μC/OS-II事件标志组的入门级使用方法

试想如下情况,有A、B、C三个事件,当A、B都满足某一条件(或执行某一动作)后C才能得到运行(持续运行或运行一次后继续等待A、B条件再次满足后再运行)。

如果需要实现这样的功能,就可以用事件标志组来实现了!

具体看实例:

//定义一个事件标志

OS_FLAG_GRP *Sem_Flg = 0;

//LED0任务

void led0_task(void *pdata)

{

INT8U  err = 0;

pdata = pdata;

//创建一个事件标志

Sem_Flg = OSFlagCreate(0, &err);

while (1)

{

delay_ms(5000u);

//发送信号量集

OSFlagPost(

Sem_Flg,

(OS_FLAGS)1, //给第0位发信号

OS_FLAG_SET, //信号量置1

&err

);

}

}

//LED1任务

void led1_task(void *pdata)

{

INT8U err = 0u;

while (1)

{

delay_ms(1000u);

//发送信号量集

OSFlagPost(

Sem_Flg,

(OS_FLAGS)2, //给第1位发信号

OS_FLAG_SET, //信号量置1

&err

);

}

}

//UART任务

void uart_task(void *pdata)

{

INT8U err = 0;

pdata = pdata;

while (1)

{

//请求信号量集

OSFlagPend(

Sem_Flg,

(OS_FLAGS)0x03, //请求第0位和第1位信号

OS_FLAG_WAIT_SET_ALL //第0位和1位均置1时为有效,否则任务挂在这里

| OS_FLAG_CONSUME,   //清除指定事件标志位

0, //无限等待,直到收到信号为止

&err

);

printf("run uart_task\r\n"); //每5秒钟打印一次

}

}

其中OS_FLAG_WAIT_SET_ALL如果改成OS_FLAG_WAIT_SET_ANY的话,

则表示第0位或第1位置1时为有效,否则任务挂在这里。

如果不加OS_FLAG_CONSUME的话,则表示一旦条件成立,打印会一直进行下去,

而不需要等待条件再次成立才能打印!

时间: 2024-12-17 07:08:42

μC/OS-II事件标志组的入门级使用方法的相关文章

事件标志组

---恢复内容开始--- 事件标志组,顾名思义,就是若干个事件标志的组合,代表若干个事件是否发生,通常用于集合两个或两个以上事件的状态. 如果想要使用事件标志组,就必须事先使能事件标志组.消息队列的使能位于"os_cfg.h" /* ----------------------------- EVENT FLAGS --------------------------- */ #define OS_CFG_FLAG_EN 1u //使能/禁用事件标志组 #define OS_CFG_F

uC/OS-II同步行为----事件标志组

主要API讲解: 1.OS_FLAG_GRP *OSFlagCreate( OS_FLAGS flags, //其中参数OS_FLAGS flags是信号的初始值 INT8U *perr //参数 *perr 是错误信息, ); //返回值为OS_FLAG_GRP型的指针,即为创建的信号量集的标志组的指针 2.OS_FLAGS OSFlagPost( OS_FLAG_GRP *pgrp,  //发送信号量集的指针 OS_FLAGS flags,  //选择要发送的信号 :例如:给第1位发信号 0

μC/OSIII——任务同步(事件标志组)

使用情况 当任务需要与多个事件的发生同步,可以使用事件标志组.有两种情况: 或同步——等待多个事件发生,任何一个事件发生,任务就发生(同步) 与同步——等待多个事件发生,当所有事件都发生,任务就发生(同步) 使用方法 事件标志组服务函数的实现代码在os_flag.c文件中,在编译时,将os_cfg.h文件中的配置常数OS_CFG_FLAG+EN设为1就可启用这些服务函数. 常用的事件标志组的服务函数有: OSFlagCreate() 创建事件标志组 OSFlagPend()    等待事件标志

FreeRTOS 事件标志组

为什么要使用事件标志事件标志组是实现多任务同步的有效机制之一.也许有不理解的初学者会问采用事件标志组多麻烦,搞个全局变量不是更简单?其实不然,在裸机编程时,使用全局变量的确比较方便,但是在加上 RTOS 后就是另一种情况了. 使用全局变量相比事件标志组主要有如下三个问题:? 使用事件标志组可以让 RTOS 内核有效地管理任务,而全局变量是无法做到的,任务的超时等机制需要用户自己去实现.? 使用了全局变量就要防止多任务的访问冲突,而使用事件标志组则处理好了这个问题,用户无需担心.? 使用事件标志组

FreeRTOS 任务计数信号量,任务二值信号量,任务事件标志组

本章节为大家讲解 FreeRTOS 计数信号量的另一种实现方式----基于任务通知(Task Notifications)的计数信号量,这里我们将这种方式实现的计数信号量称之为任务计数信号量. 任务计数信号量效率更高,需要的 RAM 空间更小.当然,缺点也是有的,它没有之前介绍的计数信号量实现的功能全面. 任务通知(Task Notifications)介绍FreeRTOS 每个已经创建的任务都有一个任务控制块(task control block),任务控制块就是一个结构体变量,用于记录任务的

Jetpack系列:LiveData入门级使用方法

Android APP开发中,开发者们都想有一个公共的组件,可以实现后台数据的监听,同时实时更新到UI进行显示,从而大大简化开发过程.Google针对这一开发需求,提供了Jetpack LiveData组件.下面我们来一起看下LiveData的基本使用方法吧! 首先,先了解下使用LiveData的优点. 确保UI与数据状态匹配 不需要担心内存泄漏问题 Activity停止后数据变化不会导致Crash 不再需要人工生命周期的处理 始终使用最新的数据 正确应用配置更改 共享资源 LiveData遵循

Freertos-事件标志组,消息队列,信号量,二值信号量,互斥信号量

任务间的通信和同步机制  在裸机编程时,使用全局变量的确比较方便,但是在加上 RTOS 后就是另一种情况了. 使用全局变量相比事件标志组主要有如下三个问题: 1.使用事件标志组可以让 RTOS 内核有效地管理任务,而全局变量是无法做到的,任务的超时等机制需要用户自己去实现.2.使用了全局变量就要防止多任务的访问冲突,而使用事件标志组则处理好了这个问题,用户无需担心.3.使用事件标志组可以有效地解决中断服务程序和任务之间的同步问题. 事件标志组:事件标志组是实现多任务同步的有效机制之一. 每创建一

uC/OS II 任务切换原理

今天学习了uC/OS II的任务切换,知道要实现任务的切换,要将原先任务的寄存器压入任务堆栈,再将新任务中任务堆栈的寄存器内容弹出到CPU的寄存器,其中的CS.IP寄存器没有出栈和入栈指令,所以只能引发一次中断,自动将CS.IP寄存器压入堆栈,再利用中断返回,将新任务的任务断点指针弹出到CPU的CS.IP寄存器中,实现任务切换.虽然明白个大概,但是其中的细节却有点模糊,为什么调用IRET中断返回指令后,弹入CPU的CS.IP寄存器的断点指针是新任务的断点指针,而不是当前任务的,UCOS II是如

方法组转换和匿名方法

前面的文章介绍过,C# 1.0中出现委托这个核心概念,在C# 2.0中,委托得到了很大的改进.C# 2.0中委托的改进为C# 3.0中的新特性提供了铺垫,当我们了解了匿名方法后,Lambda的学习就会变得相对容易. 下面就看看C# 2.0中委托的改进. 方法组转换 在C# 1.0中,如果要创建一个委托实例,就必须同时指定委托类型和符合委托签名的方法.但是,在C# 2.0中,支持了方法组转换,也就是说我们可以从方法组到一个兼容委托类型的隐式转换.所谓"方法组"(method group)