mirror of https://github.com/RT-Thread/rt-thread
[Kernel] Use rt_assert_handler() function to handle assertion.
This commit is contained in:
parent
abd19b8dd7
commit
266496cef3
|
@ -83,14 +83,7 @@ while (0)
|
||||||
#define RT_ASSERT(EX) \
|
#define RT_ASSERT(EX) \
|
||||||
if (!(EX)) \
|
if (!(EX)) \
|
||||||
{ \
|
{ \
|
||||||
volatile char dummy = 0; \
|
rt_assert_handler(#EX, __FUNCTION__, __LINE__); \
|
||||||
if (rt_assert_hook == RT_NULL) \
|
|
||||||
{ \
|
|
||||||
rt_kprintf("(%s) assert failed at %s:%d \n", #EX, __FUNCTION__, __LINE__);\
|
|
||||||
while (dummy == 0); \
|
|
||||||
} else { \
|
|
||||||
rt_assert_hook(#EX, __FUNCTION__, __LINE__); \
|
|
||||||
} \
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Macro to check current context */
|
/* Macro to check current context */
|
||||||
|
|
|
@ -518,6 +518,8 @@ void rt_show_version(void);
|
||||||
#ifdef RT_DEBUG
|
#ifdef RT_DEBUG
|
||||||
extern void (*rt_assert_hook)(const char* ex, const char* func, rt_size_t line);
|
extern void (*rt_assert_hook)(const char* ex, const char* func, rt_size_t line);
|
||||||
void rt_assert_set_hook(void (*hook)(const char* ex, const char* func, rt_size_t line));
|
void rt_assert_set_hook(void (*hook)(const char* ex, const char* func, rt_size_t line));
|
||||||
|
|
||||||
|
void rt_assert_handler(const char* ex, const char* func, rt_size_t line);
|
||||||
#endif /* RT_DEBUG */
|
#endif /* RT_DEBUG */
|
||||||
|
|
||||||
/*@}*/
|
/*@}*/
|
||||||
|
|
|
@ -30,6 +30,7 @@
|
||||||
* 2012-12-22 Bernard fix rt_kprintf issue, which found by Grissiom.
|
* 2012-12-22 Bernard fix rt_kprintf issue, which found by Grissiom.
|
||||||
* 2013-06-24 Bernard remove rt_kprintf if RT_USING_CONSOLE is not defined.
|
* 2013-06-24 Bernard remove rt_kprintf if RT_USING_CONSOLE is not defined.
|
||||||
* 2013-09-24 aozima make sure the device is in STREAM mode when used by rt_kprintf.
|
* 2013-09-24 aozima make sure the device is in STREAM mode when used by rt_kprintf.
|
||||||
|
* 2015-07-06 Bernard Add rt_assert_handler routine.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <rtthread.h>
|
#include <rtthread.h>
|
||||||
|
@ -1248,6 +1249,42 @@ void (*rt_assert_hook)(const char* ex, const char* func, rt_size_t line);
|
||||||
void rt_assert_set_hook(void (*hook)(const char* ex, const char* func, rt_size_t line)) {
|
void rt_assert_set_hook(void (*hook)(const char* ex, const char* func, rt_size_t line)) {
|
||||||
rt_assert_hook = hook;
|
rt_assert_hook = hook;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The RT_ASSERT function.
|
||||||
|
*
|
||||||
|
* @param ex the assertion condition string
|
||||||
|
* @param func the function name when assertion.
|
||||||
|
* @param line the file line number when assertion.
|
||||||
|
*/
|
||||||
|
void rt_assert_handler(const char* ex_string, const char* func, rt_size_t line)
|
||||||
|
{
|
||||||
|
volatile char dummy = 0;
|
||||||
|
|
||||||
|
if (rt_assert_hook == RT_NULL)
|
||||||
|
{
|
||||||
|
#ifdef RT_USING_MODULE
|
||||||
|
if (rt_module_self() != RT_NULL)
|
||||||
|
{
|
||||||
|
/* unload assertion module */
|
||||||
|
rt_module_unload(rt_module_self());
|
||||||
|
|
||||||
|
/* re-schedule */
|
||||||
|
rt_schedule();
|
||||||
|
}
|
||||||
|
else
|
||||||
|
#endif
|
||||||
|
{
|
||||||
|
rt_kprintf("(%s) assertion failed at function:%s, line number:%d \n", ex_string, func, line);
|
||||||
|
while (dummy == 0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
rt_assert_hook(ex_string, func, line);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
RTM_EXPORT(rt_assert_handler);
|
||||||
#endif /* RT_DEBUG */
|
#endif /* RT_DEBUG */
|
||||||
|
|
||||||
#if !defined (RT_USING_NEWLIB) && defined (RT_USING_MINILIBC) && defined (__GNUC__)
|
#if !defined (RT_USING_NEWLIB) && defined (RT_USING_MINILIBC) && defined (__GNUC__)
|
||||||
|
|
Loading…
Reference in New Issue