隊(duì)列用于在任務(wù)之間以及任務(wù)與中斷之間傳遞數(shù)據(jù),可以在調(diào)度程序啟動(dòng)之前或之后創(chuàng)建隊(duì)列。
配置相關(guān)資源
#define configSUPPORT_DYNAMIC_ALLOCATION 1
創(chuàng)建信息隊(duì)列
QueueHandle_t xQueueCreate( UBaseType_t uxQueueLength, 
                              UBaseType_t uxItemSize );
	參數(shù):
	
uxQueueLength:正在創(chuàng)建的隊(duì)列在任何時(shí)候可以容納的最大項(xiàng)數(shù)
uxItemSize:可以存儲(chǔ)在隊(duì)列中的每個(gè)數(shù)據(jù)項(xiàng)的大小(以字節(jié)為單位)
	返回值:
	
	創(chuàng)建失敗返回NULL,創(chuàng)建成功返回句柄
	
發(fā)送信息
BaseType_t xQueueSend( QueueHandle_t xQueue, 
                       const void * pvItemToQueue, 
                       TickType_t xTicksToWait );
	參數(shù):
	
xQueue:數(shù)據(jù)被發(fā)送(寫入)到的隊(duì)列的句柄
pvItemToQueue:一個(gè)指向要復(fù)制到隊(duì)列中的數(shù)據(jù)的指針
xTicksToWait:當(dāng)隊(duì)列已經(jīng)滿時(shí),任務(wù)保持阻塞狀態(tài)以等待隊(duì)列上的空間可用的最大時(shí)間
	返回值:
	
成功返回pdPASS,失敗返回errQUEUE_FULL
接收信息
BaseType_t xQueueReceive( QueueHandle_t xQueue, 
                          void*pvBuffer, 
                          TickType_txTicksToWait );
參數(shù):
xQueue:從其接收數(shù)據(jù)(讀)的隊(duì)列的句柄
pvBuffer:一個(gè)指向內(nèi)存的指針,接收到的數(shù)據(jù)將被復(fù)制到其中
xTicksToWait:任務(wù)保持阻塞狀態(tài)以等待隊(duì)列上的數(shù)據(jù)可用的最大時(shí)間,如果隊(duì)列已經(jīng)為空
返回值:
成功返回pdPASS,失敗返回errQUEUE_FULL
	注意:更多API函數(shù)請(qǐng)參閱官方相關(guān)文檔
	
簡(jiǎn)單程序
#include "stm32f10x.h"
#include 
#include "FreeRTOS.h"
#include "task.h"
#include "queue.h"
void LED_Init(void)
{
  GPIO_InitTypeDef GPIO_InitStructure;              //定義結(jié)構(gòu)體變量
  
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC,ENABLE);  //開啟時(shí)鐘
  
  GPIO_InitStructure.GPIO_Pin=GPIO_Pin_0|GPIO_Pin_1;    //選擇你要設(shè)置的IO口
  GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;      //設(shè)置推挽輸出模式
  GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;     //設(shè)置傳輸速率
  GPIO_Init(GPIOC,&GPIO_InitStructure);                //初始化GPIO
  
  GPIO_SetBits(GPIOC,GPIO_Pin_0|GPIO_Pin_1);            //將LED端口拉高,熄滅LED
}
void KEY_Init(void)
{
  GPIO_InitTypeDef GPIO_InitStructure; //定義結(jié)構(gòu)體變量  
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOE,ENABLE);
  
  GPIO_InitStructure.GPIO_Pin=GPIO_Pin_0;     //選擇你要設(shè)置的IO口
  GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IPD;//下拉輸入  
  GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;     //設(shè)置傳輸速率
  GPIO_Init(GPIOA,&GPIO_InitStructure);      /* 初始化GPIO */
  
  GPIO_InitStructure.GPIO_Pin=GPIO_Pin_3|GPIO_Pin_2|GPIO_Pin_4;
  GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IPU;  //上拉輸入
  GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
  GPIO_Init(GPIOE,&GPIO_InitStructure);
}
void USART_init(uint32_t bound)
{
  GPIO_InitTypeDef GPIO_InitStruct;   //定義GPIO結(jié)構(gòu)體變量
  USART_InitTypeDef USART_InitStruct;   //定義串口結(jié)構(gòu)體變量
  
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_USART1,ENABLE);   //使能GPIOC的時(shí)鐘
  
  GPIO_InitStruct.GPIO_Pin=GPIO_Pin_9;   //配置TX引腳
  GPIO_InitStruct.GPIO_Mode=GPIO_Mode_AF_PP;   //配置PA9為復(fù)用推挽輸出
  GPIO_InitStruct.GPIO_Speed=GPIO_Speed_50MHz;   //配置PA9速率
  GPIO_Init(GPIOA,&GPIO_InitStruct);   //GPIO初始化函數(shù)
  
  GPIO_InitStruct.GPIO_Pin=GPIO_Pin_10;   //配置RX引腳
  GPIO_InitStruct.GPIO_Mode=GPIO_Mode_IN_FLOATING;   //配置PA10為浮空輸入
  GPIO_InitStruct.GPIO_Speed=GPIO_Speed_50MHz;   //配置PA10速率
  GPIO_Init(GPIOA,&GPIO_InitStruct);   //GPIO初始化函數(shù)
  
  
  USART_InitStruct.USART_Mode=USART_Mode_Tx|USART_Mode_Rx;   //發(fā)送接收模式
  USART_InitStruct.USART_Parity=USART_Parity_No;   //無奇偶校驗(yàn)
  USART_InitStruct.USART_BaudRate=bound;   //波特率
  USART_InitStruct.USART_StopBits=USART_StopBits_1;   //停止位1位
  USART_InitStruct.USART_WordLength=USART_WordLength_8b;   //字長8位
  USART_InitStruct.USART_HardwareFlowControl=USART_HardwareFlowControl_None;   //無硬件數(shù)據(jù)流控制
  USART_Init(USART1,&USART_InitStruct);   //串口初始化函數(shù)
  
  USART_Cmd(USART1,ENABLE);   //使能USART1
}
int fputc(int ch,FILE *f)   //printf重定向函數(shù)
{
  USART_SendData(USART1,(uint8_t)ch);   //發(fā)送一字節(jié)數(shù)據(jù)
  while(USART_GetFlagStatus(USART1,USART_FLAG_TXE) == RESET);   //等待發(fā)送完成
  return ch;
}
#define START_TASK_PRIO 1      //任務(wù)優(yōu)先級(jí)
#define START_STK_SIZE 128      //任務(wù)堆棧大小
TaskHandle_t StartTask_Handler;   //任務(wù)句柄
void Start_Task(void *pvParameters);//任務(wù)函數(shù)
#define Sen_TASK_PRIO 2       //任務(wù)優(yōu)先級(jí)
#define Sen_STK_SIZE 50       //任務(wù)堆棧大小
TaskHandle_t SenTask_Handler;     //任務(wù)句柄
void Sen_Task(void *p_arg);     //任務(wù)函數(shù)
#define Queue_TASK_PRIO 3       //任務(wù)優(yōu)先級(jí)
#define Queue_STK_SIZE 50       //任務(wù)堆棧大小
TaskHandle_t QueueTask_Handler;   //任務(wù)句柄
void Queue_Task(void *p_arg);     //任務(wù)函數(shù)
QueueHandle_t xQueue = NULL;
int main( void ) 
{
  NVIC_PriorityGroupConfig(NVIC_PriorityGroup_4);    //設(shè)置系統(tǒng)中斷優(yōu)先級(jí)分組 4
  LED_Init(); //初始化 LED
  KEY_Init();
  USART_init(9600);
  //創(chuàng)建開始任務(wù)
  xTaskCreate(
    (TaskFunction_t )Start_Task,     //任務(wù)函數(shù)
    (const char* )"Start_Task",     //任務(wù)名稱
    (uint16_t )START_STK_SIZE,       //任務(wù)堆棧大小
    (void* )NULL,             //傳遞給任務(wù)函數(shù)的參數(shù)
    (UBaseType_t )START_TASK_PRIO,     //任務(wù)優(yōu)先級(jí)
    (TaskHandle_t* )&StartTask_Handler  //任務(wù)句柄 
  );
  vTaskStartScheduler();  //開啟調(diào)度
}
//開始任務(wù)函數(shù)
void Start_Task(void *pvParameters)
{
  taskENTER_CRITICAL();   //進(jìn)入臨界區(qū)
  //創(chuàng)建一個(gè)隊(duì)列
  xQueue = xQueueCreate( 1, sizeof(u8)  );
  if( xQueue != NULL )
  {
    printf("創(chuàng)建成功n");
  }
  //創(chuàng)建 Sen 任務(wù)
  xTaskCreate(
    (TaskFunction_t )Sen_Task, 
    (const char* )"Sen_Task", 
    (uint16_t )Sen_STK_SIZE, 
    (void* )NULL,
    (UBaseType_t )Sen_TASK_PRIO,
    (TaskHandle_t* )&SenTask_Handler
  );
  //創(chuàng)建 Queue 任務(wù)
  xTaskCreate(
    (TaskFunction_t )Queue_Task, 
    (const char* )"Queue_Task", 
    (uint16_t )Queue_STK_SIZE, 
    (void* )NULL,
    (UBaseType_t )Queue_TASK_PRIO,
    (TaskHandle_t* )&QueueTask_Handler
  );
  vTaskDelete(StartTask_Handler); //刪除開始任務(wù)
  taskEXIT_CRITICAL();   //退出臨界區(qū)
}
//Sen 任務(wù)函數(shù)
void Sen_Task(void *pvParameters)
{
  u8 Key = 0;
  while(1)
  {
    if( Key < 10 )
    {
      Key++;
    }
    else
    {
      Key = 0;
    }
    if( xQueue != NULL )
    {
      xQueueSend( ( QueueHandle_t ) xQueue,         //數(shù)據(jù)被發(fā)送(寫入)到的隊(duì)列的句柄
            ( void *        ) &Key,          //一個(gè)指向要復(fù)制到隊(duì)列中的數(shù)據(jù)的指針
            ( TickType_t    ) portMAX_DELAY   );  //當(dāng)隊(duì)列已經(jīng)滿時(shí),任務(wù)保持阻塞狀態(tài)以等待隊(duì)列上的空間可用的最大時(shí)間
    }
    vTaskDelay(1000);
  }
}
//Queue 任務(wù)函數(shù)
void Queue_Task(void *pvParameters)
{
  u8 Key_Receive = 0;
  while(1)
  {
    xQueueReceive( ( QueueHandle_t ) xQueue, 
             ( void *        ) &Key_Receive, 
             ( TickType_t    ) portMAX_DELAY );
    printf("%dn",Key_Receive);
    vTaskDelay(500);
  }
}
	實(shí)驗(yàn)效果
	

	--END--
	
	
	
- 
                                程序
                                +關(guān)注關(guān)注 117文章 3833瀏覽量 84590
- 
                                隊(duì)列
                                +關(guān)注關(guān)注 1文章 46瀏覽量 11187
- 
                                傳遞數(shù)據(jù)
                                +關(guān)注關(guān)注 0文章 3瀏覽量 6308
發(fā)布評(píng)論請(qǐng)先 登錄
RTOS信號(hào)量、隊(duì)列通信原理
【RA-Eco-RA2E1-48PIN-V1.0開發(fā)板試用】嘗試嵌入式操作系統(tǒng)Free-RTOS
【MiCOKit試用體驗(yàn)】慶科MiCO系統(tǒng)篇(4)MiCO RTOS消息隊(duì)列
在energia 編譯器中使用free_rtos或者ti_rtos
CC3200 可以使用 ccs TI-RTOS 和 iar FREE-RTOS,為什么要有兩個(gè)OS,他們有什么區(qū)別?
在FREE-RTOS中怎樣使用simplelink api函數(shù)
RTT有類似UCOS,或者FREE RTOS這類的移植方法嗎?
Free RTOS移植問題的解決辦法?
Small RTOS 的設(shè)計(jì)思想及消息隊(duì)列通信機(jī)制的應(yīng)用
了解一下RTOS消息隊(duì)列的應(yīng)用
實(shí)時(shí)操作系統(tǒng)Free RTOS的詳細(xì)介紹
RTOS消息隊(duì)列的多種用途
 
    
RTOS消息隊(duì)列的應(yīng)用
 
    
 
           
        
 
         Free RTOS的信息隊(duì)列
Free RTOS的信息隊(duì)列 
                 
  
     
            
             
             
                 
             工商網(wǎng)監(jiān)
工商網(wǎng)監(jiān)
        
評(píng)論