文章目录

  • 一、前言
  • 二、实验目的
  • 三、API
    • 3.1、osThreadFlagsSet
    • 3.2、osThreadFlagsWait
  • 四、代码
    • 4.1、main.h
    • 4.2、main.c
  • 五、Event Recorder调试
    • 5.1、长按按键KEY1与长按按键KEY2
    • 5.2、线程同步的效果
    • 5.3、将线程同步的地方放大

一、前言

线程标志组(Thread Flags)与事件标志组(Event Flags)的作用一样,都是用于线程(ISR)与线程之间通讯(同步)。线程标志与事件标志的区别是事件标志跟线程没有直接关系,所以事件标志需要创建之后才能使用的。线程标志属于线程的一部分,创建线程的同时,线程标志就已经被创建了。
以下是官方的描述:

线程标志组API函数汇总:

STM32工程:
链接:https://pan.baidu.com/s/10uQNtRO9nUtQNh0NWVhpeA
提取码:60p1

二、实验目的

长按按键KEY1发送线程标志(0x02U)给Test_Flags_App线程,实现LED_App线程同步Test_Flags_App线程。
长按按键KEY2发送线程标志(0x01U)给Test_Flags_App线程,实现LED_App线程同步Test_Flags_App线程。

三、API

3.1、osThreadFlagsSet

/* 使用举例 */
osThreadFlagsSet(threadID_Test_Flags_Thread,0x02U);  /* 置位Test_Flags线程的flag1 */
osThreadFlagsSet(threadID_Test_Flags_Thread,0x01U);  /* 置位Test_Flags线程的flag0 */
osThreadFlagsSet(threadID_Test_Flags_Thread,0x08U);  /* 置位Test_Flags线程的flag3 */

3.2、osThreadFlagsWait

void thread_A(void *argument)
{uint32_t flags;while(1){/* 一直等待,直到线程标志的flag0或flag1被置位 */flags = osThreadFlagsWait(0x00000003U,     /* flag0 ,flag1 */osFlagsWaitAny,  /* 逻辑或,清除标志 */osWaitForever    /* 一直等待 */);  /* 一直等待,直到线程标志的flag0,flag1,flag2,flag3都被置位 */flags = osThreadFlagsWait(0x0000000FU,     /* flag0,flag1,flag2,flag3 */osFlagsWaitAll,  /* 逻辑与,清除标志 */osWaitForever    /* 一直等待 */); /* 一直等待,直到线程标志的flag0,flag1,flag2,flag3都被置位 */flags = osThreadFlagsWait(0x0000000FU,     /* flag0,flag1,flag2,flag3 */osFlagsWaitAll | osFlagsNoClear,  /* 逻辑与,不清除标志 */osWaitForever    /* 一直等待 */); }
}

四、代码

4.1、main.h

4.2、main.c



五、Event Recorder调试

5.1、长按按键KEY1与长按按键KEY2

5.2、线程同步的效果

LED线程每隔500ms执行一次,当一直按着按键时,Test_Flags线程将跟LED线程同步,也是每500ms运行一次。

5.3、将线程同步的地方放大

LED线程的优先级是osPriorityLow,Test_Flags线程的优先级是osPriorityBelowNormal,Test_Flag线程的优先级要高许多。当LED线程发送线程标志给Test_Flags线程时会触发调度器,调度器将运行权交给Test_Flags线程,LED线程暂时进入阻塞态,等待Test_Flags运行完毕。

再做一次测试,将LED线程与Test_Flags线程的优先级互换,即LED线程的优先级是osPriorityBelowNormal,Test_Flags线程的优先级是osPriorityLow

RTX5 | 线程标志组01 - 线程同步相关推荐

  1. RTX5 | 事件标志组03 - 线程同步(逻辑或)

    一.前言 事件标志组是独自存在的,线程标志组只是线程的一部分.事件标志组的使用方法与线程标志组的使用方法一样,学会使用线程标志组就等于学会使用事件标志组,反之亦然.当线程退出之后,其线程标志组就会消失 ...

  2. RTX5 | 事件标志组04 - 线程同步(逻辑与)

    文章目录 一.前言 二.实验目的 三.API 3.1.osEventFlagsWait 四.代码 4.1.main.h 4.2.main.c 五.Event Recorder 5.1.分别长按按键KE ...

  3. RTX5 | 事件标志组01 - 创建事件标志组

    文章目录 一.前言 二.实验目的 三.API 3.1.osEventFlagsAttr_t 3.2.osEventFlagsNew 四.代码 4.1.main.h 4.2.main.c 五.Event ...

  4. RTX5 | 线程标志组02 - 获取线程标志与清除线程标志

    文章目录 一.前言 二.实验目的 三.API 3.1.osThreadFlagsClear 3.2.osThreadFlagsGet 四.代码 4.1.main.h 4.2.main.c 五.Even ...

  5. RTX5 | 事件标志组02 - 置位事件标志组,并获取事件标志组的值

    文章目录 一.前言 二.实验目的 三.API 3.1.osEventFlagsSet 3.2.osEventFlagsGet 四.代码 4.1.main.h 4.2.main.c 五.Event Re ...

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

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

  7. 01 线程同步机制封装类

    01 线程同步机制封装类 RAII RAII全称是"Resource Acquisition is Initialization",直译过来是"资源获取即初始化" ...

  8. Windows核心编程 第九章 线程与内核对象的同步(下)

    9.4 等待定时器内核对象 等待定时器是在某个时间或按规定的间隔时间发出自己的信号通知的内核对象.它们通常用来在某个时间执行某个操作. 若要创建等待定时器,只需要调用C r e a t e Wa i ...

  9. 第九章 线程与内核对象的同步(6)

    六.其他的线程同步函数 1.异步设备I/O 异步设备I/O使得线程能够启动一个读操作或写操作,但是不必等待读操作或写操作完成.设备对象是可以同步的内核对象,可以调用WaitForSingleObjec ...

最新文章

  1. 图像处理 100 问!!
  2. MariaDB: ERROR 2003 (HY000): Can't connect to MySQL server on '127.0.0.1' (111 Connection refused)
  3. Unity中sharedMaterials 和 materials
  4. [JVM]常用JVM工具使用
  5. Linux-chown and chmod 命令的使用
  6. 密码技术应用--SM2文件签名验签
  7. python中的特殊成员
  8. C++之队列的实现及各种
  9. 学习笔记(37):Python实战编程-yield实现生成器
  10. Java 中的异常处理
  11. java停机保存数据_哦,这就是java的优雅停机?(实现及原理)
  12. Atiit 常见功能 常用功能与模块的最快速解决方案
  13. AutoSar之CAN网络管理详解
  14. i58400升级可以换什么cpu_罗敏:老式碰锁可以换什么锁?老式门锁该如何
  15. TPS和QPS的区别
  16. VB6不能加载MSCOMCTL.OCX最简单的解决办法
  17. 当前目录.和上一级目录..的作用
  18. 微博热搜榜爬虫2.0
  19. 雷达信号Matlab处理(一)
  20. android对文件的MD5验证

热门文章

  1. .Net Attribute详解(下) - 使用Attribute武装枚举类型
  2. (一二六)第十一章编程练习
  3. Yii模块内生成CRUD
  4. 前辈学习C语言的四种方法,实际上不管学什么语言,都行之有效!
  5. 设计模式之Builder模式 (C++实现)
  6. 7PYX 网站代码下载
  7. 你今天volatile了吗?--慎重使用
  8. 程序员自我提高情绪10招
  9. 如今编程成为了一个越来越重要的「技能」,如何自学编程我来教你
  10. 日常撕逼:React和Vue到底谁更牛?