首先介绍三个函数:
1.消息队列创建函数
函 数 原 型:
QueueHandle_t xQueueCreate( UBaseType_t uxQueueLength,
UBaseType_t uxItemSize );
功 能:用于创建一个新的队列。
参 数:
uxQueueLength: 队列能够存储的最大消息单元数目,即队列长度。
uxItemSize: 队列中消息单元的大小,以字节为单位。
返 回 值:
如果创建成功则返回一个队列句柄,用于访问创建的队列。
如果创建不成功则返回NULL, 可能原因是创建队列需要的 RAM 无法分配成功。
2.消息队列发送函数
函 数 原 型
BaseType_t xQueueSend(QueueHandle_t xQueue,
const void * pvItemToQueue,
TickType_t xTicksToWait);
功 能:
用于向队列尾部发送一个队列消息。
参 数
xQueue: 队列句柄。
pvItemToQueue: 指针,指向要发送到队列尾部的队列消息。
xTicksToWait:
被设置成 0,函数立刻返回。
portMAX_DELAY 阻塞直到接收到消息
返 回 值
消息发送成功成功返回 pdTRUE,否则返回 errQUEUE_FULL。
3.消息队列接收函数
函 数 原 型
BaseType_t xQueueReceive(QueueHandle_t xQueue,
void *pvBuffer,
TickType_t xTicksToWait);
功 能:
用于从一个队列中接收消息, 并把接收的消息从队列中删除。
参 数
xQueue: 队列句柄。
pvBuffer: 指针,指向接收到要保存的数据。
xTicksToWait:
0,立即返回
portMAX_DELAY阻塞到有消息读出
队列接收成功返回 pdTRUE,否则返回 pdFALSE
4.代码
#include "main.h"
void AppTaskCreate(void);//声明
void Receive_Task(void* pvParameters);//声明
void Send_Task(void* pvParameters);//声明
TaskHandle_t AppTaskCreate_Handle = NULL;
TaskHandle_t Receive_Task_Handle = NULL;
TaskHandle_t Send_Task_Handle = NULL;
QueueHandle_t Test_Queue =NULL;
#define QUEUE_LEN 2
#define QUEUE_SIZE 4
int main(void)
{
BSP_Config(); //板子初始化函数
BaseType_t xReturn=pdPASS;//设置xreturn的初值
xReturn=xTaskCreate((TaskFunction_t)AppTaskCreate,//任务入口函数
"AppTaskCreate",// 任务名字
64,//任务栈大小
NULL,//任务入口函数参数
1,//任务的优先级
&AppTaskCreate_Handle);//创建一个总任务
if(xReturn==pdPASS)
{
printf("任务启动成功,开始调度\r\n");
vTaskStartScheduler(); //任务调度,比较任务优先级
}
else//不会执行
return -1;
}
/************************************************
函数名称:AppTaskCreate
函数作用:总任务调度函数
函数参数:无
函数返回值:无
************************************************/
void AppTaskCreate(void)
{
taskENTER_CRITICAL();//开启临界段
BaseType_t xReturn=pdPASS;//创建任务返回值
Test_Queue = xQueueCreate(QUEUE_LEN,QUEUE_SIZE);//创建消息队列
if(Test_Queue != NULL)
printf("创建 Test_Queue 消息队列成功!\r\n");
xReturn = xTaskCreate(Receive_Task,//任务入口函数
"Receive_Task",//任务名字
64,//任务栈大小
NULL,//任务入口函数参数
2,//任务的优先级
&Receive_Task_Handle);//任务控制块
if(xReturn == pdPASS)
printf("创建 Receive_Task 任务成功!\r\n");
xReturn = xTaskCreate(Send_Task,//任务入口函数
"Send_Task",//任务名字
64,//任务栈大小
NULL,//任务入口函数参数
3,//任务的优先级
&Send_Task_Handle);//任务控制块
if(xReturn == pdPASS)
printf("创建 Send_Task 任务成功! \r\n");
vTaskDelete(AppTaskCreate_Handle);//删除任务
taskEXIT_CRITICAL();//退出临界段
}
/************************************************
函数名称:Receive_Task
函数作用:接收任务调度函数
函数参数:pvParameters
函数返回值:无
************************************************/
void Receive_Task(void* parameter)
{
BaseType_t xReturn=pdPASS;
uint32_t r_queue;
while(1)
{
xReturn = xQueueReceive(Test_Queue,//消息队列的句柄
&r_queue,//接收的消息内容
portMAX_DELAY);//等待时间 一直等
if(xReturn == pdPASS)
printf("r_queue本次接收到的数据是 %d \r\n",r_queue);
else
printf("接收失败\r\n");
}
}
/************************************************
函数名称:Send_Task
函数作用:发送任务调度函数
函数参数:pvParameters
函数返回值:无
************************************************/
void Send_Task(void* pvParameters)
{
BaseType_t xReturn = pdPASS;
uint32_t send_data1 = 1;
uint32_t send_data2 = 2;
uint32_t data =0;
while(1)
{
if(USART_GetFlagStatus(USART1,USART_FLAG_RXNE))
{
data = USART_ReceiveData(USART1);
if(data == send_data1)
{
xReturn = xQueueSend(Test_Queue,//消息队列的句柄
&send_data1,//发送的消息内容
0);// 等待时间 0
if(xReturn == pdPASS)
printf("消息 send_data1 发送成功!\r\n");
}
else if(data == send_data2)
{
xReturn = xQueueSend(Test_Queue,//消息队列的句柄
&send_data2,//发送的消息内容
0);// 等待时间 0
if(xReturn == pdPASS)
printf("消息 send_data2 发送成功!\r\n");
}
}
vTaskDelay(20);
}
}
void BSP_Config(void)
{
led_Config();//配置LED灯
beep_Config();//蜂鸣器
key_Config();
USART_Config();
printf("串口初始化成功\r\n");
}
总结
我看的是野火的文档,赞一个把哈哈,需要的话评论一下。其实也可以自己找,很容易找到的。