关于__main和__rt_entry(点击这里进入详细页面,keil说明)的作用(或者进入ARM官网查看).
现在开始说为什么出现异常,因为当__main中的代码执行时使用到了堆栈(stack:也就是处理器中的sp寄存器),__main内部调用两层以上的函数,比如A函数调用B函数,进入B函数时A函数中的调用B函数的指令的下一个位置会地址push进堆栈(sp),当copy或者初始化全局变量时刚好把堆栈中的数据清零了,结果调用POP指令把堆栈中的数据取回到PC中,那么这时PC的值是0,然后ARM处理器就开始进入了HardFault异常处理。
不解的是,你手动把PC的值改为0的话处理器又不进入HardFault异常处理程序,郁闷不解!
解决办法就是在AREA中加入NOINIT关键字:
AREA init_stack,DATA;,NOINIT
s_size EQU 0x200
SPACE s_size
stack_End
没有评论:
发表评论