Toggle navigation
首页
问答
文章
积分商城
专家
专区
更多专区...
文档中心
返回主站
搜索
提问
会员
中心
登录
注册
RT-Thread一般讨论
关于openocd支持rt-thread
发布于 2018-04-04 11:54:00 浏览:2899
订阅该版
大家好,社区里面有人做过openocd支持rt-thread的工作吗? 比如直接使用gdb连接openocd,然后使用info threads可以看到rt-thread的所有线程状态,调试线程。 我目前正在做这方面的工作,遇到一些问题,如果社区里面有人做过相关的工作,希望能一起讨论下。
查看更多
10
个回答
默认排序
按发布时间排序
armink
2018-04-04
这家伙很懒,什么也没写!
现在 openocd 的用户群还是小些呢。 记得 FreeRTOS 有 openocd 的补丁,是不是可以借鉴下。
armink
2018-04-04
这家伙很懒,什么也没写!
[https://mcuoneclipse.com/2016/04/09/freertos-thread-debugging-with-eclipse-and-openocd/](https://mcuoneclipse.com/2016/04/09/freertos-thread-debugging-with-eclipse-and-openocd/) 这里看到一个帖子,如果真的搞好了,结合 IDE ,确实能提高调试效率。
bernard
2018-04-05
这家伙很懒,什么也没写!
有问题可以先发出来。openocd,君正那边在弄,不过暂时是MIPS底层相关的,还没涉及到rt-thread thread层面。
zikim
2018-04-10
这家伙很懒,什么也没写!
目前我完成了一些工作,在openocd上添加对rt-thread的支持,可以使用openocd得到rt-thread thread的一些信息。但是由于我对openocd和gdb的工作机制不了解,其还是存在很多问题,比如: 1)gdb一连接openocd就马上使用next、step等命令,则会导致gdb不断地向openocd发送vCont,S:0命令等,使得openocd处于一直与gdb的交互中,无法进行调试操作。 2)在openocd中的update_threads函数中,必须将当前线程的信息放在thread_details的链表头,否则无法正确显示当前线程 识别rt-thread成功的图片 ![](/home/图片/dect-rtos.png) 使用info thread显示线程信息的图片 ![](/home/图片/gdb.png) [https://github.com/zengdage/open-ocd-for-rt-thread](openocd支持rt-thread的代码) 需要将contrib/rtos-helpers文件夹下的rt-thread-openocd.c与rt-thread工程一起编译链接。 希望各路大神能够指出错误之处。
zikim
2018-04-10
这家伙很懒,什么也没写!
使用info threads显示rt-thread线程信息 ``` (gdb) info threads [New Thread 1] Id Target Id Frame 2 Thread 2 "" (Name: timer, State: Suspended, Priority: 8) rt_hw_context_switch (from=3255702948, to=3256519196) 3 Thread 3 "" (Name: mem_bw, State: Suspended, Priority: 4) rt_hw_context_switch (from=3256516892, to=3256519004) 4 Thread 4 "" (Name: mnt_task, State: Suspended, Priority: 7) rt_hw_context_switch (from=3256517084, to=3256516700) 5 Thread 5 "" (Name: ksrv_task, State: Suspended, Priority: 6) rt_hw_context_switch (from=3256517276, to=3256519196) 6 Thread 6 "" (Name: kb_input, State: Suspended, Priority: 3) rt_hw_context_switch (from=3256517468, to=3256516700) 7 Thread 7 "" (Name: mose_input, State: Suspended, Priority: 3) rt_hw_context_switch (from=3256517660, to=3256516700) 8 Thread 8 "" (Name: tp_input, State: Suspended, Priority: 3) rt_hw_context_switch (from=3256517852, to=3256516700) 9 Thread 9 "" (Name: mlstsk_001, State: Suspended, Priority: 1) rt_hw_context_switch (from=3256518044, to=3256518620) 10 Thread 10 "" (Name: pwm_task, State: Suspended, Priority: 5) rt_hw_context_switch (from=3256518236, to=3256519196) 11 Thread 11 "" (Name: mlstsk_003, State: Suspended, Priority: 1) rt_hw_context_switch (from=3256518620, to=3256518812) 12 Thread 12 "" (Name: mlstsk_004, State: Suspended, Priority: 1) rt_hw_context_switch (from=3256518812, to=3256519196) 13 Thread 13 "" (Name: mlstsk_005, State: Suspended, Priority: 14) rt_hw_context_switch (from=3256519004, to=3256520348) 14 Thread 14 "" (Name: mlstsk_006, State: Suspended, Priority: 14) rt_hw_context_switch (from=3256519196, to=3256519004) 15 Thread 15 "" (Name: mlstsk_007, State: Suspended, Priority: 14) rt_hw_context_switch (from=3256519388, to=3255699828) 16 Thread 16 "" (Name: mlstsk_008, State: Suspended, Priority: 1) rt_hw_context_switch (from=3256519580, to=3256518620) 17 Thread 17 "" (Name: mlstsk_009, State: Suspended, Priority: 14) rt_hw_context_switch (from=3256520156, to=3256519004) 18 Thread 18 "" (Name: mlstsk_010, State: Suspended, Priority: 14) rt_hw_context_switch (from=3256520348, to=3255699828) * 19 Thread 1 "" (Name: tidle, State: Ready, Priority: 254) rt_thread_idle_entry (parameter=0x0) (gdb) ```
zikim
2018-04-10
这家伙很懒,什么也没写!
>https://mcuoneclipse.com/2016/04/09/freertos-thread-debugging-with-eclipse-and-openocd/ > >这里看到一 ... --- 我模仿ucos-ii和ThreadX,也简易地实现了rt-thread thread层面的功能,但可能存在一些问题,我暂时还没想明白。
zikim
2018-04-10
这家伙很懒,什么也没写!
>有问题可以先发出来。openocd,君正那边在弄,不过暂时是MIPS底层相关的,还没涉及到rt-thread thread层面 ... --- 我自己尝试实现rt-thread thread层面的接口,能用,但是不稳定。
armink
2018-04-10
这家伙很懒,什么也没写!
>我模仿ucos-ii和ThreadX,也简易地实现了rt-thread thread层面的功能,但可能存在一些问题,我暂时还没想 ... --- 厉害,我看 6 楼都已经能够看到线程信息了呢
wangxinyuan
2020-06-09
这家伙很懒,什么也没写!
[i=s] 本帖最后由 wangxinyuan 于 2020-6-9 14:08 编辑 [/i] zikim,看到你实现的是arm926的openocd rtthread实现,我在你的基础上加了cortexm的实现,但是目前有点问题。 1.rtthread结构体的变量offset,我看你在contrib的文件夹里面定义了一个存放const变量的文件,我已经编译进rt-thread的源码了,但是openocd获取symbol的时候很奇怪,const变量在gdb加载后是个随机值,因此我直接在openocd里面把offset写死了。这个算是勉强解决, 2.cortexm的栈看不全,还没找到问题所在,考虑到stm32系列的cpu在rt-thread上用的比较多,想实现这一块,希望可以讨论。 线程显示,应该有4个线程但是只显示3个,后2个还不对: ``` (gdb) i threads warning: while parsing threads: not well-formed (invalid token) Id Target Id Frame * 1 Thread 1 (Name: tidle, State: Ready, Priority: 31) 0x080090c6 in rt_thread_idle_entry (parameter=0x0) at /home/ezaxnnw/dev/prj/rt-thread/src/idle.c:232 2 Thread 2 (Name: main, State: Suspended, Priority: 10) 0x00000000 in ?? () 3 Thread 3 0x00000000 in ?? () ``` 我的patch ``` diff --git a/src/rtos/rt-thread.c b/src/rtos/rt-thread.c index a940e58..a924f0b 100644 --- a/src/rtos/rt-thread.c +++ b/src/rtos/rt-thread.c @@ -33,6 +33,7 @@ #endif #define MY_RT_THREAD 1 +#define SELF_DEFINE_OFFSET 1 struct rt_thread_params_thread { @@ -60,6 +61,35 @@ struct rt_thread_params { rt_thread_params_thread_t threads; }; +static const struct stack_register_offset rtos_rt_thread_cortexm_stack_offsets[] = { + { -1, 32 }, /* r0 */ + { -1, 32 }, /* r1 */ + { -1, 32 }, /* r2 */ + { -1, 32 }, /* r3 */ + { 0x04, 32 }, /* r4 */ + { 0x08, 32 }, /* r5 */ + { 0x0c, 32 }, /* r6 */ + { 0x10, 32 }, /* r7 */ + { 0x14, 32 }, /* r8 */ + { 0x18, 32 }, /* r9 */ + { 0x1c, 32 }, /* r10 */ + { 0x20, 32 }, /* r11 */ + { -1, 32 }, /* r12 */ + { -1, 32 }, /* sp */ + { -1, 32 }, /* lr */ + { -1, 32 }, /* pc */ + { -1, 32 }, /* xPSR */ + +}; + +const struct rtos_register_stacking rtos_rt_thread_cortexm_stacking = { + 0x40, + -1, /* stack_growth_direction */ + ARRAY_SIZE(rtos_rt_thread_cortexm_stack_offsets), /* num_output_registers */ + rtos_generic_stack_align8, /* stack_alignment */ + rtos_rt_thread_cortexm_stack_offsets /* register_offsets */ +}; + static const struct stack_register_offset rtos_rt_thread_arm926_stack_offsets[] = { #if MY_RT_THREAD //for my rt-thread code, the first value in stack is fcse { 0x08, 32 }, /* r0 */ @@ -131,6 +161,23 @@ static const struct rt_thread_params rt_thread_params_list[] = { 0, /* num_threads */ NULL }, + { + "cortex_m", /* target_name */ + sizeof(uint32_t), /* pointer_width */ + 0, /* thread_stack_offset */ + 0, /* thread_name_offset */ + 0, /* thread_state_offset */ + 0, /* thread_priority_offset */ + 0, /* thread_prev_offset */ + 0, /* thread_next_offset */ + 0, /* rt_object_prev_offset */ + 0, /* rt_objcet_next_offset */ + false, /* thread_offsets_updated */ + 1, /* threadid_start */ + &rtos_rt_thread_cortexm_stacking, /* stacking_info */ + 0, /* num_threads */ + NULL + }, }; static const char * const rt_thread_symbol_list[] = { @@ -319,6 +366,7 @@ static int rt_thread_update_thread_offsets(struct rtos *rtos) if (params->thread_offsets_updated) return ERROR_OK; +#ifndef SELF_DEFINE_OFFSET const struct thread_offset_map { enum rt_thread_symbol_values symbol_value; @@ -371,13 +419,25 @@ static int rt_thread_update_thread_offsets(struct rtos *rtos) return retval; } } - +#else + + params->thread_stack_offset=28; + params->thread_name_offset=0; + params->thread_state_offset=52; + params->thread_priority_offset=53; + params->thread_prev_offset=16; + params->thread_next_offset=12; + params->rt_object_next_offset=4; + params->rt_object_prev_offset=8; +#endif params->thread_offsets_updated = true; return ERROR_OK; } ``` 如果大家有兴趣开发这个工具可以加个群交流。我的微信:414856897
wangxinyuan
2020-06-09
这家伙很懒,什么也没写!
>使用info threads显示rt-thread线程信息 --- 我在你的代码基础上想实现cortexm,但是目前有点问题。
撰写答案
登录
注册新账号
关注者
0
被浏览
2.9k
关于作者
zikim
这家伙很懒,什么也没写!
提问
2
回答
5
被采纳
0
关注TA
发私信
相关问题
1
有关动态模块加载的一篇论文
2
最近的调程序总结
3
晕掉了,这么久都不见layer2的踪影啊
4
继续K9ii的历程
5
[GUI相关] FreeType 2
6
[GUI相关]嵌入式系统中文输入法的设计
7
20081101 RT-Thread开发者聚会总结
8
嵌入式系统基础
9
linux2.4.19在at91rm9200 上的寄存器设置
10
[转]基于嵌入式Linux的通用触摸屏校准程序
推荐文章
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
10
个答案
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
次点赞
回到
顶部
发布
问题
分享
好友
手机
浏览
扫码手机浏览
投诉
建议
回到
底部