FreeRTOS(三)

第二部分 事件组

一、事件组的简介

1、事件

事件是一种实现任务间通信的机制,主要用于实现多任务间的同步,但事件通信只能是事件类型的通信,无数据传输。其实事件组的本质就是一个整数(16/32位)。可以是一个事件发生唤醒一个任务,或者多个事件唤醒一个或多个任务。

2、与队列/信号量的区别:

①信号量/队列当事件发生时只去唤醒一个任务,而事件组可唤醒多个任务,起到一个广播的作用。 ②信号量/队列是一个消耗性资源,即数据读走了就减少,而事件组可以选择清除事件也可以选择保留事件。 ③事件组只能是起到一个同步的作用,并不能传递数据。 ④事件组可以实现多个任务之间的同步,队列/信号量则只能是两个任务之间的同步。

3、事件组

1)整数的位数: 如果宏configUSE_16_BIT_TICKs = 0,那么这个整数是32位的,其中⽤低24位来表示事件组,代表24 个事件,剩余8位用于管理事件。 如果宏configUSE_16_BIT_TICKs = 1,那么这个整数是16位的,其中⽤低8位来表示事件组,代表8个事 件。

2)每⼀位事件的含义由我们自己定义。

3)这些位,值为1表示事件发生了,值为0表示事件没发⽣。

4)⼀个或多个任务、ISR都可以写这些位。

5)⼀个或多个任务可以等待某⼀位、某几个位。

特点

①与信号量不同设置,事件组不会阻塞,多个任务设置同一时间等于设置一次。

②支持事件超时等待机制,等待该事物类型的任务会进行阻塞态

③逻辑与:任务所期望的事件全部发生,任务才能被唤醒

逻辑或:任务所期望的事件只要有任意一个事件发生,任务即可被唤醒。

全局变量的区别

1.全局变量使用在操作系统中存在被多个任务同时读写的风险,则事件组它会直接禁止任务调度来规避风险。 2.使用全局变量需要自己去实现阻塞机制(成本太高)。 3.使用事件组能更方便的实现多任务之间的同步。

二、API函数

接口函数函数功能
xEventGroupCreate()动态创建事件组
xEventGroupSetBits()事件组置位函数
xEventGroupWaitBits()等待事件函数
EventGroupHandle_t()事件组结构体
EventGroupHandle_t
xEventGroupCreate

分三步:①为事件组结构体分配内存

②初始化事件组

③初始化等待链表

xEventGroupSetBits()

xEventGroupWaitBits

 

 

第三部分 软件定时器

一、简介

1、硬、软定时器

硬件定时器:由外部晶振提供时钟,定时精准,精度可以达到微秒级。不仅具有定时功能,还可以输出PWM,输入捕获等高级功能,当时间到达会触发一次中断。

软件定时器:基于一个守护任务,可以被其他中断或优先级比它高的任务打断,且软件定时器的精度是基于系统时钟SysTick的,一般达不到微秒级别。只能用来定时,每当时间到达会执行回调函数。

2、为何使用软件定时器

硬件定时器数量有限,而且使用定时的高级功能一般不会用来定时,但是实际上需要很多定时器来采集数据,上传数据等,所以我们就有了软件定时器,只要内存足够可以创建无数个软件定时器(一个软件定时器只需要一个定时器结构体的内存,还需要两条定时器链表,一个队列)。

软件定时器适合于对定时器精度要求不高的周期性任务

二、API函数

接口函数函数功能
tmrTimerControl定时器结构体
xTimerCreate()创建定时器
xTimerStart()启动定时器
xTimerStop()停止定时器
xTimerDelete()删除定时器
1、tmrTimerControl

(定时器结构体)

(1)定时器周期

单次定时:像闹钟一样只执行一次,时间一到事情做完定时器就停止运行;

周期定时:比如每隔20s触发一次,这就是周期执行。

(2)回调函数

每个定时器都由用户指定一个回调函数(功能由用户自己实现),每当定时器超时,守护任务则会去调用该定时器的回调函数

typedef void (* TimerCallbackFunction_t)( TimerHandle_t xTimer );

(3)定时器的状态

定时器活跃:定时器并不是一被创建就开始定时,与硬件定时器一样需要一个启动的命令(当前任务通过消息队列发送给守护任务),则定时器才会被挂入定时器链表,则处于活跃态,假设一个定时器是单次定时,在一次定时之后,则定时器会被移出定时器链表,所以判断一个定时器是否在活跃态,就是判断定时器是否在定时器链表中(如果在说明该定时器在参与定时)。

(4)软件定时器的守护任务

通过一个prvTimerTask任务来管理软件定时器,这个任务也叫“守护任务”。在启动调度器时自动创建的,以满足用户定时的需要。

需要在config文件中将configUSE_TIMERS设置为1时,在启用调度器时自动创建守护任务。

(5)定时器命令队列

任务和守护任务之间通过消息队列,守护任务创建完成后将会进入阻塞状态,等待用户程序发起定时器启动命令。其阻塞时间为定时器定时时间。

2、xTimerCreate()

第一次创建定时器需要初始化两条定时器链表(一条正常,一条超时),并创建一个消息队列,以上三者是软件定时器运行起来的基本配置。

守护任务:如果将宏configUSE_TIMERS配置为1则默认使用定时器,回创建一个定时器的守护任务。

3、xTimerStart()
定时器命令ID:

ID号-2~-1:直接调用用户指定的函数在守护任务执行前

ID号0~5:定时器的启动、复位、停止、更改周期、删除命令

ID号6~9:中断版的定时器的启动、复位、停止、更改周期命令

作用:将定时器信息打包发送给定时器信息队列等待守护任务读取信息并处理。

4、xTimerStop()

不难发现他的内部函数还是那个,只是执行命令不同。

5、xTimerDelete()

三、运行机制

(1)创建定时器--创建定时器控制块

用户程序调用定时器创建函数,给出定时时间

SysTick定时器常被用来作为软件定时器的时钟源,1s节拍1000次,1次就是1ms

(2)插入列表

根据定时时间长短:以升序方式插入链表中。

有两个链表:一个是创建时插入表,另一个是溢出时插入表。

xTimeNow:这个是SYSTIC的计数值。

XTicksToWait:xTimeNow+定时时间。

(3)启动定时器

当⽤户任务发送定时器启动命令后,定时器的守护任务函数将会执⾏。在任务函数中定义了⼀个全

局变量并初始化为0,⽤来保存上次定时器时间到的SYSTICK的值。

然后,⽐较全局变量和当前xTimeNow的值,如果xTimeNow<上次SYSTICK,则表明SYSTICK溢

出,那么将会把第⼀张链表上的定时器移到第⼆张链表中。

如果系统节拍计数器没有溢出,⽐较xTimeNow 和 xTickToWait的值,当xTimeNow >=

xTickToWait时,说明定时器时间到,调⽤回调函数。

如果xTimeNow <xTickToWait,定时器任务阻塞,阻塞时间为:xTickToWait - xTimeNow时。

以上是目前我对FreeRTOS的理解,后续如果对这块有更深理解会继续更新,如果有错误的地方可以交流。

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

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

相关文章

【C语言进阶篇】编译和链接

【C语言进阶篇】编译和链接 &#x1f955;个人主页&#xff1a;开敲&#x1f349; &#x1f525;所属专栏&#xff1a;C语言&#x1f353; &#x1f33c;文章目录&#x1f33c; 编译环境与运行环境 1. 翻译环境 2. 编译环境&#xff1a;预编译&#xff08;预处理&#xff09;编…

Mac上的Gatekeeper系统跟运行时保护

文章目录 问题&#xff1a;无法打开“xxx.xxx”&#xff0c;因为无法验证开发者。macOS无法验证此App是否包含恶意软件。如何解决&#xff1f; 参考资料门禁运行时保护 问题&#xff1a;无法打开“xxx.xxx”&#xff0c;因为无法验证开发者。macOS无法验证此App是否包含恶意软件…

解析SpringBoot自动装配原理前置知识:解析条件注释的原理

什么是自动装配&#xff1f; Spring提供了向Bean中自动注入依赖的这个功能&#xff0c;这个过程就是自动装配。 SpringBoot的自动装配原理基于大量的条件注解ConditionalOnXXX&#xff0c;因此要先来了解一下条件注解相关的源码。 以ConditionalOnClass为例 首先来查看Conditi…

兼顾陪读|本科学历律师自费赴美国加州大学伯克利分校访学

S律师拟陪同孩子赴海外就读&#xff0c;决定以访问学者身份&#xff0c;申请美国J类签证出国以兼顾陪读。因本科学历&#xff0c;无文章且有地域要求&#xff0c;自己申请无果后做了全权委托。为此我们酌情制定了三条申请策略&#xff0c;最终落实加州大学伯克利分校的访学职位…

NSString有哪些创建对象的方法?创建的对象分别存储在什么区域?

NSString有哪些创建对象的方法&#xff1f;创建的对象分别存储在什么区域&#xff1f; 一般通过NSString创建对象的方法有&#xff1a; NSString *string1 "123";NSString *string2 [[NSString alloc] initWithString:"123"];NSString *string3 [NSSt…

解决方案:如何安装neo4j软件

文章目录 一、安装JDK二、安装neo4j 一、安装JDK 第一步先安装JDK&#xff0c;因为neo4j环境需要JDK&#xff0c;过程比较多&#xff0c;截图如下&#xff1a; 安装JDK网址 https://www.oracle.com/java/technologies/downloads winR&#xff0c;输入cmd&#xff0c;再输入j…

Leetcode70. 爬楼梯(动态规划)

Leetcode原题 Leetcode70. 爬楼梯 标签 记忆化搜索 | 数学 | 动态规划 题目描述 假设你正在爬楼梯。需要 n 阶你才能到达楼顶。每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢&#xff1f;示例 1&#xff1a;输入&#xff1a;n 2 输出&#xff1a;2 解…

数据分析之POWER Piovt透视表分析与KPI设置

将几个数据表之间进行关联 生成数据透视表 超级透视表这里的字段包含子字段 这三个月份在前面的解决办法 1.选中这三个月份&#xff0c;鼠标可移动的时候移动到后面 2.在原数据进行修改 添加列获取月份&#xff0c;借助month的函数双击日期 选择月份这列----按列排序-----选择月…

C++ 控制语句(一)

一 顺序结构 程序的基本结构有三种&#xff1a; 顺序结构、分支结构、循环结构 大量的实际问题需要通过各种控制流程来解决。 1.1 顺序结构 1.2 简单语句和复合语句 二 循环 2.1 for循环 语句流程图 注意&#xff1a;使用for语句的灵活性 三 while语句 四 do while语句

【LLM多模态】Cogvlm图生文模型结构和训练流程

note Cogvlm的亮点&#xff1a; 当前主流的浅层对齐方法不佳在于视觉和语言信息之间缺乏深度融合&#xff0c;而cogvlm在attention和FFN layers引入一个可训练的视觉专家模块&#xff0c;将图像特征与文本特征分别处理&#xff0c;并在每一层中使用新的QKV矩阵和MLP层。通过引…

【LaTeX】7实现章节跳转

使用 LaTeX 实现章节跳转 写在最前面1. 引入 hyperref 包2. 标记章节3. 引用章节示例代码注意 小技巧总结 &#x1f308;你好呀&#xff01;我是 是Yu欸 &#x1f30c; 2024每日百字篆刻时光&#xff0c;感谢你的陪伴与支持 ~ &#x1f680; 欢迎一起踏上探险之旅&#xff0c;…

Vue 3中ref和reactive的区别

&#x1f90d; 前端开发工程师、技术日更博主、已过CET6 &#x1f368; 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 &#x1f560; 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》 &#x1f35a; 蓝桥云课签约作者、上架课程《Vue.js 和 E…

碳课堂|什么是碳资产?企业如何进行碳资产管理?

碳资产是绿色资产的重要类别&#xff0c;在全球气候变化日益严峻的背景下备受关注。在“双碳”目标下&#xff0c;碳资产管理是企业层面实现碳减排目标和低碳转型的关键。 一、什么是碳资产&#xff1f; 碳资产是以碳减排为基础的资产&#xff0c;是企业为了积极应对气候变化&…

就业班 第二阶段 2401--3.25 day5 mycat读写分离

[TOC] 启动并更改临时密码 [rootmysql1~]# systemctl start mysqld && passwdgrep password /var/log/mysqld.log | awk END{ print $NF} && mysqladmin -p"$passwd" password Qwer123..; MyCAT读写分离 Mycat 是一个开源的数据库系统&#xff0c;但…

遇到了问题,Firepower 2140配置带外IP时报错 commit-buffer failed

onsite we have a cisco firepower 2140 device which run ASA as we try to modify the 2140 OOB mgmt ip by CLI, we got an error why ? 经过查询发现&#xff0c;需要进入ASA里面打上以下这条命令&#xff0c;并重启ASA 1 修改模式并重启 ciscoasa# configure termina…

idea使用git笔记

1.创建分支和切换分支 创建分支 切换分支 2.把新创建的分支提交到远程服务器上&#xff08;注&#xff1a;如果没有提交的&#xff0c;随便找个文件修改再提交&#xff09; (1)切换到要提交的分支&#xff0c;add (2)commit (3)push 3.在自己分支修改代码及提交到自己的远…

STM32收发HEX数据包

在实际应用中&#xff0c;STM32的串口通信都是以数据包格式进行收发&#xff0c;这个数据包一般都包含包头和包尾&#xff0c;表示一个数据包。源代码在文末给出 数据包格式&#xff1a; 固定长度&#xff0c;含包头包尾 可变包长&#xff0c;含包头包尾 问题1&#xff1a;当…

C语言例4-15:从键盘输入一个整数,求其绝对值并输出。

代码如下&#xff1a; //从键盘输入一个整数&#xff0c;求其绝对值并输出。 #include<stdio.h> int main(void) {int n;printf("输出一个整数&#xff1a; \n");scanf("%d",&n); //从键盘输入一个整数保存至变量nif(n<0) //…

C#打印50*30条码标签

示例图&#xff1a; 源码下载地址&#xff1a;https://download.csdn.net/download/tiegenZ/89035407?spm1001.2014.3001.5503

混合云构建-使用 Azure ExpressRoute 建立从本地到 Azure 虚拟网络的专用连接

如果有大量业务数据需要在本地数据中心和azure私有网络进行传输&#xff0c;同时保证带宽和时延的情况需要使用 ExpressRoute 设置从本地网络到 Azure 中的虚拟网络的专用连接。以下是实操步骤供参考&#xff1a; 一、创建和预配 ExpressRoute 线路 登录 Azure 门户。 在页面顶…