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