Vworks任务间的通信_第1页
Vworks任务间的通信_第2页
Vworks任务间的通信_第3页
Vworks任务间的通信_第4页
Vworks任务间的通信_第5页
已阅读5页,还剩4页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

[原]Vxworks任务间的通信2015-4-13阅读29评论0vxworks中任务间的通信支持信号量、消息队列、管道、信号、事件、共享内存等。一:信号量信号量分二进制信号量、互斥信号量、计数信号量。1:二进制信号量semBCreate():创建二进制信号量SEM」DsemBCreate(intoptionszSEM_B_STATEinitialstate)options可以为基于优先级的队列EM_Q_PRIORITY(Oxl)或者是基于先进先出的队列SEM_Q_FIFO(OXO)・initialstate可以是信号量初始化为满SEM_FULL(1)或者为空SEM_EMPTY(0)osemTake():获取信号量STATUSsemTake(SEM」DsemlD,inttimeout)semID为信号量ID。timeout表示任务一直等待信号量,直到可用WAIT_FOREVER(-1)或者不等待,直接下步操作NO_WAIT(0)。semGive():释放信号量STATUSsemGive(SEM」DsemID)semFlush():唤醒信号量STATUSsemFlush(SEM」DsemID)通过此函数可以将所有阻塞在信号量(WAIT_FOREVER)上的任务释放。semDelete():删除信号量STATUSsemDelete(SEM」DsemID)semlnfo():得到阻塞在信号量上的所有任务ID列表intsemlnfo(SEM」DsemID,intidList[],intmaxTasks)idList[]为要显示任务ID的数组。maxTasks为要显示的任务最人数。semShow():显示信号量的相关信息STATUSsemShow(SEM」DsemIDJntlevel)level分概括(0),详细⑴。2:互斥信号量互斥信号量相比二进制信号量增加了防止优先级倒置、递归访问等功能。semMCreate():创建互斥信号量SEM」DsemMCreate(intoptions)options的选项有:-SEM_Q_PRIORITY(Oxl):需要获取信号量的任务基于优先级原则排列。-SEM_Q_FIFO(OxO):需要获取信号量的任务基于先进先出原则排列。-SEM_DELETE_SAFE(0x4):保护任务防止意外删除,当执行获取信号量(semtake)时操作时会默认执行任务保护(taskSafe)操作,当执行释放信号量(semGive)操作时会默认执行取消任务保护(taskUnsafe臊作。-SEM」NVERSION_SAFE(Ox8):保护系统,防止系统出现优先级倒置现象。-SEM_EVENTSEND_ERR_NOTIFY(0X10):任务发送事件失败时,会发送错误号。semMGiveForce():强制释放互斥信号量STATUSsemMGiveForce(SEM」Dsemld)3:计数信号量计数信号量主要用于搜集某些信号量。SEM」DsemCCreate(intoptionsjntinitialcount)options为信号量属性或类型initialcount初始化计数示例代码:以二进制信号量为例STATUStaskl(void);//声明两个任务STATUStask2(void);inttaskldl,taskld2;//全局变量任务IDSEM」DsemTestl,semTest2;//信号量intinitTask() 〃任务初始化taskldl=taskSpawn(,,taskl,,/120/0,10240/(FUNCPTR)taskl,0/0A0,0,0/0z0,0);//创建任务1taskld2=taskSpawn(,,task2,,/120/0,10240/(FUNCPTR)task2/0/0A0,0,0/0z0,0);//创建任务2semTestl二semBCreate(SEM_Q_PRIORITY;SEM_EMPTY);//创建信号量1semTest2=semBCreate(SEM_Q_PRIORITXSEM_EMPTY);//创建信号量2if(semTestl==NULL) 〃如果创建信号量失败,则返回错误,成功着返回0KreturnERROR;}returnOK;}STATUStaskl(void)//任务1主体函数{while(l)printf("任务1释放了信号量!\n”);semTake(semTest2,WAIT_F0REVER);//任务1得到信号量2,在任务2没有释放信号屋2前,任务1在此等待printf(”任务1得到了信号量!\n”);}}STATUStaskl(void)//任务2主体函数{while(l){semTake(semTestl,WAIT_FOREVER);//任务2得到信号量1,在任务1没有释放信号屋1前,任务2在此等待printf(“任务2得到了信号量!\n”);semGive(semTset2); 〃任务2释放信号量2printf("任务2释放了信号量!\n");}}*/消息队列Vxworks系统中提供了两种消息队列库:msgQLib和mqPxLib。msgQLib提供了标准的vxworks消息队列,而msPxLib提供了POSIX消息队列。msgQCreate():创建或者初始化消息队列MSG_Q_IDmsgQCreate(intmaxMsgs,intmaxMsgLengthJntoptions)maxMsgs为最大消息数maxMsgLength消息的最大字节数options信息的属性其中options可以为-MSG_Q_FIFO(OxOO):任务以FIFO原则排队。-MSG_Q_PRIORITY(0X01):任务以基于优先级的原则排队。-MSG_Q_EVENTSEND_ERR_NOTIFY(0X02):消息队列向他的注册任务发送事件失败时,将返回一个ERROR的值,并且正确地设置errnoo成功创建消息队列后会返回消息队列ID。msgQDelete():删除消息队列STATUSmsgQDelete(MSG_Q_IDmsgQId)//要删除的消息队列msgQSend():发送消息队列STATUSmsgQSend(MSG_Q_IDmsgQId,//要发送的?肖息队列char*buffer,〃要发送的消息指针UINTnBytes, 〃消息长度inttimeout,〃等待的tick数当为NO_WAIT(0)时,表示消息没有发送出去也立刻返回,当为WAIT_FOREVER(-1)时,则一直等待发送,知道消息发生发送出去intpriority 〃普通(MSG_PRI_NORMAL(0))还是紧急模式(MSG_Q_PRI_URGENT(1)))msgQReceive():从消息队列中收取消息intmsgQReceive(MSG_Q_IDmsgQId,//接4攵的消息队歹ijIDchar*buffer, 〃接收消息的BUFFER指针,如果消息超过了BUFFER的最大字节数,则超出的部分将被丢弃。UINTmaxNBytes,//BUFFER的最人字节数inttimeout 〃等待的tick数,当为NO_WAIT(0)时,表示消息没有发送出去也立刻返回,当为WAIT_FOREVER(-1)时,则一直等待发送,知道消息发生发送出去)msgQNumMSgs():得到排队到消息队列中的消息数intmsgQNumMsgs(intMSG_Q_IDmsgQId)〃消息队列的ID该函数返回排队到消息队列中的消息数。示例代码:STATUStaskl(void);//声明两个任务STATUStask2(void);inttaskldl,taskld2;//全局变量任务IDMSG_Q_IDmsgQIdl;〃消息队列IDcharbuffer[50];//接收消息的bufferintinitTask() 〃任务初始化{taskldl=taskSpawn(lltaskl,l/120A10240/(FUNCPTR)taskl/0/0A0A0/0/0,0);//创建任务1taskld2=taskSpawn(lltask2,l/120A10240/(FUNCPTR)task2/0/0A0A0/0/0,0);//创建任务2msgQld=msgQCreate(20,50,MSG_Q_PRIORITY);//创建消息队列if(msgQld==NULL) 〃如果创建信号量失败,则返回错误,成功着返回0K{returnERROR;}returnOK;}STATUStaskl(void)//任务1主体函数while(l)if(msgQSend(msgQldl/MSG/sizeof(MSG),WAIT_FOREVER/MSG_PRI_NORMAL)==ERROR)//向消息队列发送消息MSG{returnERROR;}taskDelay(lO);}}STATUStaskl(void)//任务2主体函数{while(l){if(msgQReceive(msgQldl,bufferz50,WAIT_FOREVER)==ERROR)//从消息队列接收消息{returnERROR;}printf("消息是%s\n",buffer);//将消息的内容显示出来}}^******************^********************************************************^****/三:管道管道是一种虚拟的I/O设备,所以对管道可以通过标准的I/OII函数进行操作。pipeDevCreate():创建管道STATUSpipeDevCreate(char*name,intnMessages,intnBytes)name为管道名nMessages为管道中的最大数目nBytes为每个消息的字节数pipeDevDelete():删除管道STATUSpipeDevDelete(char*name,BOOLforce)force为是否要强制删除pipeDrv():初始化管道STATUSpipeDrv(void)承*穴******穴******穴******穴*穴****穴*穴****穴水**********^*穴**穴*穴*穴承沐穴*穴*穴**穴*********示例代码:管道#defineMSG"hello"STATUStaskl(void);//声明两个任务STATUStask2(void);inttaskldl,taskld2;//全局变量任务IDintpipeld;inttemp;charbuffer[50];intinitTask() 〃任务初始化{taskldl=taskSpawn(,,taskl,,/120/0/10240/(FUNCPTR)taskl/0/0A0A0/0/0,0);//创建任务1taskld2=taskSpawn(,,task2,,/12O/0,10240/(FUNCPTR)task2,0/0/0z0,0,0,0,0,01;//创建任务2temp=pipeDevCreate(,7pipe/pipeTest',/50z50);//创建管道if(temp==ERROR){returnERROR;}pipeld=open(,l/pipe/pipeTest,,/O_RDWR,0);//打开管道if(pipeld==ERROR){returnERROR;}returnOK:}STATUStaskl(void)//任务1主体函数{while(l){if(write(pipeldzMSG,sizeof(MSG))==ERROR)//向管道写信息{returnERROR;}taskDelay(lO);}}STATUStask2(void)//任务2主体函数{while(l){if(read(pipeld,buffer,50)〃向管道里读信息returnERROR;

printf("消息/d%s\n",buffer);//将消息的内容显示出来}}四:信号信号是由事件引发的软中断,中断并非由外界硬件产生,而是由内部程序自己产生。需要特别注意的是,信号的处理程序并非在中断上下文中进行处理,而是在接受任务本身的上卞文中进行处理。signal():将信号与特定的处理程序绑定void(*signal(intsignozvoid(*pHandler)()))signo为信号ID,*pHandler()为信号处理程序kill():向指定的任务发送信号intkillfinttidzintsigno)tid为任务IDsigno为要发送的信号)K*p**4c*4c*p**4c*4c*4c**)K*4c*4c*4c4c***4c*4c**)K*4c**4c*4c**4c*4c*4c*4c4c*4c*4c*4c4c*p*4c*4c**4c**4c*)K*4c*示例代码:信号#defineMSG"hello"STATUStaskl(void);//声明两个任务STATUStask2(void);inttaskldl,taskld2;//全局变量任务IDintsignalTest=5;intinitTask()〃任务初始化{taskldl=taskSpawn(lltaskl,i/120A10240/(FUNCPTR)taskl/0/0/0/0z0/0/0/0z0);//创建任务1taskld2=taskSpawn(,,task2,,/120/0,10240/(FUNCPTR)task2/0/0A0,0,0/0/0z0);//创建任务2return0;}STATUStaskl(void)//任务1主体函数{signal(signalTest,siglSR);//将信号与信号处理程序绑定while(l)voidsiglSR(intsig)//任务2主体函数if(sig==signalTest)logMsg("信号数是%d\n”,sig,0,0,0,0,0);〃输出信息}return;STATUStask2(void)//任务1主体函数while(l)kill(taskldl,signalTest);//发送信号给任务1taskDelay(lO);}}五:事件事件用于任务之间或者任务与ISR,或者任务与系统之间。任务最多可以注册24个事件,每个任务的TCB中有专门的爭件寄存器,但此寄存器不可直接访问,有事件发生变化的时候会改变相应的寄存器值。eventReceive():接收事件STATUSeventReceive(UINT32events,UINT8optionsjnttimeout,UINT32*pEventsReceived)events为等待的事件号timeout为等待的事件pEventsReceived为反映接收到的爭件变量其中optionsnf选项为:-EVENTS_WAIT_ANY(OX1):等待任何一个事件发生了就就绪-EVENTS_WAIT_ALL(OXO):等待所有事件发生了再就绪-EVENTS_RETURN_ALL(0X2):返回所有等待的和不等待的事件-EVENTS_FETCH(0X80):pEventsReceived变量设置已经接收到的事件相应位,并且立刻返回。evenSend():发送事件STATUSeventSendfinttaskld,UINT32events)taskld为要发送的任务events为要发送的事件⑶evenClear():清除当前任务的所有事件semGive():将爭件拷贝到在该信号量注册的事件寄存器msgQSend():将事件拷贝到在该队列注册的事件寄存器示例代码:事件STATUStaskl(void);

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论