边肖将与您分享vxworks中的事件。相信大部分人都不是很了解,所以分享这篇文章供大家参考。希望你看完这篇文章后会有很多收获。让我们一起来发现吧!
事件是一种高效的任务间同步机制。事实上,它还可以与一些资源(信号量和消息队列)同步。使用xxEvStart()将当前任务注册到相应的资源。当此资源生效并且此资源上没有其他任务被阻止时,系统将向此注册的任务发送事件。结合Event的基本操作,可以实现任务和各种资源的同步操作。
/*与资源相关的选项*/# define EVENTS _ OPTIONS _ NONE0x 00 # define EVENTS _ SEND _ ONCE0x 01/*在EVENTS SEND之后取消注册事件*/# define EVENTS _ ALLOW _ OVERWRITE0x 02/*可以覆盖以前的注册*/# define EVENTS _ SEND _ IF _ FREE0x 04/*在xxxEvStart()*/STATUS semEvStart(SEM _ ID semi,UINT32 events,UINT8 options)中发送事件;状态semEvStop状态msgQEvStart(MSG_Q_ID msgQId,UINT32事件,UINT8选项);状态msgQEvStop(MSG _ Q _ ID msgQId);
看一个例子。
/*版权所有2020 VxWorks 567 */# include stdio . h/* printf()*/# include eventlib . h/* eventReceive()*/# include semevlib . h/* include msgqevlib . h/* msgQEvStart()*/#定义MSGS _ NUM 5 #定义MSG _ Lstatic SEM _ ID semId静态MSG _ Q _ ID msgQIdvoid testEvent(){ _ Vx _ event _ t eventsReceived;/*一个资源用二进制信号量*表示/semi=sembcreate (SEM _ q _ FIFO,SEM _ empty);/*将当前任务注册到这个信号量*/semevstart(SEM,vxev01,events _ options _ none);/*用消息队列表示一个资源*/msgqid=msgqcreate (msgs _ num,msg _ len,msg _ q _ FIFO);/*将当前任务注册到此消息队列*/msgqevstart (msgqid,vxev02,events _ options _ none);While(1) {/*当任何资源有效时,它将被处理*/事件接收(vxev01 | vxev02,events _ wait _ any,wait _ forever,接收到的事件);如果(eventsreceivedvxev 01){/* semaphore有效,并且没有其他任务可以申请semaphore */printf(' \ n \ t semphorais free \ n ');semTake(SeM,WAIT _ FOURE);} else if(EventsReceiveDVXEV 02){/*新消息到达,没有其他任务读取该消息*/printf(\ n \ tmsgQ空闲\ n ');msgQReceive(msgQId,NULL,0,WAIT _ FOREVER);}}}}} Void FreeSEM () {/* Release信号量,表示对应的资源有效*/SEM give(semi);}void freeMsgQ(){ /*发送消息表示对应资源有效*/msgQSend(msgQId,0,0,0,0);}
实施效果
以上就是文章《什么是vxworks中的事件》的全部内容。感谢您的阅读!相信大家都有一定的了解,希望分享的内容对大家有所帮助。想了解更多知识,请关注行业资讯频道!
内容来源网络,如有侵权,联系删除,本文地址:https://www.230890.com/zhan/155159.html