导出查看LDR文件
通过CCES编辑工程属性,导出LDR文件,然后用16进制查看LDR文件分析如图:
Bootloader程序
首先说说程序是如何boot 起来的,主要有两部分:
-
首先启动后,根据选定为spi flash模式, 先发送读指令从flash 的0x000000 地址中将一个256 instruction words(48-bit)的小程序load 进芯片,这个小程序就是boot kernel。这个小程序在芯片中跑起来,
-
然后根据一些必要信息引导,将真正应用程序load 入芯片。
其中,256 instruction words(48-bit)刚好等于0x600字节,看上图前0x600字节即为bootlodaer程序了,默认情况下再CCES编译时会自动链接默认的bootloader程序,如果用户想改bootloader,可以自行在工程属性里面编辑更改。
Application程序
从0x600之后开始就是application程序了,这个程序也是有结构的,如下所示:
0x0000000e // tag
0x00000013 // count
0x00040100 // addr
<data0>
<data1>
其中tag的分类有如下几种:
0x0 FINAL_INIT
0x1 ZERO_LDATA
0x2 ZERO_L48
0x3 INIT_L16
0x4 INIT_L32
0x5 INIT_L48
0x6 INIT_L64
0x7 ZERO_EXT8
0x8 ZERO_EXT16
0x9 INIT_EXT8
0xA INIT_EXT16
另外上述的count并不是字节数,而是根据tag的类型的指令数,也就是说还要乘以tag类型的字节数才是总的字节数。
举个例子:
其中,tag为0x03(INIT_L16)为2个字节,count为0x33A,addr为0x124300。
然后打开相关的*..map.xml文件,确实找到改程序段:
现在我们再找下一个程序段,应该是0x60C+0x33A*2=0xC80,我们继续看LDR文件,如下:
确实在0xC80找到下一个段了,tag为0x03(INIT_L16 ),count为0x1117,addr为0x12463C,也确实能在*..map.xml文件找到这个段。
下一个程序段地址为:0xC80+0x1117*2 = 0x2EBA,因为4字节对齐,在0x2EBC上找到段信息:
这个段是0x01(ZERO_LDATA)段,代表用0初始化0x09个RAM数据,因此没有数据段,直接下一个程序段为03(INIT_L16),count为0x8FD,addr为0x12575C。
以此类推,可以查看全部的程序段。
CCES导出的LDR和SigmaStudio导出的BIN文件区别
使用CCES导出LDR文件,然后用sigmastudio导入并刷写,再从sigmastudio导出数据,发现两次数据不一样,数据流按位高低反了下:
两次文件对比图:
上图字节数一样,但数据完全不一样,举第一个字节分析: