Linux 版 (精华区)
发信人: wzl (为了证明我很无聊,我准备开始背单词!), 信区: Linux
标 题: 嵌入式系统设计要点之二
发信站: 哈工大紫丁香 (2000年09月19日20:52:20 星期二), 转信
2.2 嵌入式程序的定位
嵌入式系统有ROM和RAM两类内存,程序被固化进ROM,而程序
变量和堆栈应设在RAM中。因此,对EXE文件的重定位过程与DOS
下不一样。定位程序必须根据系统的ROM和RAM地址,对定位表中
各远指针指向的字进行修改。定位程序最后以一种可加载进测试系统或
可烧入EPROM的形式输出程序,即ROM图,它可以是二进制或
Intel的HEX格式,根据EPROM编程器、仿真器或调试程序
的要求而定。
可用两种方法把EXE文件转换为ROM图:
一是使用EXE2BIN命令。若EXE文件定位表中不含有定位远
指针,EXE2BIN便将它转换成COM文件,它是可固化进
EPROM的二进制文件,否则便放弃转换。这仅适用于较小的单段程
序。较新版本的EXE2BIN在发现EXE文件中含重定位项时,会
提示用户提供一个基地址,进行重定位。若选用适当的内存模式,并限
制使用远指针,它也可能用一个基地址进行定位。但对于规模较大的程
序,EXE2BIN无能为力。
二是根据标头和MAP文件所提供的信息进行定位,适用于所有的EXE
文件(图2)。若在连接时进行限定,可生成只含内存分配段表的简单
MAP文件。段表的每行描述一个段,按代码段、数据段和堆栈段的次
序排列。MicrosoftC和BorlandC的MAP文件每行
长度略有区别,但行上各参数(段始址、段末址、段长、段名、段类)
的位置是固定的。
定位程序根据第一个RAM段的段名,从MAP文件中抽取出它的起始
地址,它就是数据区的相对始址。再从标头内容计算出装入模块大小,
即要占用的ROM容量。将系统ROM始址加上代码段在装入模块中的
相对地址,便得到程序开始执行的地址。然后,对定位指针进行自小到
大排序。根据各段的始末地址逐段析出段址,并从装入模块中读入该段
代码或数据。接着按定位指针顺序考察待定位的段址,若它落在该段范
围内,便进行定位操作,即把此段址修改成实际的ROM或RAM地址。
直到将属于这个段的定位指针全部处理好后,便把这段内容写到输出文
件。对所有段都进行定位后,便获得ROM图。
图2 80x86系统上嵌入式程序的定位过程
3 启动程序
ROM中程序执行前,先要在RAM中建立堆栈和数据区。串数据等常
数与程序一起固化在ROM中,程序可以访问它们,但RAM的存取速
度比E-PROM高,因此也被复制进RAM,以提高读出速度。还需
要建立C程序运行的环境,如对段寄存器和堆栈指针初始化、对静态变
量和RAM区清零、建立堆(heap)等。程序运行前还应设置必要
的中断矢量,并让各未用中断指向一个只含RET指令的哑函数,以防
止错误中断引起系统的混乱。此外,还要对系统硬件进行初始化,并根
据具体的系统,加入出错时中止程序或重启动的程序段等。这些工作都
由用汇编语言编写的启动程序完成。
启动程序是嵌入式程序的开头部分,应与应用程序一起固化在EPROM
中,并首先在系统上运行(图2)。它应包含进各模块中可能出现的所有
段类,并合理安排它们的次序。当它作为第一个模块和应用程序等一起连
接时,LINK将按照该次序归并类名相同的段。
写好启动程序是设计好嵌入式程序的关键。各类C编译均提供自己的启动
程序模块(C0.ASM),可以此为样板,经简化和修改形成适用本系
统的启动程序,也可以先搭一个启动程序骨架,再逐步完善。
--
※ 来源:·哈工大紫丁香 bbs.hit.edu.cn·[FROM: 202.118.239.97]
Powered by KBS BBS 2.0 (http://dev.kcn.cn)
页面执行时间:5.396毫秒