common_defines.h 1.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657
  1. #pragma once
  2. #include "core_defines.h"
  3. #include <stdbool.h>
  4. #include <FreeRTOS.h>
  5. #include <task.h>
  6. #ifdef __cplusplus
  7. extern "C" {
  8. #endif
  9. #include <cmsis_compiler.h>
  10. #ifndef FURI_WARN_UNUSED
  11. #define FURI_WARN_UNUSED __attribute__((warn_unused_result))
  12. #endif
  13. #ifndef FURI_IS_IRQ_MASKED
  14. #define FURI_IS_IRQ_MASKED() (__get_PRIMASK() != 0U)
  15. #endif
  16. #ifndef FURI_IS_IRQ_MODE
  17. #define FURI_IS_IRQ_MODE() (__get_IPSR() != 0U)
  18. #endif
  19. #ifndef FURI_IS_ISR
  20. #define FURI_IS_ISR() (FURI_IS_IRQ_MODE() || FURI_IS_IRQ_MASKED())
  21. #endif
  22. #ifndef FURI_CRITICAL_ENTER
  23. #define FURI_CRITICAL_ENTER() \
  24. uint32_t __isrm = 0; \
  25. bool __from_isr = FURI_IS_ISR(); \
  26. bool __kernel_running = (xTaskGetSchedulerState() == taskSCHEDULER_RUNNING); \
  27. if(__from_isr) { \
  28. __isrm = taskENTER_CRITICAL_FROM_ISR(); \
  29. } else if(__kernel_running) { \
  30. taskENTER_CRITICAL(); \
  31. } else { \
  32. __disable_irq(); \
  33. }
  34. #endif
  35. #ifndef FURI_CRITICAL_EXIT
  36. #define FURI_CRITICAL_EXIT() \
  37. if(__from_isr) { \
  38. taskEXIT_CRITICAL_FROM_ISR(__isrm); \
  39. } else if(__kernel_running) { \
  40. taskEXIT_CRITICAL(); \
  41. } else { \
  42. __enable_irq(); \
  43. }
  44. #endif
  45. #ifdef __cplusplus
  46. }
  47. #endif