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.mzph.cn/news/775040.shtml

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

相关文章

ClickHouse初体验

1.clickHouse是啥&#xff1f; ClickHouse 是俄罗斯的 Yandex 于 2016 年开源的列式存储数据库(DBMS)&#xff0c;使用 C语言编写&#xff0c;主要用于在线分析处理查询(OLAP)&#xff0c;能够使用SQL查询实时生成分析数据报告 2.clickHouse的特点 2.1列式存储 对于列的聚合&…

城市内涝排水新模式:慧天[HTWATER]

慧天[HTWATER]软件&#xff1a;慧天排水数字化分析平台针对城市排水系统基础设施数据管理的需求&#xff0c;以及水文、水力及水质模拟对数据的需求&#xff0c;实现了以数据库方式对相应数据的存储。可以对分流制排水系统及合流制排水系统进行地表水文、管网水力、水质过程的模…

Transformers 直观解释——不仅是如何工作,而且为什么工作得这么好

输入序列如何到达Attention模块 注意力模块存在于编码器堆栈中的每个编码器中&#xff0c;以及解码器堆栈中的每个解码器中。我们将首先放大编码器的注意力。 Attention in the Encoder&#xff1a; 举个例子&#xff0c;假设我们正在研究一个英语到西班牙语的翻译问题&…

【旅游】泉州攻略v1.0.0

一、泉州古城 泉州市距离深圳大约520公里&#xff0c;从深圳北站出发&#xff0c;高铁大约3小时30分。 到达泉州西站后&#xff0c;往东南方向大约8公里&#xff0c;就可以到达主要的旅游景点泉州古城。 古城很适合使用一天玩耍&#xff0c;核心路线如下&#xff1a; 一路的景…

C++ STL教程

C STL教程 文章目录 C STL教程1.1 std::vector1.1.1vector的定义1.1.2vector容器的初始化1.1.3vector容器内元素的访问和修改1.1.4vector中的常用函数 1.2 std::string1.2.1string的定义1.2.2string的初始化1.2.3string中元素的访问和修改1.2.4string中连接字符串1.2.5string中…

AtCoder Beginner Contest 337 A - E

A - Scoreboard 大意 高桥队和青木队进行了场比赛&#xff0c;给出每场比赛中高桥队和青木队的积分&#xff0c;问最后谁总分更高或平局。 思路 统计总分比较即可。 代码 #include<iostream> using namespace std; int main(){int n, a0, b0;cin >> n;while(…

介绍部署esxi8.0产品的方式

什么是esxi esxi的中文叫裸机虚拟机管理器 ESXi是由VMware公司开发的一种裸机虚拟机管理器&#xff0c;全称为VMware ESXi。 ESXi是一种虚拟化技术&#xff0c;专门设计用于在物理服务器上运行虚拟机&#xff0c;它的主要特点是能够最大限度地降低硬件配置要求并简化部署过程…

vcf文件可以用excel打开吗?四种解决方案

vcf文件可以用excel打开吗&#xff1f; 当然可以。 一、VCF文件简介 VCF&#xff08;vCard&#xff09;文件是一种用于存储联系人信息的文件格式。它通常包含姓名、电话号码、电子邮件地址、地址等详细信息。VCF文件在多种设备和操作系统中广泛使用&#xff0c;特别是在电子邮…

2024全国水科技大会【高峰对话】北京排水集团(附部分报告题目)

北京排水集团坚持“服务社会、造福百姓、企业利益与公众利益高度一致”的宗旨&#xff0c;充分认知自身在地区经济发展中的社会责任&#xff0c;以满足政府与公众对公用事业企业服务的需求为首要任务&#xff0c;通过“现代化的队伍、现代化的手段、现代化的设备和现代化的管理…

springBoot+ureport报表引擎

UReport是一款基于单元格迭代模型的纯Java中式报表引擎。它架构于Spring之上&#xff0c;因此与企业应用具有良好的集成能力。UReport提供了基于Eclipse插件与基于网页的两种报表模版设计方式&#xff0c;采用类Excel报表模版设计风格&#xff0c;简单、易上手&#xff0c;可在…

数据结构和算法:搜索

二分查找 二分查找&#xff08;binary search&#xff09; 是一种基于分治策略的高效搜索算法。它利用数据的有序性&#xff0c;每轮缩小一半搜索范围&#xff0c;直至找到目标元素或搜索区间为空为止。 给定一个长度为 &#x1d45b; 的数组 nums &#xff0c;元素按从小到大…

django orm DateTimeField 6位小数精度问题

from django.db.backends.mysql.base import DatabaseWrapperDatabaseWrapper.data_types[DateTimeField] "datetime"意思就是重写源码里面的DateTimeField字段

如何在家中使用手机平板电脑 公司iStoreOS软路由实现远程桌面

文章目录 简介一、配置远程桌面公网地址二、家中使用永久固定地址 访问公司电脑**具体操作方法是&#xff1a;** 简介 软路由是PC的硬件加上路由系统来实现路由器的功能&#xff0c;也可以说是使用软件达成路由功能的路由器。 使用软路由控制局域网内计算机的好处&#xff1a…

2024年【起重机械指挥】考试报名及起重机械指挥免费试题

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 起重机械指挥考试报名考前必练&#xff01;安全生产模拟考试一点通每个月更新起重机械指挥免费试题题目及答案&#xff01;多做几遍&#xff0c;其实通过起重机械指挥模拟考试题库很简单。 1、【多选题】严禁吊车超负…

凯撒加密.

题目描述 给定一个单词&#xff0c;请使用凯撒密码将这个单词加密 凯撒密码是一种替换加密的技术&#xff0c;单词中的所有字母都在字母表上向后偏移3位后被替换成密文。即a变为 d&#xff0c;变为e.&#xff0c;w 变为z&#xff0c;2 变为a&#xff0c;y变为 6&#xff0c;z变…

Java——注解和注释

0 注解和注释的区别 在博主刚开始学习java语言的时候&#xff0c;经常把注释和注解搞混淆&#xff0c;误认为这两个是类似的东西&#xff0c;其实它们完全不是一个东西。 注释&#xff1a; 注释是程序员在代码中添加的说明性文字&#xff0c;用于解释代码的功能、目的或实现…

每日五道java面试题之springboot篇(二)

目录&#xff1a; 第一题. 你如何理解 Spring Boot 配置加载顺序&#xff1f;第二题. Spring Boot 中如何解决跨域问题 ?第三题. 什么是 CSRF 攻击&#xff1f;第四题. 比较一下 Spring Security 和 Shiro 各自的优缺点 ?第五题. bootstrap.properties 和 application.proper…

[AIGC] 对比MySQL全文索引,RedisSearch,和Elasticsearch的详细区别

全文搜索是数据库和搜索引擎的重要功能。这个功能能在一个或多个列中查找用户查询的文本&#xff0c;这对诸如电子商务网站和检索大量文本数据的应用是必需的。在这篇文章中&#xff0c;我们将详细对比三种主流全文搜索技术&#xff1a; MySQL全文索引&#xff0c;Redis的Redis…

【Ucore操作系统】8. 并发

文章目录 【 0. 引言 】0.1 线程定义0.2 同步互斥 【 1. 内核态的线程管理 】1.1 线程概念1.2 线程模型与重要系统调用1.2.1 线程创建系统调用1.2.2 等待子线程系统调用1.2.3 进程相关的系统调用 1.3 应用程序示例1.3.1 系统调用封装1.3.2 多线程应用程序 – threads 1.4 线程管…

考研数学|《660题》这样刷最有效!

考研数学660题作为许多考研学子在备考过程中重要的复习资料之一&#xff0c;自然也有很多同学会有660该怎么刷的问题。为了更有效率地使用这些题目&#xff0c;希望以下策略能帮到大家&#xff0c; 首先&#xff0c;你需要根据自己的实际情况&#xff0c;制定一个合理的学习计…