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,一经查实,立即删除!

相关文章

C++模拟实现stack和queue

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

网上打印资料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′|┛ 嗷~~ 目录 一、斐波那契数列的初步实现 二、外围条件的不满足情况 总结 一、斐波那契数列的初步实现 …

存储型XSS

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

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

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

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

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

性能猛兽:OrangePi Kunpeng Pro评测!

1.引言 随着物联网和嵌入式系统的不断发展&#xff0c;对于性能强大、资源消耗低的单板计算机的需求也日益增加。在这个快节奏的技术时代&#xff0c;单板计算机已成为各种应用场景中不可或缺的组成部分&#xff0c;从家庭娱乐到工业自动化&#xff0c;再到科学研究&#xff0…

差分曼彻斯特编码详解

这是一种双向码&#xff0c;和曼彻斯特编码不同的是&#xff0c;这种码元中间的电平转换边只作为定时信号&#xff0c;不表示数据。数据的表示在于每一位开始处是否有电平转换&#xff1a;有电平转换则表示0&#xff0c;无则表示1。然后这就出现一个问题&#xff0c;很多小伙伴…

App Inventor 2 低功耗蓝牙BLE 两种通信方式:扫描和广播

低功耗蓝牙&#xff0c;也称为蓝牙 LE 或简称 BLE&#xff0c;是一种类似于经典蓝牙的新通信协议&#xff0c;不同之处在于它旨在消耗更少的功耗&#xff0c;同时保持可比的功能。 因此&#xff0c;低功耗蓝牙是与耗电资源有限的物联网设备进行通信的首选。BluetoothLE 扩展需…

DiffBIR论文阅读笔记

这篇是董超老师通讯作者的一篇盲图像修复的论文&#xff0c;目前好像没看到发表在哪个会议期刊&#xff0c;应该是还在投&#xff0c;这个是arxiv版本&#xff0c;代码倒是开源了。本文所指的BIR并不是一个single模型对任何未知图像degradation都能处理&#xff0c;而是用同一个…

数据结构(十)图

文章目录 图的简介图的定义图的结构图的分类无向图有向图带权图&#xff08;Wighted Graph&#xff09; 图的存储邻接矩阵&#xff08;Adjacency Matrix&#xff09;邻接表代码实现 图的遍历深度优先搜索&#xff08;DFS&#xff0c;Depth Fisrt Search&#xff09;遍历抖索过程…

【搜索方法推荐】高效信息检索方法和实用网站推荐

博主未授权任何人或组织机构转载博主任何原创文章&#xff0c;感谢各位对原创的支持&#xff01; 博主链接 本人就职于国际知名终端厂商&#xff0c;负责modem芯片研发。 在5G早期负责终端数据业务层、核心网相关的开发工作&#xff0c;目前牵头6G算力网络技术标准研究。 博客…

同时执行多个python脚本扫描,报如下错误,原因为文件越大读取到内存占用内存越多。

killed nohup python $file unable to fork process cannot allocate memory ls: error while loading shared libraries: libdl.so.2 failed to map segment from shared object cannot allocate memory python进程被系统或者某个用户通过 kill 命令强制终止了

Springboot 实战运用

一&#xff0c;基本配置 1&#xff0c;pom文件配置介绍 1.1继承 <parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.5.2</version><relativePath/> <…

ubuntu下载离线软件包及依赖

目录 一、前言 二、正文 1.准备环境 2.开始下载 3.后续工作 三、总结 一、前言 由于给客户提供的设备机不允许上网&#xff0c;那么所有待安装的软件包及依赖库都需要提前下载好&#xff0c;然后通过局域网传过去再安装。 另外&#xff0c;软件包可能还依赖其他的库&…

Mac安装tomcat

代码 brew install tomcat 运行结果如下&#xff1a; 如果要启动输入&#xff1a; brew services start tomcat

新书推荐—华为HCIA路由交换技术实战

新书推荐—华为HCIA路由交换技术实战 由HCIE认证讲师、技术能手、ICT大赛优秀指导教师、教学名师、国家规划教材作者联袂编撰&#xff0c;让学习不再是“硬”茬&#xff0c;而是“嗨”起来&#xff01; 《华为HCIA路由交换技术实战》 作者黄君羡组编正月十六工作室书号978-7-12…