RTX线程通信之——线程标志

2023-11-19

Thread Flags

In a real application, we need to be able to communicate between threads in order to make an application useful. To this end, a typical RTOS supports several different communication objects which can be used to link the threads together to form a meaningful program. The CMSIS-RTOS2 API supports inter-thread communication with thread and event flags, semaphores, mutexes, mailboxes and message queues. In the first section, the key concept was concurrency. In this section, the key concept is synchronizing the activity of multiple threads.

在实际应用中,多个线程之间往往需要相互通信,来更好地实现产品功能。RTX提供了以下几个对象,用来实现线程间通信。

  • Thread Flags: 线程标志
  • Event Flags : 事件标志
  • semaphores: 信号量
  • mutexes: 互斥锁
  • mailboxes: 邮箱(或者内存池,memory pool)
  • message queues: 消息队列

不了解这些概念?没关系,都会有的,都会讲到的~

本文就先拿线程标志开席吧,让大家尝尝鲜~

概念

Keil RTX5 supports up to thirty two thread flags for each thread. These thread flags are stored in the thread control block. It is possible to halt the execution of a thread until a particular thread flag or group of thread flags are set by another thread in the system.

RTX中每个线程可拥有高达32个线程标志,这些线程标志存放在线程控制块中,其余线程可以通过设置这些Thread Flags来中断该线程的执行。当某个执行线程调用osThreadFlagsWait()时,该线程会被阻塞,并进入wait_event状态。若其他线程将所选(specified)的标志中的某个或全部Thread Flags置位,则该线程将会变为就绪态。

Thread Flags are a more specialized version of the Event Flags. See Event Flags. While Event Flags can be used to globally signal a number of threads, thread flags are only send to a single specific thread. Every thread instance can receive thread flags without any additional allocation of a thread flags object.

抓重点,线程标志和事件标志的区别:

  • 线程标志只能发送给单个指定线程。
  • 事件标志可以发送给多个线程。

RTX线程标志API

函数

在这里插入图片描述

osThreadFlagsSet

uint32_t osThreadFlagsSet(osThreadId_t thread_id, uint32_t flags)
// 输入
* thread_id : 线程ID
* flags: 设置多个线程标志
// 输出
* 返回设置后的线程标志,或者错误码(最高位被置位)

osThreadFlagsClear

uint32_t osThreadFlagsClear(uint32_t flags)
// 输入
* flags : 线程标志
// 输出
* 清除前的线程标志或者错误码(如果最高位被置位)

osThreadFlagsGet

uint32_t osThreadFlagsGet(void)
// 输入
*// 输出
* 当前线程标志

osThreadFlagsWait

uint32_t  osThreadFlagsWait (uint32_t flags,uint32_t options,uint32_t timeout)     
// 输入
* flags : 等待的线程标志,选定等待的标志位集合,比如1U表示只有标志0,3U则表示选中标志0和标志1
* options : 标志选项
* timeout : 超时设定
// 输出
* 清除之前的线程标志,注意该函数返回时会自动清除等待线程标志(除非选项设定为osFlagsNoClear)

在这里插入图片描述

ps: 关于标志,RTX提供的32个线程标志中的任意几个,随你选。具体选哪几个,通过一个类型为uint32_t的数来指定。比如0x00000001U,尾部的U表示这是无符号数,1表示最低位,即选中标志0,同理0x00000003U,最后两位为1,表示选中标志0标志1,以此类推。

线程标志模式共有三种:

  • osFlagsWaitAny: 任何一个选中标志被置位,线程变为就绪态。
  • osFlagsWaitAll: 所有选中标志位被置位,线程变为就绪态。
  • osFlagsNoClear : 不要清除指定等待的标志位(因为函数默认返回时会自动清除所有标志位)
// 官方案例
#include "cmsis_os2.h"
 
void Thread (void* arg) {
  ;
  osThreadFlagsWait(0x00000001U, osFlagsWaitAny, osWaitForever); // Wait forever until thread flag 1(个人认为该为0) is set.
  ;
  osThreadFlagsWait(0x00000003U, osFlagsWaitAny, osWaitForever); // Wait forever until either thread flag 0 or 1 is set.
  ;
  osThreadFlagsWait(0x00000003U, osFlagsWaitAll, 10U); // Wait for 10 timer ticks until thread flags 0 and 1 are set. Timeout afterwards.
  ;
  osThreadFlagsWait(0x00000003U, osFlagsWaitAll | osFlagsNoClear, osWaitForever); // Same as the above, but the flags will not be cleared.
}

任何线程都可以将其他线程的标志位置位,线程本身只能复位自己的标志位。

#include "cmsis_os2.h"
 
osThreadId_t tid;
uint32_t     flagsX;
uint32_t     flags;
 
void threadX (void *argument) {
  osDelay(1U);
  for (;;) {
    flagsX = osThreadFlagsWait(0x0001U, osFlagsWaitAny, osWaitForever); /* B */
  }
}
 
void app_main (void *argument) {
  tid = osThreadNew(threadX, NULL, NULL);
  flags = osThreadFlagsSet(tid, 0x0002U); /* A */
  osDelay(2U);
  flags = osThreadFlagsSet(tid, 0x0005U); /* C */
  osDelay(2U);
  for(;;);
}

案例:LED灯同步闪亮

下面通过一个具体例子来进行巩固线程标志:基本思路是我们让LED1灯跟随LED2灯闪亮。实现方法是让LED2线程负责置位LED1的线程标志。

// green 线程函数
void led2(void* arg){
     while(1){
        LED2(ON);
        osThreadFlagSet(red,0x01);  // 置位red灯的线程标志0
        osDelay(500);               // 这里延时必须有
        LED2(OFF);
        osThreadFlagSet(red,0x01);  // 由于red灯的线程标志0会自动清零,所以需要重新置位
        osDelay(500);
     }
}

static const osThreadAttr_t ThreadAttr_LED2 = {
	.name = "LED2",
	.priority = osPriorityNormal,
};
// red 线程函数
void led1(void* arg){
    while(1){
        osThreadFlagsWait(0x01,osWaitForever);  // 无限等待线程标志0被置位,函数返回时会自动清除线程标志0
        LED1(ON);
        osThreadFlagsWait(0x01,osWaitForever);
        LED1(OFF);
    }
}

static const osThreadAttr_t ThreadAttr_LED1 = {
	.name = "LED1",
	.priority = osPriorityAboveNormal,    // 注意LED1的优先级必须高于LED2,才能实现闪烁同步,想想为什么?
};

小结

本文主要介绍了线程标志的基本知识,重点包括:

  • 线程标志的概念
  • RTX中线程标志的函数接口
  • 线程标志编程的步骤

深入了解,请参考官方文档~

参考资料

☞官方资料:线程标志

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

RTX线程通信之——线程标志 的相关文章

  • 计算机领域中随处可见的抽象

    想要管理多种具体的东西 那么需要遵守每种东西的规范 如果想要提供一种通用模式来对这些具体的东西统一管理 需要使用一种古老的技术 抽象 抽象是将多种具体的东西 管理时需要遵守的规范 的共同点抽取出来 放入到更高一层的抽象层 在抽象层不定义或少
  • 掉电无法启动数据库问题解决

    由于突然掉电 造成客户在windows平台上10 2 0 1数据库无法驱动 以下是具体解决步骤 一 定位故障问题 1 启动数据库 查看错误 SQL gt startup ora 01113 file 1 needs media recove
  • VMware-Ubuntu安装bochs

    我的运行环境是VMware的Ubuntu 首先大家可以按照CSDN上的教程按照符合自己需求的虚拟机 我在上午还在VMware和virtualBox之间做选择 但是由于已经安装过了VMware 所以我就直接用了VMware 当然了 一千人眼中
  • 操作系统学习(九)进程通信

    一 知识总览 二 定义 进程通信是指进程之间的信息交换 每个进程都拥有自己的内存空间 是相互独立的 这样在每个进程执行时 才不会被其他进程所干扰 三 进程通信的方式 1 共享存储 1 两个进程对共享区的访问必须是互斥的 即在同一时间内 只允
  • win10 Enable developer Mode

    经过漫长的安装过程 win10终于装上了vs2015 rc 写个小程序试试 结果提示 根据提示打开 设置 更新 for developer 据说应该有这么个界面 但是这个界面根本出不来 直接闪退的说 翻 MSDN 终于翻出了解决方法 htt
  • CF、SF、OF、ZF标志位

    没学汇编 这种题我真是做一道错一道 OF overflow flag 溢出标志位 溢出标志位 OF 1 表示带符号整数运算时结果发生溢出 对于无符号整数运算 OF没有意义 对于有符号数的溢出判断方式有 1 采用一位符号位 思想为 或 则为溢
  • Linux系统编程:多线程交替打印ABC

    引言 分享关于线程的一道测试题 因为网上基本都是Java的解决方法 决定自己写一篇来记录一下线程的学习 问题描述 编写一个至少具有三个线程的程序 称之为线程 A B 和 C 其中线程 A 输出字符 A 线程 B 输出字符 B 线程 C 输出
  • 程序员的自我修养——链接、装载与库

    1 温故而知新 操作系统概念 北桥 连接高速芯片 系统调用接口 以软件中断的方式提供 如Linux使用0x80号中断作为系统调用接口 多任务系统 进程隔离 设备驱动 直接使用物理内存的弊端 地址空间不隔离 内存使用效率低 程序运行的地址不确
  • Visual studio 2005 hangs on startup AppHangXProcB1 svchost devenv.exe svchost.exe:{2a811bb2-303b-48b...

    This problem has been torturing me for the whole afternoon and after searching on the web for a long time I finally get
  • [架构之路-185]-《软考-系统分析师》-3-操作系统基本原理 - 文件索引表

    目录 一 文件的索引块 二 索引分配表 三 索引表的链接方案 四 多层索引 五 混合索引分配 一 文件的索引块 存放在目录中的文件 并非是文件的真实内容 目录中记录了文件的索引块是几号磁盘块 文件对应的索引表是存放在指定的磁盘块中的 二 索
  • Nuttx操作系统(三):构建模式

    1 1 Nuttx构建配置以及模式 Nuttx有三种不同的构建配置 FLAT构建 这种构建是所代码驻留在公共地址空间中 1 应用 内核以及board logic在一个flat地址环境中 2 所有的地址空间具有相同的属性 PROTECTED构
  • 使用inet_ntop转换IPv6地址时在macOS和linux上的行为不一样

    下面这段python代码在macOS和linux时运行的结果是不同的 import socket ip socket inet pton socket AF INET6 1 2 3 0 5 6 7 8 print socket inet n
  • Linux 内核中的 Device Mapper 机制

    Linux 内核中的 Device Mapper 机制 尹 洋 在读博士生 尹洋 中科院计算所国家高性能计算机工程技术研究中心的在读博士生 主要从事服务部署和存储资源管理以及Linux块设备一级的开发和研究工作 简介 本文结合具体代码对 L
  • Anaconda 安装 Python 库(MySQLdb)的方法-(转)

    安装python库的过程中 最重要的地方就是版本需要兼容 其中操作系统为64位 Python为2 X 64位 下载安装文件的时候也要注意版本匹配 其中文件名中包含的cp27表示CPython 2 7版本 cp34表示CPython 3 4
  • linux 使用systemctl 启动服务报错: Error: No space left on device

    By default Linux only allocates 8192 watches for inotify which is ridiculously low And when it runs out the error is als
  • 磁盘调度算法笔记和练习题

    磁盘调度算法 先来先服务FCFS 最短寻道时间优先SSTF 扫描调度SCAN 练习题 先来先服务FCFS 最短寻道时间优先SSTF 扫描调度SCAN 它是一次只响应一个方向上的请求 这个方向上的请求都响应完了 再掉头处理另一个方向上的 有点
  • 地址映射与共享

    跟踪地址映射过程 1 通过命令 dbg asm启动调试器 在linux 0 11运行test c文件 使其进入死循环 我们的任务就是找到i的地址并将其修改为0使test c程序退出循环 2 在命令行输入crit c使Boch暂停 一般会显示
  • 《OSPF和IS-IS详解》一1.7 独立且平等

    本节书摘来自异步社区 OSPF和IS IS详解 一书中的第1章 第1 7节 作者 美 Jeff Doyle 更多章节内容可以访问云栖社区 异步社区 公众号查看 1 7 独立且平等 OSPF和IS IS详解与TCP IP相比 OSI协议对各国
  • 在 Eclipse IDE 中使用 GCC 编译器编译 RTX 内核文件

    我们在KEIL IDE中有一个LPC2148的项目 里面有RTX内核程序以及其他程序 它是由ARM CC编译的 现在我们需要将IDE从KEIL ARM CC 更改为Eclipse GCC 当我们尝试在 Eclipse GCC 编译器中编译它
  • 抢占和上下文切换的区别

    一点介绍 我目前正在编写一个小型 读微型 RTOS 内核 它应该与内核中的大多数内容是一体的 然而 我找不到关于下面列出的一些事情的太多信息 这会很有帮助 除此之外 它实际上不是某种大学项目 而是我按照自己的意愿做的事情 回答所有问题的一个

随机推荐

  • unity中Input类

    这个是鼠标与键盘按键的一些操作 void Update 获取鼠标在屏幕中的位置 Vector3 mousePos Input mousePosition print mousePos 获取屏幕的宽 Screen width 获取屏幕的高 S
  • 【技术经验分享】计算机毕业设计Python+Spark视频推荐系统 短视频推荐系统 视频流量预测系统 短视频爬虫 视频数据分析 视频可视化 视频大数据 大数据毕业设计 大数据毕设

    开发技术 前端 vue js websocket element ui echarts 后端 springboot mybatis plus 数据库 mysql neo4j图数据库 知识图谱 数据分析 hadoop spark实时计算 算法
  • TscanCode代码扫描工具

    TscanCode介绍 TscanCode 是腾讯研发的静态代码扫描工具 最早的版本是基于 cppcheck 二次开发 之后又重新自研 不仅支持 C 还支持 C Lua 语言 在发掘 C 空指针 越界 未初始化 C 空引用 Lua变量未初始
  • 活动报名|如何使用70万预算从头训练千亿语言大模型

    王业全 北京智源人工智能研究院认知模型团队负责人 清华大学博士 中国中文信息学会情感计算专委会委员 2022年被评为AI 2000全球最具影响力人工智能学者 自然语言处理领域 主要从事语言大模型 自然语言处理方面的研究工作 代表成果有 FL
  • shell脚本读取csv数据迁移文件

    前言 仅记录学习笔记 如有错误欢迎指正 最近 这段时间一直在忙数据迁移的问题 现在碰见的问题是需要将目标服务器上的文件导入到本地库 思路 我们需要的数据不多 但是服务器上特别多 所以通过查询目标文件的目录位置和文件名称 导出为csv文件 之
  • Vue + ElementUI 实现批量删除功能

    第一步 在el table 组件绑定 selection change事件 第二步 在调用父组件的子组件中添加当表格项发生变化时会触发事件函数 selectionChange val 在method 函数中添加如下代码 selectionC
  • 从零基础开始开发自己的第一个微信小程序

    文章目录 内容介绍 小程序开发步骤 注册微信小程序账号 下载开发工具搭建开发环境 创建工程编写代码 手机上查看效果 工程里的文件作用介绍 总结 内容介绍 通过本篇blog 你可以熟悉从零开始 搭建小程序开发环境 并运行起自己的第一个小程序
  • QT中slot,signal,emit讲解

    Qt中的类库有接近一半是从基类QObject上继承下来 信号与反应槽 signals slot 机制就是用来在QObject类或其子类间通讯的方法 作为一种通用的处理机制 信号与反应槽非常灵活 可以携带任意数量的参数 参数的类型也由用户自定
  • 条码编码-Code39

    近来在研究条码的实现 遇到一些坑 现在把自己遇到的一些情况分享一下 世界上约有225种以上的条形码 一般较流行的有 39码 EAN码 UPC 码 128码 以及专门用於书刊管理的ISBN ISSN等 我们先从Code39码开始 Code39
  • 电子设计竞赛之备战

    一 学习框架 1 单片机编程 C语言 用来采集各种传感器的数据 控制各种电机 多写程序多看书 单片机学习的四个层次 1 完成单片机开发板的学习 理解单片机的工作 能看懂单片机程序 2 能够照着芯片手册 datasheet 试着编写各类芯片的
  • Tomcat启动Alias name [null] does not identify a key entry报错分析,涉及从公钥(CER)+私钥(KEY)转换为jks证书的方法

    先说原因是什么 之前百度 谷歌 CSDN上也搜过 搜到最多的答案是server xml中缺少指定keyAlias xxx 但是试了以后会发现还是报这个错 只是报错由Alias name null does not identify a ke
  • 【app测试】adb常用指令及华为卸载预置软件

    adb基础指令 1 adb devices 显示当前运行的全部Android设备 2 adb s 设备编号 对某一设备执行命令 3 adb install APK路径 安装应用程序 r表示replace覆盖安装 连接了多台设备时 需要指定设
  • ubuntu 12.04下双网卡绑定实现负载和冗余

    有一个需求是ubuntu下双网卡绑定 上连交换机已配置好 现在需要配置服务器 以下是配置过程 apt get install ifenslave 2 6 modprobe bonding 自动加载 编辑以下文件 vi etc mod 添加如
  • 「2020年大学生电子设计竞赛分享」电源题,省一等奖!

    点击上方 大鱼机器人 选择 置顶 星标公众号 福利干货 第一时间送达 01 到底参不参赛 嗡嗡嗡 随着手机的一声振动 锁屏弹出了消息提醒 没看全文 依稀瞄到2020 TI杯 几个字眼我便知道自己将面临一个艰难的抉择 庚子年春 突如其来的新型
  • 芜湖,前端这波起飞!

    前天加完班 回家路上翻了下粉丝群 发现群里最近在疯传一份叫 前端offer收割机养成指南 的资料 本来感觉这个title看起来有点离谱 结果没想到仔细一看 这份资料竟然真的有点东西 内容收纳的很全 而且融合了很多今年的新玩意 据我所知有人靠
  • BSD、Apache、MIT、GPL、LGPL几种常见的开源协议

    转载地址 https www cnblogs com Vito2008 p 4806677 html 1 BSD开源协议 original BSD license FreeBSD license Original BSD license B
  • u盘安装ubuntu问题:卡在引导界面不动

    问题 一直卡在如图界面不动 分析 既然一直提示syslinux 那我们就看看他是什么东西吧 原因 syslinux分区引导记录问题 解决方案1 安装bootice软件 将制作好的启动盘插入电脑 用bootice更改syslinux引导记录
  • 8.10:如何在Python中判断文件类型?

    在计算机科学领域中 文件类型判断是一个非常基础和重要的问题 不同类型的文件需要采取不同的处理方式 因此在处理文件时 我们需要准确地判断文件类型 Python作为一门流行的编程语言 提供了许多方法来判断文件类型 在本文中 我们将介绍几种常见的
  • @vitejsplugin-vue requires vue (>=3.2.13) or @vuecompiler-sfc to be present in the dependency tree

    运行项目的时候 首先会提示要安装 vue compiler sfc 但是安装后运行项目成功但是页面是空白并且报错 VUE HMR RUNTIME is not defined 摸索了半天 查看到package json依赖文件 没有vue
  • RTX线程通信之——线程标志

    文章目录 Thread Flags 概念 RTX线程标志API 案例 LED灯同步闪亮 小结 参考资料 Thread Flags In a real application we need to be able to communicate