一、移植RTT
1、前言:一般使用JLINK都会安装他的驱动,然后一般默认安装位置是
2、解压 Jlink
版本的 RTT
驱动的压缩包
3、解压,可以见到驱动文件
4、在工程中新建一个文件夹,RTT,然后将上述的驱动文件加入到RTT文件夹中
5、添加对应的头文件路径
6、编写测试代码
#include "SEGGER_RTT.h"
/**
* @brief The application entry point.
* @retval int
*/
int main(void)
{
SEGGER_RTT_Init();
SEGGER_RTT_printf(0, "Hello world !"); // 原接口
}
二、测试RTT
1、RTT上位机下载
2、采用JLINK驱动自带上位机,位置也在驱动代码里面,可以搜索RTT Viewer
三、拓展代码
该拓展代码的作用就是可以实现 识别指令,然后执行不同的程序;将调试内容打印一定的次数
RttLog.c
#include "RttLog.h"
typedef void (*CmdFunc)(uint8_t *);
struct ShellCmd {
char *str;
CmdFunc handler;
char *help;
};
typedef struct
{
uint16_t detail_num;
}rtt_data_t;
rtt_data_t rtt_data;
static void cmd_printList(uint8_t *buf);
static void cmd_detail(uint8_t *buf)
{
char *token;
char *delimiters = ",";
uint16_t state;
LOG("\r\n%s", buf);
rtt_data.detail_num = 1;
// Use strtok function to tokenize the string
token = strtok((char *)buf, delimiters);
if (token == NULL) {
return;
}
// Skip the first token
token = strtok(NULL, delimiters);
if (token == NULL) {
return;
}
state = atoi(token);
rtt_data.detail_num = state;
}
static const struct ShellCmd cmds[] = {
{ "cmd_list", cmd_printList, "print all cmd" },
{ "detail_get", cmd_detail, "display memery" },
};
static void cmd_printList(uint8_t *buf)
{
(void)buf;
uint8_t i;
LOG("\n==========================\r\n");
for (i = 0; i < sizeof(cmds) / sizeof(cmds[0]); i++) {
LOG("cmd: %s, %s\r\n", cmds[i].str, cmds[i].help);
}
LOG("==========================\r\n");
}
static void ShellCmdhandle(uint8_t *buf)
{
uint8_t i;
if (buf == NULL) {
return;
}
for (i = 0; i < sizeof(cmds) / sizeof(cmds[0]); i++) {
if (strncmp((char *)buf, cmds[i].str, strlen(cmds[i].str)) == 0) {
cmds[i].handler(buf);
break;
}
}
}
static void ShellTaskEventhandle(void)
{
uint32_t size;
uint8_t buf[30] = {0};
if (SEGGER_RTT_HasData(0) == 0x00)
{
return;
}
size = SEGGER_RTT_ReadNoLock(0, buf, 30);
if (size < 1 || size > sizeof(buf))
{
return;
}
ShellCmdhandle(buf);
return;
}
static void print_detail_log(void)
{
if(rtt_data.detail_num > 0)
{
if(rtt_data.detail_num != 0xffff)
{
rtt_data.detail_num--;
}
LOG("\r\n=====================/*detail start*/\r\n");
LOG("software version: %d\r\n", SOFT_VERSION);
LOG("=====================/*detail end*/\r\n");
}
}
void rtt_log_handle(void)
{
ShellTaskEventhandle();
print_detail_log();
}
void rtt_task_init(void)
{
SEGGER_RTT_Init();
}
RttLog.h
#ifndef __RTTLOG_H
#define __RTTLOG_H
#include "SEGGER_RTT.h"
#include "head.h"
#define PRINTF SEGGER_RTT_printf
#define ENABLE_DEBUG 1
#if ENABLE_DEBUG
#define LOG(format, ...) \
do { \
PRINTF(0, format, ##__VA_ARGS__); \
} while (0)
#else
#define LOG(format, ...) \
do { \
; \
} while (0)
#endif
#define SOFT_VERSION 100 // version
void rtt_log_handle(void);
#endif