搜索
查看: 1509|回复: 2

[求助] ucosii跑飞到HardFault_Handler

[复制链接]

该用户从未签到

2

主题

9

帖子

0

蝴蝶豆

初级会员

最后登录
2019-8-22
发表于 2019-8-19 00:37:05 | 显示全部楼层 |阅读模式
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。
回复

使用道具 举报

该用户从未签到

3

主题

1306

帖子

929

蝴蝶豆

版主

最后登录
2021-3-31
发表于 2019-9-9 17:04:28 | 显示全部楼层
看看OSTimeDly(50);这个函数的源码,是不是代码原理导致调用时需要注意一下呢
回复 支持 反对

使用道具 举报

该用户从未签到

0

主题

8

帖子

0

蝴蝶豆

新手上路

最后登录
2020-1-18
发表于 2020-1-18 00:06:08 | 显示全部楼层
PendSVC中断优先级要设置为最低,且在 PendSVC 的第1条语句要关中断
   CPSID   I                                                   ; Prevent interruption during context switch
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 注册/登录

本版积分规则

关闭

站长推荐上一条 /3 下一条

Archiver|手机版|小黑屋|论坛-意法半导体STM32/STM8技术社区

GMT+8, 2024-4-29 04:46 , Processed in 0.153180 second(s), 34 queries .

Powered by Discuz! X3.4

Copyright © 2001-2024, Tencent Cloud.

快速回复 返回顶部 返回列表