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

硬件平台

STM32F407ZGT6,J-LINK仿真器


软件平台

MDK5.2


问题描述

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


解决过程

我们知道发生异常时可首先查看LR寄存器中的值,确定当前使用栈指针为MSP还是PSP,当LR的值为0xFFFFFFFD时,使用的堆栈是PSP,为0xFFFFFFE9时,使用的是MSP堆栈。如图R14(LR)的值为0xFFFFFFFD,所以查看PSP指针为0x20002350。
这里写图片描述


由于异常发生时,内核将R0~R3、R12、LR、PC、XPRS 寄存器依次入栈,其中LR即为发生异常前PC将要执行的下一条指令地址。注意STM32寄存器均是32位,且是小端模式。故打开Memory Windows输入地址0x20002350后,看到的第21-24字节即为该指令地址,该地址为0x08001015。
这里写图片描述


在Disassembly窗口里任意位置右键打开Show Disassembly At Address,输入刚刚得到的指令地址0x08001015,跳转过去。
这里写图片描述


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


经过多方查资料,偶然间查看到这么一句话:官方移植的 port 文件里面没有做 FPU 的支持,瞬间想到,MDK应该要关闭使用FPU,点击Option for Target,将红圈标注的地方改成Not Used,问题成功解决!
这里写图片描述

阅读更多
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/ly666888555/article/details/79958549
文章标签: ucOS III STM32
上一篇解决Source Insight 4.0版本打开.s的文件时,一片黑白没有色彩,并且在ADD TREE时没有包含.s文件的问题
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

关闭
关闭