semphr.h 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126
  1. /*
  2. * FreeRTOS Kernel V10.5.1
  3. * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved.
  4. *
  5. * SPDX-License-Identifier: MIT
  6. *
  7. */
  8. #ifndef SEMAPHORE_H
  9. #define SEMAPHORE_H
  10. #ifndef INC_FREERTOS_H
  11. #error "include FreeRTOS.h" must appear in source files before "include semphr.h"
  12. #endif
  13. #include "queue.h"
  14. typedef QueueHandle_t SemaphoreHandle_t;
  15. #define semBINARY_SEMAPHORE_QUEUE_LENGTH ( ( uint8_t ) 1U )
  16. #define semSEMAPHORE_QUEUE_ITEM_LENGTH ( ( uint8_t ) 0U )
  17. #define semGIVE_BLOCK_TIME ( ( TickType_t ) 0U )
  18. /**
  19. * 创建二值信号量
  20. */
  21. #define vSemaphoreCreateBinary(xSemaphore) \
  22. { \
  23. (xSemaphore) = xQueueGenericCreate((UBaseType_t)1, semSEMAPHORE_QUEUE_ITEM_LENGTH, queueQUEUE_TYPE_BINARY_SEMAPHORE ); \
  24. if ((xSemaphore) != NULL) \
  25. { \
  26. (void) xSemaphoreGive((xSemaphore)); \
  27. } \
  28. }
  29. /*
  30. * 创建二值信号量
  31. */
  32. #define xSemaphoreCreateBinary() \
  33. xQueueGenericCreate((UBaseType_t)1, semSEMAPHORE_QUEUE_ITEM_LENGTH, queueQUEUE_TYPE_BINARY_SEMAPHORE)
  34. /**
  35. * 获取信号量
  36. */
  37. #define xSemaphoreTake(xSemaphore, xBlockTime) xQueueSemaphoreTake((xSemaphore), (xBlockTime))
  38. /**
  39. */
  40. #if ( configUSE_RECURSIVE_MUTEXES == 1 )
  41. #define xSemaphoreTakeRecursive(xMutex, xBlockTime) \
  42. xQueueTakeMutexRecursive((xMutex), (xBlockTime))
  43. #endif
  44. /**
  45. * 释放信号量
  46. */
  47. #define xSemaphoreGive(xSemaphore) \
  48. xQueueGenericSend((QueueHandle_t) (xSemaphore), NULL, semGIVE_BLOCK_TIME, queueSEND_TO_BACK)
  49. /**
  50. */
  51. #if (configUSE_RECURSIVE_MUTEXES == 1)
  52. #define xSemaphoreGiveRecursive(xMutex) xQueueGiveMutexRecursive((xMutex))
  53. #endif
  54. /**
  55. * 释放信号量
  56. */
  57. #define xSemaphoreGiveFromISR(xSemaphore, pxHigherPriorityTaskWoken) \
  58. xQueueGiveFromISR((QueueHandle_t) (xSemaphore), (pxHigherPriorityTaskWoken))
  59. /**
  60. * 获取信号量
  61. */
  62. #define xSemaphoreTakeFromISR(xSemaphore, pxHigherPriorityTaskWoken) \
  63. xQueueReceiveFromISR((QueueHandle_t) (xSemaphore), NULL, (pxHigherPriorityTaskWoken))
  64. /**
  65. * 创建互斥量
  66. */
  67. #if (configUSE_MUTEXES == 1)
  68. #define xSemaphoreCreateMutex() xQueueCreateMutex(queueQUEUE_TYPE_MUTEX)
  69. #endif
  70. /**
  71. */
  72. #if (configUSE_RECURSIVE_MUTEXES == 1)
  73. #define xSemaphoreCreateRecursiveMutex() xQueueCreateMutex(queueQUEUE_TYPE_RECURSIVE_MUTEX)
  74. #endif
  75. /**
  76. * 创建计数型信号量
  77. */
  78. #define xSemaphoreCreateCounting(uxMaxCount, uxInitialCount) \
  79. xQueueCreateCountingSemaphore((uxMaxCount), (uxInitialCount))
  80. /**
  81. * 删除信号量
  82. */
  83. #define vSemaphoreDelete(xSemaphore) vQueueDelete((QueueHandle_t) (xSemaphore))
  84. /**
  85. */
  86. #if ( ( configUSE_MUTEXES == 1 ) && ( INCLUDE_xSemaphoreGetMutexHolder == 1 ) )
  87. #define xSemaphoreGetMutexHolder( xSemaphore ) xQueueGetMutexHolder( ( xSemaphore ) )
  88. #endif
  89. /**
  90. */
  91. #if ( ( configUSE_MUTEXES == 1 ) && ( INCLUDE_xSemaphoreGetMutexHolder == 1 ) )
  92. #define xSemaphoreGetMutexHolderFromISR(xSemaphore) xQueueGetMutexHolderFromISR((xSemaphore))
  93. #endif
  94. /**
  95. * 获取信号量计数值
  96. */
  97. #define uxSemaphoreGetCount(xSemaphore) uxQueueMessagesWaiting((QueueHandle_t)(xSemaphore))
  98. /**
  99. * 获取信号量计数值
  100. */
  101. #define uxSemaphoreGetCountFromISR(xSemaphore) uxQueueMessagesWaitingFromISR((QueueHandle_t) (xSemaphore))
  102. #endif /* SEMAPHORE_H */