你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

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

[复制链接]
hejun96 提问时间:2020-1-31 12:55 /
  1. <div class="blockcode"><blockquote>//FreeRTOS头文件
  2. #include "FreeRTOS.h"
  3. #include "task.h"
  4. #include "queue.h"
  5. //STM32F103外围硬件的头文件均定义在global.h中
  6. #include "global.h"




  7. /****************************任务句柄**********************/
  8. /*
  9. *任务句柄是一个指针,用于指向一个任务,当任务创建好之后,
  10. *它就具有了一个任务句柄,如果是自身的任务操作自己,那么
  11. *这个句柄就可以为NULL
  12. *
  13. */
  14. //创建任务句柄
  15. static TaskHandle_t AppTaskCreateHandle = NULL;
  16. // LED
  17. static TaskHandle_t        RedLedTaskHandle = NULL;
  18. static TaskHandle_t        YellowLedTaskHandle = NULL;
  19. // KEY
  20. static TaskHandle_t KeyTaskHandle = NULL;

  21. //发送和接收任务句柄
  22. static TaskHandle_t ReceiveTaskHandle = NULL;
  23. static TaskHandle_t SendTaskHandle = NULL;

  24. /**********************内核对象句柄*******************/
  25. /*
  26. *信号量,消息队列,事件标志组,软件定时器这些都属
  27. *于内核的对象,要想使用这些内核对象,必须先创建,
  28. *创建成功之后会返回一个相应的句柄。实际上就是一个
  29. *指针
  30. *
  31. *
  32. *
  33. *内核对象是一种全局的数据结构,通过这些数据结构可以
  34. *实现任务间的通信,任务间的事件同步等各种功能。至于
  35. *这些功能的实现我们是通过调用这些内核对象的函数
  36. * 来完成的
  37. *
  38. *
  39. *
  40. */
  41. QueueHandle_t TestQueueHandle = NULL;


  42. /*********************全局变量声明*****************/


  43. /************************宏定义********************/

  44. #define QUEUE_LEN                4//队列的长度,最大可包含多少个消息
  45. #define QUEUE_SIZE        4//队列中每个消息大小
  46. /*
  47. *******************************************
  48. *                                                                        函数声明
  49. *******************************************
  50. */
  51. static void AppTaskCreate(void);//用于创建任务
  52. static void RedLedTask(void *pvParameters);
  53. static void YellowLedTask(void *pvParameters);
  54. static void KeyTask(void *pvParameters);

  55. static void ReceiveTask(void *pvParameters);//接收任务
  56. static void SendTask(void *pvParameters);//发送任务

  57. static void BspInit(void);//初始化板载STM32F103外设硬件

  58. int main(void)
  59. {
  60.         BaseType_t xReturn = pdPASS;//定义一个创建信息返回值,默认为 pdPAS
  61.         BspInit();
  62.         printf("FreeRTOSTask\r\n");
  63.         printf("Please send queue message by press KEY2 or KEY_UP\n");
  64.         printf("ReceiveTask receive message echo in USART\n\n");
  65.         xReturn = xTaskCreate((TaskFunction_t)AppTaskCreate,//任务入口函数
  66.                                                                                                 (const char*   )"AppTaskCreate",//函数名字
  67.                                                                                                 (uint16_t      )512,//任务栈入口大小
  68.                                                                                                 (void*         )NULL,//任务入口函数参数
  69.                                                                                                 (UBaseType_t   )1,//任务的优先级
  70.                                                                                                 (TaskHandle_t* )&AppTaskCreateHandle);//任务控制块指针
  71.         //启动任务调度                                                                                                
  72.         if(pdPASS == xReturn)
  73.         {
  74.                 vTaskStartScheduler();//启动任务,开始调度
  75.         }               
  76.         else
  77.         {
  78.                 return -1;
  79.         }
  80.         while(1);//正常不会执行到这里
  81.         
  82. }
  83. /*
  84. *@brief:为了方便管理,所有的任务创建函数都放在这个函数里面
  85. *@function:AppTaskCreate
  86. *@param:none
  87. *@retval:none
  88. */
  89. static void AppTaskCreate(void)
  90. {
  91.         BaseType_t xReturn = pdPASS;//定义一个创建信息返回值默认为pdPAss
  92.         taskENTER_CRITICAL();//进入临界区
  93.         
  94.         TestQueueHandle = xQueueCreate((UBaseType_t)QUEUE_LEN,//消息队列的长度
  95.                                                                                                                                         (UBaseType_t)QUEUE_SIZE);//消息队列的大小
  96.         
  97.         if(NULL != TestQueueHandle)
  98.         {
  99.                 printf("Create TestQueueHandle Success!\n");
  100.         }
  101.         
  102.         
  103.         //创建ReceiveTask任务
  104.         xReturn = xTaskCreate((TaskFunction_t )ReceiveTask,//任务入口函数
  105.                                                                                                 (const char*    )"ReceiveTask",//
  106.                                                                                                 (uint16_t       )512,//
  107.                                                                                                 (void*          )NULL,//
  108.                                                                                                 (UBaseType_t    )2,//
  109.                                                                                                 (TaskHandle_t*  )&ReceiveTaskHandle);//
  110.         if(pdPASS == xReturn)
  111.         {
  112.                 printf("Create ReceiveTask Success!\n");//
  113.         }
  114.         //创建SendTask任务
  115.         xReturn = xTaskCreate((TaskFunction_t )SendTask,
  116.                                                                                                 (const char*    )"SendTask",
  117.                                                                                                 (uint16_t       )512,
  118.                                                                                                 (void*          )NULL,
  119.                                                                                                 (UBaseType_t    )3,
  120.                                                                                                 (TaskHandle_t*  )&SendTaskHandle);
  121.         if(pdPASS == xReturn)
  122.         {
  123.                 printf("Create SendTask Success!\n\n");
  124.         }               
  125.         
  126.         

  127.         vTaskDelete(AppTaskCreateHandle);//删除AppTaskCreate任务
  128.         taskEXIT_CRITICAL();//退出临界区
  129. }
  130. /*
  131. *@brief:RedLed任务管理
  132. *@function:RedLedTask
  133. *@param:*parameter
  134. *@retval:none
  135. */
  136. static void RedLedTask(void *parameter)
  137. {
  138.         while(1)
  139.         {
  140.                 RED_LED_ON();
  141.                 vTaskDelay(15000);//延时15000个tick
  142.                 printf("RedLedTask Running,RED_LED_OFF\n");
  143.                
  144.                 RED_LED_OFF();
  145.                 vTaskDelay(15000);//延时15000个tick
  146.                 printf("RedLedTask Running,RED_LED_ON\n");
  147.         }
  148. }

  149. /*
  150. *@brief:YellowLed任务管理
  151. *@function:YellowLedTask
  152. *@param:*parameter
  153. *@retval:none
  154. */
  155. static void YellowLedTask(void *parameter)
  156. {
  157.         while(1)
  158.         {
  159.                 YELLOW_LED_ON();
  160.                 vTaskDelay(15000);//延时15000个tick
  161.                 printf("YellowLedTask Running,YELLOW_LED_OFF\n");
  162.                
  163.                 YELLOW_LED_OFF();
  164.                 vTaskDelay(15000);//延时15000个tick
  165.                 printf("YellowLedTask Running,YELLOW_LED_ON\n");
  166.         }
  167. }
  168. /*
  169. *@brief:Key任务管理
  170. *@function:KeyTask
  171. *@param:*parameter
  172. *@retval:none
  173. */
  174. static void KeyTask(void *parameter)
  175. {
  176.         while(1)
  177.         {
  178.                 if(KeyScan(KEY0_GPIO_PORT,KEY0_GPIO_PIN) == KEY012_ON)
  179.                 {
  180.                         //KEY0被按下
  181.                         printf("Suspend Task of LED!\n\n");
  182.                         vTaskSuspend(RedLedTaskHandle);//挂起红灯任务
  183.                         vTaskSuspend(YellowLedTaskHandle);//挂起黄灯任务
  184.                 }
  185.                 if(KeyScan(KEY1_GPIO_PORT,KEY1_GPIO_PIN) == KEY012_ON)
  186.                 {
  187.                         //KEY1被按下
  188.                         printf("Resume Task of LED!\n\n");
  189.                         vTaskResume(RedLedTaskHandle);//挂起红灯任务
  190.                         vTaskResume(YellowLedTaskHandle);//挂起黄灯任务
  191.                 }
  192.                 vTaskDelay(100);//延时100个tick,串口打印更稳定
  193.         }

  194. }

  195. /*
  196. *@brief:ReceiveTask任务管理
  197. *@function:
  198. *@param:none
  199. *@retval:none
  200. */
  201. static void ReceiveTask(void *parameter)
  202. {
  203.         BaseType_t xReturn = pdTRUE;//定义一个创建信息返回值,默认为 pdTRUE
  204.         uint32_t ReceiveQueue;//定义一个接收消息的变量
  205.         while(1)
  206.         {
  207.                 xReturn = xQueueReceive(TestQueueHandle,
  208.                                                                                                                 &ReceiveQueue,
  209.                                                                                                                 portMAX_DELAY);
  210.                 if(pdTRUE == xReturn)
  211.                 {
  212.                         printf("This time receive data is%d\n",ReceiveQueue);
  213.                 }
  214.                 else
  215.                 {
  216.                         printf("Data receive error,error code:0x%lx\n",xReturn);
  217.                 }
  218.         }
  219. }
  220. /*
  221. *@brief:SendTask任务管理
  222. *@function:
  223. *@param:none
  224. *@retval:none
  225. */
  226. static void SendTask(void *parameter)
  227. {
  228.         BaseType_t xReturn = pdPASS;//定义一个创建信息返回值,默认为 pdPASS
  229.         uint32_t sendData1 = 1;
  230.         uint32_t sendData2 = 2;
  231.         
  232.         while(1)
  233.         {
  234.                 if(KeyScan(KEY2_GPIO_PORT,KEY2_GPIO_PIN) == KEY012_ON)
  235.                 {
  236.                         //KEY2被按下
  237.                         printf("Send message 'sendData1'!\r\n");
  238.                         xReturn = xQueueSend(TestQueueHandle,//消息队列的句柄
  239.                                                                                                                 &sendData1,//发送的消息内容
  240.                                                                                                                 0);//等待时间为0
  241.                         if(pdPASS == xReturn)
  242.                         {
  243.                                 printf("sendData1 send success!\n\n");
  244.                         }
  245.                         
  246.                 }
  247.                 if(KeyScan(KEY_UP_GPIO_PORT,KEY_UP_GPIO_PIN) == KEY_UP_ON)
  248.                 {
  249.                         //KEY_UP被按下
  250.                         printf("Send message 'sendData2'!\r\n");
  251.                         xReturn = xQueueSend(TestQueueHandle,//消息队列的句柄
  252.                                                                                                                 &sendData2,//发送的消息内容
  253.                                                                                                                 0);//0
  254.                         if(pdPASS == xReturn)
  255.                         {
  256.                                 printf("sendData2 send success!\n\n");
  257.                         }
  258.                         
  259.                 }
  260.                 vTaskDelay(100);//延时100个tick,串口打印更稳定
  261.         }
  262. }
  263. /*
  264. *@brief:板级支持包,初始化STM32F103外围硬件
  265. *@function:BspInit
  266. *@param:none
  267. *@retval:none
  268. */
  269. static void BspInit()
  270. {
  271.         NVIC_PriorityGroupConfig(NVIC_PriorityGroup_4);//设置NVIC中断优先级分组,2位抢占优先级和2位响应优先级        
  272.         LedGpioConfig();
  273.         UsartConfig();
  274.         KeyConfig();
  275. }
复制代码

复制代码
但是在串口中的打印应该是在按下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 is1
This time receive data is2
应该如何解决?


收藏 评论2 发布时间:2020-1-31 12:55

举报

2个回答
butterflyspring 回答时间:2020-2-10 16:49:39
将接收任务的优先级改为4以上,比发送任务优先级高,试试看
hejun96 回答时间:2020-2-10 21:35:02
butterflyspring 发表于 2020-2-10 16:49
将接收任务的优先级改为4以上,比发送任务优先级高,试试看

是这个原因,版主很有经验呀,一看便知

所属标签

相似问题

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
微信公众号二维码 微信公众号
手机版二维码 手机版