common_defines.h 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081
  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. static inline bool furi_is_irq_context() {
  46. bool irq = false;
  47. BaseType_t state;
  48. if(FURI_IS_IRQ_MODE()) {
  49. /* Called from interrupt context */
  50. irq = true;
  51. } else {
  52. /* Get FreeRTOS scheduler state */
  53. state = xTaskGetSchedulerState();
  54. if(state != taskSCHEDULER_NOT_STARTED) {
  55. /* Scheduler was started */
  56. if(FURI_IS_IRQ_MASKED()) {
  57. /* Interrupts are masked */
  58. irq = true;
  59. }
  60. }
  61. }
  62. /* Return context, 0: thread context, 1: IRQ context */
  63. return (irq);
  64. }
  65. #ifdef __cplusplus
  66. }
  67. #endif