FreeRTOS五种方式传递信号(队列,信号量,互斥量,事件组,任务通知)

FreeRTOS五种方式传递信号(队列,信号量,互斥量,事件组,任务通知)



前言

为什么要学使用?

在裸机编程中,一般信号传递都是全局变量,数组或者是返回值函数等等其他方式,在freertos中,我们不再使用裸机编程方式,而是使用FreeRTOS 内核通信的资源功能,有五种选择方式传递信号量,更加规范的,安全,传递(通知)信号,提高效率


一、 哪五种方式

1.队列(queue)

队列(queue)可以用于"任务到任务"、“任务到中断”、"中断到任务"直接传输信息。

队列的常规操作(简化):
 队列可以包含若干个数据:队列中有若干项,这被称为"长度"(length)
 每个数据大小固定
 创建队列时就要指定长度、数据大小
 数据的操作采用先进先出的方法(FIFO,First In First Out):写数据时放到
尾部,读数据时从头部读
 也可以强制写队列头部:覆盖头部数据

2.信号量(semaphore)

信号量只需要维护一个数值,使用信号量效率更高、更节省内存

前面介绍的队列(queue)可以用于传输数据:在任务之间、任务和中断之间。
消息队列用于传输多个数据,但是有时候我们只需要传递状态,这个状态值需要用一个数值表示,比如:
 卖家:做好了 1 个包子!做好了 2 个包子!做好了 3 个包子!
 买家:买了 1 个包子,包子数量减 1
 这个停车位我占了,停车位减 1
 我开车走了,停车位加 1

3,互斥量(mutex)

用于临界资源(比如:串口就是临界资源)的保护一般建议使用互斥量。
用于互锁的互斥量可以充当保护资源的令牌,当一个任务希望访问某个资源时,它必须先获取令牌。当任务使用完资源后,必须还回令牌,以便其它任务可以访问该资源。是不是很熟悉,在我们的二值信号量里面也是一样的,用于保护临界资源,保证多任务的访问井然有序。当任务获取到信号量的时候才能开始使用被保护的资源,使用完就释放信号量,下一个任务才能获取到信号量从而可用使用被保护的资源。但是信号量会导致的另一个潜在问题,那就是任务优先级翻转(具体会在下文讲解)。而 FreeRTOS 提供的互斥量可以通过优先级继承算法,可以降低优先级翻转问题产生的影响,

4.事件组(event group)

一个 32 位的事件集合(EventBits_t 类型的变量,实际可用与表示事件的只有 24 位),其中的每一位都可以表示一个事件.每一位事件的含义由程序员决定,比如:Bit0 表示用来串口是否就绪,Bit1 表示按键是否被按下
1. 事件标志
事件标志是一个用于指示事件是否发生的布尔值,一个事件标志只有 0 或 1 两种状态,
FreeRTOS 将多个事件标志储存在一个变量类型为 EventBits_t 变量中,这个变量就是事件组。
2. 事件组
事件组是一组事件标志的集合,一个事件组就包含了一个 EventBites_t 数据类型的变量。
3. FreeRTOS 将这个 EventBits_t 数据类型的
变量拆分成两部分,其中低 24 位[23:0](configUSE_16_BIT_TICKS 配置位 1 时,是低 8 位[7:0])用于存储事件标志。
而高 8 位[31:24](configUSE_16_BIT_TICKS 配置位 1 时,依然是高 8 位[15:8])用作存储事件标志组的一些控制信息。

一个事件组最多可以存储 24 个事件标志。

5.任务通知(Task Notifications)

在 FreeRTOS 中,每一个任务都有两个用于任务通知功能的数组,分别为 " 任务通知数组 " 和 " 任务通知状态数组 " 。
1.优点:
 消息通知虽然处理更快,RAM 开销更小
2.缺点:
 只能有一个任务接收通知消息,因为必须指定接收通知的任务。
 只有等待通知的任务可以被阻塞,发送通知的任务,在任何情况下都不会因为发送失败而进入阻塞态

总结

  • 7
    点赞
  • 32
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值