原创 十、freeRTOS 计数型信号量

2020-8-23 17:05 2209 25 4 分类: 汽车电子 文集: FreeRTOS

计数型信号量简介:

计数型信号量的创建:

计数型信号量动态创建函数:

释放和获取信号量(与二值信号量相同)

释放信号量:

获取信号量:

 

测试实验

用按键来模拟事件,按键按下后表示有事件发生,则释放计数型信号量。

创建两个任务,任务1用于按键检测和释放信号量,按键2用于获取信号量。

测试程序如下所示:

  1. void start_task(void *pvParameters)
  2. {
  3. taskENTER_CRITICAL();
  4. count_semphr = xSemaphoreCreateCounting(5, 0);
  5. if (count_semphr != NULL)
  6. {
  7. printf("计数型信号量创建成功\n");
  8. }
  9. else
  10. {
  11. printf("计数型信号量创建失败\n");
  12. }
  13. // 创建任务1
  14. xTaskCreate((TaskFunction_t ) task1_task,
  15. (char * ) "task1_task",
  16. (uint16_t ) TASK1_TASK_SIZE,
  17. (void * ) NULL,
  18. (UBaseType_t ) TASK1_TASK_PRIO,
  19. (TaskHandle_t * ) &Task1_Handle);
  20. // 创建任务2
  21. xTaskCreate((TaskFunction_t )task2_task,
  22. (char * )"task2_task",
  23. (uint16_t )TASK2_TASK_SIZE,
  24. (void * )NULL,
  25. (UBaseType_t )TASK2_TASK_PRIO,
  26. (TaskHandle_t * )&Task2_Handle);
  27. taskEXIT_CRITICAL();
  28. // 删除开始任务
  29. vTaskDelete(Start_Task_Handle);
  30. }
  31. void task1_task(void *pvParameters)
  32. {
  33. BaseType_t error_state;
  34. for (;;)
  35. {
  36. // 按键KEY1用于释放信号量
  37. if (key_scan(KEY1_GPIO_Port, KEY1_Pin) == KEY_ON)
  38. {
  39. if (count_semphr != NULL)
  40. {
  41. error_state = xSemaphoreGive(count_semphr);
  42. if (error_state == pdTRUE)
  43. {
  44. printf("信号量释放成功\n");
  45. }
  46. else
  47. {
  48. printf("信号量释放失败\n");
  49. }
  50. }
  51. }
  52. vTaskDelay(20);
  53. }
  54. }
  55. void task2_task(void *pvParameters)
  56. {
  57. BaseType_t error_state;
  58. UBaseType_t current_semphr_value;
  59. for (;;)
  60. {
  61. // 按键KEY2用于获取信号量
  62. if (key_scan(KEY2_GPIO_Port, KEY2_Pin) == KEY_ON)
  63. {
  64. if (count_semphr != NULL)
  65. {
  66. // 等待获取信号量
  67. error_state = xSemaphoreTake(count_semphr, portMAX_DELAY);
  68. if (error_state == pdTRUE)
  69. {
  70. printf("获取信号量成功\n");
  71. current_semphr_value = uxSemaphoreGetCount(count_semphr);
  72. printf("当前信号量计数值为%d\n", (int)current_semphr_value);
  73. }
  74. else
  75. {
  76. printf("获取信号量失败\n");
  77. }
  78. }
  79. }
  80. vTaskDelay(50);
  81. }
  82. }

测试结果:

 转载于:https://blog.csdn.net/dingyc_ee/article/details/104114161

文章评论0条评论)

登录后参与讨论
我要评论
0
25
关闭 站长推荐上一条 /2 下一条