FreeRTOS 实时操作系统第八讲 - 时间管理 (系统节拍,延时函数)

一、系统节拍

  FreeRTOS 实时操作系统需要一个时钟节拍,以供系统处理诸如延时、超时、软件定时器等与时间相关的事件。

  时钟节拍是周期性定时中断,这个中断可以看做是系统心跳。中断时间间隔取决于不同的应用,一般是 1ms – 100ms。时钟的节拍中断使得内核可以将任务延迟若干个时钟节拍,以及当任务等待事件发生时,提供等待超时等依据。时钟节拍率越快,系统响应越快,系统的额外开销也越大。

  对于 Cortex-M3 内核的 STM32F103 ,教程配套的例子都是用滴答定时器来实现系统时钟节拍的。

  • 滴答定时器 Systick

  SysTick 定时器位于 NVIC 中,用于产生 SysTick 异常(异常号:15),滴答定时器是一个 24 位的递减计数器,支持中断。使用比较简单,专门用于给操作系统提供时钟节拍。

  FreeRTOS 的系统时钟节拍可以在配置文件 FreeRTOSConfig.h 里面设置:

#define configTICK_RATE_HZ(( TickType_t) 1000 )

如上所示的宏定义配置表示系统时钟节拍是 1KHz,即 1ms。

二、延时相关函数

2.1、作用

FreeRTOS 中的时间延迟函数主要有以下两个作用:

  1. 为周期性执行的任务提供延迟。
  2. 对于抢占式调度器,让高优先级任务可以通过时间延迟函数释放 CPU 使用权,从而让低优先级任务可以得到执行。

2.2、相关函数

FreeRTOS 时间相关的函数主要有以下 4 个:

  1. vTaskDelay ()
  2. vTaskDelayUntil ()
  3. xTaskGetTickCount()
  4. xTaskGetTickCountFromISR()

下面我们对这 4 个函数依次进行说明:

① 函数原型:void vTaskDelay(const TickType_t xTicksToDelay);

  函数描述:函数 vTaskDelay 用于任务的延迟。 属于相对延时,指每次延时都是从执行函数 vTaskDelay() 开始,直到延时指定的时间(参数:滴答值)结束。

  参数 xTicksToDelay 用于设置延迟的时钟节拍个数,范围 1- 0xFFFFFFFF。

  延迟时间的最大值在 portmacro.h 文件里面有定义:

	typedef uint32_t TickType_t;#define portMAX_DELAY (TickType_t)0xffffffffUL

    即延迟时间的范围是:1- 0xFFFFFFFF

② 函数原型:

void vTaskDelayUntil(TickType_t *pxPreviousWakeTime, const TickType_t xTimeIncrement);

  函数描述:函数 vTaskDelayUntil 用于周期性延迟。 属于绝对延时,指间隔指定的时间(参数:滴答值),执行一次调用 vTaskDelayUntil() 函数的任务。

  第 1 个参数,存储任务最后一次解除阻塞的时间

  第 2 个参数,周期性延迟时间。

使用这个函数要注意以下问题:

  1. 使用此函数需要在 FreeRTOSConfig.h 配置文件中配置如下宏定义为 1

#define INCLUDE_vTaskDelayUntil 1

③ 函数原型:

volatile TickType_t xTaskGetTickCount(void);

  函数描述:函数 xTaskGetTickCount 用于获取系统当前运行的时钟节拍数。

  使用这个函数要注意以下问题:

  1. 此函数用于在任务代码里面调用,如果在中断服务程序里面调用的话,需要使用函数 xTaskGetTickCountFromISR,这两个函数切不可混用。

④ 函数原型:

volatile TickType_t xTaskGetTickCountFromISR(void);

  函数描述:函数 xTaskGetTickCountFromISR 用于获取系统当前运行的时钟节拍数。

  使用这个函数要注意以下问题:

  1. 此函数用于在中断服务程序里面调用,如果在任务里面调用的话,需要使用函数 xTaskGetTickCount,这两个函数切不可混用。

三、相对延时与绝对延时的区别与编程测试

1、问题:周期性去处理某一件事情。你会通过什么方式去实现?

  比如:间隔 10ms 去采集传感器的数据,然后通过一种算法计算出一个结果,最后通过串口发送出去。对于裸机编程,首先想到的是:利用定时器,定时 10ms 中断,在中断里面处理。但中断函数适合处理简单数据,要求快进快出,不适合算法、通信等需要长时间占用 CPU 的处理。对计时精度要求比较高的地方适合定时器,像本节说的周期性采集传感器数据,要求不适合很高,那么就引入本文说的绝对延时。

2、 相对延时:指每次延时都是从执行函数 vTaskDelay() 开始,直到延时指定的时间(参数:滴答值)结束。

  绝对延时:指间隔指定的时间(参数:滴答值),执行一次调用 vTaskDelayUntil() 函数的任务。

3、通过编程测试相对延时和绝对延时的区别

  创建 2 个任务,情况如下:

  任务 1:HAL_Delay 延时 50ms,模拟传感器采集数据与被中断或高优先级任务打断的时间,printf 打印任务运行次数,再通过 vTaskDelay 相对延时 200ms;

  任务 2:HAL_Delay 延时 50ms,模拟传感器采集数据与被中断或高优先级任务打断的时间,printf 打印任务运行次数,再通过 vTaskDelayUntil 就绝对延时 200ms;

实验分析:

  任务 1 由于采用相对延时,printf 间隔 250ms(50ms+200ms) 打印信息

  任务 2 由于采用绝对延时,printf 间隔 200ms(50ms+150ms) 打印信息

**疑问:**为什么采用绝对延时,printf 间隔为 50ms+150ms

  **解答:**任务执行时,先花 50ms 执行模拟采集数据与被中断或高优先级任务打断的时间, 接着,调用 vTaskDelayUntil, 此函数会根据第 1 个实参 (存储任务最后一次解除阻塞的时间) 与当前系统时间计算出模拟采集数据与被中断或高优先级任务打断的 50ms 时间,此时只延时 200ms-50ms=150ms,以确保任务周期性执行,所以 vTaskDelayUntil 实际只阻塞了 150ms。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/587529.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

[C#]C# winform实现imagecaption图像生成描述图文描述生成

介绍: 地址:C#https://github.com/ruotianluo/ImageCaptioning.pytorch 效果: 测试环境: vs2019 onnxruntime1.16.3 opencvsharp4.8 代码: using System; using System.Collections.Generic; using System.Comp…

学习体系结构 - AArch64内存管理

学习体系结构 - AArch64内存管理 Learn the architecture - AArch64 memory management Version 1.2 个人的英语很一般,对拿不准的翻译校准在后面添加了英文原文。 1、 概述 本指南介绍了AArch64中的内存转换,这是内存管理的关键。它解释了如何将虚拟地…

Spring Boot IO官方文档中文版

本文为官方文档直译版本。原文链接 Spring Boot IO官方文档中文版 引言缓存支持的缓存提供程序GenericJCache (JSR-107)HazelcastInfinispanCouchbaseRedisCaffeineCache2kSimpleNone HazelcastQuartz Scheduler发送邮件Validation调用 REST 服务WebClientWebClient Runtime自定…

【Android Gradle 插件】ProductFlavor 配置 ( ProductFlavor 引入 | ProductFlavor 参考文档地址 )

Android Plugin DSL Reference 参考文档 : 文档主页 : Android Plugin 2.3.0 DSL Reference android 模块配置文档 : AppExtension - Android Plugin 2.3.0 DSL Reference ProductFlavor 文档 : ProductFlavor - Android Plugin 2.3.0 DSL Reference 一、ProductFlavor 配置…

【数据结构】第2章线性表(头歌习题)【合集】

文章目录 第1关:实现顺序表各种基本运算的算法任务描述编程要求完整代码 第2关:实现单链表各种基本运算的算法任务描述编程要求完整代码 第3关:移除顺序表中所有值等于x的元素任务描述编程要求完整代码 第4关:逆置顺序表任务描述编…

c++——list实现细节反思

list实现反思 Mystl list实现 一开始没有什么好注意的&#xff0c;直接写就行了。 先写节点和list类 template<class T>struct ListNode{T _val;ListNode<T>* _next nullptr;ListNode<T>* _pre nullptr;//ListNode() {}ListNode(const T& val T()){…

【Kubernetes】kubectl 常用命令

kubectl 常用命令 1.基础命令2.部署命令3.集群管理命令4.故障诊断与调试命令5.高级命令6.设置命令7.其他命令 kubectl 是 Kubernetes 提供的命令行管理工具。通过使用 kubectl&#xff0c;可以管理和操作 Kubernetes。 1.基础命令 命令 说明 create通过文件名或标准输入创建 …

Java Object浅克隆深克隆

对象克隆 把A对象的属性值完全拷贝给B对象&#xff0c;也叫对象拷贝&#xff0c;对象复制。 实现Cloneable接口&#xff0c;表示当前类的对象就可以被克隆&#xff0c;反之&#xff0c;表示当前类的对象就不能克隆。 如果一个接口里面没有抽象方法&#xff0c;表示当前的接口…

VCG 基于CMake构建VCG项目

文章目录 一、简介二、相关配置三、实现代码四、实现效果参考资料一、简介 VCGlib(Visual Computing Library)是一个开源的C++库,专注于提供用于处理和分析三维图形的工具和数据结构。VCGlib 主要用于计算机图形学、计算机辅助设计(CAD)、计算机视觉等领域。以下是关于 VC…

LangChain(0.0.340)官方文档十一:Agents之Agent Types

LangChain官网、LangChain官方文档 、langchain Github、langchain API文档、llm-universe《Agent Types》、《Examples using AgentType》 文章目录 一、快速入门1.1 概念1.2 基本示例1.2.1 配置LangSmith1.2.2 使用LCEL语法创建Agents1.2.3 使用自定义runtime执行1.2.4 使用A…

CentOS 7 实战指南:文件操作命令详解

写在前面 想要快速掌握 CentOS 7 系统下的文件操作技巧吗&#xff1f;不用担心&#xff01;我为你准备了一篇详细的技术文章&#xff0c;涵盖了各种常用的文件操作命令。无论您是初学者还是有一定经验的用户&#xff0c;这篇文章都能帮助您加深对 CentOS 7 文件操作的理解&…

MySQL基础入门(二)

多表内容 一对多 这个内容是黑马的入门问题&#xff0c;可以带大家思考一下这个怎么设计 我们要知道一个岗位可以对应很多用户&#xff0c;而一个用户只能对应一个岗位&#xff0c;这就属于一对多的类型 那么我们需要怎么将他们进行关联呢&#xff1f; 现在我们可以通过一个…

【OpenAI Q* 超越人类的自主系统】DQN :Q-Learning + 深度神经网络

深度 Q 网络&#xff1a;用深度神经网络&#xff0c;来近似Q函数 DQN&#xff08;深度 Q 网络&#xff09; 深度神经网络 Q-LearningQ-Learning模型结构损失函数经验回放探索策略流程关联 DQN 优化DDQN&#xff1a;双 DQN&#xff0c;实现无偏估计Dueling DQN&#xff1a;提高…

面试数据库八股文五问五答第四期

面试数据库八股文五问五答第四期 作者&#xff1a;程序员小白条&#xff0c;个人博客 相信看了本文后&#xff0c;对你的面试是有一定帮助的&#xff01; ⭐点赞⭐收藏⭐不迷路&#xff01;⭐ 1&#xff09;什么情况下 mysql 会索引失效&#xff1f; 不使用索引列进行查询&a…

Quartus的Signal Tap II的使用技巧

概述&#xff1a; Signal Tap II全称Signal Tap II Logic Analyzer&#xff0c;是第二代系统级调试工具&#xff0c;它集成在Quartus II软件中&#xff0c;可以捕获和显示实时信号&#xff0c;是一款功能强大、极具实用性的FPGA片上调试工具软件。 传统的FPGA板级调试是由外接…

某大型车辆检测维修公司降本增效项目纪实

【客户行业】车辆检测维修 【问题类型】降本增效 【客户背景】 某大型车辆检测维修公司成立于2007年&#xff0c;位于我国河南省&#xff0c;占地面积26亩&#xff0c;是某大型国有企业下属的分公司&#xff0c;业务范围涉及汽车年检及检测、汽车修理、保险理赔、汽车装饰等…

ROS学习记录:用C++实现对wpr_simulation软件包中机器人的运动控制

一、在工作空间下输入catkin_make进行编译 二、在工作空间中输入source ./devel/setup.bash后回车 三、机器人的运动控制在wpr_simulation中有一个例子程序&#xff0c;在工作空间中输入&#xff1a; roslaunch wpr_simulation wpb_simple.launch后回车 四、就会启动一个仿真环…

菜鸟网络Java实习一面面经

自我介绍&#xff0c;做过的项目 巴拉巴拉 你项目中用到redis&#xff0c;可以介绍一下为什么使用它吗&#xff1f; 基于内存操作&#xff0c;内存读写速度快。 支持多种数据类型&#xff0c;包括String、Hash、List、Set、ZSet等。 支持持久化。Redis支持RDB和AOF两种持久…

Transformer基本结构

Transformer基本结构 输入部分、编码部分、解码部分、输出部分 1、输入部分 原文本嵌入层及其位置编码器目标文本嵌入层及其位置编码器 位置编码器(PositionalEncoding)&#xff1a;将词汇位置不同可能会产生不同语义的信息加入到词张量中&#xff0c;以弥补位置信息的缺失 …

Win10 + 4090显卡配置深度学习环境 + gaussian-splatting配置 + 实测自己的场景

目录 1 安装Anaconda 2023.09版本 2 安装CUDA11.8 3 安装深度学习库Cudnn8.6.0 4 安装VSCODE2019 5 安装Colmap3.8 6 安装git 7 安装Python3.10 Pytorch2.0.0 7 安装项目 8 采集数据 8.1 IPhone 14 pro 拍摄30张照片左右 做预处理 8.2 生成colmap位姿等信息 8.3 开…