FreeRTOS学习(六)时间管理

2023-05-16

文章目录

      • 1.延时函数
        • 1.1 vTaskDelay()
        • 1.2 vTaskDelayUntil()
        • 1.3 系统时钟节拍
      • 2.软件定时器
        • 2.1 定时器概述
        • 2.2 定时器 API
      • 3.总结

1.延时函数

  当任务需要调用延时函数延时时,任务会进入阻塞态,同时发生任务切换,指导延时完成,任务重回阻塞态。

1.1 vTaskDelay()

(1)相对延时
  vTaskDelay延时函数实现的是相对延时,其主要特点是时间计算的节点是将调用 API 的时刻作为起点

void vTaskDelay( const TickType_t xTicksToDelay )
  • 参数为时间节拍数,当configTICK_RATE_HZ1000时,所以参数数值等于延时ms

(2)延时过程
  延时函数的主要功能就是将计算任务唤醒时间,并插入到延时列表中

  • 任务唤醒时间点 = 调用函数的时刻 + 延时时间值
  • 延时列表有两个:xDelayedTaskList1xDelayedTaskList2,其中 xDelayedTaskList2是溢出时使用的列表

在这里插入图片描述

  唤醒时间点作为列表项的列表值,当任务插入到延时列表中后,按照延时时间从小到大的顺序排序(即列表值)。

vTaskDelay()    
	prvAddCurrentTaskToDelayedList()    
		xTimeToWake = xConstTickCount + xTicksToWait;   #以当前值为起点计算唤醒时间xTimeToWake
		listSET_LIST_ITEM_VALUE()   					#把xTimeToWake插入任务列表项的列表值
		vListInsert()   								#任务插入延迟列表

在这里插入图片描述

1.2 vTaskDelayUntil()

  vTaskDelayUntil()函数实现的是绝对延时,时间计算的起点是上一次任务被唤醒的时间,即任务函数执行的时刻。

void vTaskDelayUntil( TickType_t * const pxPreviousWakeTime,
					  const TickType_t xTimeIncrement )
  • pxPreviousWakeTime:上一次任务被唤醒的时间点,第一次调用时初始化为进入 while(1)的时间节点,后续会自动更新
  • xTimeIncrement:延时节拍数
    在这里插入图片描述

1.3 系统时钟节拍

(1)滴答定时器
  滴答定时器,也叫系统节拍定时器 Systick,系统运行需要有个系统时钟节拍,xTickCount 就是 FreeRTOS 的系统时钟节拍定时器。每次 SysTick 产生中断后,xTickCount 就会加一。
(2)系统时钟节拍函数
  系统时钟节拍函数是 SysTick 中断服务函数调用xPortSysTickHandler()的,过程如下
在这里插入图片描述
(3)唤醒过程-引自Here

要唤醒任务,必须把任务从延迟列表中移到就绪列表,于是追朔延迟列表的调用者,可以其中一个调用者是listGET_OWNER_OF_HEAD_ENTRY(),继续追朔,调用者是xTaskIncrementTick(),继续追朔,调用者是xPortSysTickHandler(),到此追朔完成,上一文已经提及,xPortSysTickHandler()SysTick中断的服务函数,周期性地进行工作。

  下面是唤醒的调用层次,唤醒的核心代码在xTaskIncrementTick()

xPortSysTickHandler()   						#中断服务函数
	xTaskIncrementTick()    					#更新xTickCount计数
		pxTCB = listGET_OWNER_OF_HEAD_ENTRY()   #获取延迟列表项
		xItemValue = listGET_LIST_ITEM_VALUE()  #获取唤醒时间
		if( xConstTickCount < xItemValue )      #如果到达唤醒时间
			uxListRemove()                      #把任务从延迟列表移除
			prvAddTaskToReadyList( pxTCB );     #任务插入就绪列表

  以上简单总结为:调用延时函数后,计算唤醒时间并加入任务属性中,然后任务加入延迟列表,每个SysTick中断周期内就会检查延迟列表中的任务是否到达唤醒时间,如果是,就从延迟列表中移到就绪列表,唤醒完成。

2.软件定时器

2.1 定时器概述

  定时器的定时周期到了以后会执行一次回调函数。定时器在 FreeRTOS 是一个可选配置,需要在 FreeRTOSConfig.h 中设置,它是由定时器服务任务定时器命令队列来实现。

注意:不能再回调函数中调用任何会阻塞任务的 API,如 vTaskDelay().

在这里插入图片描述
  在 FreeRTOSConfig.h 中配置的信息都是跟任务和队列创建相关的参数

#define configUSE_TIMERS             0		// 0 关闭 1 开启
#define configTIMER_TASK_PRIORITY    (2)	// 定时器服务任务优先级
#define configTIMER_QUEUE_LENGTH     10		// 队列长度
#define configTIMER_TASK_STACK_DEPTH (configMINIMAL_STACK_SIZE * 2)  // 堆栈大小

  软件定时器分为单次定时器周期定时器

  • 单次定时器启动时间到了之后,执行一次回调函数便停止运行
  • 周期定时器执行完回调函数之后会自动重启

2.2 定时器 API

(1)定时器创建

API功能
xTimerCreate()动态方法创建软件定时器
xTimerCreateStatic()静态方法创建软件定时器

  软件定时器创建时会申请一段内存空间,用来存放软件定时器结构体Timer_t,返回值为定时器句柄,也是申请得到的内存首地址。

  • 创建成功的定时器是休眠状态的,需要调用复位或启动函数进行激活
TimerHandle_t xTimerCreate( const char * const pcTimerName,
                                    const TickType_t xTimerPeriodInTicks,
                                    const UBaseType_t uxAutoReload,
                                    void * const pvTimerID,
                                    TimerCallbackFunction_t pxCallbackFunction )
	{
	   Timer_t * pxNewTimer;
	
	   pxNewTimer = ( Timer_t * ) pvPortMalloc( sizeof( Timer_t ) ); 
	
	   if( pxNewTimer != NULL )
	   {
	       /* Status is thus far zero as the timer is not created statically
	        * and has not been started.  The auto-reload bit may get set in
	        * prvInitialiseNewTimer. */
	       pxNewTimer->ucStatus = 0x00;
	       prvInitialiseNewTimer( pcTimerName, xTimerPeriodInTicks, uxAutoReload, pvTimerID, pxCallbackFunction, pxNewTimer );
	   }
	
	   return pxNewTimer;
	}

(2)定时器操控

API功能
xTimerStart()开启软件定时器,用于任务中
xTimerStartFromISR()开启软件定时器,用于中断中
xTimerReset()复位软件定时器,用于任务中
xTimerResetFromISR()复位软件定时器,用于中断中
xTimerStop()停止软件定时器,用于任务中
xTimerStopFromISR()停止软件定时器,用于中断中

3.总结

  • FreeRTOS提供两种延时:相对延时和绝对延时,两种延时计算的时间起点不一样
  • SysTick中断服务函数中会判断延时列表中的任务是否到达延时时间,如果到了便添加到就绪列表中
  • 定时器有单次和周期之分,由定时器服务任务与命令队列实现,创建时也需要申请内存空间
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

FreeRTOS学习(六)时间管理 的相关文章

  • STM32CubeMX+FreeRTOS学习笔记(一)

    嵌入式实时操作系统FreeRTOS 基本概述 在嵌入式领域当中 实时操作系统的应用越来越广泛了 目前嵌入式操作系统种类很多 例如 Clinux C OS II C OS III FreeRTOS RT Thread等等 这篇文章所记录的就是
  • FreeRTOS记录(七、FreeRTOS信号量、事件标志组、邮箱和消息队列、任务通知的关系)

    我们在前面单独介绍过FreeRTOS的任务通知和消息队列 但是在FreeRTOS中任务间的通讯还有信号量 邮箱 事件组标志等可以使用 这篇文章就这些成员与消息队列和任务通知的关系进行说明分析 增加邮箱部分 任务通知发送消息 Demo 202
  • FreeRTOS 软件定时器的使用

    FreeRTOS中加入了软件定时器这个功能组件 是一个可选的 不属于freeRTOS内核的功能 由定时器服务任务 其实就是一个定时器任务 来提供 软件定时器是当设定一个定时时间 当达到设定的时间之后就会执行指定的功能函数 而这个功能函数就叫
  • FreeRTOS软件定时器创建、复位、开始和停止(备忘)

    目录 一 简介 1 1 开发环境 1 2 摘要 二 STM32CubeIDE配置 三 创建定时器 3 1 头文件声明 3 2 工程文件定义 3 3 创建定时器 3 4 开启 复位 和关闭定时器 四 定时器回调函数 一 简介 1 1 开发环境
  • 解决错误“ #error “include FreeRTOS.h“ must appear in source files before “include event_groups.““例子分享

    今天来给大家分享一下 关于之前自己在学习FreeRTOS过程中遇到的一个错误提示 话不多说 我们直接来看 错误分析 首先 我们看一下错误的提示 error 35 error directive include FreeRTOS h must
  • 【FreeRTOS】多任务创建

    作者主页 凉开水白菜 作者简介 共同学习 互相监督 热于分享 多加讨论 一起进步 专栏资料 https pan baidu com s 1nc1rfyLiMyw6ZhxiZ1Cumg pwd free 点赞 收藏 再看 养成习惯 订阅的粉丝
  • 【FreeRTOS开发问题】FreeRTOS内存溢出

    FreeRTOS内存溢出 如下图所示 FreeRTOS编译完成后可以看到 系统提示无法分配内存到堆 Objects Template axf Error L6406E No space in execution regions with A
  • freertos---软定时器

    一 软件定时器介绍 freeRTOS软件定时器的时基是基于系统时钟节拍实现的 可以创建很多个 在硬件定时器资源不充足的情况下非常有用 软件定时器一般用作周期性地执行函数 在创建软件定时器时指定软件定时器的回调函数 在回调函数中实现相应的功能
  • STM32移植FreeRTOS的Tips

    转自 http bbs armfly com read php tid 7140 1 在FreeRTOS的demo文件夹中拷贝对应的FreeRTOSConfig h文件后 需要加入一行 define configUSE MUTEXES 1
  • ZYNQ中FreeRTOS中使用定时器

    使用普通的Timer中断方式时 Timer中断可以正常运行 但是UDP通信进程无法启动 其中TimerIntrHandler是中断服务程序 打印程序运行时间与从BRAM中读取的数据 void SetupInterruptSystem XSc
  • 【FreeRTOS】队列的使用

    作者主页 凉开水白菜 作者简介 共同学习 互相监督 热于分享 多加讨论 一起进步 专栏资料 https pan baidu com s 1nc1rfyLiMyw6ZhxiZ1Cumg pwd free 点赞 收藏 再看 养成习惯 订阅的粉丝
  • FreeRTOS记录(九、一个裸机工程转FreeRTOS的实例)

    记录一下一个实际项目由裸机程序改成FreeRTOS 以前产品的平台还是C8051单片机上面的程序 硬件平台改成了STM32L051 同时使用STM32CubeMX生成的工程 使用FreeRTOS系统 EEPROM数据存储读取函数修改更新 2
  • FreeRTOS基础五:软件定时器

    软件定时器简介 软件定时器的作用 在指定的时间到来时执行指定的函数 或者以某个频率周期性地执行某个函数 被执行的函数叫做软件定时器回调函数 软件定时器由FreeRTOS内核实现 不需要硬件支持 软件定时器只有在软件定时器回调函数被调用时才需
  • FreeRTOS,串口中断接收中使用xQueueOverwriteFromISR()函数,程序卡死在configASSERT

    原因 UART的中断优先级设置的太高 高于了configMAX SYSCALL INTERRUPT PRIORITY宏定义的安全中断等级 UART的中断等级小于等于宏定义的优先等级即可
  • FreeRTOS笔记(十)中断

    中断 当CPU在执行某一事件A时 发生另外一个更重要紧急的事件B请求CPU去处理 产生了中断 于是CPU暂时中断当前正在执行的事件A任务而对对事件B进行处理 CPU处理完事件B后再返回之前中断的位置继续执行原来的事件A 这一过程统称为中断
  • FreeRTOS实时操作系统(三)任务挂起与恢复

    系列文章 FreeRTOS实时操作系统 一 RTOS的基本概念 FreeRTOS实时操作系统 二 任务创建与任务删除 HAL库 FreeRTOS实时操作系统 三 任务挂起与恢复 FreeRTOS实时操作系统 四 中断任务管理 FreeRTO
  • FreeRTOS多任务调度器基础

    Cortex M4中SysTick调度器核心 Cortex M4中的中断管理 Cortex M4中影子栈指针 Cortex M4中SVC和PendSV异常 1 Cortex M4中SysTick调度器核心 systick每一次中断都会触发内
  • 使用 GCC 编译器的 ARM 内核的堆栈回溯(当存在 MSP 到 PSP 切换时)

    核心 ARM Cortex M4 编译器 GCC 5 3 0 ARM EABI 操作系统 免费 RTOS 我正在使用 gcc 库函数 Unwind Reason Code Unwind Backtrace Unwind Trace Fn v
  • 有可用的 FreeRTOS 解释语言库吗?

    我在一家公司工作 该公司使用 FreeRTOS 为多个设备创建固件 最近 我们对新功能的要求已经超出了我们固件工程师的工作能力 但我们现在也无力雇用任何新人 即使进行微小的更改 也需要固件人员在非常低的级别上进行修改 我一直在为 FreeR
  • 有关 CMake 错误的问题:没有为目标提供源

    我正在尝试使用 cmake 和 eclipse 将 FreeRtos 添加到我的项目中 但出现错误 我运行的是 debian 10 我的 cmake 版本是 3 13 4 cmake 的文件可以在以下位置找到这个 git 仓库 https

随机推荐

  • 【软工】程序编码

    目录 前言正文 程序设计语言 分类 选择原则 程序编码总原则 好程序的标准 结构化程序设计 主要内容 主要原则 程序设计风格 源程序文档化 数据说明 语句结构 输入输出方法 程序设计质量评价 正确性结构清晰性易修改性 易读性 简单性 程序复
  • TPM1.2到TPM 2.0的变化

    原文地址 xff1a http www vonwei com mod 61 pad amp act 61 view amp id 61 11 TPM 1 2规范主要面向PC平台 xff0c 其103版本在2009年被接受为ISO标准 xff
  • 关于Cmake与CmakeLists(一)--背景,须知,示例

    一 背景及须知 1 背景 xff1a VS2019与VS2010在编写程序时都是创建了一个工程 xff0c 然后直接打开 sln即可 但是vscode仅仅是一个编辑器 xff0c 打开之后只有 c或者 cpp文件 xff0c 故需要手动编译
  • webgl(three.js)实现室内定位,楼宇bim、实时定位三维可视化解决方案——第五课

    webgl three js 实现室内定位 楼宇bim 实时定位三维可视化解决方案 第五课 参考文章 xff1a xff08 1 xff09 webgl three js 实现室内定位 楼宇bim 实时定位三维可视化解决方案 第五课 xff
  • Linux虚拟机在线扩容lvm类型root分区

    目录 Linux虚拟机在线扩容lvm类型root分区写在前面正文写在后面 Linux虚拟机在线扩容lvm类型root分区 写在前面 这是我在CSDN上的第一篇文章 作为一个半江湖的IT人 xff0c 这些年来也在CSDN受益很多 今天是20
  • 无vCenter创建vSAN集群

    无vCenter创建vSAN集群 最近仍有朋友在问题 xff0c vCenter如果 挂了 xff0c vSAN还能正常运行吗 xff1f 这个小文通过手动创建vSAN集群的方式来解答下这个问题吧 xff08 生产环境慎用 xff01 xf
  • 记一次mdadm软raid1升级容量

    MDRaid 2块4TB做了软RAID1 xff0c 需要升级成2块8TB盘 查看磁盘信息 xff0c SerialNumber等会儿会用到 xff0c 防止换错盘 span class token function sudo span h
  • [简洁版]youtube-dl下载命令

    简介 YouTube dl是python上的pip模块 xff08 开源 xff09 xff0c 可以用来下载YouTube Bilibili等多个平台的视频 音频文件 xff0c 可谓是居家旅行必备小工具 本文主要介绍一些常用的youtu
  • [简版]VMware强大的管理工具-PowerCLI

    一 PowerCLI介绍 什么是 PowerCLI PowerCLI 是一个命令行工具 xff0c 可以用于自动化vSphere管理 xff0c 包括网络 存储 虚拟机以及其他很多功能 PowerCLI包含超过700个命令 要安装Power
  • [简版]使用PowerCLI自定义vSphere ISO安装镜像

    一 什么情况下要自定义ISO镜像 一般来说 xff0c 对于DELL Lenovo HPE这类主流的服务器厂商 xff0c VMware官方vSphere ISO镜像或者官网的第三方客制镜像 xff08 由服务器厂商提供的封装镜像 xff0
  • [简版] 关于vSphere漏洞-OpenSLP

    一 前言 近期vSphere OpenSLP漏洞在野利用的新闻频频被爆出来 xff0c 大伙儿非常关注 由于vSphere虚拟化客户之广泛 xff0c 很多朋友都表达了自己的焦虑 xff0c 同时也会担心自己管理的vSphere虚拟化平台是
  • [简版] Linux搭建SAMBA文件共享服务

    SMB服务搭建 更多参数含义参考链接 常用配置 安装samba span class token comment Ubuntu span span class token function sudo span span class toke
  • STM32 HAL库详解

    STM32 HAL库整体总结 STM32 之二 HAL库详解 及 手动移植 本篇博客是对以上参考资源的一个二次总结与整理 1 HAL库文件结构 对于开发人员而言 xff0c 首先要清楚 HAL 库的文件结构 根据文件类型可认为以下两大类 x
  • STM32 HAL库学习(四):DMA之串口空闲中断

    STM32CubeMX 配置实现参考这里 1 串口空闲中断 1 1 UART DMA方式接收数据 STM32串口使用DMA方式接收数据可以减小CPU的开销 对于接收定长数据 xff0c 可以将DMA接收缓冲区的长度设定为待接收数据的长度 x
  • Android Studio 启动模拟器出现“Timed out after 300seconds waiting for emulator to come online“解决方案

    Android Studio 启动模拟器出现 34 Timed out after 300seconds waiting for emulator to come online 34 解决方案 参考文章 xff1a xff08 1 xff0
  • 结构体中的位定义

    1 结构体位定义 在工作中 xff0c 经常遇到按位 xff08 bit xff09 定义结构体 的情况 由于一个字节有8个位 xff0c 这时 xff0c 程序员往往对bit的位置产生困惑 现在给出2个例子 xff0c 来说明位的定义次序
  • 蓝牙基础(三):蓝牙协议栈总体认知

    蓝牙基础 xff08 三 xff09 xff1a 蓝牙协议栈总体认知 0 前言 初入门经典蓝牙学习 xff0c 网上资料参差不齐 xff0c 本博客旨在整理自己的一些总结内容 xff0c 建立整体功能认识 xff0c 以便后续深入学习 1
  • FreeRTOS学习(四)任务调度与切换

    文章目录 1 任务调度2 任务切换2 1 SVC 和 PendSV2 2 上下文2 3 切换场景2 4 PendSV Handler 3 总结 1 任务调度 在建立完任务后紧接着调用任务调度函数 xff0c 便会使系统运行起来 span c
  • FreeRTOS学习(五)队列与信号量

    文章目录 1 队列1 1 队列特性1 2 队列创建1 2 1 接口函数1 2 2 内存占用1 2 3 创建过程分析 1 3 入队与出队1 3 1 队列项入队1 3 1 队列项出队 2 信号量2 1 二值信号量2 2 计数型信号量2 3 互斥
  • FreeRTOS学习(六)时间管理

    文章目录 1 延时函数1 1 vTaskDelay 1 2 vTaskDelayUntil 1 3 系统时钟节拍 2 软件定时器2 1 定时器概述2 2 定时器 API 3 总结 1 延时函数 当任务需要调用延时函数延时时 xff0c 任务