任务间通信 首先我们想想,两个任务之间通信需要知道什么,task1想往task2的发送一些数据,那么需要知道task2的ID吧,需要把数据打包吧,task2需要知道是谁发的,那么task1本身的ID也需要知道吧。 按照这几个明确的东西,我们首先把任务事件ID枚举如下
typedef enum {
eventID_1,
eventID_2,
eventID_3
}Event_ID;
然后把事件ID,发送者ID,以及要传输的结构或者数据打包封装在结构体Event中,代码如下: typedef struct{
Event_ID ID;
int16_t src; //发送者ID
void* pData; //传结构、数据
}Event;
接着,我们需要构造一个事件,把这些信息都放在这个事件中,代码如下: void makeEvent(Event* pEvent,int16_t myId,Event_ID evtId, const void* pData){
pEvent->ID = evtId;
pEvent->src = myId;
pEvent->pData = (void*) pData;
}
现在我们假设task2要往task1发送一系列数据,那么task任务中,我们需要做的事如下,获取task1中队列,看是否为空。
QueueHandle_t task1Queue;
int16_t myId = pMyTaskRecord->Id;
task1Queue = getTaskQueue(getTaskId("task1"));
构造事件 Event event;
int* ptemp; //这里自定义一些数据
makeEvent(&event,myId,eventID_1,(void*)ptemp);
然后把事件发送出去: xQueueSendToBack( task1Queue, &event, 0);
|