一、消息队列
消息队列,一种用于任务与任务间、中断和任务间传递信息的数据结构,实现了任务接收来自其他任务或中断的不等长的消息。
消息队列能够接收来自线程或中断服务例程中不固定长度的消息,并把消息缓存在自己的内存空间中。其他线程也能够从消息队列中读取相应的消息,而当消息队列是空的时候,可以挂起读取线程。当有新的消息到达时,挂起的线程将被唤醒以接收并处理消息。消息队列是一种异步的通信方式。
创建消息队列,FreeRTOS系统会分配一块单个消息大小与消息队列长度乘积的空间;(创建成功后,每个消息的大小及消息队列长度无法更改,不能写入大于单个消息大小的数据,并且只有删除消息队列时,才能释放队列占用的内存) 。写入消息队列,当消息队列未满或允许覆盖入队时,FreeRTOS系统会直接将消息复制到队列末端;否则,程序会根据指定的阻塞时间进入阻塞状态,直到消息队列未满或者是阻塞时间超时,程序就会进入就绪状态;写入紧急消息,本质上与普通消息差不多,不同的是其将消息直接复制到消息队列队首;读取消息队列,在指定阻塞时间内,未读取到消息队列中的数据(消息队列为空),程序进入阻塞状态,等待消息队列中有数据;一旦阻塞时间超时,程序进入就绪态;
二、消息队列应用实例
函数解释
//创建队列
QueueHandle_t xQueueCreate( UBaseType_t uxQueueLength,//队列长度
UBaseType_t uxItemSize );//队列中消息单元的大小,以字节为单位
//队列发送消息,队尾写入
BaseType_t xQueueSend(QueueHandle_t xQueue,//队列句柄
const void * pvItemToQueue,//指针,指向要发送到队列尾部的队列消息
TickType_t xTicksToWait);//等待时间
//中断服务程序中使用的发送函数
BaseType_t xQueueSendFromISR(QueueHandle_t xQueue,
const void *pvItemToQueue,
BaseType_t *pxHigherPriorityTaskWoken//为一个可选参数, 可以设置为 NULL。
);
//向队列首发送消息
BaseType_t xQueueSendToFront( QueueHandle_t xQueue,
const void * pvItemToQueue,
TickType_t xTicksToWait );
//从一个队列中接收消息并把消息从队列中删除
BaseType_t xQueueReceive(QueueHandle_t xQueue,
void *pvBuffer,
TickType_t xTicksToWait);
//在中断服务程序中接收消息队列的函数,总之就是在任务中调用和在中断服务程序中调用函数不同。
BaseType_t xQueueReceiveFromISR(
QueueHandle_t xQueue,
void * const pvBuffer,
BaseType_t * const pxHigherPriorityTaskWoken
);
举例说明
QueueHandle_t Test_Queue =NULL;
#define QUEUE_LEN 4 /*消息队列长度*/
#define QUEUE_SIZE 4 /*每个消息大小 */
static void AppTaskCreate(void)
{
BaseType_t xReturn = pdPASS;
·taskENTER_CRITICAL(); //进入临界区
/* 创建Test_Queue */
Test_Queue = xQueueCreate((UBaseType_t ) QUEUE_LEN,(UBaseType_t ) QUEUE_SIZE);
创建任务一:Send_Task
创建任务二:Receive_Task
vTaskDelete(AppTaskCreate_Handle);
taskEXIT_CRITICAL();
}
/
//任务一:发送
static void Send_Task(void* parameter)
{
BaseType_t xReturn = pdPASS;
uint32_t send_data1 = 1;
uint32_t send_data2 = 2;
while (1)
{
xReturn = xQueueSend( Test_Queue,&send_data1,0 );
if(pdPASS == xReturn)
printf("send_data1 发送成功!\n\n");
vTaskDelay(20);
}
}
//任务二:接收
static void Receive_Task(void* parameter)
{
BaseT