前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >trace32 for rt-thread support

trace32 for rt-thread support

作者头像
bigmagic
发布2021-01-08 11:44:13
2.2K2
发布2021-01-08 11:44:13
举报
文章被收录于专栏:嵌入式iot

trace32 for rt-thread support

  • 1.概述
  • 2.trace32的基本使用
  • 3.trace32系统插件原理
  • 4.离线trace32得到rt-thread状态信息
    • 4.1 trace32上的rt-thread插件及菜单栏
    • 4.2 trace32 加载dump以及elf文件
  • 5.总结

1.概述

Lauterbach是全球最大的、完整的、模块化和可升级微处理器开发工具的生产商,自1979年以来,在制造世界一流的调试器和实时跟踪方面拥有丰富经验。其中产品线中的TRACE32为大众广为所知,是众多手机厂商、芯片厂商的必备工具。

在嵌入式底层开发来说,不使用一下trace32,绝对想不到开发调试的便利及其功能的强大。

有幸在对某个芯片的支持上学习使用了trace32工具,并写了一些trace32 for rt-thread的插件,现在梳理一下心得体会以及实现的相关细节。

2.trace32的基本使用

关于trace32的使用,Lauterbach已经提供了相当完善的文档支持,对于芯片的架构分析、软件的重入分析、数据的观测、操作系统的状态以及各种符号信息等等都非常容易的观察到。其调试功能的强大,非常的好用,但是由于其硬件设备的昂贵,能够长时间的使用trace32也是非常有难度的。

但是trace32也提供了相关的模拟版本,所以这里采用TRACE32 Simulator版本进行演示离线功能。

可以直接选择,也可输入命令

首先选择CPU的型号

可以直接选择下面的提示框,也可以直接输入sys.cpu进行选择,这里选择Cortex-A9

接着就可以输入system.up,启动了。

导入elf符号

可以看到符号文件对应的地址及其代码。直接通过elf符号就能得到程序的源代码。

此时只需要结合dump文件,结合elf符号,则可以定位到当前程序执行的状态。

从上述功能分析来看,主要是两部分构成:

1.菜单栏(menu bar)

2.显示信息窗口

无论是点击菜单栏还是在命令行输入命令,达到的效果其实一样。菜单栏只是一个简单的插件,系统可以调用命令。

3.trace32系统插件原理

trace32是一个工具,其提供了各种各样的芯片及操作系统插件,同时也可以根据这些插件来展示需要的信息。

在操作系统层面,RTOS这部分,国外的许多操作系统都得到了很好的支持,例如Linux、freertos或者ucosii等等,所以我在此基础上做了rt-thread的支持。

要想做其支持,首先需要得到Lauterbach的官方的支持,提供EDK,也需要对rt-thread系统底层有着非常深刻的理解,尤其对于系统的全局容器对象、线程、IPC的结构体数组的布局都十分的清楚后,就可以进行插件的扩展开发了。

其底层原理可以概述如下:

TRACE32在进行程序分析的时候,可以通过ELF获取到符号表信息,可以查询到系统的全局变量和函数地址信息的。当程序在动态运行的时候,根据符号表对应的地址读取数据,可以得到当前程序的状态信息。

而在rt-thread中,有个核心的全局静态变量,对象容器(rt_object_container)。记录着当前系统中所有的线程、IPC等链表的挂载点,而根据这个线索,又可以寻找到每个链表地址对应的结构体,根据符号信息从而找到对应的对象的状态结构体的数据。

而TRACE32插件基本的原理也就是利用了符号以及地址的对应关系,从而得到了系统的信息以及当前的状态。

4.离线trace32得到rt-thread状态信息

在离线分析这部分,dump方案根据具体的硬件变化而变化,所以这里不多叙述,只采用qemu来dump在程序动态运行时的数据信息。

为了简单起见,这里采用树莓派2b的rt-thread bsp来做演示。

raspi2在qemu上启动,须在启动之前的汇编加上一句话。

代码语言:javascript
复制
/* Suspend the other cpu cores */
mrc p15, 0, r0, c0, c0, 5
ands r0, #3
bne _halt

其中_halt的实现如下:

代码语言:javascript
复制
_halt:
 wfe
 b _halt

此处挂起其他的核。

而后在env工具下输入scons进行编译,并且输入下面的命令测试qemu的执行

代码语言:javascript
复制
qemu-system-arm -M raspi2 -m 1024M -serial null -serial stdio -kernel rtthread.elf

可以看到如下的效果:

接着进入调试阶段

代码语言:javascript
复制
qemu-system-arm -M raspi2 -m 1024M -serial null -serial stdio -kernel rtthread.elf -s -S

接着,另外开启一个env终端。

依次输入下面的命令,其中dump到的文件是

代码语言:javascript
复制
dump binary memory rtt_dump 0x8000 0x1000000

可以得到rtt_dump的dump的文件,大小为16MB。

4.1 trace32上的rt-thread插件及菜单栏

其中rtthread.t32为可以加载的t32文件,而rtthread.men为菜单文件。

代码语言:javascript
复制
task.config D:\work\rt-thread\bsp\raspberry-pi\raspi2\rtthread.t32
menu.reprogram D:\work\rt-thread\bsp\raspberry-pi\raspi2\rtthread.men

4.2 trace32 加载dump以及elf文件

可以通过如下的命令进行加载dump文件以及elf文件。

代码语言:javascript
复制
Data.LOAD.Binary D:\work\rt-thread\bsp\raspberry-pi\raspi2\rtt_dump 0x8000
Data.LOAD.Elf D:\work\rt-thread\bsp\raspberry-pi\raspi2\rtthread.elf

加载了符号文件与dump文件后,可以加载插件文件了。

此时,即可看到系统相关的信息了。

这样即使在离线的情况下,也能能够根据需要看到信息了。

5.总结

rt-thread在trace32上的扩展插件使用,可以非常方便的分析系统的状态。在实际的使用场合中,往往在测试阶段,不会用到在线的调试工具,此时当系统crash发生后,采用一些dump方案将内存dump出来,接着将dump文件与elf文件加载到trace32,并且利用一些系统级别的插件功能,即可完成系统的分析,非常的简洁和高效,文章中只描述了基础功能,一些复杂信息的分析需要根据需求进行挖掘。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2021-01-05,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 嵌入式IoT 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • trace32 for rt-thread support
    • 1.概述
      • 2.trace32的基本使用
        • 3.trace32系统插件原理
          • 4.离线trace32得到rt-thread状态信息
            • 4.1 trace32上的rt-thread插件及菜单栏
            • 4.2 trace32 加载dump以及elf文件
          • 5.总结
          相关产品与服务
          容器服务
          腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
          领券
          问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档