summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--include/rtdebug.h9
-rw-r--r--include/rtthread.h5
-rw-r--r--src/kservice.c13
3 files changed, 25 insertions, 2 deletions
diff --git a/include/rtdebug.h b/include/rtdebug.h
index 8fd07b5b76..a324a29623 100644
--- a/include/rtdebug.h
+++ b/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 */
diff --git a/include/rtthread.h b/include/rtthread.h
index 9bb02abede..705795b522 100644
--- a/include/rtthread.h
+++ b/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
diff --git a/src/kservice.c b/src/kservice.c
index ab15917bbe..e8076eb237 100644
--- a/src/kservice.c
+++ b/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")));