ucosIII 事件标志组、同时等待多个内核对象、存储管理

本文内容简介:
一共分为三部分:
第一部分:事件标志组,用于等待多个事件
第二部分:同时等待多个内核对象,比如同时等待多个信号量
第三部分:存储管理,ucosIII提供的存储管理很容易内存泄露,建议直接使用正点原子提供的内存管理。

事件标志组

 有时候一个任务需要与多个事件同步,这个时候就需要使用事件标志组。事件标志组与任务之间有两种同步机制:“或”同步和“与”同步。
 “或”同步:等待多个事件时,任何一个事件发生 ,任务都被同步,这个就称为“或”同步。
 “与”同步:当所有的事件都发生时任务才被同步,这种同步机制被称为“与”同步。
 在UCOSIII中事件标志组为OS_FLAG_GRP,如果需要使用事件标志组的时候需要将宏OS_CFG_FLAG_EN置1

事件标志组结构体

struct  os_flag_grp {
OS_OBJ_TYPE          Type;                             
CPU_CHAR             *NamePtr; 
OS_PEND_LIST         PendList; 
#if OS_CFG_DBG_EN > 0u
    OS_FLAG_GRP      *DbgPrevPtr;
    OS_FLAG_GRP      *DbgNextPtr;
    CPU_CHAR         *DbgNamePtr;
#endif
OS_FLAGS             Flags;  //该值非常重要,用于表示哪个事件0或者1
CPU_TS               TS;
};

API

API

事件标志组的使用

/*1.定义*/
OS_FLAG_GRP EventFlags;     
/*2.创建一个事件标志组,记得要在start_task也就是第一个任务之前就创建好事件标志组*/
OSFlagCreate((OS_FLAG_GRP*)&EventFlags,     //事件标志组
             (CPU_CHAR*   )"Event Flags",   //
             (OS_FLAGS    )KEYFLAGS_VALUE,  //flag初始值
             (OS_ERR*     )&err);           //
/*3.发送消息,返回值为调用后Flag的值*/
flags_num=OSFlagPost((OS_FLAG_GRP*)&EventFlags,
                     (OS_FLAGS    )KEY0_FLAG,   //设置哪个标志位
                     (OS_OPT      )OS_OPT_POST_FLAG_SET,//设置为1
                     (OS_ERR*     )&err);
/*4.等待事件标志组*/
OSFlagPend((OS_FLAG_GRP*)&EventFlags,
                   (OS_FLAGS    )KEY0_FLAG+KEY1_FLAG,
                   (OS_TICK     )0,
                   (OS_OPT     )OS_OPT_PEND_FLAG_SET_ALL+OS_OPT_PEND_FLAG_CONSUME,//CONSUME表示获得后,将1设置为0,或者将0设置为1.根据post中是SET还是CLR
                   (CPU_TS*     )0,
                   (OS_ERR*     )&err);

同时使用多个内核对象

多个内核对象

/*1.定义OS_PEND_DATA数组*/
OS_OBJ_QTY index;
OS_PEND_DATA pend_multi_tbl[CORE_OBJ_NUM];//定义数组
/*2.放入消息队列或者信号量*/
pend_multi_tbl[0].PendObjPtr=(OS_PEND_OBJ*)&Test_Sem1;
pend_multi_tbl[1].PendObjPtr=(OS_PEND_OBJ*)&Test_Sem2;
pend_multi_tbl[2].PendObjPtr=(OS_PEND_OBJ*)&Test_Q;
/*3.等待多个内核,返回准备好,停止或者删除的内核对象数量*/
index=OSPendMulti((OS_PEND_DATA*    )pend_multi_tbl,//内核对象数组    
                  (OS_OBJ_QTY       )CORE_OBJ_NUM,  //内核数量
                  (OS_TICK          )0,     
                  (OS_OPT           )OS_OPT_PEND_BLOCKING,
                  (OS_ERR*          )&err);

注意

ucosIII存储管理

因为ucosIII自带的存储管理很不好,所以建议不使用内带的内存管理。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

猎羽

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值