0
点赞
收藏
分享

微信扫一扫

[CC2642r1] 移植RTT并替换TI自带LOG -- JLINK -- XDS110


官方手册:https://www.segger.com/products/debug-probes/j-link/technology/about-real-time-transfer

目录导航

  • ​​一、RTT_LOG(JLINK)​​
  • ​​Jlink常问问题​​
  • ​​二、RTT_UART(XDS110)​​
  • ​​文件下载:​​

SDK修改:

C:\ti\simplelink_cc13x2_26x2_sdk_4_40_04_04\source\ti\display\Display.h

[CC2642r1] 移植RTT并替换TI自带LOG -- JLINK -- XDS110_#define

添加文件:

[CC2642r1] 移植RTT并替换TI自带LOG -- JLINK -- XDS110_#define_02


[CC2642r1] 移植RTT并替换TI自带LOG -- JLINK -- XDS110_c++_03

建议,放到主线程初始化。

[CC2642r1] 移植RTT并替换TI自带LOG -- JLINK -- XDS110_c++_04

一、RTT_LOG(JLINK)

#include "RTT_Printf.h"
/*! Output string fmt with variable arguments to display \see Display_doPrintf() */
# define Display_printf LOG_TI

使用方法:伪代码
main.c

#include "RTT_Printf.h"
int main() {
RTT_Init();
LOGE(">>>ERR");
LOGI(">>>INFO");
LOGW(">>>Wrong");
LOGD(">>>Debug");
}

Jlink常问问题

J-Link 如何找到 RTT 缓冲区?

A:有两种方法: 如果调试器(IDE)知道 SEGGER_RTT 结构的地址,它会将它传递给 J-Link。例如,这由Ozone、J-Link 调试器或SEGGER Embedded Studio完成。如果使用不支持 SEGGER-RTT 的调试器,例如 IAR 的 Embedded Workbench 或 emIDE,则 J-Link 在程序执行期间在已知目标 RAM 中搜索 ID,在后台透明。定位 ID 字符串的过程只需几分之一秒,不会延迟程序执行。

我正在调试一个仅 RAM 的应用程序。J-Link 找到一个 RTT 缓冲区,但我没有得到任何输出。我能做些什么?

答:如果应用程序的 init 部分存储在 RAM 中,J-Link 可能会错误地识别 init 部分中的块,而不是数据部分中的实际块。为防止这种情况,请将定义 SEGGER_RTT_IN_RAM 设置为 1。现在 J-Link 将找到正确的 RTT 缓冲区,但仅在调用应用程序中的第一个 SEGGER_RTT 函数之后。建议在应用程序开始时调用 SEGGER_RTT_Init()。

这也可以用于没有 SWO 引脚的目标吗?

A:是的,使用的是调试接口。这可以是大多数 Cortex-M 设备上的 JTAG 或 SWD(仅限 2 针!),甚至可以是某些瑞萨设备上的 FINE 接口,就像英飞凌 SPD 接口(单针!)

这也可以在 Cortex-M0 和 M0+ 上使用吗?

答:是的。

某些终端输出 (printf) 解决方案在调试环境之外执行时会“崩溃”程序执行,因为它们使用软件断点触发没有调试器的硬故障或由于 SWO 未初始化而暂停。这使得无法在独立模式下运行 Debug-build。SEGGER-RTT 怎么样?

答: SEGGER-RTT 默认使用非阻塞模式,这意味着如果没有调试器并且 J-Link 甚至没有连接,它不会停止程序执行。应用程序将继续工作。

尽管在我的应用程序中使用 RTT 是正确的,但我没有看到任何输出。我能做些什么?

答:在某些情况下,J-Link 无法在已知 RAM 区域中定位 RTT 缓冲区。

在这种情况下,可以通过 J-Link exec 命令手动设置可能的区域或确切地址:

设置要搜索 RTT 缓冲区的范围:SetRTTSearchRanges <RangeStart [Hex]> [, <Range1Start [Hex]> , …](例如“SetRTTSearchRanges 0x10000000 0x1000, 0x2000000 0x1000”)
设置 RTT 缓冲区的地址:SetRTTAddr <RTTBufferAddress [Hex]>(例如“SetRTTAddr 0x20000000”)
通过 J-Link 控制面板 -> RTT 设置 RTT 缓冲区的地址
J-Link exec 命令可以在大多数应用程序中执行,例如在 J-Link Commander 中通过“exec ”,在 J-Link GDB Server 中通过“monitor exec ”或在 IAR EW 中通过“__jlinkExecCommand(” <命令>“);” 从宏文件。

是否可以使用 RTT 缓冲区的动态值调用 SetRTTAddr?

答:是的。对于大多数调试器/IDE,这是可以做到的。使用 GDB,可以使用 eval 创建和执行命令。GDB 命令将是:

eval “monitor exec SetRTTAddr %p”, &_SEGGER_RTT
在 IAR 中,可以在宏文件函数中创建命令,如下所示:

Set_RTT_Address () {
__var addr;
__var str;
addr = &_SEGGER_RTT;
str = __smessage "SetRTTAddr ",addr:%x;
__jlinkExecCommand(str);
}

二、RTT_UART(XDS110)

[CC2642r1] 移植RTT并替换TI自带LOG -- JLINK -- XDS110_c++_05

/*******************************************************************************
【文 件】 RTT_Printf.h
【概 述】 RTT打印接口
【修订日期】 2022/09/06
【说 明】 移植RTT并替换TI自带LOG -- JLINK -- XDS110
*******************************************************************************/
#ifndef __RTT_PRINTF_H__
#define __RTT_PRINTF_H__

#ifdef __cplusplus
extern "C" {
#endif

/***************************Include*****************************************/
#include <stdarg.h>
#include <stdint.h>
#include <stdio.h>
#include <time.h>
#include "SEGGER_RTT.h"

/*-------------------OUT_TYPE:决定jlinkrtt,还是uart0------------------------*/
#define OUT_TYPE 1 // 0--RTT 1--UART0
/**************************Definition*****************************************/
#if OUT_TYPE == 0
#define LOG_PROTO(type,color,format,...) \
{ \
SEGGER_RTT_printf(0, "\r\r"color"%s[%s(%d)]"format"\r\n", type, \
__func__, __LINE__, \
##__VA_ARGS__); \
}

/* 无颜色日志输出 */
#define LOG(format,...) LOG_PROTO("", "", format,##__VA_ARGS__)

/* 有颜色格式日志输出 */
#define LOGI(format,...) LOG_PROTO("I: ", RTT_CTRL_TEXT_BRIGHT_GREEN , format, ##__VA_ARGS__)
#define LOGW(format,...) LOG_PROTO("W: ", RTT_CTRL_TEXT_BRIGHT_YELLOW, format, ##__VA_ARGS__)
#define LOGE(format,...) LOG_PROTO("E: ", RTT_CTRL_TEXT_BRIGHT_RED , format, ##__VA_ARGS__)
#define LOGD(format,...) LOG_PROTO("D: ", RTT_CTRL_TEXT_BRIGHT_WHITE , format, ##__VA_ARGS__)

// TI log替换
#define LOG_TI(handle, line, column, format,...) LOGI(format, ##__VA_ARGS__)

#else
#define LOG_PROTO(type,format,...) \
{ \
SEGGER_RTT_printf(0, "%s[%s(%d)]"format"\r\n", type, \
__func__, __LINE__, \
##__VA_ARGS__); \
}
#define LOG(format,...) LOG_PROTO("", format, ##__VA_ARGS__)
#define LOGI(format,...) LOG_PROTO("I: ", format, ##__VA_ARGS__)
#define LOGW(format,...) LOG_PROTO("W: ", format, ##__VA_ARGS__)
#define LOGE(format,...) LOG_PROTO("E: ", format, ##__VA_ARGS__)
#define LOGD(format,...) LOG_PROTO("D: ", format, ##__VA_ARGS__)

// TI log替换
#define LOG_TI(handle, line, column, format,...) LOGI(format, ##__VA_ARGS__)
#endif

/***************************Function*****************************************/
void RTT_Init(void);

#ifdef __cplusplus
}
#endif

#endif

/*******************************************************************************
【文 件】 TTC_RTT_Printf.c
【概 述】 RTT打印接口
【修订日期】 2021/08/04
【说 明】
*******************************************************************************/

/***************************Include*****************************************/
#include "RTT_Printf.h"
#include "SEGGER_RTT.h"
#include "stdio.h"
#include <stdarg.h>
#include <string.h>

#if OUT_TYPE == 1
#include <ti/drivers/UART.h>
#include <ti/drivers/uart/UARTCC26XX.h>
#include "ti_drivers_config.h"
UART_Handle uart_handle = NULL;
#endif
/***************************Definition*****************************************/

const char* colorCtrl[] = {
RTT_CTRL_TEXT_BLACK,
RTT_CTRL_TEXT_RED,
RTT_CTRL_TEXT_RED,
RTT_CTRL_TEXT_YELLOW,
RTT_CTRL_TEXT_WHITE,
RTT_CTRL_TEXT_WHITE,
RTT_CTRL_TEXT_BLACK};

/***************************Function*****************************************/

void RTT_Init(void) {
#if OUT_TYPE == 0
SEGGER_RTT_Init();
SEGGER_RTT_SetTerminal(0);
#else
/* Call driver init functions */
UART_init();
UART_Params uartParams;
/* Create a UART with data processing off. */
UART_Params_init(&uartParams);
uartParams.writeDataMode = UART_DATA_BINARY;
uartParams.readDataMode = UART_DATA_BINARY;
uartParams.readReturnMode = UART_RETURN_FULL;
uartParams.baudRate = 115200;
// Open the UART and initiate the first read
uart_handle = UART_open(CONFIG_UART_0, &uartParams);
if (!uart_handle) while(1);
#endif
}

RTT\SEGGER_RTT_printf.c 修改部分(使用打包文件,则无需操作)

[CC2642r1] 移植RTT并替换TI自带LOG -- JLINK -- XDS110_#define_06


[CC2642r1] 移植RTT并替换TI自带LOG -- JLINK -- XDS110_c++_07

sysconfig 图形化操作–移除Disolay

[CC2642r1] 移植RTT并替换TI自带LOG -- JLINK -- XDS110_开发语言_08

sysconfig 图形化操作–新增Uart–注意红框的几个位置

[CC2642r1] 移植RTT并替换TI自带LOG -- JLINK -- XDS110_c语言_09

文件下载:

​​RTT_TI_CC26xx.zip​​


举报

相关推荐

0 条评论