xref: /nrf52832-nimble/rt-thread/include/rtdebug.h (revision 104654410c56c573564690304ae786df310c91fc)
1*10465441SEvalZero /*
2*10465441SEvalZero  * Copyright (c) 2006-2018, RT-Thread Development Team
3*10465441SEvalZero  *
4*10465441SEvalZero  * SPDX-License-Identifier: Apache-2.0
5*10465441SEvalZero  */
6*10465441SEvalZero 
7*10465441SEvalZero #ifndef __RTDEBUG_H__
8*10465441SEvalZero #define __RTDEBUG_H__
9*10465441SEvalZero 
10*10465441SEvalZero #include <rtconfig.h>
11*10465441SEvalZero 
12*10465441SEvalZero /* settings depend check */
13*10465441SEvalZero #ifdef RT_USING_POSIX
14*10465441SEvalZero #if !defined(RT_USING_DFS) || !defined(RT_USING_DFS_DEVFS)
15*10465441SEvalZero #error "POSIX poll/select, stdin need file system(RT_USING_DFS) and device file system(RT_USING_DFS_DEVFS)"
16*10465441SEvalZero #endif
17*10465441SEvalZero 
18*10465441SEvalZero #if !defined(RT_USING_LIBC)
19*10465441SEvalZero #error "POSIX layer need standard C library(RT_USING_LIBC)"
20*10465441SEvalZero #endif
21*10465441SEvalZero 
22*10465441SEvalZero #endif
23*10465441SEvalZero 
24*10465441SEvalZero #ifdef RT_USING_POSIX_TERMIOS
25*10465441SEvalZero #if !defined(RT_USING_POSIX)
26*10465441SEvalZero #error "termios need POSIX layer(RT_USING_POSIX)"
27*10465441SEvalZero #endif
28*10465441SEvalZero #endif
29*10465441SEvalZero 
30*10465441SEvalZero /* Using this macro to control all kernel debug features. */
31*10465441SEvalZero #ifdef RT_DEBUG
32*10465441SEvalZero 
33*10465441SEvalZero /* Turn on some of these (set to non-zero) to debug kernel */
34*10465441SEvalZero #ifndef RT_DEBUG_MEM
35*10465441SEvalZero #define RT_DEBUG_MEM                   0
36*10465441SEvalZero #endif
37*10465441SEvalZero 
38*10465441SEvalZero #ifndef RT_DEBUG_MEMHEAP
39*10465441SEvalZero #define RT_DEBUG_MEMHEAP               0
40*10465441SEvalZero #endif
41*10465441SEvalZero 
42*10465441SEvalZero #ifndef RT_DEBUG_MODULE
43*10465441SEvalZero #define RT_DEBUG_MODULE                0
44*10465441SEvalZero #endif
45*10465441SEvalZero 
46*10465441SEvalZero #ifndef RT_DEBUG_SCHEDULER
47*10465441SEvalZero #define RT_DEBUG_SCHEDULER             0
48*10465441SEvalZero #endif
49*10465441SEvalZero 
50*10465441SEvalZero #ifndef RT_DEBUG_SLAB
51*10465441SEvalZero #define RT_DEBUG_SLAB                  0
52*10465441SEvalZero #endif
53*10465441SEvalZero 
54*10465441SEvalZero #ifndef RT_DEBUG_THREAD
55*10465441SEvalZero #define RT_DEBUG_THREAD                0
56*10465441SEvalZero #endif
57*10465441SEvalZero 
58*10465441SEvalZero #ifndef RT_DEBUG_TIMER
59*10465441SEvalZero #define RT_DEBUG_TIMER                 0
60*10465441SEvalZero #endif
61*10465441SEvalZero 
62*10465441SEvalZero #ifndef RT_DEBUG_IRQ
63*10465441SEvalZero #define RT_DEBUG_IRQ                   0
64*10465441SEvalZero #endif
65*10465441SEvalZero 
66*10465441SEvalZero #ifndef RT_DEBUG_IPC
67*10465441SEvalZero #define RT_DEBUG_IPC                   0
68*10465441SEvalZero #endif
69*10465441SEvalZero 
70*10465441SEvalZero #ifndef RT_DEBUG_INIT
71*10465441SEvalZero #define RT_DEBUG_INIT                  0
72*10465441SEvalZero #endif
73*10465441SEvalZero 
74*10465441SEvalZero /* Turn on this to enable context check */
75*10465441SEvalZero #ifndef RT_DEBUG_CONTEXT_CHECK
76*10465441SEvalZero #define RT_DEBUG_CONTEXT_CHECK         1
77*10465441SEvalZero #endif
78*10465441SEvalZero 
79*10465441SEvalZero #define RT_DEBUG_LOG(type, message)                                           \
80*10465441SEvalZero do                                                                            \
81*10465441SEvalZero {                                                                             \
82*10465441SEvalZero     if (type)                                                                 \
83*10465441SEvalZero         rt_kprintf message;                                                   \
84*10465441SEvalZero }                                                                             \
85*10465441SEvalZero while (0)
86*10465441SEvalZero 
87*10465441SEvalZero #define RT_ASSERT(EX)                                                         \
88*10465441SEvalZero if (!(EX))                                                                    \
89*10465441SEvalZero {                                                                             \
90*10465441SEvalZero     rt_assert_handler(#EX, __FUNCTION__, __LINE__);                           \
91*10465441SEvalZero }
92*10465441SEvalZero 
93*10465441SEvalZero /* Macro to check current context */
94*10465441SEvalZero #if RT_DEBUG_CONTEXT_CHECK
95*10465441SEvalZero #define RT_DEBUG_NOT_IN_INTERRUPT                                             \
96*10465441SEvalZero do                                                                            \
97*10465441SEvalZero {                                                                             \
98*10465441SEvalZero     rt_base_t level;                                                          \
99*10465441SEvalZero     level = rt_hw_interrupt_disable();                                        \
100*10465441SEvalZero     if (rt_interrupt_get_nest() != 0)                                         \
101*10465441SEvalZero     {                                                                         \
102*10465441SEvalZero         rt_kprintf("Function[%s] shall not be used in ISR\n", __FUNCTION__);  \
103*10465441SEvalZero         RT_ASSERT(0)                                                          \
104*10465441SEvalZero     }                                                                         \
105*10465441SEvalZero     rt_hw_interrupt_enable(level);                                            \
106*10465441SEvalZero }                                                                             \
107*10465441SEvalZero while (0)
108*10465441SEvalZero 
109*10465441SEvalZero /* "In thread context" means:
110*10465441SEvalZero  *     1) the scheduler has been started
111*10465441SEvalZero  *     2) not in interrupt context.
112*10465441SEvalZero  */
113*10465441SEvalZero #define RT_DEBUG_IN_THREAD_CONTEXT                                            \
114*10465441SEvalZero do                                                                            \
115*10465441SEvalZero {                                                                             \
116*10465441SEvalZero     rt_base_t level;                                                          \
117*10465441SEvalZero     level = rt_hw_interrupt_disable();                                        \
118*10465441SEvalZero     if (rt_thread_self() == RT_NULL)                                          \
119*10465441SEvalZero     {                                                                         \
120*10465441SEvalZero         rt_kprintf("Function[%s] shall not be used before scheduler start\n", \
121*10465441SEvalZero                    __FUNCTION__);                                             \
122*10465441SEvalZero         RT_ASSERT(0)                                                          \
123*10465441SEvalZero     }                                                                         \
124*10465441SEvalZero     RT_DEBUG_NOT_IN_INTERRUPT;                                                \
125*10465441SEvalZero     rt_hw_interrupt_enable(level);                                            \
126*10465441SEvalZero }                                                                             \
127*10465441SEvalZero while (0)
128*10465441SEvalZero #else
129*10465441SEvalZero #define RT_DEBUG_NOT_IN_INTERRUPT
130*10465441SEvalZero #define RT_DEBUG_IN_THREAD_CONTEXT
131*10465441SEvalZero #endif
132*10465441SEvalZero 
133*10465441SEvalZero #else /* RT_DEBUG */
134*10465441SEvalZero 
135*10465441SEvalZero #define RT_ASSERT(EX)
136*10465441SEvalZero #define RT_DEBUG_LOG(type, message)
137*10465441SEvalZero #define RT_DEBUG_NOT_IN_INTERRUPT
138*10465441SEvalZero #define RT_DEBUG_IN_THREAD_CONTEXT
139*10465441SEvalZero 
140*10465441SEvalZero #endif /* RT_DEBUG */
141*10465441SEvalZero 
142*10465441SEvalZero #endif /* __RTDEBUG_H__ */
143