ITEEDU

启动程序

ROM中程序执行前,先要在RAM中建立堆栈和数据区.串数据等常数与程序一起固化在ROM中,程序可以访问它们,但RAM的存取速度比E-PROM高,因此也被复制进RAM,以提高读出速度.还需要建立C程序运行的环境,如对段寄存器和堆栈指针初始化、对静态变量和RAM区清零、建立堆(heap)等.程序运行前还应设置必要的中断矢量,并让各未用中断指向一个只含RET指令的哑函数,以防止错误中断引起系统的混乱。

此外,还要对系统硬件进行初始化,并根据具体的系统,加入出错时中止程序或重启动的程序段等.这些工作都由用汇编语言编写的启动程序完成.启动程序是嵌入式程序的开头部分,应与应用程序一起固化在EPROM 中,并首先在系统上运行.它应包含进各模块中可能出现的所有段类,并合理安排它们的次序.当它作为第一个模块和应用程序等一起连接时,LINK将按照该次序归并类名相同的段。

写好启动程序是设计好嵌入式程序的关键.各类C编译均提供自己的启动程序模块(C0.ASM),可以此为样板,经简化和修改形成适用本系统的启动程序,也可以先搭一个启动程序骨架,再逐步完善。

嵌入式程序的运行

嵌入式系统大多不能从键盘接受命令,而要在系统通电或复位时,自动执行ROM中的程序.各系统的复位地址不尽相同,以工作在实模式的80x86嵌入式系统为例,CPU复位后将执行F000:FFF0H处的代码.这是系统ROM的高址端,仅有16字节空间,设计者可用DEBUG命令在ROM图的这个位置上,放一条无条件远跳转指令JMPFARPTRstart,转到ROM开头,从那里执行启动程序。

启动程序完成上述的初始化后调main函数,执行应用程序. 80286以上 的CPU复位时,CS:IP初值仍是F000:FFF0H.但A20以上地址线在CS寄存器被第一次装进新的内容前,一直保持高电平,即开始地址指向最高地址端.如只要求系统工作在实模式,可由译码电路将开始的高地址反射到低端的1MB空间,复位矢量仍是F000:FFF0H.当上述JMP指令一 执行,CS被改写,A20以上地址线将变低而进入实模式.要是希望启动后进入保护模式,就不需要进行地址反射,但是相应的复位地址上只能放一条近跳转指令,保证不改变CS值.然后进行必要的初始化,尽快进入保护模式。