前言

在第7章我们知道在创建任务并启动任务调度器后,当前任务控制块是指向第一个任务(即pxCurrentTCB = &Task1TCB),然后会产生SVC中断,将pxCurrentTCB出栈至CPU寄存器切换至任务1。
在任务1函数的最后会执行taskYield,taskYield会产生PendSVC中断,先将任务1入栈,然后将当前任务控制块指向第二个任务(即pxCurrentTCB = &Task2TCB),再将pxCurrentTCB出栈至CPU寄存器切换至任务2。在任务2函数的最后也是如此切换至任务1。

本章知识点

在本章,在启动任务调度器时,还会同时把空闲任务创建起来,并启动滴答定时器及其中断,然后在产生的SVC中断中切换至任务1。在滴答定时器中断中会先将所有任务的倒计时个数减1,再调用taskYield完成任务切换,如下图:

在任务1函数中,会通过vTaskDelay函数来给当前任务赋以倒计时个数(即延时时长)并调用taskYield完成任务切换,如下图:


注意这里taskYield产生PendSVC中断中的任务切换不再是任务1时切任务2这样简单了,而是会通过一个复杂一些的算法来切换,如下代码:

void vTaskSwitchContext( void )
{if ( pxCurrentTCB == &IdleTaskTCB ) //当前为空闲任务时{if (Task1TCB.xTicksToDelay == 0)//任务1延时倒计时结束了{pxCurrentTCB =&Task1TCB;}else if (Task2TCB.xTicksToDelay == 0)//任务2延时倒计时结束了{pxCurrentTCB =&Task2TCB;}else //任务延时均没有到期则返回,继续执行空闲任务{return;}}else //当前不是空闲任务{if (pxCurrentTCB == &Task1TCB)//当前为任务1时{if (Task2TCB.xTicksToDelay == 0){pxCurrentTCB =&Task2TCB;}else if (pxCurrentTCB->xTicksToDelay != 0)//任务1延时倒计时没结束{pxCurrentTCB = &IdleTaskTCB;}else //返回,不进行切换,因为两个任务都处于延时中{return;}}else if (pxCurrentTCB == &Task2TCB)//当前为任务2时{if (Task1TCB.xTicksToDelay == 0){pxCurrentTCB =&Task1TCB;}else if (pxCurrentTCB->xTicksToDelay != 0)//任务2延时倒计时没结束{pxCurrentTCB = &IdleTaskTCB;}else //返回,不进行切换,因为两个任务都处于延时中{return;}}}//end of当前不是空闲任务
}

举例


最后的波形应该是这样的,如下:

“野火FreeRTOS教程”第9章知识点总结-空闲任务与阻塞延时相关推荐

  1. freertos空闲任务、阻塞延时

    freertos空闲任务.阻塞延时 空闲任务 阻塞延时 SysTick 实验现象 阻塞态:如果一个任务当前正在等待某个外部事件,则称它处于阻塞态. rtos中的延时叫阻塞延时,即任务需要延时的时候,会 ...

  2. java基础案例教程前4章知识点_java学习记录4 Java基础知识点

    java学习记录4 Java基础知识点 1. 注释 单行注释 使用"//"开头,后面是注释的内容 一般在要注释的语句的上面加注释 多行注释 以"/*"开头,以& ...

  3. python 求和并排序_Python算法教程第三章知识点:求和式、递归式、侏儒排序法和并归排序法...

    本文目录:一.求和式:二.递归式:三.侏儒排序法和并归排序法 微信公众号:geekkr 一.求和式 # 假设有一函数为f(),则在Python中经常使用的求和方法如下. sum(f(i) for i ...

  4. Python算法教程第三章知识点:求和式、递归式、侏儒排序法和并归排序法

    本文目录:一.求和式:二.递归式:三.侏儒排序法和并归排序法 微信公众号:geekkr </br> </br> </br> 一.求和式 # 假设有一函数为f(),则 ...

  5. FreeRTOS内核实现04:空闲任务与阻塞延时

    目录 1. 引入原因 2. 实现空闲任务 2.1 定义空闲任务组件 2.2 创建空闲任务 3. 实现阻塞延时 3.1 vTaskDelay函数实现 3.2 修改vTaskSwitchContext函数 ...

  6. c语言第四章循环程序设计,C语言程序设计教程第4章-循环结构程序设计

    <C语言程序设计教程第4章-循环结构程序设计>由会员分享,可在线阅读,更多相关<C语言程序设计教程第4章-循环结构程序设计(42页珍藏版)>请在人人文库网上搜索. 1.C语言程 ...

  7. cobaltstrike扩展_Cobalt Strike系列教程第七章:提权与横向移动

    Cobalt Strike系列教程分享如约而至,新关注的小伙伴可以先回顾一下前面的内容: Cobalt Strike系列教程第一章:简介与安装 Cobalt Strike系列教程第二章:Beacon详 ...

  8. Android Camera2 教程 · 第三章 · 预览

    Android Camera2 教程 · 第三章 · 预览 DarylGo关注 Android Camera 上一章<Camera2 开启相机>我们学习了如何开启和关闭相机,接下来我们来学 ...

  9. D3.js的v5版本入门教程(第一章)—— 如何在项目中使用D3.js

    D3.js的v5版本入门教程(第一章) 1.需要的一些工具 这个其实随便!最简单的就是建一个.txt文件就可以敲起代码来!作者本人用的是myeclipse(主要需要安装tomcat),因为写的是前端, ...

  10. c语言中对用户乱输入信息处理,C语言程序设计教程 第06章.ppt

    C语言程序设计教程 第06章 第六章 函数与编译预处理 6.1 模块化程序设计与函数 6.2 函数的定义与调用 6.3 函数的递归调用 6.4 变量的作用域与存取方式 6.5 编译预处理 6.1模块化 ...

最新文章

  1. Celery 进阶使用
  2. 全国大学生智能车竞赛相关培训汇总
  3. jmeter之图片上传
  4. 关于 Intel 8253/8254
  5. Python注释缩进不得当导致IndentationError: unexpected indent
  6. surefire单元测试 并发 提速
  7. Linux 下用来查询安装包信息的RPM选项
  8. jzoj2152-终极数【堆】
  9. git Could not read from remote repository.Please make sure you have the correct access rights.
  10. hdu 1251 统计难题 (Trie树)
  11. Grid R-CNN解读:商汤最新目标检测算法
  12. no value specified for java.sql.date,求助No value specified for parameter 2
  13. golang CI: Use result of type assertion to simplify cases SCC-S1034
  14. python中字典使用_python中字典的使用
  15. Win2008系统下装CTBS之前的系统组件安装向导第二篇(补充篇)
  16. cisp-pte渗透工程师考试总结
  17. win10通过VMware使用教程
  18. 原理图和PCB设计流程概述
  19. 前端技术之babel转码器
  20. PyMOL | Pymol绘图教程(一)

热门文章

  1. 终极算法-机器学习和人工智能如何重塑世界:电子书
  2. oracle 053 题库,oracle ocp 053题库讲解(232版本)
  3. 机器学习入门:隐马尔科夫模型-8
  4. 我不应该用计算机做题,超级计算器:能帮你做题的计算器,就是它了
  5. 选择排序的时间复杂度
  6. 6西格玛管理法和ISO9000标准(摘录)
  7. Windows11动态磁贴替代软件大盘点 _φ(❐_❐✧ windows教程
  8. 跨境电商SaaS会成为一门大生意吗?
  9. Unity3D MineCraft 使用Unity3D制作MineCraft 我的世界 存盘和读取问题解决
  10. 大数据技术原理与应用(一):大数据概述