58#ifndef SEGGER_RTT_CONF_H
59#define SEGGER_RTT_CONF_H
61#ifdef __IAR_SYSTEMS_ICC__
62 #include <intrinsics.h>
82#ifndef SEGGER_RTT_MAX_NUM_UP_BUFFERS
83 #define SEGGER_RTT_MAX_NUM_UP_BUFFERS (3)
90#ifndef SEGGER_RTT_MAX_NUM_DOWN_BUFFERS
91 #define SEGGER_RTT_MAX_NUM_DOWN_BUFFERS (3)
95 #define BUFFER_SIZE_UP (1024)
98#ifndef BUFFER_SIZE_DOWN
99 #define BUFFER_SIZE_DOWN (16)
102#ifndef SEGGER_RTT_PRINTF_BUFFER_SIZE
103 #define SEGGER_RTT_PRINTF_BUFFER_SIZE (64u)
106#ifndef SEGGER_RTT_MODE_DEFAULT
107 #define SEGGER_RTT_MODE_DEFAULT SEGGER_RTT_MODE_NO_BLOCK_SKIP
122#ifndef SEGGER_RTT_MEMCPY_USE_BYTELOOP
123 #define SEGGER_RTT_MEMCPY_USE_BYTELOOP 0
146#ifndef SEGGER_RTT_MAX_INTERRUPT_PRIORITY
147 #define SEGGER_RTT_MAX_INTERRUPT_PRIORITY (0x20)
155#if ((defined(__SES_ARM) || defined(__SES_RISCV) || defined(__CROSSWORKS_ARM) || defined(__GNUC__) || defined(__clang__)) && !defined (__CC_ARM) && !defined(WIN32))
156 #if (defined(__ARM_ARCH_6M__) || defined(__ARM_ARCH_8M_BASE__))
157 #define SEGGER_RTT_LOCK() { \
158 unsigned int _SEGGER_RTT__LockState; \
159 __asm volatile ("mrs %0, primask \n\t" \
161 "msr primask, r1 \n\t" \
162 : "=r" (_SEGGER_RTT__LockState) \
167 #define SEGGER_RTT_UNLOCK() __asm volatile ("msr primask, %0 \n\t" \
169 : "r" (_SEGGER_RTT__LockState) \
173 #elif (defined(__ARM_ARCH_7M__) || defined(__ARM_ARCH_7EM__) || defined(__ARM_ARCH_8M_MAIN__))
174 #ifndef SEGGER_RTT_MAX_INTERRUPT_PRIORITY
175 #define SEGGER_RTT_MAX_INTERRUPT_PRIORITY (0x20)
177 #define SEGGER_RTT_LOCK() { \
178 unsigned int _SEGGER_RTT__LockState; \
179 __asm volatile ("mrs %0, basepri \n\t" \
181 "msr basepri, r1 \n\t" \
182 : "=r" (_SEGGER_RTT__LockState) \
183 : "i"(SEGGER_RTT_MAX_INTERRUPT_PRIORITY) \
187 #define SEGGER_RTT_UNLOCK() __asm volatile ("msr basepri, %0 \n\t" \
189 : "r" (_SEGGER_RTT__LockState) \
194 #elif (defined(__ARM_ARCH_7A__) || defined(__ARM_ARCH_7R__))
195 #define SEGGER_RTT_LOCK() { \
196 unsigned int _SEGGER_RTT__LockState; \
197 __asm volatile ("mrs r1, CPSR \n\t" \
199 "orr r1, r1, #0xC0 \n\t" \
200 "msr CPSR_c, r1 \n\t" \
201 : "=r" (_SEGGER_RTT__LockState) \
206 #define SEGGER_RTT_UNLOCK() __asm volatile ("mov r0, %0 \n\t" \
207 "mrs r1, CPSR \n\t" \
208 "bic r1, r1, #0xC0 \n\t" \
209 "and r0, r0, #0xC0 \n\t" \
210 "orr r1, r1, r0 \n\t" \
211 "msr CPSR_c, r1 \n\t" \
213 : "r" (_SEGGER_RTT__LockState) \
217 #elif defined(__riscv) || defined(__riscv_xlen)
218 #define SEGGER_RTT_LOCK() { \
219 unsigned int _SEGGER_RTT__LockState; \
220 __asm volatile ("csrr %0, mstatus \n\t" \
221 "csrci mstatus, 8 \n\t" \
222 "andi %0, %0, 8 \n\t" \
223 : "=r" (_SEGGER_RTT__LockState) \
228 #define SEGGER_RTT_UNLOCK() __asm volatile ("csrr a1, mstatus \n\t" \
229 "or %0, %0, a1 \n\t" \
230 "csrs mstatus, %0 \n\t" \
232 : "r" (_SEGGER_RTT__LockState) \
237 #define SEGGER_RTT_LOCK()
238 #define SEGGER_RTT_UNLOCK()
247 #if (defined (__ARM6M__) && (__CORE__ == __ARM6M__)) || \
248 (defined (__ARM8M_BASELINE__) && (__CORE__ == __ARM8M_BASELINE__))
249 #define SEGGER_RTT_LOCK() { \
250 unsigned int _SEGGER_RTT__LockState; \
251 _SEGGER_RTT__LockState = __get_PRIMASK(); \
254 #define SEGGER_RTT_UNLOCK() __set_PRIMASK(_SEGGER_RTT__LockState); \
256 #elif (defined (__ARM7EM__) && (__CORE__ == __ARM7EM__)) || \
257 (defined (__ARM7M__) && (__CORE__ == __ARM7M__)) || \
258 (defined (__ARM8M_MAINLINE__) && (__CORE__ == __ARM8M_MAINLINE__)) || \
259 (defined (__ARM8M_MAINLINE__) && (__CORE__ == __ARM8M_MAINLINE__))
260 #ifndef SEGGER_RTT_MAX_INTERRUPT_PRIORITY
261 #define SEGGER_RTT_MAX_INTERRUPT_PRIORITY (0x20)
263 #define SEGGER_RTT_LOCK() { \
264 unsigned int _SEGGER_RTT__LockState; \
265 _SEGGER_RTT__LockState = __get_BASEPRI(); \
266 __set_BASEPRI(SEGGER_RTT_MAX_INTERRUPT_PRIORITY);
268 #define SEGGER_RTT_UNLOCK() __set_BASEPRI(_SEGGER_RTT__LockState); \
270 #elif (defined (__ARM7A__) && (__CORE__ == __ARM7A__)) || \
271 (defined (__ARM7R__) && (__CORE__ == __ARM7R__))
272 #define SEGGER_RTT_LOCK() { \
273 unsigned int _SEGGER_RTT__LockState; \
274 __asm volatile ("mrs r1, CPSR \n\t" \
276 "orr r1, r1, #0xC0 \n\t" \
277 "msr CPSR_c, r1 \n\t" \
278 : "=r" (_SEGGER_RTT__LockState) \
283 #define SEGGER_RTT_UNLOCK() __asm volatile ("mov r0, %0 \n\t" \
284 "mrs r1, CPSR \n\t" \
285 "bic r1, r1, #0xC0 \n\t" \
286 "and r0, r0, #0xC0 \n\t" \
287 "orr r1, r1, r0 \n\t" \
288 "msr CPSR_c, r1 \n\t" \
290 : "r" (_SEGGER_RTT__LockState) \
302 #define SEGGER_RTT_LOCK() { \
303 unsigned long _SEGGER_RTT__LockState; \
304 _SEGGER_RTT__LockState = __get_interrupt_state(); \
305 __disable_interrupt();
307 #define SEGGER_RTT_UNLOCK() __set_interrupt_state(_SEGGER_RTT__LockState); \
316 #define SEGGER_RTT_LOCK() { \
317 __istate_t _SEGGER_RTT__LockState; \
318 _SEGGER_RTT__LockState = __get_interrupt_state(); \
319 __disable_interrupt();
321 #define SEGGER_RTT_UNLOCK() __set_interrupt_state(_SEGGER_RTT__LockState); \
330 #if (defined __TARGET_ARCH_6S_M)
331 #define SEGGER_RTT_LOCK() { \
332 unsigned int _SEGGER_RTT__LockState; \
333 register unsigned char _SEGGER_RTT__PRIMASK __asm( "primask"); \
334 _SEGGER_RTT__LockState = _SEGGER_RTT__PRIMASK; \
335 _SEGGER_RTT__PRIMASK = 1u; \
336 __schedule_barrier();
338 #define SEGGER_RTT_UNLOCK() _SEGGER_RTT__PRIMASK = _SEGGER_RTT__LockState; \
339 __schedule_barrier(); \
341 #elif (defined(__TARGET_ARCH_7_M) || defined(__TARGET_ARCH_7E_M))
342 #ifndef SEGGER_RTT_MAX_INTERRUPT_PRIORITY
343 #define SEGGER_RTT_MAX_INTERRUPT_PRIORITY (0x20)
345 #define SEGGER_RTT_LOCK() { \
346 unsigned int _SEGGER_RTT__LockState; \
347 register unsigned char BASEPRI __asm( "basepri"); \
348 _SEGGER_RTT__LockState = BASEPRI; \
349 BASEPRI = SEGGER_RTT_MAX_INTERRUPT_PRIORITY; \
350 __schedule_barrier();
352 #define SEGGER_RTT_UNLOCK() BASEPRI = _SEGGER_RTT__LockState; \
353 __schedule_barrier(); \
363 #if defined (__TI_ARM_V6M0__)
364 #define SEGGER_RTT_LOCK() { \
365 unsigned int _SEGGER_RTT__LockState; \
366 _SEGGER_RTT__LockState = __get_PRIMASK(); \
369 #define SEGGER_RTT_UNLOCK() __set_PRIMASK(_SEGGER_RTT__LockState); \
371 #elif (defined (__TI_ARM_V7M3__) || defined (__TI_ARM_V7M4__))
372 #ifndef SEGGER_RTT_MAX_INTERRUPT_PRIORITY
373 #define SEGGER_RTT_MAX_INTERRUPT_PRIORITY (0x20)
375 #define SEGGER_RTT_LOCK() { \
376 unsigned int _SEGGER_RTT__LockState; \
377 _SEGGER_RTT__LockState = _set_interrupt_priority(SEGGER_RTT_MAX_INTERRUPT_PRIORITY);
379 #define SEGGER_RTT_UNLOCK() _set_interrupt_priority(_SEGGER_RTT__LockState); \
390 #define SEGGER_RTT_LOCK() { \
391 unsigned long _SEGGER_RTT__LockState; \
392 _SEGGER_RTT__LockState = get_psw() & 0x010000; \
395 #define SEGGER_RTT_UNLOCK() set_psw(get_psw() | _SEGGER_RTT__LockState); \
404#if defined(WIN32) || defined(SEGGER_RTT_LOCK_EMBOS)
406void OS_SIM_EnterCriticalSection(
void);
407void OS_SIM_LeaveCriticalSection(
void);
409#define SEGGER_RTT_LOCK() { \
410 OS_SIM_EnterCriticalSection();
412#define SEGGER_RTT_UNLOCK() OS_SIM_LeaveCriticalSection(); \
420#ifndef SEGGER_RTT_LOCK
421 #define SEGGER_RTT_LOCK()
424#ifndef SEGGER_RTT_UNLOCK
425 #define SEGGER_RTT_UNLOCK()