获课》789it.top/14450/
FreeRTOS中的信号量和队列详解
FreeRTOS是一个开源的实时操作系统内核,广泛应用于嵌入式系统开发中。信号量和队列是FreeRTOS中两种重要的任务间通信与同步机制,它们在多任务环境中用于协调任务执行、保护共享资源以及实现任务间的数据传递。
一、信号量(Semaphore)
信号量是一种用于任务间同步和资源共享的机制,主要分为二进制信号量(Binary Semaphore)和计数信号量(Counting Semaphore)。
1. 二进制信号量(Binary Semaphore)
作用:
类似于互斥锁(Mutex),用于保护共享资源,确保同一时间只有一个任务可以访问该资源。
也可以用于任务间的简单同步,例如一个任务等待另一个任务发出信号。
特点:
只能取两个值:0(不可用)和1(可用)。
类似于一个“开关”,任务可以“取走”(P操作)或“释放”(V操作)信号量。
使用场景:
保护共享资源(如全局变量、硬件外设)。
任务同步(如一个任务等待另一个任务完成某项操作)。
API示例:
c
2. 计数信号量(Counting Semaphore)
作用:
用于管理多个相同类型的资源,例如一个系统中有多个硬件外设,任务可以请求使用其中一个。
特点:
可以取多个值(从0到最大值),表示可用资源的数量。
当任务请求资源时,信号量计数减1;当任务释放资源时,信号量计数加1。
使用场景:
管理多个相同类型的资源(如多个串口、多个定时器)。
事件计数(如统计某个事件发生的次数)。
API示例:
c
二、队列(Queue)
队列是一种任务间通信机制,用于在任务之间传递数据。队列可以存储固定数量的数据项,任务可以向队列中发送数据,也可以从队列中接收数据。
1. 队列的特点
FIFO(先进先出):数据按照发送的顺序存储和取出。
支持多任务:多个任务可以向同一个队列发送数据,也可以从同一个队列接收数据。
数据类型:队列可以存储任意类型的数据(通过指针传递)。
阻塞机制:任务可以设置为阻塞模式,等待队列中有数据时再接收。
2. 使用场景
任务间数据传递:一个任务将数据发送到队列,另一个任务从队列中接收数据。
事件通知:任务可以通过队列发送事件,其他任务通过接收事件来处理。
资源管理:队列可以用于管理多个相同类型的数据(如多个传感器数据)。
3. API示例
创建队列:
c
三、信号量与队列的区别
| 特性 | 信号量 | 队列 |
四、总结
信号量:
适用于任务同步和资源共享。
二进制信号量类似于互斥锁,用于保护共享资源。
计数信号量用于管理多个相同类型的资源。
队列:
适用于任务间数据传递。
可以存储任意类型的数据,支持多任务通信。
通过合理使用信号量和队列,开发者可以高效地实现任务间的同步和数据传递,从而构建出功能强大的多任务系统。