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,问题成功解决!
这里写图片描述

评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值