Linux 版 (精华区)

发信人: wzl (为了证明我很无聊,我准备开始背单词!), 信区: Linux
标  题: 嵌入式系统设计要点之三
发信站: 哈工大紫丁香 (2000年09月19日20:53:08 星期二), 转信

4 嵌入式程序的运行
嵌入式系统大多不能从键盘接受命令,而要在系统通电或复位时,自动执行ROM中的
程序。各系统的复位地址不尽相同,以工作在实模式的80x86嵌入式系统为例,
CPU复位后将执行F000:FFF0H处的代码。这是系统ROM的高址端,仅
有16字节空间,设计者可用DEBUG命令在ROM图的这个位置上,放一条无条
件远跳转指令JMPFARPTRstart,转到ROM开头,从那里执行启动程
序(见图2)。启动程序完成上述的初始化后调main函数,执行应用程序。
80286以上的CPU复位时,CS:IP初值仍是F000:FFF0H。但
A20以上地址线在CS寄存器被第一次装进新的内容前,一直保持高电平,即开始
地址指向最高地址端。如只要求系统工作在实模式,可由译码电路将开始的高地址反
射到低端的1MB空间,复位矢量仍是F000:FFF0H。当上述JMP指令一
执行,CS被改写,A20以上地址线将变低而进入实模式。要是希望启动后进入保
护模式,就不需要进行地址反射,但是相应的复位地址上只能放一条近跳转指令,保
证不改变CS值。然后进行必要的初始化,尽快进入保护模式。
5 嵌入式程序的编译和连接
综上所述,设计嵌入式系统时要在PC机上编写三个程序:应用程序MYPROG.C;定
位程序LO-CATOR.C;启动程序STARTUP.ASM。然后按以下步骤进行编
译和连接,生成可编程的ROM图:
·将应用程序编译成MYPROG.OBJ。
·将定位程序编译和连接成可执行程序LO-CATOR.EXE。
·将启动程序编译成STARTUP.OBJ。
·对STARTUP.OBJ、MYPROG.OBJ及必要的库函数进行连接,
生成EMBED.EXE和简化的MAP文件EMBED.MAP。STARTUP
必须是LINK行上的第一个模块,保证它先执行。
·执行LOCATOR.EXE,以EMBED.EXE、EMBED.MAP、
第一个RAM段的段类名、RAM和ROM始址为输入参数,实现定位,输出ROM
图EMBED.BIN。
·用DEBUG命令在EMBED.BIN的F000:FFF0H位置上加进
指令JMPFARPTRstart,形成最终的ROM图。
6 其它几个问题
6.1 系统内存考虑
为确保正确复位,设计硬件时要让ROM地址空间覆盖复位矢量。例如8086
系统的最高地址为F000:FFFFH,若采用128KB的ROM,其地址范围
应取E000:0000-F000:FFFFH。
RAM地址则应从0开始,由于开头1KB字节RAM要保留给中断矢量表,通
常如图2那样将RAM数据区设在地址0040:0000H处。
常数先固化在ROM中,然后被复制进RAM,因此占用的存储器空间是DOS
下的两倍。可在程序设计中设法限制要复制进RAM的常数数量。例如,系统若支持
CRT显示器,可能需要在屏幕上显示各种消息和菜单提示。这时,可把所有显示函
数和有关文本串放进一个模块,再用指针来存取它们。比如,本来可用下面语句打印
提示:
   printf("PressStoStart"); 
printf("PerssQtoQuit");
若程序中有许多类似的语句,便可能存在较多重复串。要是对各子串都用指针访
问,编译就会把其中重复的串(如Press,to等)合并,省下不少内存空间。
即把上面语句改为:
printf("%s%s%s%s","Press","S","to","Start")
; 
printf("%s%s%s%s","Perss","Q","to","Quit");
6.2 标准I/O函数的使用
用C语言编写嵌入式程序的过程与DOS下一样,只是要避免使用不能被固化到
ROM中的库函数。在DOS下,许多低级I/O函数(如putch,getch)
均通过DOS中断21H与硬件接口,高级函数printf,scanf等也使用
该中断。若希望在无ROMBIOS的系统上使用这些函数,应编写一个模仿
DOSINT21的函数,这样便能使用除磁盘I/O函数之外的大多数标准I/O
函数,缩短程序开发时间,并保证较好的可移植性。当然,如果使用的是现成的嵌
入式系统开发软件包,厂商将告知哪些函数可被固化进ROM,不必自己编写
INT21函数。
编写嵌入式支持函数时要防止使用与DOS有关的库函数。比较起来,BC提供
的库比MSC的更独立于DOS。例如,MSC的printf函数要依赖几个低级
的DOS函数。所以在仿真INT21的控制台I/O函数时,建议用BC的
printf函数。
6.3 配置参数的保护
断电时,嵌入式系统应能保持那些用于系统恢复或外设配置的数据,可用电池供
电的RAM或EEPROM来存放它们。但在复位时,启动程序要把有初值的变量复
制进RAM,并对其余RAM区清0,结果会清除应保持的数据。为此,可把这类数
据归入一个专门段,不包括在初始化和未初始化数据区中,不让启动程序修改它们。

--
※ 来源:·哈工大紫丁香 bbs.hit.edu.cn·[FROM: 202.118.239.97]
[百宝箱] [返回首页] [上级目录] [根目录] [返回顶部] [刷新] [返回]
Powered by KBS BBS 2.0 (http://dev.kcn.cn)
页面执行时间:3.606毫秒