2014年5月10日星期六

关于ARM处理器在执行__main和__rt_entry之间的代码时出现 HardFault 异常问题解释(备忘录)

    关于__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

没有评论:

发表评论