tag 标签: 异常中断

相关博文
  • 热度 5
    2013-4-28 14:38
    1838 次阅读|
    0 个评论
      关于产生异常中断的定位问题,在《自由编程》Mindows的作者的新浪博客里已经有了详细的描述,根据处理器内核的不同可以通过仿真查看寄存器定位异常发生的位置。值得注意的是cortex内核中在发生异常或中断时 硬件自动把 R0-R3,R12,LR(也就是返回地址),PC,XPSR八个寄存器压入堆栈中,原因嘛还没研究,估计是这几个寄存器有什么特别的作用,其他内核异常的定位问题大抵如此。 说说今天调试遇到的问题: 我在程序中定义了一个调度器任务结构体(最后才发现就是这个结构体定位问题导致的程序错误),错误原因就是程序在执行到结构体内的一个函数指针时直接跳到了HardFault_Handler中,通过一步一步DEBUG发现,是函数运行过程中堆栈空间不足,堆栈和任务结构体的内存重合,导致堆栈指针篡改了任务调度结构体数据。 这类问题的解决办法有两个: 1、调度器结构体绝对定位。在文件中包含#include "absacc.h"  然后使用__at(ADDR) 定位结构体去安全区域。这种方式本身存在隐患。堆栈空间不足 2、改变堆栈空间大小,让编译器来定位调度器结构体的位置。 注意:局部变量存储在堆栈区,所以在定义大的数组的时候尽量定义为全局变量。防止堆栈溢出问题的发生,才是上上策。