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.hqwc.cn/news/311062.html

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

相关文章

将“渴望“乐谱写入AT24C02并读出播放

#include <reg51.h> // 包含51单片机寄存器定义的头文件 #include <intrins.h> //包含_nop_()函数定义的头文件 #define OP_READ 0xa1 // 器件地址以及读取操作,0xa1即为1010 0001B #define OP_WRITE 0xa0 // 器件地址以及写…

Winclone Pro 10 for Mac:轻松备份和还原你的Windows系统

Winclone Pro 10 for Mac是一款专为Mac用户设计的备份和还原软件&#xff0c;旨在帮助用户轻松管理和保护他们的Windows系统。无论是为了数据安全还是系统的稳定性&#xff0c;Winclone Pro 10都能提供全面的解决方案。 这款软件具备强大的备份功能&#xff0c;能够快速而准确…

【Transformer】深入理解Transformer模型2——深入认识理解(下)

前言 Transformer模型出自论文&#xff1a;《Attention is All You Need》 2017年 近年来&#xff0c;在自然语言处理领域和图像处理领域&#xff0c;Transformer模型都受到了极为广泛的关注&#xff0c;很多模型中都用到了Transformer或者是Transformer模型的变体&#xff0…

【LeetCode每日一题】1185.一周中的第几天(模拟+调用库函数:三种方法)

2023-12-30 文章目录 一周中的第几天方法一&#xff1a;模拟思路步骤 方法二&#xff1a;调用库函数方法三&#xff1a;调用库函数 一周中的第几天 ​ 提示&#xff1a;给出的日期一定是在 1971 到 2100 年之间的有效日期。 方法一&#xff1a;模拟 思路 1.可以根据1970年的…

多输入多输出 | MATLAB实现SSA-CNN麻雀算法优化卷积神经网络多输入多输出预测

多输入多输出 | MATLAB实现SSA-CNN麻雀算法优化卷积神经网络多输入多输出预测 目录 多输入多输出 | MATLAB实现SSA-CNN麻雀算法优化卷积神经网络多输入多输出预测预测效果基本介绍模型背景程序设计参考资料 预测效果 基本介绍 MATLAB实现SSA-CNN麻雀算法优化卷积神经网络多输入…

1.2.0 IGP高级特性之FRR

理论部分参考文档&#xff1a;Segment Routing TI-LFA FRR保护技术 - 华为 一、快速重路由技术 FRR(Fast Reroute)快速重路由 实现备份链路的快速切换&#xff0c;也可以与BFD联动实现对故障的快速感知。 随着网络的不断发展&#xff0c;VoIP和在线视频等业务对实时性的要求越…

海康visionmaster-Group 循环:获取 Group 循环数 据结果的方法

如何获取 Group 循环的所有数据结果&#xff1f; 解答 在 Group 中使用数据集合模块&#xff0c;然后在 Group 的输出设置订阅数据集合模块相关结果&#xff0c;最后在二次开发中获取 Group 的数据结果。如下图所示&#xff0c;参数 out1 为 Group 订阅的数据集合&#xff0c;在…

Vue2中使用echarts,并从后端获取数据同步

一、安装echarts npm install echarts -S 二、导入echarts 在script中导入&#xff0c;比如&#xff1a; import * as echarts from "echarts"; 三、查找要用的示例 比如柱状图 四、初始化并挂载 <template><div id"total-orders-chart" s…

07-C++ 异常

异常 1. 概念 异常事件&#xff08;如&#xff1a;除 0 溢出&#xff0c;数组下标越界&#xff0c;所要读取的文件不存在,空指针&#xff0c;内存不足等等&#xff09; 在C 语言对错误的处理是两种方法&#xff1a; 一是使用整型的 返回值标识错误&#xff1a;二是使用 errno…

分享一个学习Typescript最全的Github网站

一个专注研究Typescript的网站&#xff0c;&#x1f396;&#x1f396;&#x1f396;在这里你可以全面深入学习Typescript相关知识,通过动画方式讲解TS&#xff0c;还有很多常见问题解答。你还可以挑战相应的题目&#xff0c;快来学习吧 我就懒一点&#xff0c;直接原滋原味的…

Django学习3——靓号管理

目录 靓号管理 表结构和数据 根据表结构的需求&#xff0c;在models.py中创建类&#xff08;由类生成数据库中的表&#xff09; 在数据库生成表 自己在数据模拟创建一些数据&#xff1a; 靓号列表 新建靓号 编辑靓号 删除靓号 搜索靓号 靓号管理 表结构和数据 根…

Dirichlet Process (徐亦达老师)狄利克雷过程

混合高斯模型的例子 混合高斯模型 混合高斯模型&#xff08;Mixture of Gaussians&#xff0c;简称GMM&#xff09;是一种概率模型&#xff0c;用于对复杂的数据分布进行建模。它是由多个高斯分布组合而成的混合模型&#xff0c;每个高斯分布&#xff08;称为组件&#xff09;…