概述
OneOS添加RTT调试信息打印
〇、前言
众所周知,嵌入式开发很重要的一项工作就是调试,对于我而言,日常用的最多的调试手段就是埋log、看log。
以我的个人习惯而言,正常情况下是开一个专门看log的串口。但是也有例外,比如之前有个项目,对方没有开log口,调试过程就很麻烦,幸亏对方留了SWD口,还能用RTT看一下log。
第一次接触OneOS开发,就从RTT配置开始吧。
一、工程选择
这次使用的开发板是之前在微信公众号申请的万耦开发板,是一块STM32L475板子,板子具体参数官网可查:万耦开发板
本次使用的OneOS版本,是刚从官网clone的:
根据官网教程,选择与本开发板对应的OneOSprojectsstm32l475-cmcc-oneos
例程,这是一个循环点亮LED灯的入门例程。
PS:clone的SDK,这个工程编译的时候提示缺少文件,提示缺少的文件是RTE_Components.h
,这个目前看来是个空文件,从别的工程复制一个放到OneOSprojectsstm32l475-cmcc-oneosboard
即可解决。但是从官网下载的压缩包没问题。
二、工程配置
编译烧录以后,板子上的红绿蓝三色灯开始闪烁。
接下来,开始添加RTT相关代码。
首先在工程配置中,为工程中的"drivers"添加OneOSdriversrtt
中的SEGGER_RTT.c
以及添加对应的头文件路径。
然后在SEGGER_RTT.c
同目录下添加SEGGER_RTT_printf.c
文件,并添加到工程中。这个文件是安装jlink驱动后可以在jlink驱动安装目录下SEGGERJLinkSamplesRTT
找到,解压路径里面的压缩包SEGGER_RTT_V6XXX.zip解压即可,当然这个文件也可以从网上下载到。
添加完成后,在同一路径下新建onelog.h
文件,在这个文件里,我们主要需要创建4个调用接口,分别是打印info的ONE_LOG_INFO()
,打印警告信息的ONE_LOG_WARNING()
,打印错误信息的ONE_LOG_ERROR()
以及打印16进制数据的ONE_LOG_HEXDUMP()
,为了在调试的过程中快速定位到不同的信息,还需要为这几种信息配置不同的打印颜色,我使用了四种颜色用于区分:info是绿色,警告信息是黄色,错误信息是红色,16进制数据是白色。
以下是相关代码:
#ifndef _ONE_LOG_H_
#define _ONE_LOG_H_
#include "SEGGER_RTT.h"
#define LOG_DEBUG 1
#if LOG_DEBUG
#define ONE_LOG_PRINT(type,color,format,...)
SEGGER_RTT_printf(0,"%s%s"format"rn%s",
color,
type,
##__VA_ARGS__,
RTT_CTRL_RESET)
#define ONE_LOG_CLEAR() SEGGER_RTT_WriteString(0, " "RTT_CTRL_CLEAR)
#define ONE_LOG(format,...) ONE_LOG_PRINT("","",format,##__VA_ARGS__)
#define ONE_LOG_INFO(format,...) ONE_LOG_PRINT("I: ", RTT_CTRL_TEXT_BRIGHT_GREEN , format, ##__VA_ARGS__)
#define ONE_LOG_WARNING(format,...) ONE_LOG_PRINT("W: ", RTT_CTRL_TEXT_BRIGHT_YELLOW, format, ##__VA_ARGS__)
#define ONE_LOG_ERROR(format,...) ONE_LOG_PRINT("E: ", RTT_CTRL_TEXT_BRIGHT_RED , format, ##__VA_ARGS__)
#define ONE_LOG_HEXDUMP(p_data,len) SEGGER_RTT_HEXDUMP(p_data,len)
#else
#define ONE_LOG_CLEAR()
#define ONE_LOG
#define ONE_LOG_INFO
#define ONE_LOG_WARNING
#define ONE_LOG_ERROR
#define ONE_LOG_HEXDUMP
#endif
#endif
这里有一点需要注意的是,在上述代码第24行,我用了SEGGER_RTT_HEXDUMP()
函数,这个函数是我自己添加的,所以接下来需要在SEGGER_RTT_printf.c
最下面添加如下代码:
int SEGGER_RTT_HEXDUMP(unsigned char *p_data,unsigned char len){
SEGGER_RTT_printf(0,"%s0x",RTT_CTRL_TEXT_BRIGHT_WHITE);
for(int i = 0;i<len;i++)
{
SEGGER_RTT_printf(0,"%s%02x ",RTT_CTRL_TEXT_BRIGHT_WHITE,p_data[i]);
}
SEGGER_RTT_printf(0,"rn");
return 0;
}
以及还需要在SEGGER_RTT.h
中添加:int SEGGER_RTT_HEXDUMP(unsigned char *p_data,unsigned char len);
这样,RTT就已经添加完成。
三、RTT的调用
RTT已经配置完成,接下来需要在需要main.c中初始化以及调用。
首先进行初始化,并打印固件信息:
int main(void)
{
SEGGER_RTT_Init();
ONE_LOG_CLEAR();
ONE_LOG_INFO(RTT_CTRL_CLEAR"Compiled %s %sn", (uint32_t)__DATE__, (uint32_t)__TIME__);
………………
………………
}
然后,我们可以根据例程中三种灯的闪烁来打印不同的信息,比如:三种灯亮起的时候分别打印info、警告信息与错误信息,并且在第一个灯亮起的时候打印一组16进制数据,以下是相关代码:
static void user_task(void *parameter)
{
int i = 0;
for (i = 0; i < led_table_size; i++)
{
os_pin_mode(led_table[i].pin, PIN_MODE_OUTPUT);
}
uint8_t a[13]={0,1,2,3,4,5,6,7,8,9,0,0,1};
while (1)
{
for (i = 0; i < led_table_size; i++)
{
switch (i) {
case 0 :
{
ONE_LOG_HEXDUMP(a,13);
ONE_LOG_INFO("info:0");
}break;
case 1 :
{
ONE_LOG_WARNING("warning:1");
}break;
case 2 :
{
ONE_LOG_ERROR("error:2");
}break;
}
os_pin_write(led_table[i].pin, led_table[i].active_level);
os_task_msleep(500);
os_pin_write(led_table[i].pin, !led_table[i].active_level);
os_task_msleep(500);
}
}
}
编译,烧录,打开jlink RTT viewer,连接设备,注意设备型号不要选错了:
连接成功后,可以看到jlink RTT viewer上已经打印上述四种信息,至此, OneOS添加RTT调试信息打印完成。
最后
以上就是俊秀帅哥为你收集整理的OneOS添加RTT调试信息打印OneOS添加RTT调试信息打印的全部内容,希望文章能够帮你解决OneOS添加RTT调试信息打印OneOS添加RTT调试信息打印所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复