首页
学习
活动
专区
圈层
工具
发布

深入浅出FreeRTOS:从基础概念到项目实战的全面指南

获课》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

三、信号量与队列的区别

| 特性 | 信号量 | 队列 |

四、总结

信号量

适用于任务同步和资源共享。

二进制信号量类似于互斥锁,用于保护共享资源。

计数信号量用于管理多个相同类型的资源。

队列

适用于任务间数据传递。

可以存储任意类型的数据,支持多任务通信。

通过合理使用信号量和队列,开发者可以高效地实现任务间的同步和数据传递,从而构建出功能强大的多任务系统。

  • 发表于:
  • 原文链接https://page.om.qq.com/page/OK19lPmtQmfjs7QhE3aqYD5Q0
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。
领券