电子说
0.前言
因为RA2L1开发板板载了JLINK-OB,那么我们完全可以通过SWD调试口去打印日志,从而不去用物理串口,这样不仅省了硬件串口资源占用,而且可以很快速的打印log,对系统整体运行效率也得到了一定程度的提高。接下来就来移植一下SEGGER的RTT日志打印功能。
1.准备
一个由RTT Studio新建好的BSP工程
SEGGER RTT源码(在jlink上位机按照目录里,例如C:Program FilesSEGGERJLinkSamplesRTT)
2.移植
首先把四个基础文件加到工程目录(推荐单独建一个文件夹放源码实现模块化,这里仅做演示没有新建)
SEGGER_RTT.c SEGGER_RTT.h SEGGER_RTT_printf.c SEGGER_RTT_Conf.h
然后新建一个注册文件,这里命名为segger_rtt_register.c
刷新ide,正常来说应该和下图文件一样
接下来修改文件
segger_rtt_register.c加入以下代码
/*
将开头的include改为#include "SEGGER_RTT_Conf.h"
SEGGER_RTT_Conf.h
(此文件可以暂时不修改)
主要看以下两个地方
#ifndef BUFFER_SIZE_UP
#define BUFFER_SIZE_UP (512) // Size of the buffer for terminal output of target, up to host (Default: 1k)
#endif
#ifndef BUFFER_SIZE_DOWN
#define BUFFER_SIZE_DOWN (16) // Size of the buffer for terminal input to target from host (Usually keyboard input) (Default: 16)
#endif
这里的大小根据log频率和长度进行修改,默认是1024和16
drv_common.c
这个文件开头加入#include "SEGGER_RTT.h"
在最下面rt_hw_board_init函数增加rtt初始化函数,并注释掉rt_hw_usart_init();(原因后面说)
RT_WEAK void rt_hw_board_init()
{
rt_hw_systick_init();
SEGGER_RTT_Init();
/* Heap initialization */
#if defined(RT_USING_HEAP)
rt_system_heap_init((void *)HEAP_BEGIN, (void )HEAP_END);
#endif
/ Pin driver initialization is open by default /
#ifdef RT_USING_PIN
rt_hw_pin_init();
#endif
/ USART driver initialization is open by default /
#ifdef RT_USING_SERIAL
// rt_hw_usart_init();
#endif
/ Set the shell console output device /
#if defined(RT_USING_CONSOLE) && defined(RT_USING_DEVICE)
rt_console_set_device(RT_CONSOLE_DEVICE_NAME);
#endif
/ Board underlying hardware initialization */
#ifdef RT_USING_COMPONENTS_INIT
rt_components_board_init();
#endif
}
rtconfig.h
这里面只需要改一个地方, 将原来的uart9改成空即可
#define RT_CONSOLE_DEVICE_NAME ""
hal_entry.c
这里只是编写演示代码!!
void hal_entry(void)
{
while (1)
{
rt_kprintf("hal_entry 1n");
rt_thread_mdelay(1000);
rt_kprintf("hal_entry 2n");
rt_thread_mdelay(1000);
}
}
修改完成后直接编译下载,同时打开J-LINK RTT Viewer,通过下图配置好直接点击ok,软件会自动连接。
正常来说会在黑框中打印LOG
3.答疑
上面的文件修改可能有一些人会问为什么不去注册一个rt_device,因为那样属实麻烦了(其实是懒)。
我们在修改rtconfig.h里的RT_CONSOLE_DEVICE_NAME为空字符串时,已经把打印的函数对接到了void rt_hw_console_output(const char *str), 所以我们只需要对接这一个函数就可以完成printf重定向,至于为什么改一个空字串就可以不用device,看一下rt_kprintf的实现原理大概你就懂了,就是把_console_device的值识别成了NULL。
4.总结
使用segger rtt打印速度快还不占用io,快去试试吧。
全部0条评论
快来发表一下你的评论吧 !