当前位置: 首页 > news >正文

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.一定有释放要不然又溢出风险,这种一般是不会编译报错的,但是运行不出来结果

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

大概如图所示

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

http://www.jsqmd.com/news/264008/

相关文章:

  • 【毕业设计】基于springboot的4s店车辆管理系统(源码+文档+远程调试,全bao定制等)
  • 小程序毕设选题推荐:基于SpringBoot+微信小程序高考考试刷题系统基于springboot+微信小程序的公考宝典小程序【附源码、mysql、文档、调试+代码讲解+全bao等】
  • 为什么手机越用越卡?原来是这 3 个地方在拖后腿
  • 一文搞懂AI核心:预训练、微调与LLaMA-Factory Online高效实践
  • 气球数据集1155张VOC+YOLO格式
  • 互联网大厂Java求职面试:从Spring框架到微服务架构的技术点解析
  • 学长亲荐!10款AI论文网站测评:本科生毕业论文必备工具
  • 强烈安利10个AI论文平台,助你轻松搞定本科生论文!
  • 气球数据集1136张VOC+YOLO格式
  • 【毕业设计】基于springboot+微信小程序的公考宝典小程序(源码+文档+远程调试,全bao定制等)
  • 微信小程序毕设项目推荐-基于spirngboot和微信小程序实现公考上岸通系统基于springboot+微信小程序的公考宝典小程序【附源码+文档,调试定制服务】
  • 轻松入门SpringAI-SpringAI调用Ollama
  • 气球数据集2291张VOC+YOLO格式
  • 从Hadoop到Spark:大数据隐私保护技术演进史
  • 2026二手房翻新全攻略:靠谱公司大揭秘 - 品牌测评鉴赏家
  • Java毕设项目推荐-基于springboot的4s店车辆管理系统基于vue的4s店车辆库存销售运营管理系统【附源码+文档,调试定制服务】
  • 轻松入门SpringAI-SpringAI Alibaba实战
  • 老房翻新大揭秘!2026教你揪出最专业的装修公司 - 品牌测评鉴赏家
  • 轻松入门SpringAI-Spring AI的其他模型
  • 计算机加域后使用命令重命名计算机名称
  • Splat-Nav:首个基于 3D 高斯溅射地图的安全实时导航框架 - MKT
  • 轻松入门SpringAI-SpringAI实现RAG
  • Java毕设选题推荐:基于springboot的4s店车辆管理系统车辆信息、销售、维修等管理【附源码、mysql、文档、调试+代码讲解+全bao等】
  • 边缘到云:数据不是“搬家”,而是一场精打细算的流动博弈
  • 苹果修复了iOS平台中两个被定向攻击利用的零日漏洞
  • 【剑斩OFFER】算法的暴力美学——LeetCode 200 题:岛屿数量
  • Python+Vue的 林海生态园自动销售门票管理系统 django Pycharm flask
  • 2026新房装修不踩坑!超靠谱装修公司大揭秘 - 品牌测评鉴赏家
  • 腾讯云海外服务器装东西卡顿/有问题处理方案,把腾讯云镜像删除
  • 丑数不丑——从一个简单定义,看清“有序生成”这件大事