将FreeRTOS源码移植到STM32F10X中,编译通过,烧录后,发现开启的新任务没有运行。
现象:串口值仅仅打印了 printf("TesetesettettttttttttesT\r\n");
子任务中没有 循环打印 printf("start_task! \r\n");
任务创建返回值正确 printf("ret = %ld \r\n", ret); 返回值为1
原因判断:最开始怀疑,任务堆栈过小,但都没有解决,最后判断是未进入start_task任务中,没有任务调度。
原始代码如下:
FreeRTOS 的任务调度,是由调度器在sysTick中断中执行,同时为了中断服务得到及时响应,引入pendSV 执行任务上下文切换。
最终发现在FreeRTOSConfig.h 配置文件中没有 配置SVC异常和PenSV异常 的宏,增加下图红框中的宏定义,重命名这两个异常的函数实现名字。
#define xPortPendSVHandler PendSV_Handler
#define vPortSVCHandler SVC_Handler
xPortPendSVHandler 和 vPortSVCHandler 是FreeRTOS源码中port.h文件实现的,但是STM32 原始的异常函数名应该为PendSV_Handler 和 SVC_Handler,所以将其重命名即可。
修改后,任务调度正常。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)