FreeRTOS之taskYIELD()

本文探讨RTOS中相同优先级的任务如何通过taskYIELD()主动让出CPU实现轮转调度,并解析xLIST()在链表管理中的作用及其实现细节。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

摘自:http://www.mcuchina.com/article/2007/1227/article_59.html

1.taskYIELD()
  比如我创建了8个优先级一样的task,并且没有创建其他优先级的进程,
  而且8个task每个task都不会调用任何引起本task从就绪运行队列链表中被摘掉的系统函数,就像示例中
  vStartIntegerMathTasks()创建vCompeteingIntMathTask1(),vCompeteingIntMathTask2()...vCompeteingIntMathTask8()一样,
  每个task都是不会睡眠的不停的执行自己,当每个task觉得自己占用cpu的时间已经差不多的时候,
  就会调用taskYIELD(),主动让出cpu,让同优先级的其他task获得cpu,因为没有其他优先级的task,所以调度器不会切换优先级,

  而是采用轮转调度策略,运行同优先级的就绪运行队列链表中调用taskYIELD()函数的当前task的下一个task.

  就这样8个task轮流让出cpu给同优先级的下一个兄弟task,8个task都采用主动协作的方式,彼此安全顺利的跑了起来.

2.xLIST()
  虽然在vListInitialise()初始化时,将pxList->xListEnd初始化为了"双向循环链表",
  但是在诸多使用中,:listGET_OWNER_OF_NEXT_ENTRY(),都会以xListEnd作为双向循环链表的象征性结尾标志,
  所以看上去只是双向链表,而不是循环链表.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值