9 #if UAVCAN_STM32_CHIBIOS
11 #elif UAVCAN_STM32_NUTTX
12 # include <nuttx/arch.h>
13 # include <arch/board/board.h>
14 # include <chip/stm32_tim.h>
16 #elif UAVCAN_STM32_BAREMETAL
18 #elif UAVCAN_STM32_FREERTOS
20 # include <cmsis_os.h>
28 #ifndef UAVCAN_STM32_LOG
32 # define UAVCAN_STM32_LOG(fmt, ...) syslog("uavcan_stm32: " fmt "\n", ##__VA_ARGS__)
34 # define UAVCAN_STM32_LOG(...) ((void)0)
41 #if UAVCAN_STM32_CHIBIOS
42 # define UAVCAN_STM32_IRQ_HANDLER(id) CH_IRQ_HANDLER(id)
43 # define UAVCAN_STM32_IRQ_PROLOGUE() CH_IRQ_PROLOGUE()
44 # define UAVCAN_STM32_IRQ_EPILOGUE() CH_IRQ_EPILOGUE()
45 #elif UAVCAN_STM32_NUTTX
46 # define UAVCAN_STM32_IRQ_HANDLER(id) int id(int irq, FAR void* context, FAR void *arg)
47 # define UAVCAN_STM32_IRQ_PROLOGUE()
48 # define UAVCAN_STM32_IRQ_EPILOGUE() return 0;
50 # define UAVCAN_STM32_IRQ_HANDLER(id) void id(void)
51 # define UAVCAN_STM32_IRQ_PROLOGUE()
52 # define UAVCAN_STM32_IRQ_EPILOGUE()
55 #if UAVCAN_STM32_CHIBIOS
59 # ifndef UAVCAN_STM32_IRQ_PRIORITY_MASK
60 # if (CH_KERNEL_MAJOR == 2)
61 # define UAVCAN_STM32_IRQ_PRIORITY_MASK CORTEX_PRIORITY_MASK(CORTEX_MAX_KERNEL_PRIORITY)
63 # define UAVCAN_STM32_IRQ_PRIORITY_MASK CORTEX_MAX_KERNEL_PRIORITY
68 #if UAVCAN_STM32_BAREMETAL
72 # ifndef UAVCAN_STM32_IRQ_PRIORITY_MASK
73 # define UAVCAN_STM32_IRQ_PRIORITY_MASK 0
77 #if UAVCAN_STM32_FREERTOS
81 # ifndef UAVCAN_STM32_IRQ_PRIORITY_MASK
82 # define UAVCAN_STM32_IRQ_PRIORITY_MASK configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY
89 #define UAVCAN_STM32_GLUE2_(A, B) A##B
90 #define UAVCAN_STM32_GLUE2(A, B) UAVCAN_STM32_GLUE2_(A, B)
92 #define UAVCAN_STM32_GLUE3_(A, B, C) A##B##C
93 #define UAVCAN_STM32_GLUE3(A, B, C) UAVCAN_STM32_GLUE3_(A, B, C)
97 #if UAVCAN_STM32_CHIBIOS
99 struct CriticalSectionLocker
101 CriticalSectionLocker() { chSysSuspend(); }
102 ~CriticalSectionLocker() { chSysEnable(); }
105 #elif UAVCAN_STM32_NUTTX
107 struct CriticalSectionLocker
109 const irqstate_t flags_;
111 CriticalSectionLocker()
112 : flags_(enter_critical_section())
115 ~CriticalSectionLocker()
117 leave_critical_section(flags_);
121 #elif UAVCAN_STM32_BAREMETAL
123 struct CriticalSectionLocker
126 CriticalSectionLocker()
131 ~CriticalSectionLocker()
137 #elif UAVCAN_STM32_FREERTOS
139 struct CriticalSectionLocker
142 CriticalSectionLocker()
144 taskENTER_CRITICAL();
147 ~CriticalSectionLocker()