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

Qno*_*ish 2 c assembly exception-handling cortex-m3

在发生异常时,我已经停留了一段时间来设置回调.

我有这个测试代码:

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; 
}
Run Code Online (Sandbox Code Playgroud)

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

.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*/
Run Code Online (Sandbox Code Playgroud)

据我所知,DEFAULT_ISR_HANDLER是一个定义无限循环的宏.我想要做的是在C文件中定义我自己的函数,我可以在发生异常时调用,而不是调用DEFAULT_ISR_HANDLER宏中定义的whats.

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

希望我解释自己.欢迎任何有关此主题的信息或指示.

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

谢谢,艾萨克

编辑

我正在使用Cortex-M3.

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

显然,它的工作方式是将所有异常类型重定向到宏,后者又调用一些拇指函数,然后调用无限循环(根据代码中的DEFAULT_ISR_HANDLER).

我想要做的是在C文件中定义我自己的函数,为方便起见,所以每次出现任何类型的处理器异常时,我都可以控制如何继续.

小智 6

您有两种选择:

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

项目中应该有一个放置在SRC_IRQHandlerCortex-M3架构中称为向量表的位置.您可以使用自己的C函数替换此函数的名称,并在发生此中断(异常)时调用您的函数.