FreeRTOS进入死循环,无法调用taskYIELD()。

weixin_43067198 2020-11-18 02:19:03
本人在做GD32F103的FreeRTOS移植学习。主函数里创建了两个串口打印的任务,一个是每秒打印一次helloworld,另一个是每秒打印两次。
在调试的过程中发现每个任务都只有一次打印,且程序跑到FreeRTOS的tasks.c里的portTASK_FUNCTION函数里就卡在了for循环里不能满足条件调用taskYIELD()。
有遇到过同样问题的人吗,提供一下解决的思路吧,谢谢!
...全文
5827 7 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
matdrive 2023-05-21
  • 打赏
  • 举报
回复

thanks

qq_42947128 2023-05-21
  • 打赏
  • 举报
回复

xTaskGetSchedulerState()函数用来获取当前系统调度器的状态,判断系统调度器是否已经启动。如果系统调度器已经启动,就会调用xPortSysTickHandler()函数来处理系统节拍。xPortSysTickHandler()函数的作用是对系统节拍进行计数,并将计数值累加到系统时钟中。通过这段代码的处理,可以保证每个任务都能够按时得到执行。

dancingmoon08 2020-11-19
  • 打赏
  • 举报
回复
1.中断优先级怎么设置的? 2.开启时间片轮询了吗?
forget345 2020-11-19
  • 打赏
  • 举报
回复
你的 FreeRTOSConfig.h 没有
#define vPortSVCHandler SVC_Handler
#define xPortPendSVHandler PendSV_Handler
#define xPortSysTickHandler SysTick_Handler
??
weixin_43067198 2020-11-19
  • 打赏
  • 举报
回复 1
问题解决啦,直观来看是需要在gd32f10x_it.c的SysTick_Handler中加上
if(xTaskGetSchedulerState()!=taskSCHEDULER_NOT_STARTED)
{
    xPortSysTickHandler();
}
不过具体的原因还不是很清楚
forget345 2020-11-18
  • 打赏
  • 举报
回复
同一个 printf 接口,你如何保证 任务一调用的时候,任务二没有调用它?要有信号量
weixin_43067198 2020-11-18
  • 打赏
  • 举报
回复
不对,应该是说创建的两个任务都只会执行一次。

27,508

社区成员

发帖
与我相关
我的任务
社区描述
硬件/嵌入开发 单片机/工控
社区管理员
  • 单片机/工控社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧