显示接收消息一定要等所有消息全部发送完才显示?
<div class="blockcode"><blockquote>//FreeRTOS头文件#include "FreeRTOS.h"
#include "task.h"
#include "queue.h"
//STM32F103外围硬件的头文件均定义在global.h中
#include "global.h"
/****************************任务句柄**********************/
/*
*任务句柄是一个指针,用于指向一个任务,当任务创建好之后,
*它就具有了一个任务句柄,如果是自身的任务操作自己,那么
*这个句柄就可以为NULL
*
*/
//创建任务句柄
static TaskHandle_t AppTaskCreateHandle = NULL;
// LED
static TaskHandle_t RedLedTaskHandle = NULL;
static TaskHandle_t YellowLedTaskHandle = NULL;
// KEY
static TaskHandle_t KeyTaskHandle = NULL;
//发送和接收任务句柄
static TaskHandle_t ReceiveTaskHandle = NULL;
static TaskHandle_t SendTaskHandle = NULL;
/**********************内核对象句柄*******************/
/*
*信号量,消息队列,事件标志组,软件定时器这些都属
*于内核的对象,要想使用这些内核对象,必须先创建,
*创建成功之后会返回一个相应的句柄。实际上就是一个
*指针
*
*
*
*内核对象是一种全局的数据结构,通过这些数据结构可以
*实现任务间的通信,任务间的事件同步等各种功能。至于
*这些功能的实现我们是通过调用这些内核对象的函数
* 来完成的
*
*
*
*/
QueueHandle_t TestQueueHandle = NULL;
/*********************全局变量声明*****************/
/************************宏定义********************/
#define QUEUE_LEN 4//队列的长度,最大可包含多少个消息
#define QUEUE_SIZE 4//队列中每个消息大小
/*
*******************************************
* 函数声明
*******************************************
*/
static void AppTaskCreate(void);//用于创建任务
static void RedLedTask(void *pvParameters);
static void YellowLedTask(void *pvParameters);
static void KeyTask(void *pvParameters);
static void ReceiveTask(void *pvParameters);//接收任务
static void SendTask(void *pvParameters);//发送任务
static void BspInit(void);//初始化板载STM32F103外设硬件
int main(void)
{
BaseType_t xReturn = pdPASS;//定义一个创建信息返回值,默认为 pdPAS
BspInit();
printf("FreeRTOSTask\r\n");
printf("Please send queue message by press KEY2 or KEY_UP\n");
printf("ReceiveTask receive message echo in USART\n\n");
xReturn = xTaskCreate((TaskFunction_t)AppTaskCreate,//任务入口函数
(const char* )"AppTaskCreate",//函数名字
(uint16_t )512,//任务栈入口大小
(void* )NULL,//任务入口函数参数
(UBaseType_t )1,//任务的优先级
(TaskHandle_t* )&AppTaskCreateHandle);//任务控制块指针
//启动任务调度
if(pdPASS == xReturn)
{
vTaskStartScheduler();//启动任务,开始调度
}
else
{
return -1;
}
while(1);//正常不会执行到这里
}
/*
*@brief:为了方便管理,所有的任务创建函数都放在这个函数里面
*@function:AppTaskCreate
*@param:none
*@retval:none
*/
static void AppTaskCreate(void)
{
BaseType_t xReturn = pdPASS;//定义一个创建信息返回值默认为pdPAss
taskENTER_CRITICAL();//进入临界区
TestQueueHandle = xQueueCreate((UBaseType_t)QUEUE_LEN,//消息队列的长度
(UBaseType_t)QUEUE_SIZE);//消息队列的大小
if(NULL != TestQueueHandle)
{
printf("Create TestQueueHandle Success!\n");
}
//创建ReceiveTask任务
xReturn = xTaskCreate((TaskFunction_t )ReceiveTask,//任务入口函数
(const char* )"ReceiveTask",//
(uint16_t )512,//
(void* )NULL,//
(UBaseType_t )2,//
(TaskHandle_t*)&ReceiveTaskHandle);//
if(pdPASS == xReturn)
{
printf("Create ReceiveTask Success!\n");//
}
//创建SendTask任务
xReturn = xTaskCreate((TaskFunction_t )SendTask,
(const char* )"SendTask",
(uint16_t )512,
(void* )NULL,
(UBaseType_t )3,
(TaskHandle_t*)&SendTaskHandle);
if(pdPASS == xReturn)
{
printf("Create SendTask Success!\n\n");
}
vTaskDelete(AppTaskCreateHandle);//删除AppTaskCreate任务
taskEXIT_CRITICAL();//退出临界区
}
/*
*@brief:RedLed任务管理
*@function:RedLedTask
*@param:*parameter
*@retval:none
*/
static void RedLedTask(void *parameter)
{
while(1)
{
RED_LED_ON();
vTaskDelay(15000);//延时15000个tick
printf("RedLedTask Running,RED_LED_OFF\n");
RED_LED_OFF();
vTaskDelay(15000);//延时15000个tick
printf("RedLedTask Running,RED_LED_ON\n");
}
}
/*
*@brief:YellowLed任务管理
*@function:YellowLedTask
*@param:*parameter
*@retval:none
*/
static void YellowLedTask(void *parameter)
{
while(1)
{
YELLOW_LED_ON();
vTaskDelay(15000);//延时15000个tick
printf("YellowLedTask Running,YELLOW_LED_OFF\n");
YELLOW_LED_OFF();
vTaskDelay(15000);//延时15000个tick
printf("YellowLedTask Running,YELLOW_LED_ON\n");
}
}
/*
*@brief:Key任务管理
*@function:KeyTask
*@param:*parameter
*@retval:none
*/
static void KeyTask(void *parameter)
{
while(1)
{
if(KeyScan(KEY0_GPIO_PORT,KEY0_GPIO_PIN) == KEY012_ON)
{
//KEY0被按下
printf("Suspend Task of LED!\n\n");
vTaskSuspend(RedLedTaskHandle);//挂起红灯任务
vTaskSuspend(YellowLedTaskHandle);//挂起黄灯任务
}
if(KeyScan(KEY1_GPIO_PORT,KEY1_GPIO_PIN) == KEY012_ON)
{
//KEY1被按下
printf("Resume Task of LED!\n\n");
vTaskResume(RedLedTaskHandle);//挂起红灯任务
vTaskResume(YellowLedTaskHandle);//挂起黄灯任务
}
vTaskDelay(100);//延时100个tick,串口打印更稳定
}
}
/*
*@brief:ReceiveTask任务管理
*@function:
*@param:none
*@retval:none
*/
static void ReceiveTask(void *parameter)
{
BaseType_t xReturn = pdTRUE;//定义一个创建信息返回值,默认为 pdTRUE
uint32_t ReceiveQueue;//定义一个接收消息的变量
while(1)
{
xReturn = xQueueReceive(TestQueueHandle,
&ReceiveQueue,
portMAX_DELAY);
if(pdTRUE == xReturn)
{
printf("This time receive data is%d\n",ReceiveQueue);
}
else
{
printf("Data receive error,error code:0x%lx\n",xReturn);
}
}
}
/*
*@brief:SendTask任务管理
*@function:
*@param:none
*@retval:none
*/
static void SendTask(void *parameter)
{
BaseType_t xReturn = pdPASS;//定义一个创建信息返回值,默认为 pdPASS
uint32_t sendData1 = 1;
uint32_t sendData2 = 2;
while(1)
{
if(KeyScan(KEY2_GPIO_PORT,KEY2_GPIO_PIN) == KEY012_ON)
{
//KEY2被按下
printf("Send message 'sendData1'!\r\n");
xReturn = xQueueSend(TestQueueHandle,//消息队列的句柄
&sendData1,//发送的消息内容
0);//等待时间为0
if(pdPASS == xReturn)
{
printf("sendData1 send success!\n\n");
}
}
if(KeyScan(KEY_UP_GPIO_PORT,KEY_UP_GPIO_PIN) == KEY_UP_ON)
{
//KEY_UP被按下
printf("Send message 'sendData2'!\r\n");
xReturn = xQueueSend(TestQueueHandle,//消息队列的句柄
&sendData2,//发送的消息内容
0);//0
if(pdPASS == xReturn)
{
printf("sendData2 send success!\n\n");
}
}
vTaskDelay(100);//延时100个tick,串口打印更稳定
}
}
/*
*@brief:板级支持包,初始化STM32F103外围硬件
*@function:BspInit
*@param:none
*@retval:none
*/
static void BspInit()
{
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_4);//设置NVIC中断优先级分组,2位抢占优先级和2位响应优先级
LedGpioConfig();
UsartConfig();
KeyConfig();
}
但是在串口中的打印应该是在按下KEY2后,打印Send message 'sendData1'!sendData1 send success!且打印This time receive data is1现在的问题是只有等待KEY2和KEY_UP都执行后也就是在Send message 'sendData1'!sendData1 send success!Send message 'sendData2'!sendData2 send success!都出现后才会打印This time receive data is1This time receive data is2应该如何解决?
将接收任务的优先级改为4以上,比发送任务优先级高,试试看:) butterflyspring 发表于 2020-2-10 16:49
将接收任务的优先级改为4以上,比发送任务优先级高,试试看
是这个原因,版主很有经验呀,一看便知
页:
[1]