【发布时间】:2017-06-22 22:58:28
【问题描述】:
我一直在思考如何在发生异常时设置回调。
我有这个测试代码:
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 种异常类型的列表。
显然,它的工作方式是将所有异常类型重定向到宏,然后调用一些 thumb 函数,然后是一个无限循环(根据代码中的 DEFAULT_ISR_HANDLER)。
为了方便起见,我想做的是在 C 文件中定义自己的函数,这样每次出现任何类型的处理器异常时,我都可以控制如何进行。
【问题讨论】:
-
C 不支持异常。
-
是的,但是有 are 处理器异常/陷阱/...似乎是这样的。我认为需要进行一些澄清,例如使用的确切平台和编译器/运行时。
-
虽然 C 不支持异常,但特定环境提供了扩展来支持它们。例如,avr-gcc 就可以。问题的答案可能在于使用的特定编译器对特定平台的支持的文档。作为一个快速提示,看起来服务例程被定义为弱符号,因此可能您在某处有一些宏可以帮助您定义具有相同符号名称的自己的处理程序,因此链接器或初始化代码会安装它而不是默认的。
-
这取决于您的操作系统。大多数操作系统会将这些转换为您可以捕获的陷阱或信号(使用信号或结构化异常处理程序)。在“裸机”上,您需要设置自己的中断处理程序。
-
@ChrisDodd:看起来很可能没有操作系统。这似乎是一个裸机系统。但是,没有提供足够/不清楚的信息。
标签: c assembly exception-handling cortex-m3