gpt4 book ai didi

c - 如何设置异常发生时的回调函数?

转载 作者:行者123 更新时间:2023-12-04 09:13:04 24 4
gpt4 key购买 nike

我一直在思考如何在发生异常时设置回调。

我有这个测试代码:

void main()
{
long * bad = (long*)0x0A000000; //Invalid address

//When the following line gets executed
//it causes an error and the debugger sends me to an assembly file.
*bad = 123456789;
}

我发送到的程序集文件看起来像这样(真实文件的片段):

.macro DEFAULT_ISR_HANDLER name=
.thumb_func
.weak \name
\name:
1: b 1b /* endless loop */
.endm

DEFAULT_ISR_HANDLER SRC_IRQHandler /*Debugger stops on this line*/

据我了解,DEFAULT_ISR_HANDLER 是一个定义无限循环的宏。我想要做的是在 C 文件中定义我自己的函数,当发生异常时我可以调用它,而不是调用 DEFAULT_ISR_HANDLER 宏中定义的内容。

我的问题是,如何在该程序集中定义调用特定 C 函数的宏?

希望我解释了自己。感谢您提供有关此主题的任何信息或方向。

如果相关,我使用的是 GCC ARM 编译器 v5.4_2016q3

谢谢,艾萨克

编辑

我使用的是 Cortex-M3。

直到现在我才意识到我在谈论处理器异常。根据数据表,有一个包含 16 种异常类型的列表。

显然,它的工作方式是所有异常类型都被重定向到宏,宏依次调用一些拇指函数,然后是无限循环(根据上面代码中的 DEFAULT_ISR_HANDLER)。

为了方便起见,我想做的是在 C 文件中定义自己的函数,这样每次出现任何类型的处理器异常时,我都可以控制如何进行。

最佳答案

你有两个选择:

只需使用 void SRC_IRQHandler(void) 签名定义一个 C 函数,由于宏将默认处理程序定义为弱,您的函数将在链接阶段覆盖默认处理程序。

您的项目中应该有一个地方,其中 SRC_IRQHandler 被放置在 Cortex-M3 架构中所谓的 vector 表中。您可以将此函数的名称替换为您自己的 C 函数,当此中断(异常)发生时将调用您的函数。

关于c - 如何设置异常发生时的回调函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44710567/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com