FreeRTOS学习------队列(实践)


学习一种操作系统理论的学习是必须的,当然如果没有实践我想再多理论学习也没有任何意义。


硬件平台: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()均会                   立即返回



这里多亏网友翻译的FreeRTOS实时内核实用指南,我们可以查找到每个FreeRTOS的每个函数的用法以及每个参数的意思,对于英文不是很好的朋友这样资料对于我们来说帮助的莫大的。这个手册我也将会上传到我们博客资源,供大家一起学习。















  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值