学习一种操作系统理论的学习是必须的,当然如果没有实践我想再多理论学习也没有任何意义。
硬件平台:STM32F107VC 工程板
代码段:
#define Queue_Send_TASK_PRIO ( tskIDLE_PRIORITY+2 ) //发送任务优先级别
#define Queue_Recv_TASK_PRIO ( tskIDLE_PRIORITY+1 ) //接收任务优先级
xQueueHandle xReaderQueue; //队列句柄变量的声明
int main(void) {
NVIC_Configuration();
#if DEBUG>0
Usart_IO();
Debug_Usart_Init(115200);
#endif
xReaderQueue = xQueueCreate(1,3*sizeof(char)); //创建一个队列 保存在我们之前声明的句柄变量中
xTaskCreate(vQueue_send_Task,"Queue_send",configMINIMAL_STACK_SIZE,NULL,tskIDLE_PRIORITY+2 ,NULL);
xTaskCreate(vQueue_Recv_Task,"Queue_Recv",configMINIMAL_STACK_SIZE,NULL,tskIDLE_PRIORITY+1 ,NULL);
vTaskStartScheduler(); //启动OS
return 0;
}
void vQueue_send_Task( void *pvParameters )
{
u8 buff[3]={0x12,0x34,0x56};
// u32 buff=0x123456; //这里对于多字节长度的数据,队列传送从低字节到高字节
while(1)
{
#if DEBUG>0
printf("send Queue\r\n");
#endif
xQueueSend(xReaderQueue,buff,0); // 发送数据到队列中
vTaskDelay( 1000 / portTICK_RATE_MS );
}
}
void vQueue_Recv_Task( void *pvParameters )
{
uint8_t temp[3]={0};
uint8_t i=0;
while(1)
{
#if DEBUG>0
printf("recv Queue\r\n");
#endif
xQueueReceive(xReaderQueue,temp,0); //从队列中接收数据
#if DEBUG>0
for(i=0;i<3;i++)
printf("temp[%d]=%02x\r\n",i,temp[i]);
#endif
vTaskDelay( 1000 / portTICK_RATE_MS );
}
}
void NVIC_Configuration(void)
{
/* Set the Vector Table base location at 0x08000000 */
NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x0);
}
实验数据:
数据分析:
这里我们可以看到,队列发送函数每次都先运行,之后再到队列接收函数中,这里我们可以看到代码段的优先级定义。这里可以知道FreeRTOS的优先级数字越大优先级越高。
代码段里我们创建了一个队列,深度为1,每个单元为3个字节,这里我们从打印信息可以看到每次我们都从队列里取出了长3个字节的数据,这里如果我们用代码段中U32 BUFF=0X123456 作为指针传入队列中,可以看到传出的数据是563412。这里可以看到当我们传送的数据是从低位开始传送。结果见下图
相关函数解释:
xQueueSend(xReaderQueue,buff,0); 队列发送函数
参数解释:
xReaderQueue 目标队列的句柄。这个句柄即是调用xQueueCreate()创建该队列时的返回值。
buff 发送数据的指针。其指向将要复制到目标队列中的数据单元。由于在创建队列时设置了队列中数据单元的长度, 所以会从该指针指向的空间复制对应长度的数据到队列的存储区域。
0 阻塞超时时间。如果在发送时队列已满,这个时间即是任务处于阻塞态等待队列空间有效的最长等待时间。
设 为 0 , 并 且 队 列 已 满 , 则xQueueSendToFront()与 xQueueSendToBack()均会立即返回。
xQueueReceive(xReaderQueue,temp,0); //队列接收函数
//xQueueReceive()用于从队列中接收(读取)数据单元。接收到的单元同时会从队列中删除。
xReaderQueue 被读队列的句柄。这个句柄即是调用 xQueueCreate()创建该队列时的返回值。
temp 接收缓存指针。其指向一段内存区域,用于接收从队列中拷贝来的数据。数据单元的长度在创建队列时就 已经被设定,所以该指针指向的内存区域大小应当足够保存一个数据单元。
0 阻塞超时时间。如果在接收时队列为空,则这个时间是任务处于阻塞状态以等待队列数据有效的最长等待 时间。如果 xTicksToWait 设为 0,并且队列为空,则 xQueueRecieve()与 xQueuePeek()均会 立即返回