历史上的今天
今天是:2025年04月24日(星期四)
2019年04月24日 | UCOSIII事件标志组和同时等待多个内核对象
2019-04-24 来源:eefocus
1、UCOSIII事件标志组
1.1事件标志组:
有时候一个任务需要与多个事件同步,这个时候就需要使用事件标志组。事件标志组与任务之间有两种同步机制:“或”同步和“与”同步。
“或”同步:等待多个事件时,任何一个事件发生 ,任务都被同步,这个就称为“或”同步。
“与”同步:当所有的事件都发生时任务才被同步,这种同步机制被称为“与”同步。

在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;
CPU_TS TS;
};
1.2、事件标志组API函数:
1.2.1 创建事件标志组
void OSFlagCreate (OS_FLAG_GRP *p_grp,//事件标志组 OS_FLAG_GRP EventFlag
CPU_CHAR *p_name,//事件标志组名字
OS_FLAGS flags,//定义事件标志组的名字
OS_ERR *p_err)
1.2.2 等待事件标志组
OS_FLAGS OSFlagPend (OS_FLAG_GRP *p_grp,//事件标志组
OS_FLAGS flags,//bit序列,把对应序列置1
OS_TICK timeout,//超时时间,同信号量
OS_OPT opt,//决定任务等待的条件,四个选项可选
CPU_TS *p_ts,//指向时间戳,记录发送、终止等事件时刻
OS_ERR *p_err)
1.2.3 向事件标志组发布标志
OS_FLAGS OSFlagPost (OS_FLAG_GRP *p_grp,//指向事件标志组
OS_FLAGS flags,//决定对哪些位清零和置位
OS_OPT opt,//决定对标志位的操作,有两种选项
OS_ERR *p_err)
2、UCOSIII同时等待多个内核对象
2.1、同时等待多个内核对象
前面我们讲过都是等待单个内核对象,包括:信号量、互斥信号量、消息队列和事件标志组。在UCOSIII中允许任务同时等待多个信号量和多个消息队列,也就是说,UCOSIII不支持同时等待多个事件标志组或互斥信号量。
一个任务可以等待任意数量的信号量和消息队列,第一个信号量或消息队列的发布会导致该任务进入就绪态。

2.2、OSPendMulti()函数:等待多个内核对象
一个任务可以调用函数OSPendMulti()函数来等待多个对象,并且可以根据需要指定一个等待超时值,函数OSPendMulti()原型如下:
OS_OBJ_QTY OSPendMulti (OS_PEND_DATA *p_pend_data_tbl,//指向OS_PEND_DATA表的指针
OS_OBJ_QTY tbl_size,//表p_pend_data_tbl的大小:内核对象数量
OS_TICK timeout,//超时时间
OS_OPT opt,//选择是否使用阻塞模式,两个选项
OS_ERR *p_err)
在调用函数OSPendMulti()之前我们需要先初始化OS_PEND_DATA数组,数组的大小取决于任务同时等待的内核对象的总数量。
2.3、初始化OS_PEND_DATA数组
2.3.1、定义内核对象,如下:
OS_SEM Test_Sem1; //信号量1
OS_SEM Test_Sem2; //信号量2
OS_Q Test_Q; //消息队列
2.3.2、初始化OS_PEND_DATA数组
OS_PEND_DATA pend_multi_tbl[CORE_OBJ_NUM]; //定义数组
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;
上一篇:UCOSIII存储管理
下一篇:UCOSIII任务间的通信
史海拾趣
|
引言 电容器一般由两个接近并相互绝缘的导体构成,是军用电子整机不可缺少的基础元件。在军用电子产品中,电解电容器占有相当大的比重,其可靠性在整机中起着至关重要的作用。 根据国内有关部门的统计,在整机故障原因中,由电容器选择和 ...… 查看全部问答> |
|
在nmd中回车的功能是进入下一级页面。但并不是靠VK_RETURN消息实现的,代码中有句注释如下 // NOTE: VK_RETURN is actualy handled by LBN_DBLCLK in the WMCommand handler 但我搜遍整个nmd目录未发现那里有将回车消息转换了,难道是在nmd目录外 ...… 查看全部问答> |
|
请问,在BSP中应如何修改SDHC驱动,让它支持多个SD设备,请给一些思路. 现有的BSP中只支持一个SD卡.(问题1:一般来说 CPU物理上应可支持多个SD卡,它应有相关寄存器表示支持的SDIO设备数, 是不是这样?) 问题2: 请问,在BSP中应如何修改SDHC驱动,让它支持多个SD设备,请给一些思路.谢谢… 查看全部问答> |
|
请问,如果我打算用STM32系列的单片机,都要准备什么工具? 请问斑竹和各位老师,如果我打算用STM32系列的单片机,都要准备什么工具?软件呢,我看有人用REALVIEW MDK,但是我 ...… 查看全部问答> |




