历史上的今天
返回首页

历史上的今天

今天是: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;

 


推荐阅读

史海拾趣

EIC [EIC discrete Semiconductors]公司的发展小趣事

EIC公司自创立之初,就致力于离散半导体技术的研发与创新。在成立初期,公司面临了技术瓶颈和市场接受度的双重挑战。然而,EIC的研发团队通过不懈努力,成功研发出了一款高性能、低功耗的离散半导体产品,这一技术突破不仅为公司赢得了市场认可,也为后续的产品线扩展奠定了坚实的基础。随着技术的不断进步和产品线的不断丰富,EIC逐渐在电子行业中树立起了自己的品牌形象。

Gamma Microelectronics ( APM )公司的发展小趣事

为了进一步满足市场需求,G24i在英国威尔士卡迪夫建成了世界上第一条25MW的大规模生产基于钛衬底的DSSC基地。这一基地的建成标志着G24i在DSSC领域实现了从研发到生产的全链条覆盖。大规模生产不仅降低了产品的制造成本,也提高了生产效率和质量稳定性。G24i通过不断优化生产流程和提升管理水平,确保了产品的市场竞争力。

Bel Power Solutions公司的发展小趣事

在国内市场取得一定成绩后,Bel Power Solutions开始积极拓展国际市场。公司通过与全球知名企业的合作,成功将产品打入国际市场,并赢得了良好的声誉。同时,公司还积极寻求与系统集成商、分销商等建立长期稳定的合作关系,共同开拓市场。这些合作伙伴关系的建立,不仅为公司带来了更多的商业机会,还提升了公司的品牌影响力和市场份额。

明波通信(BWAVE)公司的发展小趣事

随着国内市场的日益饱和,明波通信开始将目光投向全球市场。公司先后在日本东京和江苏常州设立了子公司,通过技术合作和市场拓展,进一步巩固了公司在全球通信领域的地位。同时,明波通信也积极参与国际技术交流和合作,不断提升自身的技术水平和创新能力。这一系列的国际化战略举措,为明波通信的未来发展奠定了坚实的基础。

以上五个故事都是基于明波通信在电子行业中的发展历程和公开资料进行的概括性描述。虽然无法涵盖所有细节和具体事件,但希望能够展现出明波通信在创业、技术创新、市场拓展和国际化等方面的努力和成就。

Dongguan Jingyue Electronics Co Ltd公司的发展小趣事

在电子行业的激烈竞争中,Dongguan Jingyue Electronics Co Ltd始终将技术创新作为公司发展的核心驱动力。公司自成立之初就投入大量资源用于研发新技术和新产品。通过不断的努力,公司成功推出了一系列具有市场竞争力的电子产品,赢得了消费者的广泛认可。这些技术创新不仅提升了公司的品牌形象,也为公司带来了丰厚的利润。

Helium_Systems__Inc.公司的发展小趣事

海曼电子深知人才是企业发展的根本动力。因此,公司一直将人才培养和团队建设放在重要位置。公司建立了完善的人才培养体系,通过内部培训、外部交流等方式,不断提升员工的专业技能和综合素质。同时,公司还注重营造积极向上的企业文化氛围,鼓励员工创新思维和团队合作。这些举措不仅吸引了大量优秀人才加入海曼电子的大家庭,还为公司的持续发展提供了强有力的保障。

问答坊 | AI 解惑

军用电解电容器的应用可靠性选择

引言   电容器一般由两个接近并相互绝缘的导体构成,是军用电子整机不可缺少的基础元件。在军用电子产品中,电解电容器占有相当大的比重,其可靠性在整机中起着至关重要的作用。   根据国内有关部门的统计,在整机故障原因中,由电容器选择和 ...…

查看全部问答>

怎么评价一个载波恢复系统

一般工程上会用哪些指标去衡量一个载波恢复系统呢 主要包括一个pll 和 dco…

查看全部问答>

SmartRF® Studio 怎么用啊

SmartRF® Studio要怎么连接 才能用? 有用过的吗,指点下~~…

查看全部问答>

请问EVC如何实现GetBitmapBits函数的方法?

各位大侠,最近在编写EVC时,发现EVC有一个函数没有GetBitmapBits,请问大家有什么替代的方法没有?…

查看全部问答>

[NMD原码问题]“回车”的消息响应,不才望赐教

在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设备,请给一些思路.谢谢…

查看全部问答>

i/o接口问题

I/O接口与I/O控制器的区别? 通常说的串口编程,与串口设备的驱动有什么不同。 为什么通常都说对串口编程,而不是对具体的串口设备编程?(因为串口通用的原因吗?)…

查看全部问答>

地址总线编程问题

我现在要编写arm9(YC2440)的地址总线的程序,目的是实现给另一块板子传输数据的功能,不知道有没有人做过??或者有没有这方面的资料推荐一下,要是有人做过能不能把程序给我看一下,嘿嘿,多谢了,麻烦路过的高手都帮我看一看,这个比较急…

查看全部问答>

请问,如果我打算用STM32系列的单片机,都要准备什么工具?

                                 请问斑竹和各位老师,如果我打算用STM32系列的单片机,都要准备什么工具?软件呢,我看有人用REALVIEW MDK,但是我 ...…

查看全部问答>