OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 4672|回复: 4

Freertos运行一段时间后,进入HardFault中断。

[复制链接]

20

主题

99

帖子

0

精华

初级会员

Rank: 2

积分
177
金钱
177
注册时间
2020-6-21
在线时间
70 小时
发表于 2021-5-7 16:03:51 | 显示全部楼层 |阅读模式
然后我发现是在
void delay_ms(u32 nms)
{       
        if(xTaskGetSchedulerState()!=taskSCHEDULER_NOT_STARTED)//系统已经运行
        {               
                if(nms>=fac_ms)                                                //延时的时间大于OS的最少时间周期
                {
                           vTaskDelay(nms/fac_ms);                         //FreeRTOS延时
                }
                nms%=fac_ms;                                                //OS已经无法提供这么小的延时了,采用普通方式延时   
        }
        delay_us((u32)(nms*1000));                                //普通方式延时
}

这段代码的nms%=fac_ms;处卡死的。

我看fac_ms = 0;

这段代码时什么意思啊?而且我的程序里面应该也没有调用delay_ms。我都是直接用vTaskDelay的。
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

17

主题

140

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
5455
金钱
5455
注册时间
2018-7-24
在线时间
2163 小时
发表于 2021-5-7 16:28:59 | 显示全部楼层
你没有调用调试的时候的应该不会到delay_ms处吧,看看是不是有哪里用到了delay_ms
回复 支持 反对

使用道具 举报

10

主题

3281

帖子

1

精华

论坛元老

Rank: 8Rank: 8

积分
8204
金钱
8204
注册时间
2020-5-11
在线时间
3697 小时
发表于 2021-5-7 16:48:43 | 显示全部楼层
%是求余。
nms%=fac_ms;
就是
nms=nms % fac_ms;
由于求余会用到除法,所以fac_ms不能为0,为0则会死翘翘。
专治疑难杂症
回复 支持 反对

使用道具 举报

109

主题

5562

帖子

0

精华

资深版主

Rank: 8Rank: 8

积分
10541
金钱
10541
注册时间
2017-2-18
在线时间
1908 小时
发表于 2021-5-7 20:03:00 | 显示全部楼层
可以按照3楼的方法试试看,如果真如3楼所说,程序会先进入Usage Fault,而后再进入HardFault
回复 支持 反对

使用道具 举报

20

主题

99

帖子

0

精华

初级会员

Rank: 2

积分
177
金钱
177
注册时间
2020-6-21
在线时间
70 小时
 楼主| 发表于 2021-5-12 13:55:44 | 显示全部楼层
嗯,我把delay_ms这个函数注释掉了。然后发现它卡死是因为串口FIFO数据处理不过来。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2024-11-22 16:15

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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