news 2026/9/30 14:15:28

5.2 信号量(Semaphore)

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
5.2 信号量(Semaphore)

5.2 信号量(Semaphore)

5.2.1 信号量的抽象本质与同步哲学

在并发编程理论中,信号量由艾兹赫尔·戴克斯特拉于1965年提出,是一种用于控制多个执行实体对共享资源访问,或用于同步彼此操作的通用同步原语。FreeRTOS中的信号量严格遵循了这一经典定义,其本质是一个受内核保护的整型计数器,并配有两个原子操作:xSemaphoreTake(P操作,或wait)用于尝试减少计数,xSemaphoreGive(V操作,或signal)用于增加计数。

信号量的值与操作规则构成了其同步逻辑的核心:

  • xSemaphoreTake:当任务调用此API时,内核检查信号量的计数值。如果值大于0,则将其减1,任务继续执行(称为“获取”信号量成功)。如果值等于0,则任务可以选择阻塞等待,直到其他实体执行xSemaphoreGive使计数值变为正数。
  • xSemaphoreGive:此操作将信号量的计数值加1。如果此时有任务正因等待此信号量而阻塞,则内核会将其中的一个任务(通常是优先级最高的)解除阻塞,使其得以完成之前的Take操作(计数值随之被该任务减1)。

与之前介绍的队列(主要用于传递数据)不同,信号量的核心目的是传递“事件”或“权限”。数据本身通常不通过信号量携带;信号量的“给予”操作本身就是一个事件,其“获取”操作是对该事件的等待。这种机制将任务间的协作从“数据流”层面提升到了“控制流”层面,是构建复杂同步关系的基石。

FreeRTOS实现了两种主要的信号量:二进制信号量和计数信号量。两者共享相同的Take/GiveAPI,但其内部计数器的上限和典型用途有本质区别。

5.2.2 二进制信号量:事件通知与互斥的利器

二进制信号量可以看作是计数信号量的一种特例,其计数值被约束在0和1之间。因此,它最多只能记录一个“事件”或保存一个“权限”。

1. 事件通知:解耦任务与中断
这是二进制信号量最经典的应用。用于在中断服务程序(ISR)与任务之间传递一个事件发生的信号,实现“中断延迟处理”。

// 场景:UART接收完成中断通知处理任务SemaphoreHandle_t xUartRxSemaphore;voidvUART_ISR(void){BaseType_t xHigherPriorityTaskWoken=pdFALSE;// ... 读取数据到缓冲区 ...// 给予信号量,通知任务xSemaphoreGiveFromISR(xUartRxSemaphore,&xHigherPriorityTaskWoken);portYIELD_FROM_ISR(xHigherPriorityTaskWoken);}voidvUartProcessTask(void*pvParameters){for(;;){// 阻塞等待信号量(事件)if(xSemaphoreTake(xUartRxSemaphore,portMAX_DELAY)==pdTRUE){// 信号量到来,处理接收缓冲区中的数据vProcessUartData();}}}

优势:与在ISR中直接处理数据相比,这种方式将耗时的数据处理工作移到了任务上下文,极大缩短了ISR的执行时间,提升了系统对其它中断的响应能力。同时,任务可以等待并处理多个不同来源的事件,结构清晰。

2. 同步任务执行顺序
二进制信号量可用于确保两个或多个任务按特定顺序执行,构成一个简单的“汇合点”。

// 场景:任务B必须等待任务A完成初始化后才能运行SemaphoreHandle_t xInitSemaphore=NULL;// 初始为NULL,表示“事件未发生”voidvTaskA(void*pvParameters){vPerformCriticalInit()
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/26 9:42:11

SenseVoice Small实战:构建多语言语音转录服务

SenseVoice Small实战:构建多语言语音转录服务 1. 引言 随着人工智能技术的不断演进,语音识别已从单一文本转录发展为融合语义理解、情感分析与事件检测的综合感知系统。在这一背景下,SenseVoice Small 凭借其轻量化架构和强大的多语言支持…

作者头像 李华
网站建设 2026/9/30 11:18:45

Kotaemon安全评估:云端隔离环境,测试更放心

Kotaemon安全评估:云端隔离环境,测试更放心 在金融行业,数据安全和系统稳定性是压倒一切的优先事项。当一家金融机构需要对一个新兴的AI工具——比如Kotaemon进行安全性评估时,他们面临的核心挑战不是“能不能用”,而…

作者头像 李华
网站建设 2026/9/26 19:46:03

Qwen-Image-Edit-Rapid-AIO:零基础10分钟上手AI绘图神器

Qwen-Image-Edit-Rapid-AIO:零基础10分钟上手AI绘图神器 【免费下载链接】Qwen-Image-Edit-Rapid-AIO 项目地址: https://ai.gitcode.com/hf_mirrors/Phr00t/Qwen-Image-Edit-Rapid-AIO 还在为复杂的AI绘图工具发愁吗?Qwen-Image-Edit-Rapid-AIO…

作者头像 李华
网站建设 2026/9/30 14:05:47

Open Interpreter代码生成评测:3种模型云端对比体验

Open Interpreter代码生成评测:3种模型云端对比体验 你是否也遇到过这样的困扰:想测试不同AI模型在代码生成任务中的表现,但每次切换模型都要重新配置环境、安装依赖、调试参数,费时又费力?尤其是当你要对比像Open In…

作者头像 李华
网站建设 2026/9/28 17:11:35

铜钟音乐:打造纯粹听觉体验的终极指南

铜钟音乐:打造纯粹听觉体验的终极指南 【免费下载链接】tonzhon-music 铜钟 (Tonzhon.com): 免费听歌; 没有直播, 社交, 广告, 干扰; 简洁纯粹, 资源丰富, 体验独特!(密码重置功能已回归) 项目地址: https://gitcode.com/GitHub_Trending/to/tonzhon-m…

作者头像 李华
网站建设 2026/9/27 10:50:27

智能相册开发实录:基于DamoFD的自动分类系统搭建

智能相册开发实录:基于DamoFD的自动分类系统搭建 你是不是也遇到过这样的烦恼:手机里成千上万张照片,想找某个人的合影得翻半天?朋友聚会、家庭出游、工作留念……时间一长,照片越积越多,管理起来越来越难…

作者头像 李华