原教程: https://devzone.nordicsemi.com/tutorials/6/安全
在SDK12.0.0或者更高的版本中,对RTT的日志记录调试是内置到记录器模块(logger module NRF_LOG)。想使用RTT的日志记录,检查配置向导(configuration wizard)的sdk_config.h文件的NRF_LOG_BACKEND_SERIAL_USES_RTT 选项。app
所以,下面记录的方法主要用于SDK11或者更久远的版本。函数
当咱们建立一个工程的时候,一般须要调试和监视代码的执行。若是咱们想要调试,有几个选项,例如在串行端口打印信息,或者在keil中使用断点并单步运行。不过,对于带有蓝牙协议栈这样的实时操做系统的程序来讲,这些法子都不怎么能工做。想要在串行端口上记录下标准日志,能够尝试使用SEGGER的实时终端。下面上正题,来谈谈如何将这种调试功能添加到现有的项目中。spa
一、将RTT文件添加到项目操作系统
在网上下载RTT文件调试
将RTT文件解压复制到工程目录下日志
在C/C++选项卡包含路径code
在项目的主要.c文件顶部包含 #include "SEGGER_RTT.h"blog
将RTT中的SEGGER_RTT.c文件加入工程教程
二、简单应用
如今能够经过RTT发送简单的字符串了:
SEGGER_RTT_WriteString(0,"hello!\r\n");
第一个参数是将字符串写入的通道(channel)。
不过咱们更常常使用的是另外一个函数:
SEGGER_RTT_printf(0,"hello:%d %s\r\n", a, s);
这个函数的功能更强大,使用就和printf同样。它在SEGGER_RTT_printf.c文件中。可是它在中断中使用过多经常会没法正常打印,或者直接不打印。
编译运行一下
三、打开实时终端
如今,代码能够将数据输出到RTT,咱们须要能看到它。方法有不少。最方便的一种是使用J-Link软件包附带的RTT查看器。(j-Link RTT Viewer)
打开J-Link RTT Viewer。以下。若是有多个设备链接,请检查序列号(Serial no),而后输入您想要链接的设备的序列号。
单击“肯定”。显示以下:
如今,下载你的程序到设备上,就能看到终端上显示“Hello!”。
注意,若是你打开终端,并不会影响串口打印。你可使用ble_app_uart 工程来建造的项目,在这个项目中向RTT发送文本以进行调试。
请记住,SEGGER_RTT_WriteString()比printf快的多,所以您能够安全地调用此函数,而不影响应用程序的实时性。
四、更高级的打印
来详细讲讲以前提到的SEGGER_RTT_printf()函数。为了可以使用它,稍微修改一下项目:
将文件SEGGER_RTT_printf.c加入到项目中
加入文件RTT_Syscalls_KEIL.c(文件在keil_v5\ARM\Pack\NordicSemiconductor\Syscalls)
去掉工程中的retarget文件(工程目录的nRF_Libraries文件夹下,以下)
在选项卡的 target选项中取消勾线Use MicroLIB
而后就可使用了,以下:在主程序中:
编译运行。
注意:如上例程,能够经过在第三个参数写入 RTT_CTRL_BG_BRIGHT_RED 来控制该输出语句的颜色。以下 Terminals 0 所示:char c = 0; for (;;) { c = SEGGER_RTT_WaitKey(); // will block until data is available if(c == 'r'){ SEGGER_RTT_printf(0, "%sResetting in %d second..%s\n", RTT_CTRL_BG_BRIGHT_RED, 1, RTT_CTRL_RESET); nrf_delay_ms(1000); sd_nvic_SystemReset(); } //power_manage(); }
注意:咱们经常使用的rintf()函数实际上是定向输出到RTT的。ble_app_uart 项目可以依然按照预期工做,由于它是使用 app_uart_put() 输出到串行端口。
使用printf的例子:
SEEGGER_RGG_printf(0, "variable value: %d\r\n", variable);
第一个参数指定输出的通道,第二个参数是要打印的字符串,variable变量的值插入%d.