RAM LOG

RAMLOG简介

RAM LOG 是为了解决在没有连接JLink时候,或者JLink没有持续的读取RTT时候,导致无法查看RTT LOG的问题所设计的。

当没有连接JLink,或者没有持续的读取RTT时候,此时发生了HardFault或者其他原因,需要查看LOG,此时仅仅能够查看最开始的1K的LOG。这样显然不合理。

如果开启了RAMLOG,系统就可以将LOG打在RAM中一个副本,并且循环覆盖。RAM中会保持最新的一部分LOG内容。

RAMLOG 配置

RAMLOG默认是关闭的,需要在“Trunk\plf\bx_debug\bx_log_def.h”进行配置开启。

#define LOG_BACKEND (JLINK_RTT | RAM_LOG)  //使用 JLINK_RTT + RAM_LOG

和RAM LOG相关的参数有如下几行,“Trunk\plf\bx_debug\log\ram_log.h”中配置

INTERNAL_LOG_MAX_SIZE 为RAMLOG总的缓冲区大小

INTERNAL_LOG_SINGLE_SIZE 为每一条LOG打印函数最大能够承受的数量,单条LOG超过本数值会导致内存溢出。

//set ram log parameter
#define INTERNAL_LOG_MAX_SIZE           10240  //max usage of ram log size
#define INTERNAL_LOG_SINGLE_SIZE        1024   //max size per item

RAMLOG 观察

RAMLOG的数据结构如下表所示:

uint8_t  ram_log_buf[INTERNAL_LOG_MAX_SIZE];
uint8_t *ram_log_pointer = ram_log_buf;

首先需要找到 ram_log_buf 数组的地址,该数组保存了所有的RAM LOG。

其次需要找到 ram_log_pointer ,该数值表示了最后一条RAM LOG写到的位置。 注意如果LOG数据比较多,会循环覆盖掉最旧的。

如果没有循环覆盖,则LOG内容为:{&ram_log_buf[0] -> ram_log_pointer}

如果存在循环覆盖,则最新LOG内容为: {ram_log_pointer -> &ram_log_buf[INTERNAL_LOG_MAX_SIZE]} 以及 {&ram_log_buf[0] -> ram_log_pointer}