news 2026/6/15 18:49:29

FreeRTOS学习笔记(9)

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
FreeRTOS学习笔记(9)

消息量

信号量本质上是一个特殊的队列,但是它内部是一个计数装置,通过计数来表明程序的状态,可以理解成一个状态机,

信号量是FreeRTOS中用于"计数"和"同步"的工具,主要解决:1个资源多个任务抢的问题,和1个事件多个任务等的问题。

信号量的使用主要分为创建,读取,释放三个步骤,此外还有一个删除操作

创建信号量

使用信号量之前,要先创建,得到一个句柄;使用信号量时,要使用句柄来表明使用哪个信号量。 对于二进制信号量、计数型信号量,它们的创建函数不一样:

具体的信号量还分为二进制信号量,和计数信号量

他两个大致的区别就是,二进制初始数据只能是1,技术型可以自己设定

此外还有动态和静态之分,动态和静态的区别前面已经说过

这个里就直接搬运韦老师的代码了

/* 创建一个二进制信号量,返回它的句柄。 * 此函数内部会分配信号量结构体 * 返回值: 返回句柄,非NULL表示成功 */ SemaphoreHandle_t xSemaphoreCreateBinary( void ); /* 创建一个二进制信号量,返回它的句柄。 * 此函数无需动态分配内存,所以需要先有一个StaticSemaphore_t结构体,并传入它的指针 * 返回值: 返回句柄,非NULL表示成功 */ SemaphoreHandle_t xSemaphoreCreateBinaryStatic( StaticSemaphore_t *pxSemaphoreBuffer ); 创建计数型信号量的函数原型如下: /* 创建一个计数型信号量,返回它的句柄。 * 此函数内部会分配信号量结构体 * uxMaxCount: 最大计数值 * uxInitialCount: 初始计数值 * 返回值: 返回句柄,非NULL表示成功 */ SemaphoreHandle_t xSemaphoreCreateCounting(UBaseType_t uxMaxCount, UBaseType_t uxInitialCount); /* 创建一个计数型信号量,返回它的句柄。 * 此函数无需动态分配内存,所以需要先有一个StaticSemaphore_t结构体,并传入它的指针 * uxMaxCount: 最大计数值 * uxInitialCount: 初始计数值 * pxSemaphoreBuffer: StaticSemaphore_t结构体指针 * 返回值: 返回句柄,非NULL表示成功 */ SemaphoreHandle_t xSemaphoreCreateCountingStatic( UBaseType_t uxMaxCount, UBaseType_t uxInitialCount, StaticSemaphore_t *pxSemaphoreBuffer );

然后是读取函数,这个函数有任务中和中断中两种

在任务中使用在ISR中使用
givexSemaphoreGivexSemaphoreGiveFromISR

xSemaphoreGive的函数原型如下:

BaseType_t xSemaphoreGive( SemaphoreHandle_t xSemaphore );

xSemaphoreGive函数的参数与返回值列表如下:

参数说明
xSemaphore信号量句柄,释放哪个信号量
返回值pdTRUE表示成功, 如果二进制信号量的计数值已经是1,再次调用此函数则返回失败; 如果计数型信号量的计数值已经是最大值,再次调用此函数则返回失败

pxHigherPriorityTaskWoken的函数原型如下:

BaseType_t xSemaphoreGiveFromISR( SemaphoreHandle_t xSemaphore, BaseType_t *pxHigherPriorityTaskWoken );

xSemaphoreGiveFromISR函数的参数与返回值列表如下:

参数说明
xSemaphore信号量句柄,释放哪个信号量
pxHigherPriorityTaskWoken如果释放信号量导致更高优先级的任务变为了就绪态, 则*pxHigherPriorityTaskWoken = pdTRUE
返回值pdTRUE表示成功, 如果二进制信号量的计数值已经是1,再次调用此函数则返回失败; 如果计数型信号量的计数值已经是最大值,再次调用此函数则返回失败

然后是释放

xSemaphoreTake的函数原型如下:

BaseType_t xSemaphoreTake( SemaphoreHandle_t xSemaphore, TickType_t xTicksToWait );

xSemaphoreTake函数的参数与返回值列表如下:

参数说明
xSemaphore信号量句柄,获取哪个信号量
xTicksToWait如果无法马上获得信号量,阻塞一会: 0:不阻塞,马上返回 portMAX_DELAY: 一直阻塞直到成功 其他值: 阻塞的Tick个数,可以使用*pdMS_TO_TICKS()*来指定阻塞时间为若干ms
返回值pdTRUE表示成功

xSemaphoreTakeFromISR的函数原型如下:

BaseType_t xSemaphoreTakeFromISR( SemaphoreHandle_t xSemaphore, BaseType_t *pxHigherPriorityTaskWoken );

xSemaphoreTakeFromISR函数的参数与返回值列表如下:

参数说明
xSemaphore信号量句柄,获取哪个信号量
pxHigherPriorityTaskWoken如果获取信号量导致更高优先级的任务变为了就绪态, 则*pxHigherPriorityTaskWoken = pdTRUE
返回值pdTRUE表示成功

最后是删除操作

对于动态创建的信号量,不再需要它们时,可以删除它们以回收内存。

vSemaphoreDelete可以用来删除二进制信号量、计数型信号量,函数原型如下:

/* * xSemaphore: 信号量句柄,你要删除哪个信号量 */ void vSemaphoreDelete( SemaphoreHandle_t xSemaphore );

然后我来给大家将几点注意事项

1.如果你的代码不是事先用CUBEMX生成好的信号量,那么你就需要引用

#include "semphr.h"

头文件

2.一定有释放要不然又溢出风险,这种一般是不会编译报错的,但是运行不出来结果

然后我们在使用信号量可能会出现优先级反转的问题,简单来说,就是低优先级的任务运行比高优先级的任务高,这个原因就是因为,信号量的权限一直在低优先级手里,也就是低优先级没有释放信号量造成的,

大概如图所示

要想完美解决这个问题就要使用到互斥量

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/15 11:49:37

从Hadoop到Spark:大数据隐私保护技术演进史

从Hadoop到Spark:大数据隐私保护技术演进史 关键词:大数据隐私保护、Hadoop、Spark、数据脱敏、差分隐私、同态加密、访问控制 摘要:本文深入探讨了大数据处理框架从Hadoop到Spark演进过程中隐私保护技术的发展历程。文章首先介绍大数据生态系统的演变背景,然后详细分析各阶…

作者头像 李华
网站建设 2026/6/15 11:50:26

StretchSense获230万美元融资,推动XR训练手套全球扩张

StretchSense获230万美元融资,推动XR训练手套全球扩张 可穿戴技术公司StretchSense已成功筹集230万美元资金,本轮融资由PXN Ventures领投,某机构提供支持。该公司目前已通过三轮外部融资筹集了总计近2000万美元。 StretchSense成立于2012年&a…

作者头像 李华
网站建设 2026/6/15 12:53:09

2024最新大数据架构趋势:云原生与湖仓一体实战指南

2024大数据架构趋势深度解析:云原生与湖仓一体实战指南 一、引言:为什么说“云原生湖仓一体”是2024大数据的“必选项”? 1.1 一个真实的痛点:企业数据架构的“两难困境” 某零售企业的技术负责人最近很头疼: 数据分散…

作者头像 李华
网站建设 2026/6/15 13:50:38

大数据领域中 RabbitMQ 的消息压缩技术

大数据场景下RabbitMQ消息压缩实战:从原理到落地的全攻略 摘要/引言 在大数据时代,高吞吐量、大体积消息已成为RabbitMQ的常见挑战:比如电商系统的交易日志(每条10KB+)、物联网的传感器数据(每秒10万条)、数据同步中的全量备份(单条100KB+)。这些场景下,未压缩的消…

作者头像 李华
网站建设 2026/6/15 13:50:55

2. 训练 vs 推理:真正烧钱的是哪一步

作者:HOS(安全风信子) 日期:2026-01-17 来源平台:GitHub 摘要: 2026年,AI行业的成本结构已经发生根本性转变。本文通过云厂商真实数据揭示,推理的累计成本已超过训练10倍以上,成为真正烧钱的环节…

作者头像 李华
网站建设 2026/6/15 17:55:01

5. vLLM 出现前的推理地狱

作者:HOS(安全风信子) 日期:2026-01-17 来源平台:GitHub 摘要: 2023年vLLM出现之前,大模型推理面临着显存碎片化、低效调度和高延迟等诸多挑战,被称为"推理地狱"。本文通过回顾pre-vLLM时代的痛点…

作者头像 李华