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函数替换此函数的名称,并在发生此中断(异常)时调用您的函数.