common_defines.h 1.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061
  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_WEAK
  14. #define FURI_WEAK __attribute__((weak))
  15. #endif
  16. #ifndef FURI_IS_IRQ_MASKED
  17. #define FURI_IS_IRQ_MASKED() (__get_PRIMASK() != 0U)
  18. #endif
  19. #ifndef FURI_IS_IRQ_MODE
  20. #define FURI_IS_IRQ_MODE() (__get_IPSR() != 0U)
  21. #endif
  22. #ifndef FURI_IS_ISR
  23. #define FURI_IS_ISR() (FURI_IS_IRQ_MODE() || FURI_IS_IRQ_MASKED())
  24. #endif
  25. #ifndef FURI_CRITICAL_ENTER
  26. #define FURI_CRITICAL_ENTER() \
  27. uint32_t __isrm = 0; \
  28. bool __from_isr = FURI_IS_ISR(); \
  29. bool __kernel_running = (xTaskGetSchedulerState() == taskSCHEDULER_RUNNING); \
  30. if(__from_isr) { \
  31. __isrm = taskENTER_CRITICAL_FROM_ISR(); \
  32. } else if(__kernel_running) { \
  33. taskENTER_CRITICAL(); \
  34. } else { \
  35. __disable_irq(); \
  36. }
  37. #endif
  38. #ifndef FURI_CRITICAL_EXIT
  39. #define FURI_CRITICAL_EXIT() \
  40. if(__from_isr) { \
  41. taskEXIT_CRITICAL_FROM_ISR(__isrm); \
  42. } else if(__kernel_running) { \
  43. taskEXIT_CRITICAL(); \
  44. } else { \
  45. __enable_irq(); \
  46. }
  47. #endif
  48. #ifdef __cplusplus
  49. }
  50. #endif