已经遇到很多客户反映:CodeWarrior10.x编译环境调试Processor Expert软件生成的Kinetis芯片程序时经常会进入PE_ISR(Cpu_Interrupt) PE_DEBUGHALT中断,但仅从这个中断服务函数名上又无法辨别到底是什么原因导致的。参考以往问题反馈和同事Erich Styger的博文Debugging Hard Faults on ARM Cortex-M并经过几番尝试之后发现这往往是芯片由于各种原因导致的Hard Fault异常中断。在此与大家分享一下使用 CodeWarrior10.6编译环境调试PE生成的程序时,查找Hard Fault异常中断原因的方法。
此处简略介绍文档内容:
一、CodeWarrior10.x编译环境背景知识
二、Cortex M0+内核异常中断背景知识
三、人工查找HardFault异常原因
借鉴ARM官网专为Keil MDK编译环境提供的应用手册apnt209里提到的方法,在CodeWarrior10.x编译环境里展示:通过查看进入异常中断函数后的LR值来观察被栈入Main Stack 或 Process Stack的进入异常前的R0-R3,R12, LR, PC,PSR寄存器值。被栈入的LR链接寄存器存储着进入异常前调用的子程序地址信息,被栈入的返回地址PC寄存器存储着进入异常前将执行的那条代码。
四、程序查找HardFault异常原因
使用汇编代码在异常中断函数里将引起Hard Fault的代码地址或子程序地址存入R1寄存器以便大家观察。
完整文档及测试代码请下载:
【经验分享】CW10.x编译环境查找HardFault异常原因.zip
(1.37 MB)
PS:本帖可从 飞思卡尔MCU论坛 置顶帖 飞思卡尔Kinetis资料大本营 的 飞思卡尔论坛支持小组【经验分享】总汇 链接进入。
|