在发生异常时,我已经停留了一段时间来设置回调.
我有这个测试代码:
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文件中定义我自己的函数,为方便起见,所以每次出现任何类型的处理器异常时,我都可以控制如何继续.
我一直在努力寻找对以下代码中出现的错误的解释:
#include <stdlib.h>
int main() {
int m=65536;
int n=65536;
float *a;
a = (float *)malloc(m*n*sizeof(float));
for (int i = 0; i < m; i++){
for (int j = 0; j < n; j++){
a[i*n + j] = 0;
}
}
return 0;
}
Run Code Online (Sandbox Code Playgroud)
为什么执行此程序时出现"访问冲突"错误?
内存分配是成功的,问题是在一些迭代计数的嵌套for循环中.我尝试使用较小的m&n值并且程序正常运行.
这是否意味着我内存不足?