|
先解释一下队列:是先进先出(FIFO, First-In-First-Out)的线性表。在具体应用中通常用链表或者数组来实现。队列只允许在后端(称为rear)进行插入操作,在前端(称为front)进行删除操作。队列的操作方式和堆栈类似,唯一的区别在于队列只允许新数据在后端进行添加。
FreeRTOS中信号量与互斥琐的底层都是通过队列来实现的!
在嵌入式操作系统中队列是任务间数据交换的常用手段,队列是生产者消费者模型的重要组成部分。FreeRTOS的队列简单易用,下面结合一个具体例子说明FreeRTOS中的队列如何使用。
参考代码中存在两个任务,任务Task3 和任务task 4。任务Task4 扮演生产者的角色,任务Task4每隔1S向队列中填充内容,填充的内容为4个int8_t类型的变量,填充完之后该变量累加;任务Task 3 扮演消费者的角色,任务Task3 不断的从队列中提取内容,并通过串口打印.
- /*
- *********************************************************************************************************
- * 函 数 名: vTask3
- * 功能说明: 接收队列信息
- * 形 参:pvParameters 是在创建该任务时传递的形参
- * 返 回 值: 无
- *********************************************************************************************************
- */
- void vTask3( void *pvParameters )
- {
- uint8_t Count[5];
- while(1)
- {
-
- /* 从队列中获取内容 */
- xQueueReceive( xQueue, &Count[0], portMAX_DELAY); //任务中断并等待队列中可用空间的最大时间
- xQueueReceive( xQueue, &Count[1], portMAX_DELAY);
- xQueueReceive( xQueue, &Count[2], portMAX_DELAY);
- xQueueReceive( xQueue, &Count[3], portMAX_DELAY);
- xQueueReceive( xQueue, &Count[4], portMAX_DELAY);
-
- printf("Count0 = %d\r\n", Count[0]);
- printf("Count1 = %d\r\n", Count[1]);
- printf("Count2 = %d\r\n", Count[2]);
- printf("Count3 = %d\r\n", Count[3]);
- printf("Count4 = %d\r\n", Count[4]);
- }
- }
- /*
- *********************************************************************************************************
- * 函 数 名: vTask4
- * 功能说明: 向队列中填充内容
- * 形 参:pvParameters 是在创建该任务时传递的形参
- * 返 回 值: 无
- *********************************************************************************************************
- */
- void vTask4( void *pvParameters )
- {
- portTickType xLastWakeTime;
- const portTickType xFrequency = 1000;
- uint8_t ucVar[5] = {0};
- // Initialise the xLastWakeTime variable with the current time.
- xLastWakeTime = xTaskGetTickCount();
- while(1)
- {
- ucVar[0]++;
- ucVar[1]++;
- ucVar[2]++;
- ucVar[3]++;
- ucVar[4]++;
-
- if( xQueue ) //!=NULL 如果队列创建成功
- {
- //当队列满时,则等待 xTicksToWait个滴答周期后再传递
- xQueueSend( xQueue, ( void * ) &ucVar[0], ( portTickType ) 10 );
- xQueueSend( xQueue, ( void * ) &ucVar[1], ( portTickType ) 10 );
- xQueueSend( xQueue, ( void * ) &ucVar[2], ( portTickType ) 10 );
- xQueueSend( xQueue, ( void * ) &ucVar[3], ( portTickType ) 10 );
- xQueueSend( xQueue, ( void * ) &ucVar[4], ( portTickType ) 10 );
- }
- vTaskDelayUntil( &xLastWakeTime, xFrequency );
- }
- }
复制代码
|
|