如果您无法下载资料,请参考说明:
1、部分资料下载需要金币,请确保您的账户上有足够的金币
2、已购买过的文档,再次下载不重复扣费
3、资料包下载后请先用软件解压,在使用对应软件打开
vxworks中任务间的通信支持信号量、消息队列、管道、信号、事件、共享内存等。一:信号量信号量分二进制信号量、互斥信号量、计数信号量。1:二进制信号量(1)semBCreate():创建二进制信号量SEM_IDsemBCreate(intoptions,SEM_B_STATEinitialState)options可以为基于优先级的队列EM_Q_PRIORITY(0x1)或者是基于先进先出的队列SEM_Q_FIFO(0X0).initialState可以是信号量初始化为满SEM_FULL(1)或者为空SEM_EMPTY(0)。(2)semTake():获取信号量STATUSsemTake(SEM_IDsemID,inttimeout)semID为信号量ID。timeout表示任务一直等待信号量,直到可用WAIT_FOREVER(-1)或者不等待,直接下步操作NO_WAIT(0)。(3)semGive():释放信号量STATUSsemGive(SEM_IDsemID)(4)semFlush():唤醒信号量STATUSsemFlush(SEM_IDsemID)通过此函数可以将所有阻塞在信号量(WAIT_FOREVER)上的任务释放。(5)semDelete():删除信号量STATUSsemDelete(SEM_IDsemID)(6)semInfo():得到阻塞在信号量上的所有任务ID列表intsemInfo(SEM_IDsemID,intidList[],intmaxTasks)idList[]为要显示任务ID的数组。maxTasks为要显示的任务最大数。(7)semShow():显示信号量的相关信息STATUSsemShow(SEM_IDsemID,intlevel)level分概括(0),详细(1)。2:互斥信号量互斥信号量相比二进制信号量增加了防止优先级倒置、递归访问等功能。(1)semMCreate():创建互斥信号量SEM_IDsemMCreate(intoptions)options的选项有:-SEM_Q_PRIORITY(0x1):需要获取信号量的任务基于优先级原则排列。-SEM_Q_FIFO(0x0):需要获取信号量的任务基于先进先出原则排列。-SEM_DELETE_SAFE(0x4):保护任务防止意外删除,当执行获取信号量(semtake)时操作时会默认执行任务保护(taskSafe)操作,当执行释放信号量(semGive)操作时会默认执行取消任务保护(taskUnsafe)操作。-SEM_INVERSION_SAFE(0x8):保护系统,防止系统出现优先级倒置现象。-SEM_EVENTSEND_ERR_NOTIFY(0X10):任务发送事件失败时,会发送错误号。(2)semMGiveForce():强制释放互斥信号量STATUSsemMGiveForce(SEM_IDsemId)3:计数信号量计数信号量主要用于搜集某些信号量。SEM_IDsemCCreate(intoptions,intinitialCount)options为信号量属性或类型initialCount初始化计数/************************************************************************示例代码:以二进制信号量为例STATUStask1(void);//声明两个任务STATUStask2(void);inttaskId1,taskId2;//全局变量任务IDSEM_IDsemTest1,semTest2;//信号量intinitTask()//任务初始化{taskId1=taskSpawn("task1",120,0,10240,(FUNCPTR)task1,0,0,0,0,0,0,0,0,0);//创建任务1taskId2=taskSpawn("task2",120,0,10240,(FUNCPTR)task2,0,0,0,0,0,0,0,0,0);//创建任务2semTest1=semBCreate(SEM_Q_PRIORITY,SEM_EMPTY);//创建信号量1semTest2=semBCreate(SEM_Q_PRIORITY,SEM_EMPTY);//创建信号量2if(semTest1==NULL)//如果创建信号量失败,则返回错误,成功着返回OK{returnERROR;}returnOK;}STATUStask1(void)//任务1主体函数{while(1){semGive(semTset1);//任务1释放信号量1printf("任务1释放了信号量!\n");semTake(semTest2,WAIT_FOREVER);//任务1得到信号量2,在