OneOS添加RTT调试信息打印

OneOS添加RTT调试信息打印

〇、前言

众所周知,嵌入式开发很重要的一项工作就是调试,对于我而言,日常用的最多的调试手段就是埋log、看log。
以我的个人习惯而言,正常情况下是开一个专门看log的串口。但是也有例外,比如之前有个项目,对方没有开log口,调试过程就很麻烦,幸亏对方留了SWD口,还能用RTT看一下log。

第一次接触OneOS开发,就从RTT配置开始吧。

一、工程选择

这次使用的开发板是之前在微信公众号申请的万耦开发板,是一块STM32L475板子,板子具体参数官网可查:万耦开发板

本次使用的OneOS版本,是刚从官网clone的:

在这里插入图片描述

根据官网教程,选择与本开发板对应的OneOS\projects\stm32l475-cmcc-oneos例程,这是一个循环点亮LED灯的入门例程。

PS:clone的SDK,这个工程编译的时候提示缺少文件,提示缺少的文件是RTE_Components.h,这个目前看来是个空文件,从别的工程复制一个放到OneOS\projects\stm32l475-cmcc-oneos\board即可解决。但是从官网下载的压缩包没问题。

二、工程配置

编译烧录以后,板子上的红绿蓝三色灯开始闪烁。

在这里插入图片描述

接下来,开始添加RTT相关代码

首先在工程配置中,为工程中的"drivers"添加OneOS\drivers\rtt中的SEGGER_RTT.c以及添加对应的头文件路径。

在这里插入图片描述

然后在SEGGER_RTT.c同目录下添加SEGGER_RTT_printf.c文件,并添加到工程中。这个文件是安装jlink驱动后可以在jlink驱动安装目录下SEGGER\JLink\Samples\RTT找到,解压路径里面的压缩包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"\r\n%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,"\r\n");
	
	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 %s\n", (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调试信息打印完成。

在这里插入图片描述

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值