Просмотр исходного кода

Merge pull request #2 from Lawlieta/main

更新文档,添加示例代码
朱天龙 (Armink) 5 лет назад
Родитель
Сommit
50a7fe8a46
5 измененных файлов с 113 добавлено и 10 удалено
  1. 13 7
      README.md
  2. 3 0
      SConscript
  3. 84 0
      samples/logmgr_sample.c
  4. 2 2
      src/logmgr.c
  5. 11 1
      src/logmgr_abort.c

+ 13 - 7
README.md

@@ -1,12 +1,16 @@
-# 日志管理软件包介绍
+# 日志管理介绍
 
 ## 1、介绍
 
-该软件包主要用于配置和管理系统中日志相关功能,实现功能如下
+该软件包主要用于配置和管理系统中日志相关功能,实现功能如下
 
 - 支持 ulog 文件后端功能启动;
-- 重定向异常日志打印接口,支持异常时多种调试日志输出;
-- 支持异常时日志保存并输出到指定文件中;
+- 重定向系统 hardfault 和 assert 异常错误回调,添加更多系统异常相关日志输出,包括
+  - 函数调用栈日志
+  - 内核运行日志
+  - 系统负荷监视器日志
+  - 当前系统 IPC 状态、内存状态、JS 堆等日志信息
+- 支持系统异常时日志输出到 Flash,并在重启后导出到文件功能;
 
 ### 1.1 许可证
 
@@ -39,6 +43,7 @@ RT-Thread online packages
         [*]     kernel running log support
         [*]     system load monitor log support
         [*]     system memory log support
+        [ ]   Enable samples
             Version (latest)  --->
 ```
 
@@ -53,18 +58,19 @@ RT-Thread online packages
   - **kernel running log support**:开启系统异常后系统运行日志打印
   - **system load monitor log support**:开启系统异常系统负荷监视器打印
   - **system memory log support**:开启系统异常后系统内存相关信息日志打印
+- **Enable samples**:开启示例文件
 
 ## 3、使用说明
 
-### 3.1 日志管理初始化
+### 3.1 日志管理初始化
 
 ```
 int logmgr_init(void);
 ```
 
-上述功能配置完成之后,需要在应用层调用 `logmgr_init()` 初始化函数,或者开启自动初始化,即可完成日志管理系统初始化。实现文件后端和异常日志输出功能支持。
+上述功能配置完成之后,需要在应用层调用 `logmgr_init()` 初始化函数,或者开启自动初始化,即可完成日志管理系统初始化。
 
-### 3.1 日志管理取消初始化
+### 3.1 日志管理取消初始化
 
 ```
 int logmgr_deinit(void);

+ 3 - 0
SConscript

@@ -6,6 +6,9 @@ cwd = GetCurrentDir()
 src = Glob('src/*.c')
 CPPPATH = [cwd + '/inc']
 
+if GetDepend(['LOGMGR_USING_SAMPLES']):
+    src += Glob('samples/*.c')
+
 group = DefineGroup('logmgr', src, depend = ['PKG_USING_LOGMGR'], CPPPATH = CPPPATH)
 
 Return('group')

+ 84 - 0
samples/logmgr_sample.c

@@ -0,0 +1,84 @@
+/*
+ * Copyright (c) 2006-2021, RT-Thread Development Team
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ *
+ * Change Logs:
+ * Date           Author       Notes
+ * 2021-01-13     ChenYong     first version
+ */
+
+#include <string.h>
+
+#include <rtthread.h>
+#include <logmgr.h>
+
+static int logmgr_test(int argc, char **argv)
+{
+    volatile int * SCB_CCR = (volatile int *) 0xE000ED14; // SCB->CCR
+    static rt_bool_t is_init = RT_FALSE;
+    int x, y, z;
+
+    if (argc < 2)
+    {
+        rt_kprintf("Please input 'logmgr_test <INIT|DIVBYZERO|UNALIGNED|ASSERT>' \n");
+        return -1;
+    }
+
+    if (!strcmp(argv[1], "INIT"))
+    {
+        /* logmgr initialized */
+        logmgr_init();
+        is_init = RT_TRUE;
+    }
+    else
+    {
+        if (is_init == RT_FALSE)
+        {
+            rt_kprintf("logmgr is not initialized, please input 'logmgr_test INIT'\n");
+            return -1;
+        }
+
+        if (!strcmp(argv[1], "DIVBYZERO"))
+        {
+            *SCB_CCR |= (1 << 4); /* bit4: DIV_0_TRP. */
+            x = 10;
+            y = rt_strlen("");
+            z = x / y;
+            rt_kprintf("z:%d\n", z);
+
+            return 0;
+        }
+        else if (!strcmp(argv[1], "UNALIGNED"))
+        {
+            volatile int * p;
+            volatile int value;
+            *SCB_CCR |= (1 << 3); /* bit3: UNALIGN_TRP. */
+
+            p = (int *) 0x00;
+            value = *p;
+            rt_kprintf("addr:0x%02X value:0x%08X\r\n", (int) p, value);
+
+            p = (int *) 0x04;
+            value = *p;
+            rt_kprintf("addr:0x%02X value:0x%08X\r\n", (int) p, value);
+
+            p = (int *) 0x03;
+            value = *p;
+            rt_kprintf("addr:0x%02X value:0x%08X\r\n", (int) p, value);
+
+            return 0;
+        }
+        else if (!strcmp(argv[1], "ASSERT"))
+        {
+            char *p = RT_NULL;
+            RT_ASSERT(p);
+        }
+    }
+
+    return 0;
+}
+#ifdef RT_USING_FINSH
+#include <finsh.h>
+MSH_CMD_EXPORT(logmgr_test, logmgr feature test);
+#endif

+ 2 - 2
src/logmgr.c

@@ -11,7 +11,7 @@
 #include <rtthread.h>
 #include <logmgr.h>
 
-#ifdef PKG_USING_ULOG_FILE
+#ifdef LOGMGR_USING_ULOG_FILE
 #include <ulog_file.h>
 #endif
 
@@ -32,7 +32,7 @@ int logmgr_init(void)
         return -1;
     }
 
-#ifdef PKG_USING_ULOG_FILE
+#ifdef LOGMGR_USING_ULOG_FILE
     ulog_file_backend_init();
 #endif
 #ifdef LOGMGR_USING_ABORT

+ 11 - 1
src/logmgr_abort.c

@@ -85,6 +85,11 @@ RT_WEAK rt_err_t logmgr_exception_hook(void *context)
 {
     volatile uint8_t _continue = 1;
 
+#ifdef LOGMGR_USING_ULOG_FILE
+    extern int ulog_file_backend_deinit(void);
+    ulog_file_backend_deinit();
+#endif
+
     /* set console device to new customize device */
     _logmgr_console_switch(&g_console_dev);
 
@@ -123,6 +128,11 @@ RT_WEAK void logmgr_assert_hook(const char *ex, const char *func, rt_size_t line
 {
     volatile uint8_t _continue = 1;
 
+#ifdef LOGMGR_USING_ULOG_FILE
+    extern int ulog_file_backend_deinit(void);
+    ulog_file_backend_deinit();
+#endif
+
     /* set console device to new customize device */
     _logmgr_console_switch(&g_console_dev);
 
@@ -208,7 +218,7 @@ static bool _logmgr_tsl_cb(fdb_tsl_t tsl, void *arg)
     int fd = *((int *) arg);
     struct fdb_blob blob;
     size_t data_len = 0;
-    char data[LOGMGR_FLASHDB_MAX_LEN] = { 0 };
+    static char data[LOGMGR_FLASHDB_MAX_LEN] = { 0 };
 
     /* get blob data by tsl data */
     fdb_blob_make(&blob, data, tsl->log_len);