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

2023-05-16

前言

在第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当前不是空闲任务
}

举例

在这里插入图片描述
最后的波形应该是这样的,如下:
在这里插入图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

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

  • 回溯法 题目 leetcode

    1 22 括号生成 数字 n 代表生成括号的对数 xff0c 请你设计一个函数 xff0c 用于能够生成所有可能的并且 有效的 括号组合 示例 xff1a 输入 xff1a n 61 3 输出 xff1a 34 34 34 34 34 34
  • 买卖股票系列问题 Leetcode题目

    leetcode 刷题记录 一 买卖股票系列问题 1 121 买卖股票的最佳时机 给定一个数组 xff0c 它的第 i 个元素是一支给定股票第 i 天的价格 如果你最多只允许完成一笔交易 xff08 即买入和卖出一支股票一次 xff09 x
  • 区间问题 LeetCode

    表示重点复习题 xff0c 没做出来 区间问题 1 56 合并区间 给出一个区间的集合 xff0c 请合并所有重叠的区间 示例 1 输入 intervals 61 1 3 2 6 8 10 15 18 输出 1 6 8 10 15 18 解
  • 网格DFS LeetCode

    岛屿问题 DFS 200 岛屿数量 给你一个由 1 xff08 陆地 xff09 和 0 xff08 水 xff09 组成的的二维网格 xff0c 请你计算网格中岛屿的数量 岛屿总是被水包围 xff0c 并且每座岛屿只能由水平方向和 或竖直
  • 括号题目 Leetcode

    括号系列问题 Leetcode 20 有效的括号 给定一个只包括 39 39 xff0c 39 39 xff0c 39 39 xff0c 39 39 xff0c 39 39 xff0c 39 39 的字符串 s xff0c 判断字符串是否有
  • 回溯 组合 排列 生成 LeetCode

    回溯 组合 排列 生成 算法题目 77 组合 给定两个整数 n 和 k xff0c 返回 1 n 中所有可能的 k 个数的组合 示例 输入 n 61 4 k 61 2 输出 2 4 3 4 2 3 1 2 1 3 1 4 解法1 回溯 递归
  • Centos 7安装Python3环境

    目录 1 安装依赖环境2 下载Python压缩包3 解压Python压缩包4 编译安装4 1 编译前安装相关软件4 2 创建安装目录4 3 生成编译脚本4 4 编译和安装4 5 检查 5 建立软链接6 设置Python3的环境变量6 1 设
  • Linux命令c++filt

    一个简单的linux命令 xff0c 确实不值得大费周折 xff0c 但是 xff0c 在实际的开发过程中 xff0c 却帮助很大 xff0c 在编译cgi xff0c 修改函数的调用之后获得函数的符号名 xff0c 就可以看到这个函数的定
  • 子序列 子数组问题 Leetcode

    子序列 子数组问题 53 最大子序和 给定一个整数数组 nums xff0c 找到一个具有最大和的连续子数组 xff08 子数组最少包含一个元素 xff09 xff0c 返回其最大和 示例 1 xff1a 输入 xff1a nums 61
  • 用devstack快速部署 openstack

    本人openstack小白一名 xff0c 在部署openstack时出现了很多不可逾越的错误 xff0c 只好借助于工具 在用devstack安装openstack之前 xff0c 先用的openshit进行安装 但是出现了无法连接数据库
  • Debain 10安装使用中文输入法

    Debain 10安装使用中文输入法 近来因工作需要 xff0c 需在虚拟机上搭建服务 xff0c 公司虚拟机上用的是Debain系统 xff0c 在使用的过程中觉着没有中文输入法极其不爽 xff0c 于是按照网上多篇教程一步步尝试至最终切
  • 【算法题】素数伴侣-用匈牙利算法解决二分图匹配问题

    描述 输入一个字符串 xff0c 内容是一个不重复的整数数组 若数组中两个数相加为素数 xff0c 那么这两个数可以配对 xff0c 即素数伴侣 一个数字只能配对一次 输出最大配对数 示例 输入 xff1a 4 2 5 6 13 输出 xf
  • MAX30102

    include 34 myiic h 34 include 34 delay h 34 初始化IIC void IIC Init void GPIO InitTypeDef GPIO InitStructure RCC gt APB2ENR
  • linux系统开机自动挂载分区

    以挂载分区 dev sdb1为例 1 查看所有的分区 xff1a sudo fdisk l 1 修改分区类型 fdisk dev sdb 输入m可以查看帮助 xff0c 修改分区类型需要使用t命令 xff0c 并输入分区类型标号 2 查看分
  • Python文件处理相关函数

    文件 xff0c 文件夹 xff0c 压缩包处理模块模块 shutil模块 引入 xff1a import shutil shutil是对OS中文件操作的补充 xff1a 移动 复制 打包 压缩 解压 1 copy文件内容到另一个文件 xf
  • Python多线程

    线程的创建 加入 锁 待补充完善
  • noVNC压缩包下载

    1 浏览器器输入地址 Git地址 xff1a GitHub Where the world builds software GitHub https github com 2 搜索noVNC 3 选择novnc noVNC 4 点击发行版本
  • Python数据类型(结构)

    Python复合数据类型之一 列表 即写在方括号之间 用逗号隔开的数值列表 列表内的数值不必全是相同的类型 list1 span class token operator 61 span span class token punctuati
  • Python条件循环控制语句

    Python 条件语句 通过一条或多条语句的执行结果 xff08 True或者False xff09 来决定执行的代码块 Python程序语言指定任何非0和非空 xff08 null xff09 值为true xff0c 0 或者 null
  • Python面向对象编程

    Python面向对象编程

随机推荐