DSP

DSP DM355 如何加载运行bin文件

2019-07-13 10:17发布

背景及问题:          在DM355板子上通过UBL启动测试模式,因为没有操作系统在裸板上运行测试程序,所以不能使用CCS直接生成的.OUT可执行文件,要将.OUT文件格式转成没有操作系统能直接运行的.BIN文件。要能运行.BIN文件必须将其加载到正确的内存位置,并找到入口地址。转换后的.BIN文件的加载地址和入口地址分别是多少? 解决过程:         .OUT文件是COFF格式的,COFF文件的结构如下表1所示。每个段表示的含义在这里不再叙述,网上有讲解。 表1  COFF文件结构 File Header Optional Header Section Header 1 ...... Section Header n Section Data Relocation Directives Line Numbers Symbol Table String Table COFF文件一共有8种数据,自上而下分别为: 1. 文件头(File Header) 2. 可选头(Optional Header) 3. 段落头(Section Header) 4. 段落数据(Section Data) 5. 重定位表(Relocation Directives) 6. 行号表(Line Numbers) 7. 符号表(Symbol Table)                COFF格式的文件可以使用COFF Reader这个软件打开查看其内容(之前先要安装python2.4)。这里以ublNAND这个CCS项目为例,打开其.OUT文件,如下图1所示。   图1 .OUT文件的内容             从图中可以看出有四个部分Header,Optional Header,Sections,Symbols,经过实验发现其他CCS项目.OUT文件也只包含这四个部分。COFF文件格式当为目标文件时是可重定位的,而作为可执行文件是不可重定位的,因为.OUT文件中没有重定位表这个信息。所以一旦.OUT文件生成后,它运行时在内存的位置就是固定的。至于在内存中的什么位置是由项目的.CMD文件定义的。          在生成.OUT文件同时,会有一个.MAP文件,在.MAP文件中,有个“ENTRY POINT SYMBOL”它指明了入口地址,这个.OUT可执行文件的入口地址和.BIN的入口地址是相同的。因为.OUT文件是包含.BIN文件的,将.OUT文件中文件头,可选头,段落头等描述信息去掉之后,剩下的纯数据部分就是BIN文件的内容。而入口地址是程序开始执行的地址,与描述信息无关,所以两个文件可执行文件的入口地址相同的。以ublNAND项目为例,图2是ubl的MAP文件,可以看出入口地址为0X00000020,在下面的SECTION ALLOCATION MAP,即段的内存分配的映射,0X00000020地址是在.boot这个段中的。用COFF Reader软件打开ublNAND项目的.OUT文件,找到.boot这个段,如图3所示,可以看到十六进制的数据内容,开始0X20开始那行数据“24 01 9f e5 11 0f 09 ee 00 00 a0 e1 00 00 0f e1”。再用UltraEdit打开转换后的BIN文件,找到那行数据,可以发现那块的数据是相同的。   图2  .MAP文件   图3  .OUT文件        图4  .BIN文件            对于转换后的加载地址,可以在转换过程中生成的HAXMAP文件中查看,如图5所示。CONENTS部分,描述了将.OUT文件中的哪些段抽取出来形成.BIN文件,而第一个就是加载地址0X 00000020。注意,这里入口地址和加载地址是相同的,但是有的项目中是不一样的,所以不能认为入口地址和加载地址相同。   图5  HEXMAP文件           由以上可以得出,BIN文件的入口地址在MAP文件中的ENTRY POINT SYMBOL中,BIN文件的加载地址在HEXMAP文件的CONTENTS中。