freeRTOS相对延时函数-vTaskDelay源码分析

2023-05-16

最近学习白问网韦东山老师在B站开源的freeRTOS课程,网址:韦东山直播公开课:RTOS实战项目之实现多任务系统 第1节:裸机程序框架和缺陷_哔哩哔哩_bilibili和7天物联网训练营【第2期】7天物联网智能家居实战训练营

在学习过程中按照韦老师的方法分析了下freeRTOS源码,如果有不对的地方请指证。
 

vTaskDelay源码分析,基于cubemx生成的freeRTOS工程。

	void vTaskDelay( const TickType_t xTicksToDelay )
	{
	//xAlreadyYielded:已经调度的状态
	//初始赋值为0 
	BaseType_t xAlreadyYielded = pdFALSE;

		/* 延时周期是否大于0,不大于0,就不应该调度 */
		if( xTicksToDelay > ( TickType_t ) 0U )
		{
			configASSERT( uxSchedulerSuspended == 0 );
			//1、挂起调度器
			vTaskSuspendAll();
			{
				traceTASK_DELAY();

				/* 1、添加任务到延时列表中
				   2、需要传入两个参数
					2.1、xTicksToDelay:延时周期
					2.2、pdFALSE:状态值为0


				*/
				prvAddCurrentTaskToDelayedList( xTicksToDelay, pdFALSE );
			}
			//恢复调度器,这个调度器是有返回值的,这返回值,表示在恢复调度器
			的时候,是否已经进行了任务切换
			xAlreadyYielded = xTaskResumeAll();
		}
		else
		{
			mtCOVERAGE_TEST_MARKER();
		}

		/* xAlreadyYielded 等于FALSE,代表在恢复调度器的时候,没有进行任务切换 */
		if( xAlreadyYielded == pdFALSE )
		{
			//调用了任务切换:内部就是触发PendSV异常
			portYIELD_WITHIN_API();
		}
		else
		{
			mtCOVERAGE_TEST_MARKER();
		}
	}
//添加任务到延时列表中
//传入两个参数
//xTicksToWait:延时周期
//xCanBlockIndefinitely :延时的确定状态
static void prvAddCurrentTaskToDelayedList( TickType_t xTicksToWait, const BaseType_t xCanBlockIndefinitely )
{
//延时周期----下次唤醒的时间
TickType_t xTimeToWake;
//xTickCount为系统节拍值  全局的,进行一次获取
const TickType_t xConstTickCount = xTickCount;


	/* 把当前任务从就绪列表中移除 */
	if( uxListRemove( &( pxCurrentTCB->xStateListItem ) ) == ( UBaseType_t ) 0 )
	{
		/* The current task must be in a ready list, so there is no need to
		check, and the port reset macro can be called directly. */
		portRESET_READY_PRIORITY( pxCurrentTCB->uxPriority, uxTopReadyPriority );
	}
	else
	{
		mtCOVERAGE_TEST_MARKER();
	}
	//是否使用了任务挂起的功能
	#if ( INCLUDE_vTaskSuspend == 1 )
	{
		//portMAX_DELAY  = 0XFFFFFFFF 表示延时是一直持续的,也就是让任务一直阻塞
		if( ( xTicksToWait == portMAX_DELAY ) && ( xCanBlockIndefinitely != pdFALSE ) )
		{
			/* 把任务添加到,挂起列表中去*/
			vListInsertEnd( &xSuspendedTaskList, &( pxCurrentTCB->xStateListItem ) );
		}
		else
		{
			/* 先去计算,下次唤醒的tick值 */
			xTimeToWake = xConstTickCount + xTicksToWait;

			/* 每个任务控制块里,状态列表都有一个延时值:value
				这个value就是任务延时周期,在systick里面,进行比较,是否到达
			*/
			listSET_LIST_ITEM_VALUE( &( pxCurrentTCB->xStateListItem ), xTimeToWake );
			//判断下次延时周期,是否小于系统节拍值,那就证明定时已经溢出
			if( xTimeToWake < xConstTickCount )
			{
				/* 溢出,就把任务,添加到延时溢出列表里 */
				vListInsert( pxOverflowDelayedTaskList, &( pxCurrentTCB->xStateListItem ) );
			}
			else
			{
				/* 没有溢出,把任务添加到延时列表中,让内核进行处理 */
				vListInsert( pxDelayedTaskList, &( pxCurrentTCB->xStateListItem ) );

				/*还要去更新系统时间片,因为系统时间片永远保存最小的延时周期 */
				if( xTimeToWake < xNextTaskUnblockTime )
				{
					xNextTaskUnblockTime = xTimeToWake;
				}
				else
				{
					mtCOVERAGE_TEST_MARKER();
				}
			}
		}
	}
	#else /* INCLUDE_vTaskSuspend */
	{
		/* 计算下次唤醒的系统节拍值 */
		xTimeToWake = xConstTickCount + xTicksToWait;

		/* 赋值到任务控制块里 */
		listSET_LIST_ITEM_VALUE( &( pxCurrentTCB->xStateListItem ), xTimeToWake );

		if( xTimeToWake < xConstTickCount )
		{
			/* 溢出,添加到延时溢出列表中 */
			vListInsert( pxOverflowDelayedTaskList, &( pxCurrentTCB->xStateListItem ) );
		}
		else
		{
			/* 没有溢出,添加到延时列表中 */
			vListInsert( pxDelayedTaskList, &( pxCurrentTCB->xStateListItem ) );

			/*更新时间片 */
			if( xTimeToWake < xNextTaskUnblockTime )
			{
				xNextTaskUnblockTime = xTimeToWake;
			}
			else
			{
				mtCOVERAGE_TEST_MARKER();
			}
		}

		/* Avoid compiler warning when INCLUDE_vTaskSuspend is not 1. */
		( void ) xCanBlockIndefinitely;
	}
	#endif /* INCLUDE_vTaskSuspend */
}

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

freeRTOS相对延时函数-vTaskDelay源码分析 的相关文章

  • 网页设计与制作(HTML+CSS)(一)

    初识html 名词解释 xff1a Internet xff1a 即因特网 www World Wide Web xff1a 即万维网 URL Uniform Reource Locator xff1a 统一资源定位符 DNS Domain
  • 局域网中连接mysql数据库

    解决局域网中无法连接mysql数据库问题 在局域网中如果多人协作开发 xff0c 肯定会连接同一数据库 mysql 服务 xff0c 可是在连接时总是遇到问题 现提供解决方案如下 xff1a 只需要修改mysql配置文件 xff1a 在li
  • GPS在ROS中的测试和使用

    原链接 通过GPS机器人可以获取定位信息 ROS中也提供了GPS的相关驱动包 xff0c 可以方便的使用GPS的定位信息 下面以蓝鲸GPS模块为例演示如何在ROS中使用GPS传感器 其他的可以通过串口指令发布nmea语句的GPS模块都是通用
  • spring security oauth2 sso退出

    一 客户端退出调用认证中心 logout服务 这种方式是客户端先退出 xff0c 然后再退出认证中心 方法1 xff1a 集成WebSecurityConfigurerAdapter xff0c 重写方法如下 xff08 推荐这种方式 xf
  • 【智能家居】Home Assistant入门安装并内网穿透实现远程安全控制

    文章目录 前言1 安装Home Assistant2 配置Home Assistant3 安装cpolar内网穿透3 1 windows系统3 2 Linux系统3 3 macOS系统 4 映射Home Assistant端口5 公网访问H
  • Windows搭建Maven环境并在Eclipse中进行配置

    Maven环境 下载maven并配置 http maven apache org download cgi 下载完成如下 xff1a 接下来开始配置maven环境 xff1a 计算机 gt 右键 属性 gt 高级系统设置 gt 环境变量 g
  • 初见Ubuntu

    Ubuntu入门与常用娱乐软件安装 设置语言环境设置服务器镜像源安装搜狗输入法安装网易云音乐 一 设置语言环境 在系统右上角找到小齿轮图标 xff0c 点击选择 System Settings 选项 在打开的设置界面点击 Language
  • Ubuntu终端命令详述

    一 基本终端命令 1 调整终端窗口的字体大小 34 ctrl 43 shift 43 61 34 放大终端窗口的字体 34 ctrl 43 34 缩小终端窗口的字体 2 Linux命令的基本使用 序号命令对应英文作用01lslist查看当前
  • Ubuntu安装并连接Mysql

    安装配置MySql sudo apt install mysql server XX 提示 xff1a 当输入mysql时便可连续按 tab 键两次便可得到提示信息 xff0c 根据信息选择安装 安装过程中会提示输入mysql服务密码 xf
  • vi的使用与基本命令

    vi的使用 一 初识vi 1 什么是vi vi xff0c 即终端中一款编辑器 2 vi的应用场景 当我们要通过远程连接到服务器时 xff0c 此时没有图形界面 xff0c 当我们要对服务器上的文件进行编辑时 xff0c 便可以使用vi进行
  • Ubuntu下安装并配置Redmine

    Redmine安装与使用 Redmine是什么 xff1f Redmine是用Ruby开发的基于web的项目管理软件 xff0c 是用ROR框架开发的一套跨平台项目管理系统 xff0c 支持多种数据库 xff0c 多项独特功能 这种 Web
  • Ubuntu下安装ReviewBoard

    ReviewBoard安装与使用 ReviewBoard是什么 xff1f ReviewBoard是个开源的 可扩展的 友好的基于Web的代码评审工具 xff0c 是用Python框架Django开发的 ReviewBoard是通过Pyth
  • Ubuntu安装redis,Docker下安装redis以及redis基本配置说明

    一 什么是redis redis是一个key value存储系统 和Memcached类似 xff0c 它支持的数据类型相对更多 xff0c 包括string 字符串 list 链表 set 集合 zset sorted set 有序集合
  • Ubuntu安装memcache

    一 什么是memcache memcache是一个高性能的分布式的内存对象缓存系统 xff0c 通过在内存里维护一个统一的巨大的hash表 xff0c 它能够用来存储各种格式的数据 xff0c 包括图像 视频 文件以及数据库检索的结果等 简
  • Ubuntu安装Apache+Svn+Submin

    安装之前建议先更新 sudo apt update sudo apt upgrade 一 安装配置Apache 1 安装apache sudo apt install apache2 2 开启apache2模块 a2enmod rewrit
  • ROS坐标系统,常见的坐标系和其含义

    原链接 运行测试平台 小强ROS机器人 常见的坐标系 在使用ROS进行定位导航等操作时 xff0c 我们经常会遇到各种坐标系 每种坐标系都有明确的含义 理论上坐标系的名称可以是随意的 xff0c 但是为了方便不同的软件间共享坐标信息 xff
  • ReviewBoard+SVN配置强制code review

    本文需要在svn与reviewboard安装成功之后开始进行配置 xff0c 详情参考如下两篇文章根据实际情况操作 xff1a Ubuntu安装Apache 43 Svn 43 Submin https blog csdn net qq 2
  • Ubuntu安装配置Maven私服Nexus

    1 简介 Maven是什么 xff1f Maven是一个采用纯Java编写的开源项目管理工具 Maven采用了一种被称之为Project Object Model POM 的概念来管理项目 xff0c 所有的项目配置信息都被定义在一个叫做P
  • Ubuntu安装配置Docker

    一 Docker简介 Docker 是一个开源的应用容器引擎 xff0c 可以轻松的为任何应用创建一个轻量级的 可移植的 自给自足的容器 xff0c 让开发者可以打包他们的应用以及依赖包到一个可移植的容器中 xff0c 然后发布到任何流行的
  • Ubuntu安装ftp实现文件上传

    ftp服务安装与配置 sudo apt install vsftpd 外链图片转存失败 源站可能有防盗链机制 建议将图片保存下来直接上传 img UlscHRVo 1598855886357 https img blog csdn net

随机推荐

  • Docker安装Tomcat镜像并部署web项目简述

    一 安装Tomcat 1 查找Docker Hub上的tomcat镜像 docker search tomcat 2 拉取官方的镜像 docker pull tomcat 等待下载完毕 xff0c 需要一些时间 3 查看docker所有的镜
  • Docker删除镜像和容器

    删除docker中的镜像 xff0c 我们可以使用如下命令 xff1a docker rmi 镜像id 删除docker中的容器可以使用如下命令 xff1a docker rm 容器id 使用如下命令可以查看当前正在运行的容器 docker
  • ubuntu安装SonarQube实现代码质量检测

    一 ubuntu中安装jdk 下载并安装jdk 详细过程可参考 xff1a https blog csdn net qq 26709459 article details 80466239 二 ubuntu中安装mysql 详细过程可参考
  • springboot整合quartz(集群环境)

    使用quartz实现定时任务 xff0c 若是部署多台机器 xff0c 那么到了时间点 xff0c 多台服务器便会同时均开始执行定时任务 xff0c 这不符合我们的功能实现 quartz集群分为水平集群和垂直集群 xff0c 水平集群即将定
  • tomcat集群环境下实现负载均衡、session共享

    一 高可用 高可用HA High Availability 是分布式系统稳定运行必须考虑的因素之一 xff0c 它指的是通过处理减少系统不能提供服务的时间 比如说系统能够一直正常提供服务 xff0c 我们就说这个系统可用性为100 我们知道
  • 搭建RocketMq

    安装所需要的所有安装包 自己可以搜索源码自己打包 xff0c 也可以自己百度下载 xff0c 下面的是我的相关软件包 xff0c 有需要可以自己下载 xff1a https download csdn net download qq 267
  • ros launch中的节点工作空间路径

    原链接 运行测试平台 小强ROS机器人 在launch文件中启动节点 xff0c 那么这个节点的工作目录是什么呢 xff1f 在node程序中如果创建一个文件 xff0c 这个文件的默认位置在哪里 xff1f 在launch中node节点有
  • 搭建Git服务器并安装管理工具Gitblit

    一 安装Git服务 1 移除旧版git yum remove git 2 下载git 在如下链接中可以看到git所有版本 xff0c 选择自己需要的版本进行下载 xff0c 这里我选择最新版本 https github com git gi
  • FastDFS的安装配置及其使用

    一 fastDFS是什么 fastDFS是c语言编写的一款开源分布式文件系统 xff0c 使用fastDFS可以很方便搭建一套高性能的文件服务器集群提供文件上传 下载等服务 二 fastDFS工作原理 fastDFS包括Tracker se
  • centos编译hadoop源码包

    一 所需工具 JDK maven protobuf CMake ant hadoop 2 x x src 如下所示 xff1a 二 安装 1 安装jdk 2 安装maven 可以参考如下地址 xff1a https blog csdn ne
  • CentOs搭建Zookeeper

    下载地址 https mirrors tuna tsinghua edu cn apache zookeeper zookeeper 3 4 14 一 zookeeper环境搭建 安装jdk xff1a 略 本次我们在192 168 0 1
  • CensOs搭建Solr环境并配置

    下载地址 xff1a https mirrors tuna tsinghua edu cn apache lucene solr 8 1 1 注 xff1a 这里我使用的8 1 1版本 xff0c 可以根据自己需要选择版本 若是版本相差较大
  • Centos安装Docker

    Docker 是一个开源的应用容器引擎 xff0c 让开发者可以打包他们的应用以及依赖包到一个可移植的容器中 xff0c 然后发布到任何流行的 Linux 机器上 xff0c 也可以实现虚拟化 Docker 技术的三大核心概念 xff0c
  • Docker图形管理工具的安装与使用

    1 搜索Portainer镜像 docker search portainer 2 下载镜像 docker pull portainer portainer 3 启动 docker run d p 9000 9000 restart 61
  • PV3953L1光流定点激光定高四轴悬停模块说明书

    PV3953L1光流定点激光定高四轴悬停模块说明书 视频效果 xff1a STM32F103 270飞控 四轴飞行器大机架 DIY安装 视频教程 1 产品图片 型号 xff1a PV3953L1 接线标识 xff1a V xff1a 3 3
  • 【OpenCV3.2】Detection of ArUco Markers

    姿态估计 xff08 Pose estimation xff09 在 计算机视觉 领域扮演着十分重要的角色 xff1a 机器人 导航 增强现实以及其它 这一过程的基础是找到现实世界和图像投影之间的对应点 这通常是很困难的一步 xff0c 因
  • FreeRTOS学习之前后台系统存在的问题

    最近报了百问网7天物联网的训练营 https www 100ask net detail term 6216e88bc00cf 3clJb1 25 和在B站上学习的韦东山老师的freeRTOS做了下学习记录 1 什么是前后台系统 这是一个典
  • 速腾聚创16线激光雷达rslidar-16的ros驱动安装与rviz点云显示

    原链接 https community bwbot org topic 520 运行测试平台 小强ROS机器人 速腾聚创16线激光雷达rslidar 16的供电是直流12v 3A xff0c 通信接口是rs485网络接口 小强ros开发平台
  • freeRTOS滴答时钟相关源码分析

    最近学习白问网韦东山老师在B站开源的freeRTOS课程 xff0c 网址 xff1a 韦东山直播公开课 xff1a RTOS实战项目之实现多任务系统 第1节 xff1a 裸机程序框架和缺陷 哔哩哔哩 bilibili和7天物联网训练营 第
  • freeRTOS相对延时函数-vTaskDelay源码分析

    最近学习白问网韦东山老师在B站开源的freeRTOS课程 xff0c 网址 xff1a 韦东山直播公开课 xff1a RTOS实战项目之实现多任务系统 第1节 xff1a 裸机程序框架和缺陷 哔哩哔哩 bilibili和7天物联网训练营 第