FreeRTOS学习笔记(五)

FreeRTOS学习笔记(五)

FreeRTOS基础知识

  • FreeRTOS学习笔记(五)
    • FreeRTOS基础入门
      • 一、信号量
        • 1,信号量的简介
          • (1)队列与信号量的对比
        • 2,二值信号量
          • (1)二值信号量相关API函数
            • (1)创建二值信号量函数
            • (2)释放二值信号量函数
            • (3)获取二值信号量函数
        • 3,计数型信号量
          • (1)计数型信号量适用场合:
          • (2)计数型信号量相关API函数
            • 1.创建一个计数型信号量
            • 2.获取信号量当前计数值大小
        • 4,优先级翻转简介
        • 5,互斥信号量
          • 互斥信号量相关API函数
      • 二、队列集
        • 1,队列集简介
        • 2,队列集相关API函数介绍
          • (1)创建队列集
          • (2)往队列集中添加队列
          • (3)往队列集中移除队列
          • (4)在任务中获取队列集中有有效消息的队列
          • (5)队列集使用流程
      • 三、事件标志组
        • 1,事件标志组简介
          • (1)**事件标志组的特点:**
          • (2)一个事件组就包含了一个 EventBits_t 数据类型的变量,变量类型 EventBits_t 的定义如下所示:
          • (3)事件标志组与队列、信号量的区别?
        • 2,事件标志组相关API函数介绍
          • (1)动态方式创建事件标志组API函数
          • (2)清除事件标志位API函数
          • (3)设置事件标志位API函数
          • (4)等待事件标志位API函数
          • (5)同步函数![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/a0e6b952f4822483b281b8afd87d4713.png)

FreeRTOS基础入门

一、信号量

1,信号量的简介

信号量是一种解决同步问题的机制,可以实现对共享资源的有序访问
在这里插入图片描述
在这里插入图片描述

(1)队列与信号量的对比

在这里插入图片描述

2,二值信号量

二值信号量的本质是一个队列长度为 1 的队列 ,该队列就只有空和满两种情况,这就是二值。

二值信号量通常用于互斥访问或任务同步, 与互斥信号量比较类似,但是二值信号量有可能会导致优先级翻转的问题 ,所以二值信号量更适合用于同步!
在这里插入图片描述

(1)二值信号量相关API函数

使用二值信号量的过程:
创建二值信号量 → 释放二值信号量→ 获取二值信号量

在这里插入图片描述

(1)创建二值信号量函数

SemaphoreHandle_t xSemaphoreCreateBinary( void )

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

(2)释放二值信号量函数

BaseType_t xSemaphoreGive( xSemaphore )

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

(3)获取二值信号量函数

BaseType_t xSemaphoreTake( xSemaphore, xBlockTime )

在这里插入图片描述

在这里插入图片描述

3,计数型信号量

计数型信号量相当于队列长度大于1 的队列,因此计数型信号量能够容纳多个资源,这在计数型信号量被创建的时候确定的

(1)计数型信号量适用场合:
  1. 事件计数
    当每次事件发生后,在事件处理函数中释放计数型信号量(计数值+1),其他任务
    会获取计数型信号量(计数值-1) ,这种场合一般在创建时将初始计数值设置为 0
  2. 资源管理
    信号量表示有效的资源数目。任务必须先获取信号量(信号量计数值-1 )才能获取资源控制权。当计数值减为零时表示没有的资源。当任务使用完资源后,必须释放信号量(信号量计数值+1)。信号量创建时计数值应等于最大资源数目
(2)计数型信号量相关API函数

使用计数型信号量的过程:
创建计数型信号量 →释放信号量 → 获取信号量

在这里插入图片描述
计数型信号量的释放和获取与二值信号量相同 !

1.创建一个计数型信号量

在这里插入图片描述

此函数用于创建一个计数型信号量 。

在这里插入图片描述

在这里插入图片描述

2.获取信号量当前计数值大小

在这里插入图片描述
此函数用于获取信号量当前计数值大小
在这里插入图片描述
在这里插入图片描述

4,优先级翻转简介

优先级翻转:高优先级的任务反而慢执行,低优先级的任务反而优先执行
优先级翻转在抢占式内核中是非常常见的,但是在实时操作系统中是不允许出现优先级翻转的,因为优先级翻转会破坏任务的预期顺序,可能会导致未知的严重后果。
在使用二值信号量的时候,经常会遇到优先级翻转的问题。
如:
在这里插入图片描述
高优先级任务被低优先级任务阻塞,导致高优先级任务迟迟得不到调度。但其他中等优先级的任务却能抢到CPU资源。从现象上看,就像是中优先级的任务比高优先级任务具有更高的优先权(即优先级翻转)

5,互斥信号量

互斥信号量其实就是一个拥有优先级继承的二值信号量,在同步的应用中二值信号量最适合。互斥信号量适合用于那些需要互斥访问的应用中!

优先级继承:当一个互斥信号量正在被一个低优先级的任务持有时, 如果此时有个高优先级的任务也尝试获取这个互斥信号量,那么这个高优先级的任务就会被阻塞。不过这个高优先级的任务会将低优先级任务的优先级提升到与自己相同的优先级。

在这里插入图片描述

此时任务H的阻塞时间仅仅是任务L 的执行时间,将优先级翻转的危害降到了最低

优先级继承并不能完全的消除优先级翻转的问题,它只是尽可能的降低优先级翻转带来的影响
注意:互斥信号量不能用于中断服务函数中,原因如下:
(1) 互斥信号量有任务优先级继承的机制, 但是中断不是任务,没有任务优先级, 所以互斥信号量只能用与任务中,不能用于中断服务函数。
(2) 中断服务函数中不能因为要等待互斥信号量而设置阻塞时间进入阻塞态。

互斥信号量相关API函数

使用互斥信号量:
首先将宏configUSE_MUTEXES置一
使用流程:创建互斥信号量 →(task)获取信号量 →(give)释放信号量
创建互斥信号量函数:
在这里插入图片描述
互斥信号量的释放和获取函数与二值信号量相同 !只不过互斥信号量不支持中断中调用
注意:创建互斥信号量时,会主动释放一次信号量

在这里插入图片描述
此函数用于创建互斥信号量
在这里插入图片描述

二、队列集

1,队列集简介

一个队列只允许任务间传递的消息为同一种数据类型,如果需要在任务间传递不同数据类型的消息时,那么就可以使用队列集 !

作用:用于对多个队列或信号量进行“监听”,其中不管哪一个消息到来,都可让任务退出阻塞状态

假设:有个接收任务,使用到队列接收和信号量的获取,如下:
在这里插入图片描述

2,队列集相关API函数介绍

在这里插入图片描述
说明如下:

(1)创建队列集

在这里插入图片描述
此函数用于创建队列集。
在这里插入图片描述
在这里插入图片描述

(2)往队列集中添加队列

在这里插入图片描述

此函数用于往队列集中添加队列,要注意的时,队列在被添加到队列集之前,队列中不能有有效的消息
在这里插入图片描述
在这里插入图片描述

(3)往队列集中移除队列

在这里插入图片描述此函数用于从队列集中移除队列, 要注意的是,队列在从队列集移除之前,必须没有有效的消息
在这里插入图片描述
在这里插入图片描述

(4)在任务中获取队列集中有有效消息的队列

在这里插入图片描述

此函数用于在任务中获取队列集中有有效消息的队列

在这里插入图片描述
在这里插入图片描述

(5)队列集使用流程

1、启用队列集功能需要将宏configUSE_QUEUE_SETS 配置为 1
2、创建队列集
3、创建队列或信号量
4、往队列集中添加队列或信号量
5、往队列发送信息或释放信号量
6、获取队列集的消息

三、事件标志组

1,事件标志组简介

事件标志位:用一个位,来表示事件是否发生
事件标志组是一组事件标志位的集合, 可以简单的理解事件标志组,就是一个整数。

(1)事件标志组的特点:

· 它的每一个位表示一个事件(高8位不算)
· 每一位事件的含义,由用户自己决定,如:bit0表示按键是否按下,bit1表示是否接受到消息 … …
(这些位的值为1:表示事件发生了;值为0:表示事件未发生)
· 任意任务或中断都可以读写这些位
· 可以等待某一位成立,或者等待多位同时成立

(2)一个事件组就包含了一个 EventBits_t 数据类型的变量,变量类型 EventBits_t 的定义如下所示:

在这里插入图片描述

EventBits_t 实际上是一个 16 位或 32 位无符号的数据类型

虽然使用了 32 位无符号的数据类型变量来存储事件标志, 但其中的高8位用作存储事件标志组的控制信息,低24位用作存储事件标志 ,所以说一个事件组最多可以存储 24 个事件标志!

在这里插入图片描述

(3)事件标志组与队列、信号量的区别?

在这里插入图片描述

2,事件标志组相关API函数介绍

在这里插入图片描述

(1)动态方式创建事件标志组API函数

EventGroupHandle_t xEventGroupCreate ( void );
在这里插入图片描述

(2)清除事件标志位API函数

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

(3)设置事件标志位API函数

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

(4)等待事件标志位API函数

在这里插入图片描述
在这里插入图片描述
特点:可以等待某一位、也可以等待多位
等到期望的事件后,还可以清除某些位

在这里插入图片描述

(5)同步函数在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值