当前位置:   article > 正文

TencentOS-tiny 任务间通信(十)- 优先级消息队列

TencentOS-tiny 任务间通信(十)- 优先级消息队列

一、任务间通信

  1. 优先级消息队列

概述

优先级消息队列相对消息队列来说,给消息附加了一个优先级的概念,较高优先级的消息会比较低优先级的消息更快地被其他任务收到(本质上,消息队列的底层数据容器是环形队列,优先级消息队列的底层数据容器是优先级队列)。

API讲解

编程实例

1、在tos_config.h中,配置优先级消息队列组件开关TOS_CFG_PRIORITY_MESSAGE_QUEUE_EN:

#define TOS_CFG_PRIORITY_MESSAGE_QUEUE_EN 1u

2、编写main.c示例代码:

  1. /* USER CODE END Header */
  2. /* Includes ------------------------------------------------------------------*/
  3. #include "main.h"
  4. #include "usart.h"
  5. #include "gpio.h"
  6. /* Private includes ----------------------------------------------------------*/
  7. /* USER CODE BEGIN Includes */
  8. #include "cmsis_os.h"
  9. #include "stdio.h"
  10. #include "tos_k.h"
  11. /* USER CODE END Includes */
  12. /* Private typedef -----------------------------------------------------------*/
  13. /* USER CODE BEGIN PTD */
  14. #define STK_SIZE_TASK_RECEIVER 512
  15. #define STK_SIZE_TASK_SENDER 512
  16. #define MESSAGE_MAX 10
  17. /* USER CODE END PTD */
  18. /* Private define ------------------------------------------------------------*/
  19. /* USER CODE BEGIN PD */
  20. k_stack_t stack_task_receiver[STK_SIZE_TASK_RECEIVER];
  21. k_stack_t stack_task_sender[STK_SIZE_TASK_SENDER];
  22. uint8_t msg_pool[MESSAGE_MAX * sizeof(void *)];
  23. k_task_t task_receiver;
  24. k_task_t task_sender;
  25. k_prio_msg_q_t prio_msg_q;
  26. extern void entry_task_receiver(void *arg);
  27. extern void entry_task_sender(void *arg);
  28. /* USER CODE END PD */
  29. /* Private macro -------------------------------------------------------------*/
  30. /* USER CODE BEGIN PM */
  31. void entry_task_receiver(void *arg)
  32. {
  33. k_err_t err;
  34. void *msg_received;
  35. while (K_TRUE) {
  36. err = tos_prio_msg_q_pend(&prio_msg_q, &msg_received, TOS_TIME_FOREVER);
  37. if (err == K_ERR_NONE) {
  38. printf("receiver: msg incoming[%s]\n", (char *)msg_received);
  39. }
  40. }
  41. }
  42. void entry_task_sender(void *arg)
  43. {
  44. char *msg_prio_0 = "msg with priority 0";
  45. char *msg_prio_1 = "msg with priority 1";
  46. char *msg_prio_2 = "msg with priority 2";
  47. printf("sender: post a message with priority 2\n");
  48. tos_prio_msg_q_post(&prio_msg_q, msg_prio_2, 2);
  49. printf("sender: post a message with priority 1\n");
  50. tos_prio_msg_q_post(&prio_msg_q, msg_prio_1, 1);
  51. printf("sender: post a message with priority 0\n");
  52. tos_prio_msg_q_post(&prio_msg_q, msg_prio_0, 0);
  53. }
  54. /* USER CODE END PM */
  55. /* Private variables ---------------------------------------------------------*/
  56. /* USER CODE BEGIN PV */
  57. /* USER CODE END PV */
  58. /* Private function prototypes -----------------------------------------------*/
  59. void SystemClock_Config(void);
  60. /* USER CODE BEGIN PFP */
  61. /* USER CODE END PFP */
  62. /* Private user code ---------------------------------------------------------*/
  63. /* USER CODE BEGIN 0 */
  64. /* USER CODE END 0 */
  65. /**
  66. * @brief The application entry point.
  67. * @retval int
  68. */
  69. int main(void)
  70. {
  71. /* USER CODE BEGIN 1 */
  72. /* USER CODE END 1 */
  73. /* MCU Configuration--------------------------------------------------------*/
  74. /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
  75. HAL_Init();
  76. /* USER CODE BEGIN Init */
  77. /* USER CODE END Init */
  78. /* Configure the system clock */
  79. SystemClock_Config();
  80. /* USER CODE BEGIN SysInit */
  81. /* USER CODE END SysInit */
  82. /* Initialize all configured peripherals */
  83. MX_GPIO_Init();
  84. MX_USART1_UART_Init();
  85. /* USER CODE BEGIN 2 */
  86. tos_knl_init();
  87. tos_prio_msg_q_create(&prio_msg_q, msg_pool, MESSAGE_MAX);
  88. (void)tos_task_create(&task_receiver, "receiver", entry_task_receiver, NULL,
  89. 5, stack_task_receiver, STK_SIZE_TASK_RECEIVER, 0);
  90. (void)tos_task_create(&task_sender, "sender", entry_task_sender, NULL,
  91. 4, stack_task_sender, STK_SIZE_TASK_SENDER, 0);
  92. tos_knl_start();
  93. /* USER CODE END 2 */
  94. /* Infinite loop */
  95. /* USER CODE BEGIN WHILE */
  96. while (1)
  97. {
  98. /* USER CODE END WHILE */
  99. /* USER CODE BEGIN 3 */
  100. }
  101. /* USER CODE END 3 */
  102. }

3、运行效果:

源码链接:Git​​​​​​​

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/黑客灵魂/article/detail/763260
推荐阅读
相关标签
  

闽ICP备14008679号