一、传输数据为少量字节
1. 信号量
信号量本身是基于队列实现的,所以占用更多的内存,只能一发一收,读取后清除。
二进制信号量:主要用于任务同步,也可用于任务间传递一个变化标志。
计数信号量:主要用于任务同步,也可用于任务间传递一个计数型事件。
2. 事件位和事件组
主要用于任务与中断之间同步,工作于广播模式(一发多收),读取后可选择清除或不清除。
也可用于任务间传递状态信号(8或24位)。
3. 任务通知
既可以用于任务间同步,也可以用于传递32bit的数据。
可用于代替二进制信号量、计数型信号量、事件组,其占用的内存更小。
3.1通知的应用示例1(轻量型通知,适合二进制或计数型信号量)
//定义通知句柄
static TaskHandle_t Rx_NotifyHandle;
//Websocket事件中发送通知
xTaskNotifyGive(Rx_NotifyHandle);
//websocket_rx_task任务中接收通知
ulTaskNotifyTake(pdTRUE,portMAX_DELAY);
//创建带有通知句柄参数的接收任务websocket_rx_task
xTaskCreate(websocket_rx_task, "websocket_rx_task", 1500*2, NULL, configMAX_PRIORITIES-3, &Rx_NotifyHandle);
3.1通知的应用示例2(完整的通知功能)
//定义通知句柄
TaskHandle_t UartTxTask_NotifyHandle;
//在另一个任务中发送通知
xTaskNotify(UartTxTask_NotifyHandle,0x0100,eSetBits);
//下面是接收通知任务的相关内容
uint32_t ulNotifiedValue = 0;
//等待通知,这里是不等待
xTaskNotifyWait(0, ULONG_MAX,&ulNotifiedValue, pdMS_TO_TICKS(0));
//是要等待的通知吗
if((ulNotifiedValue & 0x0100) == 0x0100){
//添加自己的代码
}
//创建含有通知句柄参数的任务uart2_tx_task
xTaskCreate(uart2_tx_task, "uart2_tx_task", bufSize*2, NULL, configMAX_PRIORITIES-5, &UartTxTask_NotifyHandle);
下面两个函数用于从ISR中断服务程序中发送
void vTaskNotifyGiveFromISR( TaskHandle_t xTaskToNotify,
BaseType_t *pxHigherPriorityTaskWoken );
BaseType_t xTaskNotifyFromISR( TaskHandle_t xTaskToNotify,
uint32_t ulValue,
eNotifyAction eAction,
BaseType_t *pxHigherPriorityTaskWoken );
二、传输数据为大量字节
1. Queue
队列是任务间通信最基础最灵活的方式,缺点是长度固定。
2. StreamBuffer
流缓冲区适用于大量数据交互,但仅限一对一应用。
3. MessageBuffer
消息缓冲区基于流缓冲区实现,带有长度标签,一次读取一条消息。
个人认为比较适合串口、网口、WIFI等方式传递数据。