FreeRTOS任务外调用vTaskDelay引发HardFault的解决办法

问题

在移植裸机程序到RTOS的过程中,需要在初始化函数中使用vTaskDelay()进行延时,当在主函数中调用初始化函数时没有观察到现象。调试后发现进入vTaskDelay()后程序卡死(HardFault)。

原因

猜测可能是vTaskDelay()引起了任务调度,vTaskDelay会将任务从当前列表中移除并加入延时列表,当在任务外调用此函数时,由于没有正在运行的用户任务,会引发异常。

验证

为了验证以上猜想,编写一个包含vTaskDelay()的测试函数,在不同的位置调用,发现:

1.在主函数调用时:如果是在调度器开启前调用,此时没有运行的任务,程序会卡死。

2.在主函数调用时:如果是在调度器开启后调用,此时有一个运行的空闲任务,程序没有卡死,但是没有运行这个函数(在主函数中将任务调度器开启后,程序就会运行任务,而不再运行后面的程序)。

3.在自定义任务内调用时可以正常运行。因此可以将带延时的函数写在任务内运行。

解决方案

  1. 在任务中执行初始化函数
  2. 使用自定义的延时函数(SysTick定时器)
  • 8
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值