FreeRTOS【8】二值信号量使用

1.开发背景

       FreeRTOS 提供了队列可以在线程间快速交换信息,那么还有没有其他交互渠道?答案是有的,相对于队列传递信息,还有更轻量级的线程唤醒操作,那就是信号量,而二值信号量就是最简单的一种。

        二值信号量就是二进制的 0 和 1,或者是 bool 类型的 true 和 false,二值信号量代替了传统编程中的循环等待。

2.开发需求

        设计实验:

        1)接收线程一直等待信号量唤醒;

        2)发送线程发送信号量;

        3)按键中断发送信号量;

3.开发环境

        window10 + MDK + STM32F429 + FreeRTOS10.3.1

4.实现步骤

4.1 实现编码

#include "appTest.h"#include <stdio.h>
#include <string.h>
#include <stdlib.h>#include "mspDwt.h"
#include "mspGpio.h"
#include "mspExti.h"#include "FreeRTOS.h"
#include "task.h"
#include "queue.h"#include "appLog.h"typedef struct
{/* 信号量 */SemaphoreHandle_t signal;       // 队列句柄/* 创建任务 */TaskHandle_t taskRx;       // 接收线程TaskHandle_t taskTx;       // 发送线程}Ctrl_t;/* 文件指针 */
static Ctrl_t s_ctrl = {0};
static Ctrl_t *p = &s_ctrl;
static void TaskRx(void *pvParameters);
static void TaskTx(void *pvParameters);/* 接收线程 */
static void TaskRx(void *pvParameters)
{vTaskDelay(100);for ( ; ; ){xSemaphoreTake(p->signal, portMAX_DELAY);Log_Debug("%s 线程接收信号量\r\n", __func__);}
}/* 发送线程 */
static void TaskTx(void *pvParameters)
{vTaskDelay(1000);xSemaphoreGive(p->signal);Log_Debug("%s 线程发送信号量\r\n", __func__);for ( ; ; ){vTaskDelay(1000);}
}/* 测试初始化 */
void aTest_Init(void)
{/* 创建二值信号量 */p->signal = xSemaphoreCreateBinary();/* 创建动态任务 */xTaskCreate(TaskRx, "TaskRx",  500, NULL, 5, &p->taskRx);xTaskCreate(TaskTx, "TaskTx",  500, NULL, 5, &p->taskTx);
}/* Key2 PC13   Key0 PH3 Key1 PH2 */
void Exti13_TriggerInterrupt(void)
{mspExti_Close(13);if (mspGpio_GetInput("PC13") == 0){/* 队列发送数据 */BaseType_t xHigherPriorityTaskWoken;xSemaphoreGiveFromISR(p->signal, &xHigherPriorityTaskWoken);portYIELD_FROM_ISR(xHigherPriorityTaskWoken);Log_Debug("%s 中断发送信号量\r\n", __func__);}
}

4.2 结果显示

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

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

相关文章

解读一下15.52.34.160/27

IP地址15.52.34.160/27可以分解为两部分来解读&#xff1a; IP地址: 15.52.34.160 这是分配给网络接口的地址&#xff0c;用于在网络中标识一个特定的设备。 子网掩码: /27 这表示子网掩码是27位长&#xff0c;意味着网络部分占据了IP地址的前27位&#xff0c;剩下的5位用于主…

C++模拟实现stack和queue

1 stack 1.1概念 stl栈 1.2栈概念 1.3代码 2 queue 2.1概念 stl队列 2.2队列概念 2.3代码

【python】实用性python脚本链接汇总

目标检测方向–python脚本 标签处理 链接备注基于YOLO目标检测任务相关将一张labelImg图片标注的xml标签文件检测框复制到其他图片目标检测任务的VOC标签&#xff0c;可复制xml修改目标检测的xml标签(VOC)类别名目标检测任务的VOC标签&#xff0c;修改标签文件的类别名称(nam…

网上打印资料A4纸一般多少钱一张

我们知道&#xff0c;在打印需求上A4纸&#xff08;210mmx297mm&#xff09;是较为常见的打印用纸&#xff0c;同时因为纸张的不同在价格上也存在一定的差异。当然&#xff0c;因在网上打印平台打印资料&#xff0c;能够降低一定的租金个人工成本。 因此&#xff0c;在网上打印…

Swift 中的Getter 和 Setter

目录 前言 1. 什么是Getter和Setter 1.定义 2.作用 2.属性 1.存储属性 2.计算属性 3.属性观察者 3. 使用 Getter 和 Setter 的场景 1.数据转换 2.懒加载 3.数据验证和限制 4.触发相关操作 4.自定义Getter 和 Setter 5. 参考资料 前言 属性是 Swift 编程中的基本…

关于 Spring 是什么

Spring 是什么 我们通常所说的 Spring 指的是 Spring Framework&#xff08;Spring 框架&#xff09;&#xff0c;它是⼀个开源框架&#xff0c;有着活跃⽽庞⼤的社区&#xff0c;这就是它之所以能⻓久不衰的原因。Spring ⽀持⼴泛的应⽤场景&#xff0c;它可以让 Java 企业级的…

九章云极DataCanvas公司DingoDB完成中国信通院权威多模数据库测试

2024年5月16日&#xff0c;九章云极DataCanvas公司自主研发和设计的开源多模向量数据库DingoDB顺利完成中国信息通信研究院&#xff08;以下简称中国信通院&#xff09;多模数据库产品测试。本次测试的成功标志着DingoDB在技术能力、性能表现和产品稳定性方面得到了权威机构的高…

python深入探索斐波那契数列:代码示例与不满足的外围条件

新书上架~&#x1f447;全国包邮奥~ python实用小工具开发教程http://pythontoolsteach.com/3 欢迎关注我&#x1f446;&#xff0c;收藏下次不迷路┗|&#xff40;O′|┛ 嗷~~ 目录 一、斐波那契数列的初步实现 二、外围条件的不满足情况 总结 一、斐波那契数列的初步实现 …

Presto 从提交SQL到获取结果 源码详解(2)

逻辑执行计划&#xff1a; //进入逻辑执行计划阶段 doAnalyzeQuery().new LogicalPlanner().plan(analysis);//createAnalyzePlan createAnalyzePlan(analysis, (Analyze) statement);//返回RelationPlan&#xff0c;&#xff08;返回root根节点&#xff0c;逻辑树上包含输出字…

docker容器中解决中文乱码

1. 找到dockerfile文件 2. 编辑Dockerfile 添加 ENV LANG en_US.UTF-8 ENV LANGUAGE en_US:en ENV LC_ALL en_US.UTF-8 3. 生成新的镜像文件 FROM java17_yinpeng:latest MAINTAINER YP <2064676101QQ.COM> ADD jiquan_online_chat.jar jiquan_online_chat #CM…

Socks5代理IP有什么特点:

小熊IPSocks5代理IP比其他类型的代理具有更多的灵活性和安全性。SOCKS5代理的另一个优点是您可以将其用于任何类型的流量&#xff08;TCP或UDP&#xff09;。您可以有选择地隐藏流量的特定部分&#xff08;基于应用程序&#xff09;&#xff0c;从基于TCP的连接&#xff08;如H…

【HarmonyOS】取消页面转场动画

【HarmonyOS】取消页面转场动画 问题背景&#xff1a; 当A页面切换至B页面时&#xff0c;系统会自带左右进场退场的动画效果。一般来说&#xff0c;该效果是ok的&#xff0c;但是在特殊场景下&#xff0c;例如&#xff1a; A页面跳到B页面&#xff0c;又跳到C页面。C页面直接返…

存储型XSS

前言 什么是存储型xss&#xff1a; 提交恶意xss数据&#xff0c;存入数据库中&#xff0c;访问时触发。 存储型xss和反射型xss区别&#xff1a; 存储型存入数据库中&#xff0c;可持续时间长&#xff0c;而反射型持续时间短&#xff0c;仅对本次访问有影响&#xff0c;反射型一…

中华活页文选高中版投稿发表

《中华活页文选&#xff08;高中版&#xff09;》创刊于1960年&#xff0c;是中宣部所属中国出版传媒股份有限公司主管、中华书局主办的国家级基础教育期刊&#xff0c;曾获得“中国期刊方阵双效期刊”、国家新闻出版广电总局推荐的“百种优秀报刊”等荣誉称号。本刊以高中学科…

TCP连接优化

TCP连接未释放 断开连接后TCP有两个状态&#xff1a; 一个是TIME_WAIT&#xff0c;一个是CLOSE_WAIT&#xff0c;是不同的两个状态 TIME_WAIT&#xff1a;出现在主动断开方&#xff0c;发出最后一个ACK后 CLOSE_WAIT&#xff1a;出现在被动断开方&#xff0c;收到主动断开方的…

Day 6:2981. 找出出现至少三次的最长特殊子字符串 I

Leetcode 2981. 找出出现至少三次的最长特殊子字符串 I 给你一个仅由小写英文字母组成的字符串 s 。 如果一个字符串仅由单一字符组成&#xff0c;那么它被称为 特殊 字符串。例如&#xff0c;字符串 “abc” 不是特殊字符串&#xff0c;而字符串 “ddd”、“zz” 和 “f” 是特…

数据容器:set(集合) 更新啦!

数据容器&#xff1a;set&#xff08;集合&#xff09; 1.集合的定义方式 {元素, 元素, 元素} # 定义集合 my_set {"欣欣向荣", "嘉嘉", "red", "欣欣向荣", "嘉嘉", "red", "欣欣向荣", "嘉嘉…

Spring BeanPostProcessor的前置魔法:揭秘与启迪

1. 引言 Spring框架的BeanPostProcessor是一个强大的扩展点&#xff0c;允许开发者在Spring IoC容器实例化、配置和初始化bean前后插入自定义逻辑。其中&#xff0c;前置方法postProcessBeforeInitialization是BeanPostProcessor接口中的一个重要方法&#xff0c;它在bean的初…

数据库中的视图:定义、作用及使用场景

在数据库的世界中&#xff0c;视图&#xff08;View&#xff09;是一个虚拟的表&#xff0c;其内容由查询定义。视图同真实的表一样&#xff0c;包含一系列带有名称的列和行数据。但是&#xff0c;视图并不在数据库中以存储的数据值集形式存在。行和列数据来自由定义视图的查询…

读《营销管理》之三大市场结果

由于四大市场力量的存在&#xff0c;有形无形的改变着世界&#xff0c;在新的营销现实中&#xff0c;消费者、公司和竞争环境都经历了显著的变化&#xff0c;这些变化赋予了他们新的能力&#xff0c;并改变了他们互动的方式。读《营销管理》之四大市场力量-CSDN博客以下是详细解…