单片机list文件解析

单片机list文件解析.
单片机开发中 lst 文件 在调试中有很高的参考价值, 从list文件总基本可用看出所有的目标文件信息. 看出我们汇编文件在内存中的分布及执行过程. 进而发现一些隐藏的BUG.
st 文件实际是使用 objdump 反汇编 elf 文件得到的输出文件,它拥有比 map 文件更详细的信息。如果你的程序中加入了调试信息,那么你可以在 lst 中看到每一条指令的地址。借助 lst 文件,同时通过查看栈帧结构(可以通过查看相应的手册来确定栈帧的组成),通过在 lst 文件中查找 lr 的地址所在的位置,你就能立刻定位到问题。
以CH582 的工程配置为例, 项目->属性->C/C++构建->设置->工具设置->GNU RISC-V Create Flash Image->General,你可以在这个选项中指定更详细的信息。

文件总含有丰富的信息. listing file中出现的先后顺序加以说明:

1.页头段(Page Header)

 每个lst文件都有一个包含了编译器版本号、源文件名称、日期、时间、页号的头部。示例:
 EC_BLE_SOC.elf:     file format elf32-littleriscvarchitecture: riscv:rv32, flags 0x00000112:EXEC_P, HAS_SYMS, D_PAGEDstart address 0x00000000

还包含内部所有代码块的, 头地址.

Program Header:LOAD off    0x00001000 vaddr 0x00000000 paddr 0x00000000 align 2**12filesz 0x00000004 memsz 0x00000004 flags r-xLOAD off    0x00002000 vaddr 0x20000000 paddr 0x00000004 align 2**12filesz 0x0000287c memsz 0x0000287c flags r-xLOAD off    0x00004880 vaddr 0x00002880 paddr 0x00002880 align 2**12filesz 0x000291bc memsz 0x000291bc flags r-xLOAD off    0x0002e87c vaddr 0x2000287c paddr 0x0002ba3c align 2**12filesz 0x000005ac memsz 0x00002f20 flags rw-

符号列表段(Sections table)

 符号表段含有,所有符号的入口地址及大小,符号列表段包含了源程序文件中定义的变量信息,比如变量名称、类别(SFR、structure、typedef、static、public、auto、extern)、存储空间、数据类型、偏移量、占用 字节数等。SYMBOLS 指令控制LST文件产生符号列表段。所有变量及函数的入口都在这里

示例1.段类型

Sections:
Idx Name            Size      VMA       LMA       File off  Algn  Flags0 .init           00000004  00000000  00000000  00001000  2**1  CONTENTS, ALLOC, LOAD, READONLY, CODE1 .highcodelalign 00000000  00000004  00000004  0002ee28  2**0  CONTENTS2 .highcode       0000287c  20000000  00000004  00002000  2**1  CONTENTS, ALLOC, LOAD, READONLY, CODE3 .text           000291bc  00002880  00002880  00004880  2**2  CONTENTS, ALLOC, LOAD, READONLY, CODE4 .fini           00000000  0002ba3c  0002ba3c  0002ee28  2**0  CONTENTS, ALLOC, LOAD, CODE5 .dalign         00000000  2000287c  2000287c  0002ee28  2**0  CONTENTS6 .dlalign        00000000  0002ba3c  0002ba3c  0002ee28  2**0  CONTENTS7 .data           000005ac  2000287c  0002ba3c  0002e87c  2**2  CONTENTS, ALLOC, LOAD, DATA8 .bss            00002974  20002e28  0002bfe8  0002ee28  2**3  ALLOC9 .stack          00000000  20008000  20008000  0002ee28  2**0  CONTENTS10 .debug_info     000399df  00000000  00000000  0002ee28  2**0  CONTENTS, READONLY, DEBUGGING11 .debug_abbrev   00006f9c  00000000  00000000  00068807  2**0  CONTENTS, READONLY, DEBUGGING12 .debug_loc      0000a5a1  00000000  00000000  0006f7a3  2**0  CONTENTS, READONLY, DEBUGGING13 .debug_aranges  00000b40  00000000  00000000  00079d48  2**3  CONTENTS, READONLY, DEBUGGING14 .debug_ranges   00001f40  00000000  00000000  0007a888  2**3  CONTENTS, READONLY, DEBUGGING15 .debug_line     0001c557  00000000  00000000  0007c7c8  2**0  CONTENTS, READONLY, DEBUGGING16 .debug_str      00006518  00000000  00000000  00098d1f  2**0  CONTENTS, READONLY, DEBUGGING17 .comment        00000033  00000000  00000000  0009f237  2**0  CONTENTS, READONLY18 .debug_frame    00002b40  00000000  00000000  0009f26c  2**2  CONTENTS, READONLY, DEBUGGING19 .stab           00000084  00000000  00000000  000a1dac  2**2  CONTENTS, READONLY, DEBUGGING20 .stabstr        00000117  00000000  00000000  000a1e30  2**0  CONTENTS, READONLY, DEBUGGING

示例2.程序及变量符号表

SYMBOL TABLE:
00000000 l    d  .init  00000000 .init
00000004 l    d  .highcodelalign    00000000 .highcodelalign
20000000 l    d  .highcode  00000000 .highcode
00002880 l    d  .text  00000000 .text
0002ba3c l    d  .fini  00000000 .fini
2000287c l    d  .dalign    00000000 .dalign
0002ba3c l    d  .dlalign   00000000 .dlalign
2000287c l    d  .data  00000000 .data
20002e28 l    d  .bss   00000000 .bss
20008000 l    d  .stack 00000000 .stack
00000000 l    df *ABS*  00000000 core_riscv.c
00000000 l    df *ABS*  00000000 CH58x_adc.c
00000000 l    df *ABS*  00000000 CH58x_clk.c
00000000 l    df *ABS*  00000000 CH58x_gpio.c
00000000 l    df *ABS*  00000000 CH58x_uart0.c
00000000 l    df *ABS*  00000000 CH58x_uart1.c
00000000 l    df *ABS*  00000000 CH58x_uart2.c
00000000 l    df *ABS*  00000000 CH58x_uart3.c
00000000 l    df *ABS*  00000000 Command.c
20002db8 l     O .data  00000004 erase_seq
20002dbc l     O .data  00000004 p.6140
00000000 l    df *ABS*  00000000 bsp_Initial.c
00000000 l    df *ABS*  00000000 bsp_adc.c
00000000 l    df *ABS*  00000000 bsp_ctrl.c
20002dc0 l     O .data  00000004 s.6140
00000000 l    df *ABS*  00000000 bsp_key.c
20002e40 l     O .bss   00000006 keyc
20002e48 l     O .bss   00000006 keys
00000000 l    df *ABS*  00000000 bsp_led.c
00000000 l    df *ABS*  00000000 bsp_storer.c
20002de3 l     O .data  00000001 buz_count
20002de4 l     O .data  00000001 led_count
00000000 l    df *ABS*  00000000 message.c
00000000 l    df *ABS*  00000000 gap.c
0000aae2 l     F .text  00000022 disconnectNext
20002ea4 l     O .bss   00000006 gapCurrentRandomAddr
20002eb4 l     O .bss   00000004 pfnCentralCBs
20002eb8 l     O .bss   00000004 pfnCentralConnCBs
20002ebc l     O .bss   00000004 pfnPeripheralCBs
20002ec0 l     O .bss   00000004 pfnPeripheralConnCBs
20002ec4 l     O .bss   00000008 slaveUpdateReq
20002ecc l     O .bss   00000001 terminateAllTaskID
20002ecd l     O .bss   00000001 terminateReason
00000000 l    df *ABS*  00000000 gap_central.c
0000c458 l     F .text  0000003a gapSendScanEnable

源码段(Source Code)及汇编代码段(Assembly Listing)

源码段展示了每行源程序及其行号。COND指令,可以控制条件编译代码(#if 作用范围内的代码)被源码段列出,NOCOND指令,可以控制条件编译代码不被源码段列出。用户可以使用 LISTINCLUDE 指令,让源码段显示 #include 所包含的文件内容,默认情况下,#include包含的文件内容不被显示。汇编代码段包含了由C语言程序编译产生的汇编代码,CODE 指令可以控制LST文件产生汇编代码段。

两者信息交错在一起, 可以对照看一下源码及编译好的目标汇编代码. 可以看出编译的情况.

源码及汇编代码段示例:启动代码

Disassembly of section .init:00000000 <_sinit>:.section    .init,"ax",@progbits.global  _start.align    1
_start:j    handle_reset0:  0810206f            j   2880 <handle_reset>Disassembly of section .highcode:20000000 <_highcode_vma_start>:...
20000008:   0090                    addi    a2,sp,64
2000000a:   2000                    fld fs0,0(s0)
2000000c:   0938                    addi    a4,sp,152
2000000e:   2000                    fld fs0,0(s0)
20000010:   bda9                    j   1ffffe6a <_data_lma+0x1ffd442e>
20000012:   f5f9                    bnez    a1,1fffffe0 <_data_lma+0x1ffd45a4>
20000014:   0094                    addi    a3,sp,64
20000016:   2000                    fld fs0,0(s0)
....

主程序编译结果示例:

00006048 <main_task_init>:
//名称:       sys_init
//功能:       系统主程序初始化
//参数:       无
//返回值:  无
void main_task_init(void)
{6048:  1141                    addi    sp,sp,-16SetSysClock( CLK_SOURCE_PLL_60MHz );604a:  04800513            li  a0,72
{604e:  c606                    sw  ra,12(sp)SetSysClock( CLK_SOURCE_PLL_60MHz );6050:  1fffa097            auipc   ra,0x1fffa6054: 490080e7            jalr    1168(ra) # 200004e0 <SetSysClock>motor_io_Init();6058:    9e3fe0ef            jal ra,4a3a <motor_io_Init>DelayMs(100);605c: 06400513            li  a0,1006060: 1fffa097            auipc   ra,0x1fffa6064: 638080e7            jalr    1592(ra) # 20000698 <mDelaymS>sys_para_init();    //初始化全局参数6068:  fcdfe0ef            jal ra,5034 <sys_para_init>sys_state_init();606c: ed7fe0ef            jal ra,4f42 <sys_state_init>sys_monitor_init();//启动看门狗监视6070: 3e5030ef            jal ra,9c54 <sys_monitor_init>
......00006084 <main>:
* Input          : None
* Output         : None
* Return         : None
*******************************************************************************/
int main(void)
{6084:  1141                    addi    sp,sp,-166086:  c606                    sw  ra,12(sp)main_task_init();6088: 37c1                    jal 6048 <main_task_init>systask_Create();608a:   355d                    jal 5f30 <systask_Create>log("%s\r\n", VER_LIB);608c:   1fffa097            auipc   ra,0x1fffa6090: 628080e7            jalr    1576(ra) # 200006b4 <Log_get_pbuff>6094:  00025617            auipc   a2,0x256098:    2bc60613            addi    a2,a2,700 # 2b350 <VER_LIB>609c:  00025597            auipc   a1,0x2560a0:    f9058593            addi    a1,a1,-112 # 2b02c <DeviceName+0x3ec>60a4:   565220ef            jal ra,28e08 <siprintf>60a8:  1fffa097            auipc   ra,0x1fffa60ac: 676080e7            jalr    1654(ra) # 2000071e <Log_pbuff_out>log("\r\n系统启动完成2\r\n");60b0: 1fffa097            auipc   ra,0x1fffa60b4: 604080e7            jalr    1540(ra) # 200006b4 <Log_get_pbuff>60b8:  4649                    li  a2,1860ba:  00025597            auipc   a1,0x2560be:    a5e58593            addi    a1,a1,-1442 # 2ab18 <FW_VERSION+0x10>60c2:   36b220ef            jal ra,28c2c <memcpy>60c6:    1fffa097            auipc   ra,0x1fffa60ca: 658080e7            jalr    1624(ra) # 2000071e <Log_pbuff_out>while(1) {TMOS_SystemProcess();60ce:   1fffb097            auipc   ra,0x1fffb60d2: 17a080e7            jalr    378(ra) # 20001248 <TMOS_SystemProcess>60d6:  bfe5                    j   60ce <main+0x4a>
......

子程序编译结果示例:

20000698 <mDelaymS>:
__HIGH_CODE
void mDelaymS(uint16_t t)
{uint16_t i;for(i = 0; i < t; i++)
20000698:   cd09                    beqz    a0,200006b2 <mDelaymS+0x1a>
2000069a:   4701                    li  a4,0
2000069c:   6691                    lui a3,0x4
2000069e:   a9868793            addi    a5,a3,-1384 # 3a98 <Log_uart1_txisr+0x5c>__nop();
200006a2:   0001                    nop
200006a4:   17fd                    addi    a5,a5,-1} while(--i);
200006a6:   fff5                    bnez    a5,200006a2 <mDelaymS+0xa>for(i = 0; i < t; i++)
200006a8:   0705                    addi    a4,a4,1
200006aa:   0742                    slli    a4,a4,0x10
200006ac:   8341                    srli    a4,a4,0x10
200006ae:   fee518e3            bne a0,a4,2000069e <mDelaymS+0x6>{mDelayuS(1000);}
}
200006b2:   8082                    ret

参考list文件追踪 hardfalt 问题

 从 .lst 文件总可以看到很多有用的信息, 特别是代码的编译结果和在内存中的分布. 结合调试PC信息能很容易追踪到棘手的 hardfalt  问题.  以及找出程序报错的地方

写一段错误代码:

//非对齐的地址取int数据
void hardfault_test(void) {int a,*p;while(1){DelayMs(100);for(int i=0;i<16;i++) {p = (int *)(0x200+i);a = *p;printf("test:%X\r\n",a);}}
}

在hardfalt中断中打印出错点 PC值

hardfault
mepc:000025ca
mcause:00000004
mtval:00000201

编译出来的list结果:

//对非4字节对齐的地址取uint32_t
void hardfault_test(void) {25a4:    1141                    addi    sp,sp,-1625a6:  c226                    sw  s1,4(sp)25a8:   c04a                    sw  s2,0(sp)25aa:   c606                    sw  ra,12(sp)25ac:  c422                    sw  s0,8(sp)DelayMs(100);for(int i=0;i<16;i++) {p = (int *)(0x200+i);a = *p;printf("test:%X\r\n",a);25ae:    00002917            auipc   s2,0x225b2: 91a90913            addi    s2,s2,-1766 # 3ec8 <cmd_mm+0x78>for(int i=0;i<16;i++) {25b6:   21000493            li  s1,528DelayMs(100);25ba:    06400513            li  a0,10025be: 1fffe097            auipc   ra,0x1fffe25c2: 0da080e7            jalr    218(ra) # 20000698 <mDelaymS>25c6:    20000413            li  s0,512printf("test:%X\r\n",a);25ca:   400c                    lw  a1,0(s0)25cc:   854a                    mv  a0,s225ce:  0405                    addi    s0,s0,125d0:    2d01                    jal 2be0 <iprintf>for(int i=0;i<16;i++) {25d2:  fe941ce3            bne s0,s1,25ca <hardfault_test+0x26>25d6:    b7d5                    j   25ba <hardfault_test+0x16>
 很明显就在list文件里面,我们可以找到000025ca地址对应的行, 这一行是一条取值的指令, 从0x0201的地址尝试取出一个int. 很明显这个里不对齐的地址会产生了一个hardfault.

单片机list文件解析及 hardfalt问题定位相关推荐

  1. AUTOSAR从入门到精通100讲(十五)-AURIX TC3xx MCAL中Link文件解析以及代码变量定位方法详解

    一 TC3xx系列MCAL中TASKING Link文件解析以及代码变量定位方法 1 TASKING Link文件解析 1.1 DSRAM中的数据存放: 在AURIX™ 2G中(以TC387为例),每 ...

  2. exe文件解析_PE文件格式之重定位表

    一.重定向表的作用: 这个在网上有很多种解释,那我也说一下自己对这个表的解释,程序运行的时候一般有两种方式来调用函数就是OD的那个CALL,一个是基址+偏移,另一种就是写死的函数地址比如 CALL 0 ...

  3. asp.net中各种类型文件解析 收藏

    asp.net中各种类型文件解析 收藏 ASP.NET的页面文件是*.aspx,每个页面对应一个*.resx资源文件和一个*.aspx.cs的代码文件. *.resx是资源文件.每个页面都有一个资源文 ...

  4. elf文件格式_Android so(ELF) 文件解析

    Android so(ELF) 文件解析 Android so(ELF) 文件解析 前言 生成 so 文件 相关工具 objdump readelf 整体结构图 头部结构 段表结构 字符串表结构 程序 ...

  5. 嵌入式知识-ARM裸机-学习笔记(2):利用GPIO来控制LED(附mkv210_image.c文件解析)

    嵌入式知识-ARM裸机-学习笔记(2):利用GPIO来控制LED(附mkv210_image.c文件解析) 首先声明该博客是针对朱有鹏老师的嵌入式课程进行笔记的总结. 一.通过GPIO控制点亮LED( ...

  6. 三维模型obj文件解析

    目录 obj文件简介 文件结构 顶点数据(Vertex data): 自由形态曲线(Free-form curve)/表面属性(surface attributes): 元素(Elements): 自 ...

  7. 安卓系统文件夹及其文件解析

    安卓系统文件夹及其文件解析 打开Android文件管理器,会发现里面数十个英文名称命名的文件夹罗列其中,很多功能我们可以从其名字上略有所知,内部大批量的文件却让我们有些一头雾水.这些文件是什么?有什么 ...

  8. PDF 与 PS页面描述语言与PDF文件解析(转)

    PDF 与 PS页面描述语言与PDF文件解析(转) 页面描述语言 页面描述语言(Page Description Language,简称PDL)是一种面向输出效应的语言,用于描述打印或照排的版面,这种 ...

  9. Python大文件解析的效率问题

    论坛求助与自行摸索相结合,基本解决python大文件解析效率问题.现将过程与结论存档,供有需要者参考. =================前言==================== 看着python ...

最新文章

  1. 不懂编程可以自学python吗-我不会编程,也可能学会Python吗?
  2. JSP中四种传递参数的方法
  3. SQLServer 错误: 15404,无法获取有关 Windows NT 组/用户
  4. 分析Android银行木马GM Bot的变异过程
  5. 八十九、常见的圣杯布局和双飞翼布局
  6. Boost字符串处理
  7. 17 张程序员专属壁纸,有你喜欢的吗?
  8. windows自定义快速启动(运行)命令
  9. 机器视觉及图像处理系列之二(C++,VS2015)——图像级的人脸识别(1)
  10. Linux系统GCC常用命令和GCC编译过程描述
  11. JMeter之性能监控插件PerfMon Metrics Collector
  12. iPhone突然掉电快是什么情况,该如何解决?
  13. 得到语音下载(dedaodown)
  14. YOLOv5 anchor 编码(label assign)方式详解
  15. Quantopian自学笔记03
  16. 使用连接管理器出现“安装程序无法复制文件”错误的解决方法
  17. 贷款买二手房 这4笔钱你都准备好了么?
  18. 使用face-api实现html前端摄像头人脸检测
  19. 看清大厂面目:美光宣布暂停向华为供货!
  20. C++ 计166-1 C语言实验——圆柱体计算

热门文章

  1. python 招聘 海盐_聚焦普高新课标 提升信息核心素养——海盐县初中信息技术Python课堂教学研讨活动在武原中学举行...
  2. tomcat 6x and 7x https配置
  3. IOS 世界标准时间UTC /GMT 转为当前系统时区对应的时间
  4. 秒杀排列组合(上)————排列篇
  5. JAVA蘑菇西餐,蘑菇的二十二种西餐做法,简单易上手,让你品尝不一样的风味...
  6. 小程序点击多个指定地方都能关闭弹框
  7. Python爬虫抓取某音乐网站MP3(下载歌曲、存入Sqlite)
  8. 饿了么“盛夏之战”,背后的底气是什么? | 一点财经
  9. 阿里云个人镜像仓库日常基本使用
  10. 使用阿里云实现短信发送服务(测试版)