STM32 FreeRTOS 二值信号量

2023-05-16

二值信号量可以用于任务同步(任务与任务间,任务与中断间)。
假设有高,中,低三个任务。
高级任务:

API

  1. 创建一个二值量、并返回一个ID:osSemaphoreCreate
osSemaphoreDef(telesendSem);
telesendSemHandle = osSemaphoreCreate(osSemaphore(telesendSem), 1);
  1. 删除一个信号量:osSemaphoreDelete
 osSemaphoreDelete(BinarySem01Handle);
  1. 释放信号量
osSemaphoreRelease(telerecvSemHandle);
  1. 获取信号量
osSemaphoreWait(telerecvSemHandle, osWaitForever);

代码部分

任务High

void StartHighTask(void const * argument)
{
  for(;;)
  {
  	printf("进入任务High,等待二值量\n");
    osSemaphoreWait(telerecvSemHandle, osWaitForever);		// waiting for Semaphore
    printf("High: 获得二值量\n");
    printf("High: 释放二值量\n\n");
    osSemaphoreRelease(telerecvSemHandle);		// releasng Semaphore
    osDelay(500);
  }
}

任务Normal

void StartNormalTask(void const * argument)
{
  for(;;)
  {
	printf("进入任务Normal\n");
	printf("退出任务Normal\n\n");
   	osDelay(1000);
  }
}

任务Low

void StartteletransTask(void const * argument)
{
  for(;;)
  {
	printf("进入任务Low,等待二值量\n");
	osSemaphoreWait(telerecvSemHandle, osWaitForever);		// waiting for Semaphore
	printf("Low: 获得二值量\n");
    osSemaphoreWait(gpsrecvSemHandle, osWaitForever);		// waiting for Semaphore
    printf("Low: 释放二值量\n\n");
    osSemaphoreRelease(telerecvSemHandle);		// releasng Semaphore
    osDelay(500);
  }
}

任务中的“gpsrecvSemHandle”通过串口接收中断释放。

实验结果

在这里插入图片描述
初始运行时,程序按照任务优先级依次运行High,Normal,Low程序。
Low获取完telerecvSemHandle后,因为没有向串口发数,gpsrecvSemHandle一直未被释放。任务开始等待。
由于无需等待信号量,Normal可以继续按照自己的节奏发送数据。

osSemaphoreWait(gpsrecvSemHandle, osWaitForever);		// waiting for Semaphore

此处后便进入进行等待。

接下来给串口发送数据,释放gpsrecvSemHandle。
在这里插入图片描述
上图可以看出
gpsrecvSemHandle被释放,Low解除等待,释放二值量
High获取到二值量并释放
Low和High都等待500ms,因为High优先级高,再次获得信号量并释放
Low任务运行,因为gpsrecvSemHandle没有被释放,程序开始等待。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

STM32 FreeRTOS 二值信号量 的相关文章

  • 136-基于stm32单片机家庭温湿度防漏水系统设计Proteus仿真+源程序

    资料编号 136 一 功能介绍 1 采用stm32单片机 LCD1602显示屏 独立按键 DHT11传感器 蜂鸣器 制作一个基于stm32单片机家庭温湿度防漏水系统设计Proteus仿真 2 通过DHT11传感器检测当前温湿度 并且显示到L
  • Push_back() 导致程序在进入 main() 之前停止

    我正在为我的 STM32F3 Discovery 板使用 C 进行开发 并使用 std deque 作为队列 在尝试调试我的代码 直接在带有 ST link 的设备上或在模拟器中 后 代码最终在 main 中输入我的代码之前在断点处停止 然
  • STM32F4 通过软复位跳转到引导加载程序,无需 BOOT0 和 BOOT1 引脚

    我问这个问题是因为可以在这里找到类似问题的答案 通过应用程序跳转到 STM32 中的引导加载程序 即从用户闪存在引导模式下使用引导 0 和引导 1 引脚 用户 JF002 JF002回答 当我想跳转到引导加载程序时 我在其中一个备份寄存器中
  • 匹配 STM32F0 和 zlib 中的 CRC32

    我正在研究运行 Linux 的计算机和 STM32F0 之间的通信链路 我想对我的数据包使用某种错误检测 并且由于 STM32F0 有 CRC32 硬件 并且我在 Linux 上有带有 CRC32 的 zlib 所以我认为在我的项目中使用
  • 如何将 void* 转换为函数指针?

    我在 FreeRTOS 中使用 xTaskCreate 其第四个参数 void const 是传递给新线程调用的函数的参数 void connect to foo void const task params void on connect
  • HAL 锁定和解锁函数如何使用以及为什么?

    我试图理解另一位程序员编写的代码 它使用了I C http en wikipedia org wiki I C2 B2C通信以将数据写入 STM32 微控制器的 EEPROM 一般来说 我理解他的代码是如何工作的 但我不明白他为什么使用HA
  • 解决KEIL编译慢问题

    两种方案 使用v6版本的ARM Compiler 如果v6版本编译不过 必须使用v5版本的 则可以勾选掉Browse Information选项 提升很明显 1分多钟能优化到几秒 看代码量 但是这个有个弊端 在KEIL中会影响函数跳转 建议
  • 跟着野火学FreeRTOS:第一段(任务定义,切换以及临界段)

    在裸机系统中 系统的主体就是 C P U CPU CP U 按照预先设定的程序逻辑在 m a i n
  • 1.69寸SPI接口240*280TFT液晶显示模块使用中碰到的问题

    1 69寸SPI接口240 280TFT液晶显示模块使用中碰到的问题说明并记录一下 在网上买了1 69寸液晶显示模块 使用spi接口 分辨率240 280 给的参考程序是GPIO模拟的SPI接口 打算先移植到FreeRtos测试 再慢慢使用
  • 串口通讯第一次发送数据多了一字节

    先初始化IO再初始化串口 导致第一次发送时 多出一个字节数据 优化方案 先初始化串口再初始化IO 即可正常通讯
  • 1.69寸SPI接口240*280TFT液晶显示模块使用中碰到的问题

    1 69寸SPI接口240 280TFT液晶显示模块使用中碰到的问题说明并记录一下 在网上买了1 69寸液晶显示模块 使用spi接口 分辨率240 280 给的参考程序是GPIO模拟的SPI接口 打算先移植到FreeRtos测试 再慢慢使用
  • 无法使用 OpenOCD 找到脚本文件

    我正在尝试按照本教程将 OpenOCD 与我的 ST 发现板一起使用 https japaric github io discovery README html https japaric github io discovery READM
  • STM32F4XX的12位ADC采集数值超过4096&右对齐模式设置失败

    文章目录 一 前言 二 问题1 数值超过4096 三 问题1的排错过程 四 问题2 右对齐模式设置失败 五 问题2的解决方法 5 1 将ADC ExternalTrigConv设置为0 5 2 使用ADC StructInit 函数 一 前
  • 特殊寄存器

    特殊寄存器 文章目录 前言 一 背景 二 2 1 2 2 总结 前言 前期疑问 STM32特殊寄存器到底是什么 特殊寄存器怎么查看和调试代码 本文目标 记录和理解特殊寄存器 一 背景 最近在看ucosIII文章是 里面提到特殊寄存器 这就进
  • Cortex-M3与M4权威指南

    处理器类型 所有的ARM Cortex M 处理器是32位的精简指令集处理器 它们有 32位寄存器 32位内部数据路径 32位总线接口 除了32位数据 Cortex M处理器也可以有效地处理器8位和16位数据以及支持许多涉及64位数据的操作
  • 通过JTAG恢复STM32 MCU磨掉的标记

    我有一块可能带有 STM32 MCU 的板 我想为该板制作定制固件 因为库存板有很多问题 不幸的是 电路板制造商很友善地磨掉了所有标记 有没有办法通过 jtag 获取设备 系列 ID 并将其交叉引用到型号 我能找到的一切都是关于获取芯片的唯
  • STM32内部时钟

    我对 STM32F7 设备 意法半导体的 Cortex M7 微控制器 上的时钟系统感到困惑 参考手册没有充分阐明这些时钟之间的差异 SYSCLK HCLK FCLK 参考手册中阅读章节 gt RCC 为 Cortex 系统定时器 SysT
  • 使用 STM32 USB 设备库将闪存作为大容量存储设备

    我的板上有这个闪存IC 它连接到我的STM32F04 ARM处理器 处理器的USB端口可供用户使用 我希望我的闪存在通过 USB 连接到 PC 时被检测为存储设备 作为第一步 我在程序中将 USB 类定义为 MSC 效果很好 因为当我将主板
  • stm32l0: 执行MI命令失败。使用 vFlashErase 数据包擦除闪存时出错

    我正在使用 Nucleo STM32L031 和 AC6 STM32 工作台 eclipse 我编写应用程序并进入调试模式 一切正常 直到我在应用程序中添加另一个功能 我注意到当我删除 评论 新函数 软件可以再次进入调试模式 但是当我添加
  • 当 Cortex-M3 出现硬故障时如何保留堆栈跟踪?

    使用以下设置 基于 Cortex M3 的 C gcc arm 交叉工具链 https launchpad net gcc arm embedded 使用 C 和 C FreeRtos 7 5 3 日食月神 Segger Jlink 与 J

随机推荐

  • 【AI绘画】——Midjourney关键词格式解析(常用参数分享)

    目前在AI绘画模型中 xff0c Midjourney的效果是公认的top级别 xff0c 但同时也是相对较难使用的 xff0c 对小白来说比较难上手 xff0c 主要就在于Mj没有webui xff0c 不能选择参数 xff0c 怎么找到
  • ChatGPT总是答非所问?如何使用chatgpt定义角色

    一 x1f4dd 定义角色 xff1a ChatGPT 的角色设定 背景信息 xff1a 提供详细 准确的背景信息和前提条件 xff0c 以便 ChatGPT 提供有针对性的回答和建议 任务目标 xff1a 清晰地描述希望 ChatGPT
  • 免费ChatGPT接入-国内怎么玩chatGPT

    免费ChatGPT中文版 OpenAI 的 GPT 模型目前并不提供中文版的免费使用 xff0c 但是有许多机器学习平台和第三方服务提供商也提供了基于 GPT 技术的中文版模型和 API 下面是一些常见的免费中文版 ChatGPT xff1
  • 分享一个国内可用的免费GPT-AI网站

    背景 ChatGPT作为一种基于人工智能技术的自然语言处理工具 xff0c 近期的热度直接沸腾 x1f30b 我们也忍不住做了一个基于ChatGPT的网站 xff0c 可以免登陆 xff01 xff01 国内可直接对话AI xff0c 也有
  • ChatGPT狂飙之下 云计算加速键启动?

    集微网消息 xff0c ChatGPT一夜爆火 xff0c 成为AI届的 流量收割机 有观点认为 xff0c ChatGPT不仅是AI的成功 xff0c 也是云计算的成功 AIGC xff08 人工智能生成内容 xff09 有望开启云计算产
  • ChatGPT :国内免费可用 ChatGPT +Midjourney绘图

    前言 ChatGPT xff08 全名 xff1a Chat Generative Pre trained Transformer xff09 xff0c 美国OpenAI 研发的聊天机器人程序 xff0c 于2022年11月30日发布 C
  • 分享一个国内免费的ChatGPT镜像网址(亲测有效-5月7日更新)

    最近由于ChatGPT的爆火也让很多小伙伴想去感受一下ChatGPT的魅力 xff0c 那么今天就分享几个ChatGPT国内的镜像网址 xff0c 大家可以直接使用 xff01 记得点赞收藏一下呦 xff01 1 Mental AI 地址
  • Chat GPT国内懒人专用版(基于网站开发使用)

    一 xff1a 概述 小伙伴们肯定都知道沸沸扬扬的Chat GPT xff08 全名 xff1a Chat Generative Pre trained Transformer xff09 xff0c 美国Open AI研发的聊天机器人程序
  • Linux 串口编程学习记录(termios.h)

    目录 0 Linux 串口编程简述 1 open close 函数 open 函数参数说明 xff1a close 函数参数说明 2 termios 结构体 a c cflag 控制模式标志位可选参数 xff08 unsigned shor
  • 手把手教你怎么搭建自己的ChatGPT和Midjourney绘图(含源码)

    AI程序采用NUXT3 43 LARAVEL9开发 xff08 目前版本V1 1 7 xff09 授权方式 xff1a 三个顶级域名 43 两次更换 1 AI智能对话 对接官方和官方反代 xff08 markdown输出 xff09 PS
  • CLion中文乱码问题解决

    问题描述 xff1a 向 C语言编程 say Hello World 之后 xff0c 小白在 CLion 中运行第一个 C语言程序 xff0c 又撞墙了 xff0c 运行结果中文是乱码 xff0c 如图 xff1a 解决方案 xff1a
  • 润和软件携OpenHarmony最新成果出席2021AIoT开源科技节

    12月10日 xff0c 2021 AIOT开源科技节暨OpenHarmony技术论坛在广州召开 xff0c 润和软件作为OpenHarmony项目的初始共建单位之一及积极的生态贡献者受邀出席大会 润和软件鸿蒙研发总监石磊在科技节技术论坛中
  • 解决Maven打包时报错"The packaging for this project did not assign a file to the build artifact"...

    今天在IDEA中打包Maven项目安装到本地仓库时报错 Failed to execute goal org apache maven plugins maven install plugin 2 4 install default cli
  • 嵌入式软件工程师面试题收录(1)

    最近收集了许多嵌软的面试题 xff0c 内容都是在很多文章中剪下来的 xff01 1 用预处理指令 define 声明一个常数 xff0c 用以表明1年中有多少秒 xff08 忽略闰年问题 xff09 define SECONDS PER
  • 嵌入式软件工程师面试题收录(4)

    最近收集了许多嵌软的面试题和相关知识 xff0c 内容都是在很多文章中剪下来的 xff01 1 什么是物联网 xff1f 物联网的含义是什么 xff1f 万物互联 实时共享 xff0c 对物品进行智能化的识别 定位 跟踪 监控和管理的一种网
  • FreeRTOS个人笔记-挂起/解挂任务

    根据个人的学习方向 xff0c 学习FreeRTOS 由于野火小哥把FreeRTOS讲得比较含蓄 xff0c 打算在本专栏尽量细化一点 作为个人笔记 xff0c 仅供参考或查阅 配套资料 xff1a FreeRTOS内核实现与应用开发实战指
  • FreeRTOS个人笔记-消息队列

    根据个人的学习方向 xff0c 学习FreeRTOS 由于野火小哥把FreeRTOS讲得比较含蓄 xff0c 打算在本专栏尽量细化一点 作为个人笔记 xff0c 仅供参考或查阅 配套资料 xff1a FreeRTOS内核实现与应用开发实战指
  • 由浅入深吃透容器云+微服务+K8S+MQ+阿里云内部实施手册

    针对腾讯 百度 阿里 京东等100 43 家互联网公司 xff0c 对其技术方向进行调查和研究 从18年开始 xff0c 各大厂商都陆续把底层业务从KVM Vmware等底层架构开始逐步迁移到Docker 43 K8s体系中来 xff0c
  • Robotics XM430-W350 云台电机使用记录

    XM430 W350 是加拿大 Trossen Robotics 公司生产的一种伺服舵机 公司给这种电机配套了自研的控制协议以及开发 SDK 例程 Dynamixel SDK xff0c 此处记录下基于ROS 的开发例程的使用方法 xff0
  • STM32 FreeRTOS 二值信号量

    二值信号量可以用于任务同步 xff08 任务与任务间 xff0c 任务与中断间 xff09 假设有高 xff0c 中 xff0c 低三个任务 高级任务 xff1a API 创建一个二值量 并返回一个ID xff1a osSemaphoreC