RA2L1移植SEGGER RTT日志打印功能

电子说

1.3w人已加入

描述

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,正常来说应该和下图文件一样

swd接口

接下来修改文件

segger_rtt_register.c加入以下代码

/*

  • Copyright (c) 2006-2021, RT-Thread Development Team
  • SPDX-License-Identifier: Apache-2.0
  • Change Logs:
  • Date Author Notes
  • 2023-02-24 dreamcmi the first version
    */
    #include "SEGGER_RTT.h"
    #include "rtthread.h"
    void rt_hw_console_output(const char *str)
    {
    SEGGER_RTT_Write(0, str, rt_strlen(str));
    }
    SEGGER_RTT.h

将开头的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,软件会自动连接。

swd接口

正常来说会在黑框中打印LOG

swd接口

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,快去试试吧。

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分