Toggle navigation
首页
问答
文章
积分商城
专家
专区
更多专区...
文档中心
返回主站
搜索
提问
会员
中心
登录
注册
UART
在rtt-console和shell中使用JLINK RTT来代替串口调试设备
发布于 2018-05-21 14:27:39 浏览:13360
订阅该版
[ 本帖最后由 FlyLu 于 2018-6-27 15:39 编辑 ]
* 本帖最后由 FlyLu 于 2018-5-21 14:27 编辑 * rtt-shell是一个非常好用的组件,但通常会以串口作为shell的设备 如果硬件设备串口有限,可以通过使用JLINK RTT功能,也可以做到mcu与pc的交互。并且可以作为console和shell的设备 关于更多JLINK RTT [https://www.segger.com/products/debug-probes/j-link/technology/about-real-time-transfer/](https://www.segger.com/products/debug-probes/j-link/technology/about-real-time-transfer/) ```/*============================ INCLUDES ======================================*/ #include
#include "SEGGER_RTT.h" /*============================ MACROS ========================================*/ #define SEGGER_RTT_THREAD_STACKSIZE 512 #define SEGGER_RTT_THREAD_PRIOR 19 #define SERRER_RTT_THREAD_DELAY 30 /*============================ MACROFIED FUNCTIONS ===========================*/ /*============================ TYPES =========================================*/ struct segger_rtt_device { struct rt_device parent; }; /*============================ GLOBAL VARIABLES ==============================*/ /*============================ LOCAL VARIABLES ===============================*/ static struct segger_rtt_device sSeggerRtt; /*============================ PROTOTYPES ====================================*/ /*============================ IMPLEMENTATION ================================*/ static rt_size_t rt_segger_rtt_read(struct rt_device *dev, rt_off_t pos, void *buffer, rt_size_t size) { return SEGGER_RTT_Read(0, buffer, size); } static rt_size_t rt_segger_rtt_write(struct rt_device *dev, rt_off_t pos, const void *buffer, rt_size_t size) { return SEGGER_RTT_Write(0, buffer, size); } static rt_err_t rt_segger_rtt_open(struct rt_device *dev, rt_uint16_t oflag) { return RT_EOK; } static rt_err_t rt_segger_rtt_close(struct rt_device *dev) { return RT_EOK; } static rt_err_t rt_segger_rtt_init(struct rt_device *dev) { return RT_EOK; } static rt_err_t rt_segger_rtt_control(struct rt_device *dev, rt_uint8_t cmd, void *args) { return RT_EOK; } rt_err_t rt_hw_segger_rtt_register(struct segger_rtt_device *segger_rtt, const char *name, rt_uint32_t flag, void *data) { struct rt_device *device; RT_ASSERT(segger_rtt != RT_NULL); device = &(segger_rtt->parent); device->type = RT_Device_Class_Char; device->rx_indicate = RT_NULL; device->tx_complete = RT_NULL; device->init = rt_segger_rtt_init; device->open = rt_segger_rtt_open; device->close = rt_segger_rtt_close; device->read = rt_segger_rtt_read; device->write = rt_segger_rtt_write; device->control = rt_segger_rtt_control; device->user_data = data; /* register a character device */ return rt_device_register(device, name, flag); } static void segger_rtt_client_thread_entry (void *parameter) { struct segger_rtt_device *segger_rtt; uint32_t count; rt_kprintf("Hello SEGGER Real-Time-Terminal
"); segger_rtt = (struct segger_rtt_device *)rt_device_find("rtdebug"); RT_ASSERT(segger_rtt != RT_NULL); for (;;) { if ((count = SEGGER_RTT_HasData(0)) != 0) { if (segger_rtt->parent.rx_indicate != RT_NULL) { segger_rtt->parent.rx_indicate(&segger_rtt->parent, count); } } rt_thread_delay(rt_tick_from_millisecond(SERRER_RTT_THREAD_DELAY)); } } void segger_rtt_device_init(void) { rt_hw_segger_rtt_register(&sSeggerRtt, "rtdebug", 0, NULL); } ALIGN(RT_ALIGN_SIZE) static rt_uint8_t segger_rtt_stack[SEGGER_RTT_THREAD_STACKSIZE]; static struct rt_thread segger_rtt_thread; void segger_rtt_client_thread_init(void) { int result; result = rt_thread_init(&segger_rtt_thread, "rtdebug", segger_rtt_client_thread_entry, RT_NULL, (rt_uint8_t *)segger_rtt_stack, sizeof(segger_rtt_stack), SEGGER_RTT_THREAD_PRIOR, 20); if (RT_EOK == result) rt_thread_startup(&segger_rtt_thread); } ``` 1. 好像该JLINK RTT没有中断,而是通过访问一块共享内存,所以建立一个查询线程,定时去检测是否有数据更新。如果存在则通知给shell 2. JLINK RTT配合j-link RTT Viewer支持多个通道打印,可以将信息输出到不同的窗口,这里只简单使用默认的通道0作为输入输出,作为rtt-console和rt-shell功能 3. rtt设备结构保留,有需求在进一步扩展,小伙伴们也可以自行修改 使用方法: 1. 下载附件,放到到你的BSP目录,并且在rtconfig.h 添加 #define RT_USING_SEGGER_RTT 2. 在rtconfig.h修改RT_CONSOLE_DEVICE_NAME的名字为 "rtdebug"(console 功能) 3. 将segger_rtt_device_init()函数放到rt_hw_board_init()中,并且需要在rt_console_set_device()前面 ```void rt_hw_board_init(void) { /* NVIC Configuration */ NVIC_Configuration(); /* Configure the SysTick */ SysTick_Config( SystemCoreClock / RT_TICK_PER_SECOND ); #if STM32_EXT_SRAM EXT_SRAM_Configuration(); #endif extern void segger_rtt_device_init(void); segger_rtt_device_init(); rt_hw_usart_init(); rt_console_set_device(RT_CONSOLE_DEVICE_NAME); #ifdef RT_USING_COMPONENTS_INIT rt_components_board_init(); #endif }``` 4. 在rt_init_thread_entry线程中添加segger_rtt_client_thread_init(); ```void rt_init_thread_entry(void* parameter) { #ifdef RT_USING_COMPONENTS_INIT /* initialization RT-Thread Components */ rt_components_init(); #endif extern void segger_rtt_client_thread_init(void); segger_rtt_client_thread_init(); }``` 使用效果: 唯一不好的一点就是,这个j-link RTT Viewer(如果没找到,更新高版本的jlink驱动)输入没有向putty那样方便,并且那个table键打不出来。 ![6YP`[MO$9TA{L)Q53SM{C35.png](https://oss-club.rt-thread.org/uploads/201805/21/132258wjh9u9n3is2wuw24.png) ![H]QUJOVSMU_[6XR3O4ETQOG.png](https://oss-club.rt-thread.org/uploads/201805/21/133832sz2lvw1seg0xwphv.png) 下载附件 [SEGGER_RTT.rar](https://oss-club.rt-thread.org/uploads/201805/21/140424tr4p133bttzr3bta.rar)
查看更多
25
个回答
默认排序
按发布时间排序
xckhmf
2018-05-22
这家伙很懒,什么也没写!
早就有此想法 ,Nordic上只有一个串口 很痛苦
armink
2018-05-22
这家伙很懒,什么也没写!
很不错哦~~ 整理下,可以做成 RT-Thread 的软件包,这样可以方便的让更多的人都能用起来你的 SEGGER_RTT
来一颗糖
2018-05-23
这家伙很懒,什么也没写!
收藏 ヾ(≧▽≦*)o
ou513
2018-06-21
这家伙很懒,什么也没写!
这个不错,调试方便多了,
wlof
2018-06-23
这个家伙不懒,什么也没写
强大,学习啦,以后再也不怕别人用俺的shell啦
风来吴山
2018-06-27
这家伙很懒,什么也没写!
顶
tanek
2018-07-23
这家伙很懒,什么也没写!
我把这个功能加入到systemview里面了,可以和systemview一起使用。 [https://github.com/RT-Thread/segger_debug/blob/master/SystemView_Src/Config/SEGGER_RTT_Device.c](https://github.com/RT-Thread/segger_debug/blob/master/SystemView_Src/Config/SEGGER_RTT_Device.c)
FlyLu
2018-07-23
这家伙很懒,什么也没写!
>我把这个功能加入到systemview里面了,可以和systemview一起使用。 >https://github.com/RT-Thread/segger_d ... --- tanek大神辛苦了!:lol
armink
2018-07-23
这家伙很懒,什么也没写!
>tanek大神辛苦了! --- tanek 大神新搞的这个不用单独开辟线程,更加简单方便,可以试试哈
风来吴山
2018-08-17
这家伙很懒,什么也没写!
一直试了一下,如果把3和4新增的函数放在rt_hw_board_init和rt_init_thread_entry靠下的地方,会有declaration may not appear after executable statement in block的报错,移到靠上的地方就没有报错了,有一个警告,SEGGER_RTT\SEGGER_RTT_CLIENT.c(92): warning: #513-D: a value of type "rt_err_t (*)(struct rt_device *, rt_uint8_t, void *)" cannot be assigned to an entity of type "rt_err_t (*)(rt_device_t, int, void *)"。 下载之后,打开jlink rtt view,shell输出了hard fault on handler、 bus fault: SCB_CFSR_BFSR:0x82 PRECISERR SCB->BFAR:FFFFFFEC
撰写答案
登录
注册新账号
关注者
0
被浏览
13.4k
关于作者
FlyLu
这家伙很懒,什么也没写!
提问
8
回答
1
被采纳
0
关注TA
发私信
相关问题
1
rt thread 2.0.2 usart 接收缓存问题
2
关于STM32串口通信的问题
3
STM32F1+RTT串口接收终端数据丢失问题
4
UART TX丢数据?
5
RTT打开串口的时候如何自定义波特率呢?
6
STM32F4的USART数据接收问题
7
串口1234使用问题
8
串口接收回调函数
9
LPC18xx UART问题讨论
10
x1000串口配置的失败问题
推荐文章
1
RT-Thread应用项目汇总
2
玩转RT-Thread系列教程
3
国产MCU移植系列教程汇总,欢迎查看!
4
机器人操作系统 (ROS2) 和 RT-Thread 通信
5
五分钟玩转RT-Thread新社区
6
【技术三千问】之《玩转ART-Pi》,看这篇就够了!干货汇总
7
关于STM32H7开发板上使用SDIO接口驱动SD卡挂载文件系统的问题总结
8
STM32的“GPU”——DMA2D实例详解
9
RT-Thread隐藏的宝藏之completion
10
【ART-PI】RT-Thread 开启RTC 与 Alarm组件
最新文章
1
CherryUSB的bootuf2配置
2
在用clangd开发RTT吗,快来试试如何简单获得清晰干净的工作区
3
GD32F450 片内 flash驱动适配
4
STM32H7R7运行CherryUSB
5
RT-Smart首次线下培训,锁定2024 RT-Thread开发者大会!
热门标签
RT-Thread Studio
串口
Env
LWIP
SPI
AT
Bootloader
Hardfault
CAN总线
FinSH
ART-Pi
USB
DMA
文件系统
RT-Thread
SCons
RT-Thread Nano
线程
MQTT
STM32
RTC
FAL
rt-smart
ESP8266
I2C_IIC
UART
WIZnet_W5500
ota在线升级
PWM
freemodbus
flash
cubemx
packages_软件包
BSP
潘多拉开发板_Pandora
定时器
ADC
flashDB
GD32
socket
中断
编译报错
Debug
SFUD
rt_mq_消息队列_msg_queue
msh
keil_MDK
ulog
C++_cpp
MicroPython
本月问答贡献
a1012112796
12
个答案
1
次被采纳
踩姑娘的小蘑菇
4
个答案
1
次被采纳
红枫
4
个答案
1
次被采纳
张世争
4
个答案
1
次被采纳
Ryan_CW
4
个答案
1
次被采纳
本月文章贡献
catcatbing
3
篇文章
6
次点赞
YZRD
2
篇文章
5
次点赞
lizimu
2
篇文章
5
次点赞
qq1078249029
2
篇文章
2
次点赞
xnosky
2
篇文章
1
次点赞
回到
顶部
发布
问题
分享
好友
手机
浏览
扫码手机浏览
投诉
建议
回到
底部