文章目录
一、信号量的简介
在 FreeRTOS 中,信号量(Semaphore)是一种用于任务间同步和资源管理的核心机制,主要用于控制对共享资源的访问、任务间的通信以及事件通知。信号量是队列的衍生,队列是传输数据,信号量是传输状态。FreeRTOS 提供了多种信号量类型,每种适用于不同的场景。下面详细介绍 FreeRTOS 信号量的类型、使用方法和典型应用。
二、信号量的类型
1.1.二值信号量(Binary Semaphore)
- 行为:类似一个标志位,只有 0 和 1 两种状态
- 用途:任务同步(如中断服务程序 ISR 通知任务);简单的互斥访问(但优先级反转问题需谨慎处理)
- 特点:不可递归获取(同一任务重复获取会死锁);通常用于事件通知而非资源计数。
1.2.计数信号量(Counting Semaphore)
- 行为:允许信号量值大于 1,表示可用资源的数量
- 用途:管理有限数量的资源(如缓冲区池、连接池);事件分组(记录多个事件的发生次数)
- 特点:初始值可设为最大资源数;获取信号量时值减 1,释放时加 1
1.3.互斥信号量(Mutex Semaphore)
- 行为:特殊的二进制信号量,支持优先级继承(Priority Inheritance)机制
- 用途:保护共享资源,防止多任务同时访问(如全局变量、外设)
- 特点:同一任务可递归获取(避免自死锁);解决优先级反转问题(低优先级任务持有锁时,临时提升其优先级)
1.4.递归互斥信号量(Recursive Mutex)
- 行为:允许同一任务多次获取同一互斥锁,需相同次数释放
- 用途:递归函数或嵌套调用中保护资源
- 特点:仅由获取锁的任务释放,避免其他任务误操作
三、信号量与队列的对比
| 队列 | 信号量 |
|---|---|
| 可以容纳多个数据;创建队列有两部分内存:队列结构体 + 队列项存储空间 | 仅存放计数值,无法存放其他数据;创建信号量,只需分配信号量结构体 |
| 写入队列:当队列满时,可阻塞 | 释放信号量:不可阻塞,计数值++;当计数值为最大时,返回失败 |
| 读取队列:当队列为空时,可阻塞 | 获取信号量:计数值–;当没有资源时,可阻塞 |
1191

被折叠的 条评论
为什么被折叠?



