1 基于J-Link的调试信息输出( 二 )


以上配置选项都是从开发包中其它例子程序提取出来的 , 对于每个选项的意义可以在官方文档中搜索查看 。
修改
打开文件 , 将 和 变量修改为如下代码
# Source files common to all targetsSRC_FILES += \$(PROJ_DIR)/main.c \$(SDK_ROOT)/modules/nrfx/mdk/gcc_startup_nrf52.S \$(SDK_ROOT)/modules/nrfx/mdk/system_nrf52.c \$(SDK_ROOT)/components/libraries/atomic/nrf_atomic.c \$(SDK_ROOT)/components/libraries/balloc/nrf_balloc.c \$(SDK_ROOT)/components/libraries/util/app_util_platform.c \$(SDK_ROOT)/components/libraries/experimental_memobj/nrf_memobj.c \$(SDK_ROOT)/components/libraries/experimental_log/src/nrf_log_backend_rtt.c \$(SDK_ROOT)/components/libraries/experimental_log/src/nrf_log_default_backends.c \$(SDK_ROOT)/components/libraries/experimental_log/src/nrf_log_frontend.c \$(SDK_ROOT)/components/libraries/experimental_log/src/nrf_log_str_formatter.c \$(SDK_ROOT)/components/libraries/experimental_log/src/nrf_log_backend_serial.c \$(SDK_ROOT)/external/segger_rtt/SEGGER_RTT.c \$(SDK_ROOT)/external/segger_rtt/SEGGER_RTT_Syscalls_GCC.c \$(SDK_ROOT)/external/segger_rtt/SEGGER_RTT_printf.c \$(SDK_ROOT)/external/fprintf/nrf_fprintf.c \$(SDK_ROOT)/external/fprintf/nrf_fprintf_format.c \# Include folders common to all targetsINC_FOLDERS += \$(PROJ_DIR) \$(SDK_ROOT)/modules/nrfx \$(SDK_ROOT)/modules/nrfx/mdk \$(SDK_ROOT)/integration/nrfx \$(SDK_ROOT)/components/toolchain/cmsis/include \$(SDK_ROOT)/components/drivers_nrf/nrf_soc_nosd \$(SDK_ROOT)/components/libraries/atomic \$(SDK_ROOT)/components/libraries/balloc \$(SDK_ROOT)/components/libraries/delay \$(SDK_ROOT)/components/libraries/strerror \$(SDK_ROOT)/components/libraries/util \$(SDK_ROOT)/components/libraries/experimental_log/src \$(SDK_ROOT)/components/libraries/experimental_log \$(SDK_ROOT)/components/libraries/experimental_memobj \$(SDK_ROOT)/components/libraries/experimental_section_vars \$(SDK_ROOT)/external/fprintf \$(SDK_ROOT)/external/segger_rtt \
这些都是使用我们这个程序要用到的源文件和头文件路径 。
修改main.c
打开main.c文件将所有内容删除替换为如下代码
#include "nrf_delay.h"#include "nrf_log.h"#include "nrf_log_ctrl.h"#include "nrf_log_default_backends.h"/*** @brief Function for application main entry.*/int main(void){NRF_LOG_INIT(NULL);NRF_LOG_DEFAULT_BACKENDS_INIT();uint8_t bytes[] = {0x12, 0x34, 0xAC, 0xBE};while (true){nrf_delay_ms(1000);NRF_LOG_DEBUG("Hello World");NRF_LOG_INFO("Hello World");NRF_LOG_WARNING("Hello World");NRF_LOG_ERROR("Hello World");NRF_LOG_HEXDUMP_DEBUG(bytes, sizeof(bytes));NRF_LOG_HEXDUMP_INFO(bytes, sizeof(bytes));NRF_LOG_HEXDUMP_WARNING(bytes, sizeof(bytes));NRF_LOG_HEXDUMP_ERROR(bytes, sizeof(bytes));}}
以上代码完成每隔1s打印四种输出级别的 Hello World和字节数组的16进制显示 。
完成以上修改后 , 打开终端cd到本节RTT目录下执行make编译出错了 , 错误信息如下
error: implicit declaration of function 'NRF_LOG_INTERNAL_HEXDUMP_' [-Werror=implicit-function-declaration]
出现这种错误可能由以下原因造成:
没有把函数所在的c文件生成.o目标文件在函数所在的c文件中定义了 , 但是没有在与之相关联的.h文件中声明
经过在源码中查看发现在SDK////src/.h文件中的第238行
NRF_LOG_INTERNAL_HEXDUMP_(NRF_LOG_SEVERITY_WARNING, NRF_LOG_SEVERITY_WARNING, p_data, len)
DUMP_只在这一处出现 , 又对比G等函数的实现规律 , 所以判断应该是库中的小缺陷 , 这也进一步印证了为什么库文件名命名有个前缀 。我们只需要将这句改成下面的样子就可以修复这个小问题