/*
* 信号量和消息队列发送事件
* 任务A接收信号量事件
* 任务B接收消息队列事件
* 任务C操作信号量和消息队列
*/
#include<vxworks.h>
#include<semLib.h>
#include<semEvLib.h>
#include<msgQEvLib.h>
#include<eventLib.h>
#include<taskLib.h>
#include<stdio.h>
#include<unistd.h>
#include<msgQLib.h>
/* 定义任务堆栈大小*/
#define STACK_SIZE 20000
/*定义任务*/
int taskA_ID;
int taskB_ID;
int taskC_ID;
/*定义信号量ID*/
SEM_ID semId;
/*消息队列ID*/
MSG_Q_ID msgId;
void taskA();
void taskB();
void taskC();
STATUS taskDemo(void) {
/*创建任务*/
taskA_ID = taskSpawn("EventReceiver", 200, 0, STACK_SIZE, (FUNCPTR)taskA,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0);
taskB_ID = taskSpawn("Sem", 200, 0, STACK_SIZE, (FUNCPTR)taskB, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0);
taskC_ID = taskSpawn("EventReceiver2", 200, 0, STACK_SIZE, (FUNCPTR)taskC, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0);
/*创建信号量,信号量初始为0*/
semId = semBCreate(SEM_Q_FIFO, SEM_EMPTY);
if (semId == NULL) {
return (ERROR);
}
/*创建消息队列*/
msgId=msgQCreate(10,255,MSG_Q_PRIORITY);
return OK;
}
void taskA() {
UINT32 eventReceiver;
/*任务A在资源<二进制信号量semId>上注册,如果资源(信号量)发生变化,则任务会收到相应的事件*/
semEvStart(semId, VXEV01|VXEV02, EVENTS_OPTIONS_NONE);
/*接收事件*/
while(1)
{
eventReceive(VXEV01,EVENTS_OPTIONS_NONE,WAIT_FOREVER,&eventReceiver);
if (eventReceiver == VXEV01) {
printf("[TaskA]:Receive Event01!\n");
}
}
}
void taskB() {
UINT32 eventReceiver;
/*任务A在资源<二进制信号量semId>上注册,如果资源(信号量)发生变化,则任务会收到相应的事件*/
msgQEvStart(msgId,VXEV02,EVENTS_OPTIONS_NONE);
/*接收事件*/
while(1)
{
eventReceive(VXEV02,EVENTS_OPTIONS_NONE,WAIT_FOREVER,&eventReceiver);
if (eventReceiver == VXEV02) {
printf("[TaskB]:Receive Event02!\n");
}
}
}
void taskC() {
char buf[]="hello";
sleep(2);
while(1){
/*释放信号量,二进制信号量在空闲时(无任务占有时)才会发送事件*/
printf("[SEM]Free semphone!\n");
semGive(semId);
sleep(1);
semTake(semId, WAIT_FOREVER);
sleep(1);
/*向消息队列写入消息*/
printf("[MSG]write to msgQ!\n");
msgQSend(msgId,buf,sizeof(buf),WAIT_FOREVER,MSG_PRI_NORMAL);
sleep(1);
}
}
VxWorks 信号量/消息队列发送事件
最新推荐文章于 2024-05-15 05:16:53 发布