stm32/libuavcan/driver/src/internal.hpp
Go to the documentation of this file.
1 /*
2  * Copyright (C) 2014 Pavel Kirienko <pavel.kirienko@gmail.com>
3  */
4 
5 #pragma once
6 
8 
9 #if UAVCAN_STM32_CHIBIOS
10 # include <hal.h>
11 #elif UAVCAN_STM32_NUTTX
12 # include <nuttx/arch.h>
13 # include <arch/board/board.h>
14 # include <chip/stm32_tim.h>
15 # include <syslog.h>
16 #elif UAVCAN_STM32_BAREMETAL
17 #include <chip.h> // See http://uavcan.org/Implementations/Libuavcan/Platforms/STM32/
18 #elif UAVCAN_STM32_FREERTOS
19 # include <chip.h>
20 # include <cmsis_os.h>
21 #else
22 # error "Unknown OS"
23 #endif
24 
28 #ifndef UAVCAN_STM32_LOG
29 // syslog() crashes the system in this context
30 // # if UAVCAN_STM32_NUTTX && CONFIG_ARCH_LOWPUTC
31 # if 0
32 # define UAVCAN_STM32_LOG(fmt, ...) syslog("uavcan_stm32: " fmt "\n", ##__VA_ARGS__)
33 # else
34 # define UAVCAN_STM32_LOG(...) ((void)0)
35 # endif
36 #endif
37 
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;
49 #else
50 # define UAVCAN_STM32_IRQ_HANDLER(id) void id(void)
51 # define UAVCAN_STM32_IRQ_PROLOGUE()
52 # define UAVCAN_STM32_IRQ_EPILOGUE()
53 #endif
54 
55 #if UAVCAN_STM32_CHIBIOS
56 
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)
62 # else // ChibiOS 3+
63 # define UAVCAN_STM32_IRQ_PRIORITY_MASK CORTEX_MAX_KERNEL_PRIORITY
64 # endif
65 # endif
66 #endif
67 
68 #if UAVCAN_STM32_BAREMETAL
69 
72 # ifndef UAVCAN_STM32_IRQ_PRIORITY_MASK
73 # define UAVCAN_STM32_IRQ_PRIORITY_MASK 0
74 # endif
75 #endif
76 
77 #if UAVCAN_STM32_FREERTOS
78 
81 # ifndef UAVCAN_STM32_IRQ_PRIORITY_MASK
82 # define UAVCAN_STM32_IRQ_PRIORITY_MASK configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY
83 # endif
84 #endif
85 
89 #define UAVCAN_STM32_GLUE2_(A, B) A##B
90 #define UAVCAN_STM32_GLUE2(A, B) UAVCAN_STM32_GLUE2_(A, B)
91 
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)
94 
95 namespace uavcan_stm32
96 {
97 #if UAVCAN_STM32_CHIBIOS
98 
99 struct CriticalSectionLocker
100 {
101  CriticalSectionLocker() { chSysSuspend(); }
102  ~CriticalSectionLocker() { chSysEnable(); }
103 };
104 
105 #elif UAVCAN_STM32_NUTTX
106 
107 struct CriticalSectionLocker
108 {
109  const irqstate_t flags_;
110 
111  CriticalSectionLocker()
112  : flags_(enter_critical_section())
113  { }
114 
115  ~CriticalSectionLocker()
116  {
117  leave_critical_section(flags_);
118  }
119 };
120 
121 #elif UAVCAN_STM32_BAREMETAL
122 
123 struct CriticalSectionLocker
124 {
125 
126  CriticalSectionLocker()
127  {
128  __disable_irq();
129  }
130 
131  ~CriticalSectionLocker()
132  {
133  __enable_irq();
134  }
135 };
136 
137 #elif UAVCAN_STM32_FREERTOS
138 
139 struct CriticalSectionLocker
140 {
141 
142  CriticalSectionLocker()
143  {
144  taskENTER_CRITICAL();
145  }
146 
147  ~CriticalSectionLocker()
148  {
149  taskEXIT_CRITICAL();
150  }
151 };
152 
153 #endif
154 
155 namespace clock
156 {
158 }
159 }
uavcan::uint64_t
std::uint64_t uint64_t
Definition: std.hpp:27
build_config.hpp
uavcan_stm32
Definition: bxcan.hpp:22
uavcan_stm32::clock::getUtcUSecFromCanInterrupt
uavcan::uint64_t getUtcUSecFromCanInterrupt()
Definition: clock.cpp:78
chip.h


uavcan_communicator
Author(s):
autogenerated on Fri Dec 13 2024 03:10:02