两种同步机制

“或”同步

“与”同步

使能

#define OS_CFG_FLAG_EN 1u /* Enable (1) or Disable (0) code generation for EVENT FLAGS */

主结构体

typedef struct os_flag_grp OS_FLAG_GRP;
struct os_flag_grp { /* Event Flag Group */ OS_OBJ_TYPE Type; /* Should be set to OS_OBJ_TYPE_FLAG */
CPU_CHAR *NamePtr; /* Pointer to Event Flag Name (NUL terminated ASCII) */
OS_PEND_LIST PendList; /* List of tasks waiting on event flag group */
#if OS_CFG_DBG_EN > 0u
OS_FLAG_GRP *DbgPrevPtr;
OS_FLAG_GRP *DbgNextPtr;
CPU_CHAR *DbgNamePtr;
#endif OS_FLAGS Flags; /* 8, 16 or 32 bit flags */
CPU_TS TS; /* Timestamp of when last post occurred */
};

API函数

//创建
void OSFlagCreate (OS_FLAG_GRP *p_grp,
CPU_CHAR *p_name,
OS_FLAGS flags,
OS_ERR *p_err); #if OS_CFG_FLAG_DEL_EN > 0u
//删除
OS_OBJ_QTY OSFlagDel (OS_FLAG_GRP *p_grp,
OS_OPT opt,
OS_ERR *p_err);
#endif /*
* opt specifies whether you want ALL bits to be set or ANY of the bits to be set.
* You can specify the 'ONE' of the following arguments:
*
* OS_OPT_PEND_FLAG_CLR_ALL You will wait for ALL bits in 'flags' to be clear (0)
* OS_OPT_PEND_FLAG_CLR_ANY You will wait for ANY bit in 'flags' to be clear (0)
* OS_OPT_PEND_FLAG_SET_ALL You will wait for ALL bits in 'flags' to be set (1)
* OS_OPT_PEND_FLAG_SET_ANY You will wait for ANY bit in 'flags' to be set (1)
*
* You can 'ADD' OS_OPT_PEND_FLAG_CONSUME if you want the event flag to be 'consumed' by
* the call. Example, to wait for any flag in a group AND then clear
* the flags that are present, set 'wait_opt' to:
*
* OS_OPT_PEND_FLAG_SET_ANY + OS_OPT_PEND_FLAG_CONSUME
*
* You can also 'ADD' the type of pend with 'ONE' of the two option:
*
* OS_OPT_PEND_NON_BLOCKING Task will NOT block if flags are not available
* OS_OPT_PEND_BLOCKING Task will block if flags are not available
*/
//等待-1
OS_FLAGS OSFlagPend (OS_FLAG_GRP *p_grp,
OS_FLAGS flags,
OS_TICK timeout,
OS_OPT opt,
CPU_TS *p_ts,
OS_ERR *p_err); #if OS_CFG_FLAG_PEND_ABORT_EN > 0u
//取消等待
OS_OBJ_QTY OSFlagPendAbort (OS_FLAG_GRP *p_grp,
OS_OPT opt,
OS_ERR *p_err);
#endif //获取使任务就绪的事件标志
OS_FLAGS OSFlagPendGetFlagsRdy (OS_ERR *p_err); //发送+1
OS_FLAGS OSFlagPost (OS_FLAG_GRP *p_grp,
OS_FLAGS flags,
OS_OPT opt,
OS_ERR *p_err);

应用举例

#define FLAG1       (1 << 0)
#define FLAG2 (1 << 1)
OS_FLAG_GRP EventFlags; //定义一个事件标志组 void task1(void *p_arg)
{
while(1)
{
//向事件标志组EventFlags发送标志
flags_num=OSFlagPost((OS_FLAG_GRP*)&EventFlags,
(OS_FLAGS )FLAG1,
(OS_OPT )OS_OPT_POST_FLAG_SET,
(OS_ERR* )&err);
printf("task1事件标志组EventFlags的值:%d\r\n",flags_num); OSTimeDlyHMSM(0,0,2,0,OS_OPT_TIME_PERIODIC,&err); //向事件标志组EventFlags发送标志
flags_num=OSFlagPost((OS_FLAG_GRP*)&EventFlags,
(OS_FLAGS )FLAG2,
(OS_OPT )OS_OPT_POST_FLAG_SET,
(OS_ERR* )&err);
printf("task1事件标志组EventFlags的值:%d\r\n",flags_num); OSTimeDlyHMSM(0,0,2,0,OS_OPT_TIME_PERIODIC,&err);
}
} void task2(void *p_arg)
{
while(1)
{
//等待事件标志组
OSFlagPend((OS_FLAG_GRP*)&EventFlags,
(OS_FLAGS )FLAG1|FLAG2,
(OS_TICK )0,
(OS_OPT )OS_OPT_PEND_FLAG_SET_ALL+OS_OPT_PEND_FLAG_CONSUME,
(CPU_TS* )0,
(OS_ERR* )&err);
printf("task2事件标志组EventFlags的值:%d\r\n",EventFlags.Flags);
}
}

实验现象

UCOSIII事件标志组的更多相关文章

  1. 16.3-uC/OS-III同步 (事件标志组实验)

    事件标志组,顾名思义,就是若干个事件标志的组合,代表若干个事件是否发生,通常用于集合两个或两个以上事件的状态 . 1.如果想要使用事件标志组,就必须事先使能事件标志组.消息队列的使能位于“os_cfg ...

  2. 16.2-uC/OS-III同步 (事件标志组)

    事件标志组 1.当任务要与多个事件同步时可以使用事件标志.若其中的任意一个事件发生时任务被就绪, 叫做逻辑或(OR).若所有的事件都发生时任务被就绪,叫做逻辑与( AND). 2.用户可以创建任意个事 ...

  3. FreeRTOS 事件标志组 ——提高篇

    假设你已经看过FreeRTOS 事件标志组这篇随笔了. 之前的基础篇,真的就只是简单了解一下,相当于大学实验室的实验,但是,我们实际公司项目中,需要更多地思考,就算我们之前只是学习了基础概念以及基础语 ...

  4. RTX——第13章 事件标志组

    以下内容转载自安富莱电子: http://forum.armfly.com/forum.php 前面的章节我们已经讲解了任务管理和时间管理,从本章节开始讲解任务间的通信和同步机制.首先讲解任务间的通信 ...

  5. FreeRTOS 事件标志组

    以下转载自安富莱电子: http://forum.armfly.com/forum.php 为什么要使用事件标志事件标志组是实现多任务同步的有效机制之一.也许有不理解的初学者会问采用事件标志组多麻烦, ...

  6. FreeRTOS 任务计数信号量,任务二值信号量,任务事件标志组,任务消息邮箱

    以下基础内容转载自安富莱电子: http://forum.armfly.com/forum.php 本章节为大家讲解 FreeRTOS 计数信号量的另一种实现方式----基于任务通知(Task Not ...

  7. FreeRTOS_事件标志组

    FreeRTOS事件标志组 事件标志组简介 1. 事件位(事件标志) 事件位用于表明某个事件是否发生,事件位通常用作事件标志,比如下面的几个例子: 当收到一条消息并且把这条消息处理掉以后就可以将某个位 ...

  8. FreeRTOS 任务通知模拟事件标志组

    实验 //设置事件位的任务 void eventsetbit_task(void *pvParameters) { u8 key; while(1) { if(EventGroupTask_Handl ...

  9. ucos中信号量 事件标志 消息队列都怎么用

    信号量 事件标志和消息队列分别应用于什么场景(反正我学的时候有点闹不清,现在总结一下): 信号量和事件标志用于任务同步.详细来说,这个功能可以替代以前裸机中你打一个标记的功能,比如使用了一个定时器,5 ...

随机推荐

  1. 性能测试指标:TPS,吞吐量,并发数,响应时间

    性能测试指标:TPS,吞吐量,并发数,响应时间 常用的网站性能测试指标有:TPS.吞吐量.并发数.响应时间.性能计数器等. 并发数并发数是指系统同时能处理的请求数量,这个也是反应了系统的负载能力. 响 ...

  2. MySQL中的比较操作符<=>

    对于=操作符,两个值被比较,结果是0(不相等)或者1(相等). 比较操作符<=>表示NULL安全的等价.这个比较操作符执行等价比较,和=操作符类似,但是如果两个操作数都是NULL,会返回1 ...

  3. JBoss服务器的安装和使用(关联到IDEA)

    1. 下载安装jboss服务器 wildfly-16.0.0.Final.zip(更名为wildfly了,选择合适的版本) 2. 解压,配置环境变量. JBOSS_HOME=D:\Program Fi ...

  4. React中跨域问题的完美解决方案

    针对react版本^16.6.0有多种解决方案 方案一:package.json中加上proxy代理配置 在packge.json加入 "proxy": "http:// ...

  5. Win10访问共享文件夹如何取消用户名密码

    win10中,开启guest(来宾)账户的步骤是: 右击win10左下角Windows的图标->计算机管理->计算机管理(本地)->系统工具->本地用户和组->用户-&g ...

  6. 如何用java代码写一个堆栈

    public class Stack { int[] data; int maxSize; int top; public Stack(int maxSize) { this.maxSize = ma ...

  7. [译]为什么在__new __()后总是调用__init __()?

    原文来源: https://stackoverflow.com/questions/674304/why-is-init-always-called-after-new 需要控制新实例的创建时,请使用 ...

  8. 安卓 android studio 报错 The specified Android SDK Build Tools version (27.0.3) is ignored, as it is below the minimum supported version (28.0.3) for Android Gradle

    今天将项目迁移到另一台笔记本,进行build出现以下问题,导致build失败 报错截图: 大致意思,目前使用的build工具版本27.0.3不合适.因为当前使用Gradle插件版本是3.2.1,这个版 ...

  9. 【449】Win10 蓝牙耳机链接没有声音

    Exhausting,当电脑出现问题的时候!!! 问题描述:蓝牙耳机连接上了电脑,但是通过右下角声音按钮无法选择蓝牙耳机的选项??? 解决方案:在声音按钮处点击右键,选择最下面的菜单“troubles ...

  10. js scheme 打开手机app的方法

    1.iframe function schemeUrl(url,callbak){ var ifr = document.createElement("iframe"); ifr. ...