FreeRTOS_信号量_学习笔记

信号量的特性

消息队列用于传输多个数据,但是有时候我们只需要传递状态,这个状态值需要用一个数值表示。套用队列笔记中的流水线例子,可以理解为流水线上工件的数量。
信号:起通知作用
量:还可以用来表示资源的数量
当"量"没有限制时,它就是"计数型信号量"(Counting Semaphores)
当"量"只有0、1两个取值时,它就是"二进制信号量"(Binary Semaphores)
支持的动作:"give"给出资源,计数值加1;"take"获得资源,计数值减1。
在这里插入图片描述

队列信号量
数据存储可容纳多个数据。创建时要分配队列结构体和存储数据的空间只有计数值。创建时只需要分配信号量结构体
生产者没有空间存入时可以阻塞不阻塞,计数值最大时返回失败
消费者没有数据时可阻塞计数值最小时可阻塞

信号量分为二进制信号量和计数型信号量。二进制信号量初始值为0,计数型信号量的最大值不是1。

信号量函数

创建

 // 动态创建二进制信号量
SemaphoreHandle_t xSemaphoreCreateBinary( void );// 静态创建二进制信号量
SemaphoreHandle_t xSemaphoreCreateBinaryStatic( StaticSemaphore_t *pxSemaphoreBuffer );//动态创建计数型信号量
SemaphoreHandle_t xSemaphoreCreateCounting(UBaseType_t uxMaxCount, UBaseType_t uxInitialCount);
//静态创建计数型信号量
SemaphoreHandle_t xSemaphoreCreateCountingStatic( UBaseType_t uxMaxCount, UBaseType_t uxInitialCount, StaticSemaphore_t *pxSemaphoreBuffer );

删除

void vSemaphoreDelete( SemaphoreHandle_t xSemaphore );

存取

/*在任务中使用*/
BaseType_t xSemaphoreGive( SemaphoreHandle_t xSemaphore );
/*在中断中使用*/
BaseType_t xSemaphoreGiveFromISR(SemaphoreHandle_t xSemaphore,BaseType_t *pxHigherPriorityTaskWoken);

xSemaphore:信号量句柄
*pxHigherPriorityTaskWoken:如果在信号量操作中唤醒了一个更高优先级的任务,会被设置为 pdTRUE,否则为pdFALSE

/*在任务中使用*/
BaseType_t xSemaphoreTake(SemaphoreHandle_t xSemaphore,TickType_t xTicksToWait);
/*在中断中使用*/
BaseType_t xSemaphoreTakeFromISR(SemaphoreHandle_t xSemaphore,BaseType_t *pxHigherPriorityTaskWoken);

xTicksToWait:阻塞的时间

信号量实验

模拟车辆进站,假设车辆要有票才能同行,用一个信号量来模拟总共有多少票。当有票的时候,车拿走一张并开出,当其到达终点,就把票放回票仓,下一辆车再开出。

static SemaphoreHandle_t g_xSemTicks; 
static uint32_t g_xres, g_yres, g_bpp;
static uint8_t *g_framebuffer;
// 定义汽车结构体,包括位置和控制键
struct car {int x;int y;int control_key;
};
// 定义三辆汽车的初始位置和控制键
struct car g_cars[3] = {{0, 0, IR_KEY_1},{0, 17, IR_KEY_2},{0, 34, IR_KEY_3},
};
// 汽车图片的二进制数据
static const byte carImg[] = {0x40,0xF8,0xEC,0x2C,0x2C,0x38,0xF0,0x10,0xD0,0x30,0xE8,0x4C,0x4C,0x9C,0xF0,0x02,0x1F,0x37,0x34,0x34,0x1C,0x0F,0x08,0x0B,0x0C,0x17,0x32,0x32,0x39,0x0F,
};
// 清除区域的图像数据,用于隐藏汽车
static const byte clearImg[30] = {0};
// 显示汽车
static void ShowCar(struct car *pcar)
{draw_bitmap(pcar->x, pcar->y, carImg, 15, 16, false, 0);draw_flushArea(pcar->x, pcar->y, 15, 16);
}
// 隐藏汽车
static void HideCar(struct car *pcar)
{draw_bitmap(pcar->x, pcar->y, clearImg, 15, 16, false, 0);draw_flushArea(pcar->x, pcar->y, 15, 16);
}// 每辆汽车的任务
static void CarTask(void *params)
{struct car *pcar = params;// 任务开始时等待信号量,以同步启动所有车辆xSemaphoreTake(g_xSemTicks, portMAX_DELAY);while (1){if (pcar->x < g_xres - CAR_LENGTH){HideCar(pcar);  // 隐藏汽车以更新位置// 更新汽车位置pcar->x += 1;ShowCar(pcar);  // 显示新位置的汽车vTaskDelay(50); // 控制更新频率if (pcar->x == g_xres - CAR_LENGTH){xSemaphoreGive(g_xSemTicks); // 到达屏幕边缘时释放信号量并结束任务vTaskDelete(NULL);}}}
}
// 主游戏函数,初始化并启动任务
void car_game(void)
{g_framebuffer = LCD_GetFrameBuffer(&g_xres, &g_yres, &g_bpp);draw_init();draw_end();// 创建信号量,开始计数为2,最大计数为3g_xSemTicks = xSemaphoreCreateCounting(3, 2);// 创建每辆汽车的任务xTaskCreate(CarTask, "car1", 128, &g_cars[0], osPriorityNormal, NULL);xTaskCreate(CarTask, "car2", 128, &g_cars[1], osPriorityNormal, NULL);xTaskCreate(CarTask, "car3", 128, &g_cars[2], osPriorityNormal, NULL);	
}

可以通过改变g_xSemTicks = xSemaphoreCreateCounting(3, 2);的参数,来改变有多少张票。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/18308.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

打印机手动双面打印技巧

一、WORD和PDF &#xff08;1&#xff09;首先选择要打印的页面范围&#xff0c;然后选择仅奇数页打印 &#xff08;2&#xff09;将打印完的纸张翻过来&#xff0c;白纸朝上&#xff0c;纸张的头部先放入打印机 &#xff08;3&#xff09;选择要打印的页面范围&#xff0c;然…

大模型部署_书生浦语大模型 _作业2

本节课可以让同学们实践 4 个主要内容&#xff0c;分别是&#xff1a; 1、部署 InternLM2-Chat-1.8B 模型进行智能对话 1.1安装依赖库&#xff1a; pip install huggingface-hub0.17.3 pip install transformers4.34 pip install psutil5.9.8 pip install accelerate0.24.1…

Elasticsearch之文本分析

文本分析基本概念 官网&#xff1a;Text analysis | Elasticsearch Guide [7.17] | Elastic 官网称为文本分析&#xff0c;这是对文本进行一直分析处理的方式&#xff0c;基本处理逻辑是为按照预先制定的分词规则&#xff0c;把原本的文档进行分割成多个小颗粒度的词项&#x…

如何给出好的“文言一心”指令?

一、文言一心是什么&#xff1f; 在现代技术背景下&#xff0c;“文言一心”还是百度公司创建的一款大语言模型。这款模型基于飞桨深度学习平台和文心知识增强大模型&#xff0c;并拥有强大的中文语料库&#xff0c;可以理解和生成富含文化内涵和哲理的文本内容。其核心技术架构…

社区医院|基于SprinBoot+vue的社区医院管理服务系统(源码+数据库+文档)

社区医院管理服务系统 目录 基于SprinBootvue的社区医院管理服务系统 一、前言 二、系统设计 三、系统功能设计 1系统功能模块 2管理员功能模块 3用户功能模块 4医生功能模块 四、数据库设计 五、核心代码 六、论文参考 七、最新计算机毕设选题推荐 八、源码获取…

看花眼,眼花缭乱的主食冻干到底应该怎么选?靠谱的主食冻干分享

随着科学养猫知识的普及&#xff0c;主食冻干喂养越来越受到养猫人的青睐。主食冻干不仅符合猫咪的饮食天性&#xff0c;还能提供均衡的营养&#xff0c;有助于维护猫咪的口腔和消化系统健康。许多猫主人认识到了主食冻干喂养的诸多益处&#xff0c;计划尝试这种喂养方式&#…

C++面向对象程序设计 - 标准输出流

在C中&#xff0c;标准输出流通常指的是与标准输出设备&#xff08;通常是终端或控制台&#xff09;相关联的流对象。这个流对象在C标准库中被定义为std::cout、std::err、std::clog&#xff0c;它们是std::ostream类的一个实例。 一、cout&#xff0c;cerr和clog流 ostream类…

echarts(6大基础图表)的使用

目录 一、vue2挂载 二、柱状图 2.1、基础柱状图介绍 2.2、标记&#xff1a;最大值\最小值(markPoint)、平均值(markLine) 2.3、显示&#xff1a;数值显示(label)、柱子宽度(barWidth)、横向柱状图 三、折线图 3.1、标记&#xff1a;最大值\最小值(markPoint)、平均值(ma…

android11禁止进入屏保和自动休眠

应某些客户要求&#xff0c;关闭了开机进入屏保&#xff0c;一段时间会休眠的问题。以下diff可供参考&#xff1a; diff --git a/overlay/frameworks/base/packages/SettingsProvider/res/values/defaults.xml b/overlay/frameworks/base/packages/SettingsProvider/res/value…

常见5大开发进度盲点问题及解决方案

在软件开发项目中&#xff0c;识别并解决常见的进度管理盲点问题&#xff0c;对于确保项目按时、按预算、高质量完成至关重要。它直接关系到项目能否顺利进行&#xff0c;忽视任何一个问题&#xff0c;都可能导致项目延期、成本超支、质量下降&#xff0c;甚至项目失败。 因此&…

香橙派华为昇腾CANN架构编译opencv4.9

香橙派华为升腾AI盒子 为啥要编译opencv4.9.0&#xff0c; 因为在4.9.0 中增加了华为昇腾CANN的外接开发库&#xff0c;下图为盒子外观&#xff0c;此次一接到这个盒子&#xff0c;立刻开始开箱操作&#xff0c;首先就是要编译opencv4.9&#xff0c;以前在香橙派3588 的盒子中…

大模型应用:LLM基本原理及应用场景

1.背景 23年以来&#xff0c;随着OpenAI公司的ChatGPT横空出世&#xff0c;大模型一词开始火爆全球。国内外以OpenAI、Google、百度、阿里、字节等大厂为代表&#xff0c;相继推出一系列大模型及其应用&#xff0c;涉及社交、问答、代码助手等多个方面。 目前主流的大模型及产…

Echarts - 多个页面内有N个 echarts 图表,封装组件 CommonEcharts 快捷实现

目录 子组件父组件使用注意 option 文件效果展示相关数据处理&#xff08;代码备份 - 可不看&#xff09;数据处理后页面展示 子组件 CommonEcharts.vue <template><div><div v-for"id in domId" :id"id" :key"id" class"…

go select

select 是与 switch 相似的控制结构&#xff0c;与 switch 不同的是&#xff0c;select 中虽然也有多个 case&#xff0c;但是这些 case 中的表达式必须都是 channel 的收发操作。 select 能够让 goroutine 同时等待多个 channel 可读或者可写&#xff0c;在多个 channel 状态改…

章十五、Maven —— Maven 简介、Maven 开发环境搭建、命令、打包案例

一、 Maven 简介 Maven 是 Apache 软件基金会的一个开源项目&#xff0c;是一个优秀的项目构建工具&#xff0c;它用来帮助开发者管理项目中的 jar&#xff0c;以及 jar 之间的依赖关系&#xff08;在A.jar文件中用到了B.jar&#xff09;、完成项目的编译&#xff08;.java -&g…

Compose Button移除水波纹效果

一、背景 在使用Compose实现Button按钮时&#xff0c;设计要求移除按钮的水波纹效果&#xff0c;只保留按压效果&#xff0c;经查Compose1.4.3版本中&#xff0c;并没有直接移除水波纹的能力 二、遇到问题 经过多次尝试&#xff0c;使用Compose的Button组件始终无法实现目标效…

html通过数据改变,图片跟着改变

改变前 改变后 通过数据来控制样式展示 <template><div>通过num控制图标是否更改{{num}}<div class"box"><!-- 如果num大于1则是另一种&#xff0c;样式&#xff0c;如果小时1&#xff0c;则是另一种样式 --><div class"item&qu…

小阿轩yx-Shell 编程之循环语句与函数

小阿轩yx-Shell 编程之循环语句与函数 for 循环语句 可以很好地解决顺序编写异常烦琐、困难重重的全部代码 &#xff08;&#xff09;{}&#xff1a;里边写的都是命令 &#xff09;&#xff1a;不能嵌套 $&#xff08;&#xff09;&#xff1a;可以嵌套&#xff0c;适合更…

2-Django项目进阶--继续学生管理系统

目录 项目框架: urls.py views.py modules.py class_data.html add_and_modify.html add_stu.html 笔记: 继承语法 模板继承总结&#xff1a; 班级添加 add_and_modify.html 修改添加公用一个页面即可 views.py 班级修改 views.py url.py 班级删除 views.py…

boost asio异步服务器(2)实现伪闭包延长连接生命周期

闭包 在函数内部实现一个子函数&#xff0c;子函数的作用域内能访问外部函数的局部变量。闭包就是能够读取其他函数内部变量。但是由于闭包会使得函数中的变量都被保存在内存中&#xff0c;内存消耗很大&#xff0c;所以不能滥用闭包&#xff0c;否则会造成程的性能问题&#x…