FreeRTOS_任务管理_任务调度_学习笔记

上一篇文章

3.7 任务调度

任务调度规则:

  1. 高优先级任务未执行完,低优先级任务无法执行
  2. 一旦高优先级任务就绪,马上运行
  3. 同等优先级的任务轮流运行

任务调度是利用链表来管理的,在STM32F103Z中,最高任务优先级configMAX_PRIORITIES=56,即有56个数组pxReadyTasksLists,里面每一个元素都是一个链表,其定义为:

PRIVILEGED_DATA static List_t pxReadyTasksLists[configMAX_PRIORITIES] = {0};

里面存放的是特定优先级的 处于ready或running的 任务

  1. 启动调度器时,在对应优先级的数组中,会创建由几个任务组成的链表。同时在pxReadyTasksLists[0]下会创建一个空闲任务
  2. 会有一个全局指针pxCurrentTCB,指向最后创建的任务(因此最后创建的任务会先执行)
  3. 每过一次时钟中断tick,启动一次任务调度。pxCurrentTCB遍历pxReadyTasksLists,找到第一个非空的list,再在list里面从头遍历
  4. 当有任务进入阻塞态时,会把他从pxReadyTasksLists中删除,放到xDelayedTaskList中
  5. 下一次tick开始时,先到xDelayedTaskList看里面的任务是否能被唤醒。若被阻塞的任务能被唤醒,则回到pxReadyTasksLists,然后发起一次调度。
  6. 当有任务被挂起时,会把他放到xSuspendTaskList中,此时他就不能像被阻塞的任务一样被自动唤醒了。当他被Resume时,则又放回到pxReadyTasksLists中

简而言之,在每一次tick中断中,都会依次做这三件事:

  1. cnt++
  2. 判断xDelayedTaskList里面的任务是否可恢复,如果可以恢复,则放到pxReadyTasksLists
  3. 发起任务调度

由此可以引出编程的良好习惯:

  1. 以事件驱动任务
  2. 用vTaskDelay()而不是mdeley()
  • 4
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值