[Kernel] Use rt_assert_handler() function to handle assertion.

This commit is contained in:
Bernard Xiong 2015-08-03 16:07:30 +08:00
parent abd19b8dd7
commit 266496cef3
3 changed files with 40 additions and 8 deletions

View File

@ -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 */

View File

@ -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 */
/*@}*/ /*@}*/

View File

@ -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__)