将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,所以将其重命名即可。
修改后,任务调度正常。

本文记录了在将FreeRTOS操作系统移植到STM32F10X芯片过程中遇到的任务无法运行的问题。问题表现为新任务未执行,仅打印初始化串口信息。经过排查,确定为FreeRTOSConfig.h配置文件中缺少SVC和PendSV异常的宏定义。修复方法是添加相应的宏,并重命名异常处理函数名称以匹配FreeRTOS源码。完成这些修改后,任务调度恢复正常。

3580

被折叠的 条评论
为什么被折叠?



