ucOS III进入硬件错误中断的问题研究

硬件平台

STM32F407ZGT6,J-LINK仿真器


软件平台

MDK5.2


问题描述

博主在进行ucOS III的移植过程中,出现任务无法正常切换的现象。于是用J-LINK进行仿真,发现其进入了硬件错误中断,从而进入死循环导致无法正常切换任务。


解决过程

我们知道发生异常时可首先查看LR寄存器中的值,确定当前使用栈指针为MSP还是PSP,当LR的值为0xFFFFFFFD时,使用的堆栈是PSP,为0xFFFFFFE9时,使用的是MSP堆栈。如图R14(LR)的值为0xFFFFFFFD,所以查看PSP指针为0x20002350。
ucOS III进入硬件错误中断的问题研究_第1张图片


由于异常发生时,内核将R0~R3、R12、LR、PC、XPRS 寄存器依次入栈,其中LR即为发生异常前PC将要执行的下一条指令地址。注意STM32寄存器均是32位,且是小端模式。故打开Memory Windows输入地址0x20002350后,看到的第21-24字节即为该指令地址,该地址为0x08001015。
ucOS III进入硬件错误中断的问题研究_第2张图片


在Disassembly窗口里任意位置右键打开Show Disassembly At Address,输入刚刚得到的指令地址0x08001015,跳转过去。
ucOS III进入硬件错误中断的问题研究_第3张图片


定位到CPU_INT_EN();这条语句,故导致硬件错误的是其上面的代码-OS_TASK_SW();出现硬件错误的原因大多是数组越界和堆栈溢出,仔细查看下发现任务并未使用数组,加大堆栈也并没有解决问题。故排除任务本身造成的原因。
ucOS III进入硬件错误中断的问题研究_第4张图片


经过多方查资料,偶然间查看到这么一句话:官方移植的 port 文件里面没有做 FPU 的支持,瞬间想到,MDK应该要关闭使用FPU,点击Option for Target,将红圈标注的地方改成Not Used,问题成功解决!
ucOS III进入硬件错误中断的问题研究_第5张图片

你可能感兴趣的:(ucOS,III,工具使用技巧及解决方案,STM32,ucOS,III,STM32)