EFM32jg之FreeRTOS(7)-队列、信号量、任务通知

@EFM32JG移植FreeRTOS

队列-Queue_t

作用
队列是为了任务与任务、任务与中断之间的通信而准备的,可以在任务与任务、任务与中断之间传递消息,队列中可以存储有限的、大小固定的数据项目。

储存机制
使用先入先出缓冲机制,也就是往队列发送数据的时候(也叫入队)永远都是发送到队列的尾部,而从队列提取数据的时候(也叫出队)是从队列的头部提取的。使用的是值传递,切记。

阻塞
当队列为空时会导致出队阻塞,当队列为满时会导致入队阻塞。

队列创建:
QueueHandle_t xQueueCreate(UBaseType_t uxQueueLength,
UBaseType_t uxItemSize) //队列项目数 每个项目的字节数

QueueHandle_t xQueueGenericCreate( const UBaseType_t uxQueueLength,
const UBaseType_t uxItemSize,
const uint8_t ucQueueType ) //队列项目数 每个项目的字节数 队列类型

队列创建函数分析:
1)申请队列所需内存。
2)队列结构体内存在前,紧跟在后面的就是消息存储区内存
3)调用函数 prvInitialiseNewQueue()来初始化队列
4)进一步调用了函数 xQueueGenericReset()来复位队列

在这里插入图片描述
使用分析
在使用队列传输串口数据时,使用队列,若创建1字节的队列项,则不能使用xQueueOverwriteFromISR()来进行入队,会卡死在如下代码中:

configASSERT( !( ( xCopyPosition == queueOVERWRITE ) && ( pxQueue->uxLength != 1 ) ) );

信号量-Queue_t

作用:
信号量常常用于控制对共享资源的访问和任务同步。。

二值信号量:

作用:
二值信号量通常用于互斥访问或同步

阻塞:
信号量 API 函数允许设置一个阻塞时间,阻塞时间是当任务获取信号量的时候,由于信号量无效从而导致任务进入阻塞态的最大时钟节拍数。如果多个任务同时阻塞在同一一个信号量上的话那么优先级最高的哪个任务优先获得信号量。

本质:
二值信号量其实就是一个只有一个队列项的队列,这个特殊的队列要么是满的,要么是空的,正好就是二值的。

二值信号量创建
1)函数 xSemaphoreCreateBinary(),创建好的二值信号量默认是空的。
2)创建了一个队列,队列长度为 1,队列项长度为 0
3)创建的队列是个没有存储区的队列, 使用队列是否为空来表示二值信号量,而队列是否为空可以通过队列结构体的成员变量 uxMessagesWaiting 来判断。

二值信号量释放
1)函数 xSemaphoreGive()
2)任务级释放信号量就是向队列发送消息的过程,只是这里并没有发送具体的消息
3)函数 xSemaphoreGiveFromISR():此函数只能用来释放二值信号量和计数型信号量,绝对不能用来在中断服务函数中释放互斥信号量! 因为互斥信号量涉及到优先级继
承的问题,而中断不属于任务,没法处理中断优先级继承。

二值信号量获取
1)函数 xSemaphoreTake(),获取信号量的过程其实就是读取队列的过程,只是这里并不是为了读取队列中的消息。

计数型信号量:

作用:
事件计数,初始值为0。
资源管理,0为没有资源,初始后定义资源总数,使用释放后资源加一

互斥信号量:

作用:
互斥信号量就是一个拥有优先级继承的二值信号量,只能用在任务中,不能用于中断服务函数。
当一个互斥信号量正在被一个低优先级的任务使用,而此时有个高优先级的任务也尝试获取这个互斥信号量的话就会被阻塞。不过这个高优先级的任务会将低优先级任务的优先级提升到与自己相同的优先级, 这个过程就是优先级继承。

任务通知:

实现
FreeRTOS 的每个任务都有一个 32 位的通知值,任务控制块中的成员变量 ulNotifiedValue就是这个通知值。

好处
使用任务通知来实现二值信号量功能的时候,解除任务阻塞的时间比直接使用二值信号量要快 45%

局限
1)FreeRTOS 的任务通知只能有一个接收任务,其实大多数的应用都是这种情况。
2)接收任务可以因为接收任务通知而进入阻塞态,但是发送任务不会因为任务通知发送失败而阻塞。

结语:很久没登录所以才发现还有一篇草稿没发送,目前FreeRTOS使用基本无问题,进一步有进一步的欣喜,感谢自己工作中也没有懈怠,不至于一直吃大学的老本,学习无止境,希望可以保持向上探索的热情。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值