Преглед изворни кода

[kservice]add hook for RT_ASSERT

armink пре 10 година
родитељ
комит
892eac2cce
3 измењених фајлова са 25 додато и 2 уклоњено
  1. 7 2
      include/rtdebug.h
  2. 5 0
      include/rtthread.h
  3. 13 0
      src/kservice.c

+ 7 - 2
include/rtdebug.h

@@ -84,8 +84,13 @@ while (0)
 if (!(EX))                                                                    \
 {                                                                             \
     volatile char dummy = 0;                                                  \
-    rt_kprintf("(%s) assert failed at %s:%d \n", #EX, __FUNCTION__, __LINE__);\
-    while (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__);                          \
+    }                                                                         \
 }
 
 /* Macro to check current context */

+ 5 - 0
include/rtthread.h

@@ -515,6 +515,11 @@ rt_uint32_t rt_strcasecmp(const char *a, const char *b);
 
 void rt_show_version(void);
 
+#ifdef RT_DEBUG
+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));
+#endif /* RT_DEBUG */
+
 /*@}*/
 
 #ifdef __cplusplus

+ 13 - 0
src/kservice.c

@@ -1237,6 +1237,19 @@ int __rt_ffs(int value)
 }
 #endif
 
+#ifdef RT_DEBUG
+/* RT_ASSERT(EX)'s hook */
+void (*rt_assert_hook)(const char* ex, const char* func, rt_size_t line);
+/**
+ * This function will set a hook function to RT_ASSERT(EX). It will run when the expression is false.
+ *
+ * @param hook the hook function
+ */
+void rt_assert_set_hook(void (*hook)(const char* ex, const char* func, rt_size_t line)) {
+    rt_assert_hook = hook;
+}
+#endif /* RT_DEBUG */
+
 #if !defined (RT_USING_NEWLIB) && defined (RT_USING_MINILIBC) && defined (__GNUC__)
 #include <sys/types.h>
 void *memcpy(void *dest, const void *src, size_t n) __attribute__((weak, alias("rt_memcpy")));