57 #ifndef SEGGER_RTT_CONF_H
58 #define SEGGER_RTT_CONF_H
60 #if defined (CONFIG_RTT) || dg_configSYSTEMVIEW
62 #ifdef __IAR_SYSTEMS_ICC__
63 #include <intrinsics.h>
83 #ifndef SEGGER_RTT_MAX_NUM_UP_BUFFERS
84 #define SEGGER_RTT_MAX_NUM_UP_BUFFERS (3) // Max. number of up-buffers (T->H) available on this target (Default: 3)
91 #ifndef SEGGER_RTT_MAX_NUM_DOWN_BUFFERS
92 #define SEGGER_RTT_MAX_NUM_DOWN_BUFFERS (3) // Max. number of down-buffers (H->T) available on this target (Default: 3)
95 #ifndef BUFFER_SIZE_UP
96 #define BUFFER_SIZE_UP (4096) // Size of the buffer for terminal output of target, up to host (Default: 1k)
99 #ifndef BUFFER_SIZE_DOWN
100 #define BUFFER_SIZE_DOWN (16) // Size of the buffer for terminal input to target from host (Usually keyboard input) (Default: 16)
103 #ifndef SEGGER_RTT_PRINTF_BUFFER_SIZE
104 #define SEGGER_RTT_PRINTF_BUFFER_SIZE (64u) // Size of buffer for RTT printf to bulk-send chars via RTT (Default: 64)
107 #ifndef SEGGER_RTT_MODE_DEFAULT
108 #define SEGGER_RTT_MODE_DEFAULT SEGGER_RTT_MODE_NO_BLOCK_SKIP // Mode for pre-initialized terminal channel (buffer 0)
123 #ifndef SEGGER_RTT_MEMCPY_USE_BYTELOOP
124 #define SEGGER_RTT_MEMCPY_USE_BYTELOOP 0 // 0: Use memcpy/SEGGER_RTT_MEMCPY, 1: Use a simple byte-loop
147 #ifndef SEGGER_RTT_MAX_INTERRUPT_PRIORITY
148 #define SEGGER_RTT_MAX_INTERRUPT_PRIORITY (0x20) // Interrupt priority to lock on SEGGER_RTT_LOCK on Cortex-M3/4 (Default: 0x20)
156 #if ((defined(__SES_ARM) || defined(__SES_RISCV) || defined(__CROSSWORKS_ARM) || defined(__GNUC__) || defined(__clang__)) && !defined (__CC_ARM) && !defined(WIN32))
157 #if (defined(__ARM_ARCH_6M__) || defined(__ARM_ARCH_8M_BASE__))
158 #define SEGGER_RTT_LOCK() { \
159 unsigned int _SEGGER_RTT__LockState; \
160 __asm volatile ("mrs %0, primask \n\t" \
162 "msr primask, r1 \n\t" \
163 : "=r" (_SEGGER_RTT__LockState) \
168 #define SEGGER_RTT_UNLOCK() __asm volatile ("msr primask, %0 \n\t" \
170 : "r" (_SEGGER_RTT__LockState) \
174 #elif (defined(__ARM_ARCH_7M__) || defined(__ARM_ARCH_7EM__) || defined(__ARM_ARCH_8M_MAIN__))
175 #ifndef SEGGER_RTT_MAX_INTERRUPT_PRIORITY
176 #define SEGGER_RTT_MAX_INTERRUPT_PRIORITY (0x20)
178 #define SEGGER_RTT_LOCK() { \
179 unsigned int _SEGGER_RTT__LockState; \
180 __asm volatile ("mrs %0, basepri \n\t" \
182 "msr basepri, r1 \n\t" \
183 : "=r" (_SEGGER_RTT__LockState) \
184 : "i"(SEGGER_RTT_MAX_INTERRUPT_PRIORITY) \
188 #define SEGGER_RTT_UNLOCK() __asm volatile ("msr basepri, %0 \n\t" \
190 : "r" (_SEGGER_RTT__LockState) \
195 #elif defined(__ARM_ARCH_7A__)
196 #define SEGGER_RTT_LOCK() { \
197 unsigned int _SEGGER_RTT__LockState; \
198 __asm volatile ("mrs r1, CPSR \n\t" \
200 "orr r1, r1, #0xC0 \n\t" \
201 "msr CPSR_c, r1 \n\t" \
202 : "=r" (_SEGGER_RTT__LockState) \
207 #define SEGGER_RTT_UNLOCK() __asm volatile ("mov r0, %0 \n\t" \
208 "mrs r1, CPSR \n\t" \
209 "bic r1, r1, #0xC0 \n\t" \
210 "and r0, r0, #0xC0 \n\t" \
211 "orr r1, r1, r0 \n\t" \
212 "msr CPSR_c, r1 \n\t" \
214 : "r" (_SEGGER_RTT__LockState) \
218 #elif defined(__riscv) || defined(__riscv_xlen)
219 #define SEGGER_RTT_LOCK() { \
220 unsigned int _SEGGER_RTT__LockState; \
221 __asm volatile ("csrr %0, mstatus \n\t" \
222 "csrci mstatus, 8 \n\t" \
223 "andi %0, %0, 8 \n\t" \
224 : "=r" (_SEGGER_RTT__LockState) \
229 #define SEGGER_RTT_UNLOCK() __asm volatile ("csrr a1, mstatus \n\t" \
230 "or %0, %0, a1 \n\t" \
231 "csrs mstatus, %0 \n\t" \
233 : "r" (_SEGGER_RTT__LockState) \
238 #define SEGGER_RTT_LOCK()
239 #define SEGGER_RTT_UNLOCK()
248 #if (defined (__ARM6M__) && (__CORE__ == __ARM6M__)) || \
249 (defined (__ARM8M_BASELINE__) && (__CORE__ == __ARM8M_BASELINE__))
250 #define SEGGER_RTT_LOCK() { \
251 unsigned int _SEGGER_RTT__LockState; \
252 _SEGGER_RTT__LockState = __get_PRIMASK(); \
255 #define SEGGER_RTT_UNLOCK() __set_PRIMASK(_SEGGER_RTT__LockState); \
257 #elif (defined (__ARM7EM__) && (__CORE__ == __ARM7EM__)) || \
258 (defined (__ARM7M__) && (__CORE__ == __ARM7M__)) || \
259 (defined (__ARM8M_MAINLINE__) && (__CORE__ == __ARM8M_MAINLINE__)) || \
260 (defined (__ARM8M_MAINLINE__) && (__CORE__ == __ARM8M_MAINLINE__))
261 #ifndef SEGGER_RTT_MAX_INTERRUPT_PRIORITY
262 #define SEGGER_RTT_MAX_INTERRUPT_PRIORITY (0x20)
264 #define SEGGER_RTT_LOCK() { \
265 unsigned int _SEGGER_RTT__LockState; \
266 _SEGGER_RTT__LockState = __get_BASEPRI(); \
267 __set_BASEPRI(SEGGER_RTT_MAX_INTERRUPT_PRIORITY);
269 #define SEGGER_RTT_UNLOCK() __set_BASEPRI(_SEGGER_RTT__LockState); \
271 #elif (defined (__ARM7A__) && (__CORE__ == __ARM7A__)) || \
272 (defined (__ARM7R__) && (__CORE__ == __ARM7R__))
273 #define SEGGER_RTT_LOCK() { \
274 unsigned int _SEGGER_RTT__LockState; \
275 __asm volatile ("mrs r1, CPSR \n\t" \
277 "orr r1, r1, #0xC0 \n\t" \
278 "msr CPSR_c, r1 \n\t" \
279 : "=r" (_SEGGER_RTT__LockState) \
284 #define SEGGER_RTT_UNLOCK() __asm volatile ("mov r0, %0 \n\t" \
285 "mrs r1, CPSR \n\t" \
286 "bic r1, r1, #0xC0 \n\t" \
287 "and r0, r0, #0xC0 \n\t" \
288 "orr r1, r1, r0 \n\t" \
289 "msr CPSR_c, r1 \n\t" \
291 : "r" (_SEGGER_RTT__LockState) \
303 #define SEGGER_RTT_LOCK() { \
304 unsigned long _SEGGER_RTT__LockState; \
305 _SEGGER_RTT__LockState = __get_interrupt_state(); \
306 __disable_interrupt();
308 #define SEGGER_RTT_UNLOCK() __set_interrupt_state(_SEGGER_RTT__LockState); \
317 #define SEGGER_RTT_LOCK() { \
318 __istate_t _SEGGER_RTT__LockState; \
319 _SEGGER_RTT__LockState = __get_interrupt_state(); \
320 __disable_interrupt();
322 #define SEGGER_RTT_UNLOCK() __set_interrupt_state(_SEGGER_RTT__LockState); \
331 #if (defined __TARGET_ARCH_6S_M)
332 #define SEGGER_RTT_LOCK() { \
333 unsigned int _SEGGER_RTT__LockState; \
334 register unsigned char _SEGGER_RTT__PRIMASK __asm( "primask"); \
335 _SEGGER_RTT__LockState = _SEGGER_RTT__PRIMASK; \
336 _SEGGER_RTT__PRIMASK = 1u; \
337 __schedule_barrier();
339 #define SEGGER_RTT_UNLOCK() _SEGGER_RTT__PRIMASK = _SEGGER_RTT__LockState; \
340 __schedule_barrier(); \
342 #elif (defined(__TARGET_ARCH_7_M) || defined(__TARGET_ARCH_7E_M))
343 #ifndef SEGGER_RTT_MAX_INTERRUPT_PRIORITY
344 #define SEGGER_RTT_MAX_INTERRUPT_PRIORITY (0x20)
346 #define SEGGER_RTT_LOCK() { \
347 unsigned int _SEGGER_RTT__LockState; \
348 register unsigned char BASEPRI __asm( "basepri"); \
349 SEGGER_RTT__LockState = BASEPRI; \
350 BASEPRI = SEGGER_RTT_MAX_INTERRUPT_PRIORITY; \
351 __schedule_barrier();
353 #define SEGGER_RTT_UNLOCK() BASEPRI = _SEGGER_RTT__LockState; \
354 __schedule_barrier(); \
364 #if defined (__TI_ARM_V6M0__)
365 #define SEGGER_RTT_LOCK() { \
366 unsigned int _SEGGER_RTT__LockState; \
367 _SEGGER_RTT__LockState = __get_PRIMASK(); \
370 #define SEGGER_RTT_UNLOCK() __set_PRIMASK(_SEGGER_RTT__LockState); \
372 #elif (defined (__TI_ARM_V7M3__) || defined (__TI_ARM_V7M4__))
373 #ifndef SEGGER_RTT_MAX_INTERRUPT_PRIORITY
374 #define SEGGER_RTT_MAX_INTERRUPT_PRIORITY (0x20)
376 #define SEGGER_RTT_LOCK() { \
377 unsigned int _SEGGER_RTT__LockState; \
378 _SEGGER_RTT__LockState = _set_interrupt_priority(SEGGER_RTT_MAX_INTERRUPT_PRIORITY);
380 #define SEGGER_RTT_UNLOCK() _set_interrupt_priority(_SEGGER_RTT__LockState); \
391 #define SEGGER_RTT_LOCK() { \
392 unsigned long _SEGGER_RTT__LockState; \
393 _SEGGER_RTT__LockState = get_psw() & 0x010000; \
396 #define SEGGER_RTT_UNLOCK() set_psw(get_psw() | _SEGGER_RTT__LockState); \
405 #if defined(WIN32) || defined(SEGGER_RTT_LOCK_EMBOS)
407 void OS_SIM_EnterCriticalSection(
void);
408 void OS_SIM_LeaveCriticalSection(
void);
410 #define SEGGER_RTT_LOCK() { \
411 OS_SIM_EnterCriticalSection();
413 #define SEGGER_RTT_UNLOCK() OS_SIM_LeaveCriticalSection(); \
421 #ifndef SEGGER_RTT_LOCK
422 #define SEGGER_RTT_LOCK() // Lock RTT (nestable) (i.e. disable interrupts)
425 #ifndef SEGGER_RTT_UNLOCK
426 #define SEGGER_RTT_UNLOCK() // Unlock RTT (nestable) (i.e. enable previous interrupt lock state)