文章目录
一、前言
线程标志组(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。