问题
在移植裸机程序到RTOS的过程中,需要在初始化函数中使用vTaskDelay()进行延时,当在主函数中调用初始化函数时没有观察到现象。调试后发现进入vTaskDelay()后程序卡死(HardFault)。
原因
猜测可能是vTaskDelay()引起了任务调度,vTaskDelay会将任务从当前列表中移除并加入延时列表,当在任务外调用此函数时,由于没有正在运行的用户任务,会引发异常。
验证
为了验证以上猜想,编写一个包含vTaskDelay()的测试函数,在不同的位置调用,发现:
1.在主函数调用时:如果是在调度器开启前调用,此时没有运行的任务,程序会卡死。
2.在主函数调用时:如果是在调度器开启后调用,此时有一个运行的空闲任务,程序没有卡死,但是没有运行这个函数(在主函数中将任务调度器开启后,程序就会运行任务,而不再运行后面的程序)。
3.在自定义任务内调用时可以正常运行。因此可以将带延时的函数写在任务内运行。
解决方案
- 在任务中执行初始化函数
- 使用自定义的延时函数(SysTick定时器)