Browse Source

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

Bernard Xiong 10 years ago
parent
commit
266496cef3
3 changed files with 40 additions and 8 deletions
  1. 1 8
      include/rtdebug.h
  2. 2 0
      include/rtthread.h
  3. 37 0
      src/kservice.c

+ 1 - 8
include/rtdebug.h

@@ -83,14 +83,7 @@ while (0)
 #define RT_ASSERT(EX)                                                         \
 #define RT_ASSERT(EX)                                                         \
 if (!(EX))                                                                    \
 if (!(EX))                                                                    \
 {                                                                             \
 {                                                                             \
-    volatile char dummy = 0;                                                  \
-    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__);                          \
-    }                                                                         \
+    rt_assert_handler(#EX, __FUNCTION__, __LINE__);                           \
 }
 }
 
 
 /* Macro to check current context */
 /* Macro to check current context */

+ 2 - 0
include/rtthread.h

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

+ 37 - 0
src/kservice.c

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