news 2026/4/23 16:20:09

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/4/23 16:06:11

py-xiaozhi语音助手:终极配置与使用指南

py-xiaozhi语音助手:终极配置与使用指南 【免费下载链接】py-xiaozhi python版本的小智ai,主要帮助那些没有硬件却想体验小智功能的人 项目地址: https://gitcode.com/gh_mirrors/py/py-xiaozhi 想要体验智能语音助手却苦于没有专用硬件设备&…

作者头像 李华
网站建设 2026/4/23 13:36:42

终极纯净音乐体验:铜钟音乐平台完全指南

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

作者头像 李华
网站建设 2026/4/23 13:39:11

7-Zip压缩工具终极指南:从入门到精通的10个核心技巧

7-Zip压缩工具终极指南:从入门到精通的10个核心技巧 【免费下载链接】7-Zip 7-Zip source code repository 项目地址: https://gitcode.com/gh_mirrors/7z/7-Zip 想要免费高效地管理电脑文件?7-Zip压缩工具是您不可错过的开源神器!作…

作者头像 李华
网站建设 2026/4/23 11:43:00

Stirling-PDF:打造本地化PDF处理的专业级解决方案

Stirling-PDF:打造本地化PDF处理的专业级解决方案 【免费下载链接】Stirling-PDF locally hosted web application that allows you to perform various operations on PDF files 项目地址: https://gitcode.com/gh_mirrors/st/Stirling-PDF 在数字化办公日益…

作者头像 李华
网站建设 2026/4/23 11:43:43

Qwen3-4B思维模型2507:256K上下文推理新升级

Qwen3-4B思维模型2507:256K上下文推理新升级 【免费下载链接】Qwen3-4B-Thinking-2507-GGUF 项目地址: https://ai.gitcode.com/hf_mirrors/unsloth/Qwen3-4B-Thinking-2507-GGUF 导语:阿里云推出Qwen3-4B-Thinking-2507大语言模型,实…

作者头像 李华