hejun96 发表于 2020-1-31 12:55:56

显示接收消息一定要等所有消息全部发送完才显示?

<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应该如何解决?

butterflyspring 发表于 2020-2-10 16:49:39

将接收任务的优先级改为4以上,比发送任务优先级高,试试看:)

hejun96 发表于 2020-2-10 21:35:02

butterflyspring 发表于 2020-2-10 16:49
将接收任务的优先级改为4以上,比发送任务优先级高,试试看

是这个原因,版主很有经验呀,一看便知
页: [1]
查看完整版本: 显示接收消息一定要等所有消息全部发送完才显示?