你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

ucosii跑飞到HardFault_Handler

[复制链接]
pedro 提问时间:2019-8-19 00:37 /
main里面创建一个启动任务
OSInit();
OSTaskCreate(startTask,0,&START_TASK_STK[START_STK_SIZE],START_TASK_PRIO);
OSStart();

startTask里调用了两次OSTimeDly就程序就跑飞了,其中systick的初始化再startTask里。
查看fault report发现这个hardfault是由usagefault上访造成的,定位错误代码
微信截图_20190819001434.png
引起异常的代码如下:
void _LibDwLoadLde(void)
{
................
OSTimeDly(50);
...............
OSTimeDly(450);
...............
}程序在退出该函数是出现异常的。然后我开始查看OSTimeDly前后的寄存器
微信截图_20190819001957.png 这是OSTimeDly执行之前的psp
微信截图_20190819002058.png 这个事执行OSTimeDly时跳到OS_CPU_PendSVHandler里时的psp,注意这是psp已经发生变化,超过了芯片自动保存的值
微信截图_20190819002347.png 这是延时时间到返回到OSTimeDly下一行时的psp,此时的psp和执行之前的psp应该一致程序才不会跑飞,这的新的psp导致退出该函数时出栈值错误
微信截图_20190819002649.png 这是通过错误的psp退出函数时,出栈的值,此时的pc为0x00000000,肯定是不对的,其值应该是随机的,因此报出异常,最终导致该错误是第三张图,psp为0x20001c98,这个地方错了,导致后面已练成的出栈错误。
问题分析到这里卡住了,不知道这里的psp为什么会莫名其妙的被修改,正常情况应该是中断后自动保存r0-r4,r11,cpsr(好像就这些了,记不太清了),psp应该减小24即20001CE8。
收藏 评论2 发布时间:2019-8-19 00:37

举报

2个回答
butterflyspring 回答时间:2019-9-9 17:04:28
看看OSTimeDly(50);这个函数的源码,是不是代码原理导致调用时需要注意一下呢
stock999 回答时间:2020-1-18 00:06:08
PendSVC中断优先级要设置为最低,且在 PendSVC 的第1条语句要关中断
   CPSID   I                                                   ; Prevent interruption during context switch

所属标签

相似问题

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版