RT-Thread正式启动硬件产品生态共建计划"你有创意,我帮你推广",我们寻找那些藏在工作台、实验室和创客空间的嵌入式硬件创意——无论是一块开发板、一个智能工具,还是一套完整的解决方案。我们诚挚邀请社区开发者、创客和硬件公司,将您的创意原型带到RT-Thread生态,也欢迎已有成熟产品直接入驻!!欢迎加入我们的硬件生态计划,可发送作品(建议包含:产品介绍、演示视频/图片、技术亮点、您的介绍)邮件至 hardware@rt-thread.com。
今天给大家介绍一下MicroKeen(MKLink)的使用方法,以下来自MKLink创作者的作品内容,欢迎支持!
在嵌入式开发中,我们总是离不开“串口打印”来调试。
但传统串口调试存在很多明显的痛点:
SEGGER RTT + MKLink完美结合了双方的优势:
让调试既拥有 RTT 的性能,又能使用任意串口助手,真正做到“即插即用,自由畅快”!
RTT,全称Real Time Transfer(实时传输),是一种无需中断 MCU 程序执行,就能实现数据与主机交互的调试技术。
它使用一种内存共享机制,将 MCU 内部的数据实时“搬运”到 PC 上。
形象理解:
就像你在 MCU 的 RAM 里放了个“邮箱”,PC 随时来收信,MCU 照常干活,互不打扰。
在 MCU RAM 中,有一个非常重要的结构体:
_SEGGER_RTT 控制块
它的作用是:
收发数据过程:
由于只是内存拷贝,整个收发过程极快,微秒级完成,不会打断 MCU 正常工作。

只需简单三步:
步骤一:集成 RTT 源码
从 SEGGER J-Link 安装目录 Samples/RTT 复制以下文件到工程中,并添加头文件路径。
如我电脑上的路径:
C:\Program Files (x86)\SEGGER\JLink_V632f\Samples\RTT

步骤二:输出日志到 RTT
#include "SEGGER_RTT.h"
int main(void)
{
SEGGER_RTT_Init();
SEGGER_RTT_printf(0, "hello RTT\n");
while(1){
}
}
步骤三:连接调试工具
MKLink突破传统,打通了 RTT 和通用串口调试工具之间的隔阂,直接把 RTT 数据转发到 USB CDC 虚拟串口,让 MCU 仿佛接了一个超级快的“软串口”!
MCU端:
MKLink端:
PC端:
MKLink 数据流示意图:

效果总结:
步骤一:找到MKLink 的 USB CDC 虚拟串口
使用USB TypeC数据线与MKLink连接以后,电脑设备端会弹出三个设备:

V2和V3会弹出两个USB串行设备端口号,分别是USB转串口和虚拟串口
V4会弹出三个USB串行设备端口号,分别是USB转串口、USB转485端口和虚拟串口
打开虚拟串口后,下载器会自动打印如下信息:

V4版本可以通过屏幕界面,来高速你打开的是什么端口,分别打开三个串口号,效果如下:
步骤二:使用串口助手类工具访问 MKLink 的 USB CDC 虚拟串口
比如使用SSCOM,连接MicroLink的串口,输入以下指令:
RTTView.start(0x20000000,1024,0)

_SEGGER_RTT 控制块地址可以通过查看MDK编译生成的.map文件来查找,如下:

可知,_SEGGER_RTT在地址0x20000040处,可以通过设置搜寻的地址和大小来重新启动MicroLink的RTT功能。
步骤一:打开SEGGER_RTT.c,添加红框中的代码,宏SEGGER_RTT_OPS_ADDR可以将_SEGGER_RTT的地址固定在0x20000000

代码如下,方便直接复制:
#define SEGGER_RTT_OPS_ADDR 0X20000200
#define __ARM_AT(x) ".ARM.__at_"#x
#define ARM_AT(x) __ARM_AT(x)
#if defined(__CC_ARM) // ARM Compiler 5 (AC5)
#define SEGGER_RTT_SECTION __attribute__((at(BOOT_FLASH_OPS_ADDR)))
#elif defined(__ARMCC_VERSION) && (__ARMCC_VERSION >= 6000000) // ARM Compiler 6 (AC6)
#define SEGGER_RTT_SECTION __attribute__((section(ARM_AT(SEGGER_RTT_OPS_ADDR))))
#elif defined(__GNUC__) // GCC
#define SEGGER_RTT_SECTION __attribute__((section(".segger_rtt_ops"), used, aligned(4)))
#else
#define SEGGER_RTT_SECTION
#endif
SEGGER_RTT_SECTION
SEGGER_RTT_PUT_CB_SECTION(SEGGER_RTT_CB_ALIGN(SEGGER_RTT_CB _SEGGER_RTT));
步骤一:打开U盘中python文件夹下的default_config.py,添加红框中的代码,下载器上电会自动执行default_config.py脚本。

步骤一:RTE配置
1.打开 RTE 配置窗口(菜单:Project -> Manage -> Run-Time Environment)。

2.勾选以下选项:
如果你在RTE中找不到 CMSIS-Compiler ,说明你的MDK版本较低——如果不想升级MDK,则可以通过下面的链接从官方直接下载对应的cmsis-pack:
https://www.keil.arm.com/packs/cmsis-compiler-arm/
或者老版本的cmsis-pack中,找到Compiler:

步骤二:添加stdout_putchar()
在代码中实现 stdout_putchar() 函数——用它来把printf重定向到RTT通道:
int stdout_putchar(int ch)
{
SEGGER_RTT_PutChar(0, ch);
return ch;
}
方法一:安装SEGGER_RTT软件包
SEGGER_RTT软件包是将 RT-Thread 的msh重定向到SEGGER RTT

方法二:安装agile_console软件包
agile_console软件包可以将 RT-Thread 的msh重定向到多个端口,比如可以不影响原先uart打印的基础上,再增加一路RTT端口,比较适合两种方式需要同时使用的场景。
步骤一:安装软件包

步骤二:单片机添加SEGGER_RTT 源码
从 SEGGER J-Link 安装目录 Samples/RTT 复制以下文件到工程中,并添加头文件路径。
如我电脑上的路径:
C:\Program Files (x86)\SEGGER\JLink_V632f\Samples\RTT

步骤三:单片机添加agile软件包的适配代码
添加一个agile_console_rtt_be.c文件,代码如下:
#include
#include
#include "SEGGER_RTT.h"
staticstruct agile_console_backend _console_backend = {0};
static void rtt_backend_output(rt_device_t dev, const uint8_t *buf, int len)
{
SEGGER_RTT_Write(0,buf,len);
}
static int rtt_backend_read(rt_device_t dev, uint8_t *buf, int len)
{
return SEGGER_RTT_Read(0,buf, len);
}
static void segger_rtt_check(void)
{
while (SEGGER_RTT_HasKey())
{
agile_console_wakeup();
}
}
static int agile_console_rtt_init(void)
{
SEGGER_RTT_Init();
rt_thread_idle_sethook(segger_rtt_check);
_console_backend.output = rtt_backend_output;
_console_backend.read = rtt_backend_read;
agile_console_backend_register(&_console_backend);
return0;
}
INIT_BOARD_EXPORT(agile_console_rtt_init);


全部0条评论
快来发表一下你的评论吧 !