嵌入式系统设计要点

发布 2022-10-21 07:46:28 阅读 6444

嵌入式系统。

采用大容量epr来固化程序的专用系统,正在智能仪器和自动化等领域里得到广泛应用。传统设计方法用汇编语言编写程序,这主要是从保证速度和节省存储空间考虑,但编程费时,调试和排错很不容易。微电子技术的飞速发展,使高性能微处理器和大容量存储器的**变得十分便宜,速度和存储容量不再是困扰设计者的主要问题。

人们将rom和crt显示器等外设加进这类专用系统,并尝试用高级语言来开发其软件,即把通用计算机上的软件和硬件“嵌入”专用系统,构成所谓的嵌入式系统由于c语言容易编程、**紧凑、可移植性和可维护性好,因而被普遍用于嵌入式程序的设计。

大多数嵌入式系统无操作系统支持,要由设计者提供所有低级i/o功能。系统i/o资源有限,程序必须固化在epr中,不能象在dos下那样从磁盘装入和由用户编程。设计者要编写一个定位程序把exe格式的应用程序转换成可固化进epr的二进制文件(ro图)。

还要编写一个启动程序与rom图一起嵌入epr先由它建立数据区和对系统硬件作必要初始化,然后调mai函数,执行应用程序。若想发挥c语言之优势,使用一些标准i/o语句,如用pri驱动显示器等,则要在嵌入式程序中加进经过修改的库函数。总之,c语言编程会使系统开发面临一些新问题,要求设计人员具备软硬件方面的综合知识,才能正确进行系统调试和排错。

当然,如果拥有专用的嵌入式系统开发工具,设计工作便要省劲些。它们通常配有定位程序和可供设计者修改的启动程序样板,有些还能通过串口或并口,在pc机上联机调试程序,甚至有源级**调试功能。利用工控机来设计系统,事情就更简单。

不过,专用开发工具和工控机**昂贵,因此许多人在设计嵌入式系统时选择自己编写定位程序和启动程序,甚至编写可嵌入的i/o库函数。本文就嵌入式系统的程序设计方法及设计中可能遇到的问题作些讨论,供打算设计嵌入式程序的读者参考,有关编写定位程序和启动程序的具体方法将另文介绍。

嵌入式程序的定位。

.1e文件格式和dos重定位。

os下的exe文件是一种可重定位文件它由重定位标头和装入模块组成。后者含一段或几段程序**,段数与类型取决于程序规模和编译时所用的内存模式,然后是初始化与未初始化的数据及堆栈,还可能有程序排错信息。**、数据和堆栈段地址均是参考到程序开头的相对地址。

标头放在装入模块之前,含若干定位控制信息和一张定位表。控制信息包括exe文件大小、标头长度、需要重定位的项数和位置、装入模块的开头和堆栈的相对地址等。定位表是一组形式为段址:

偏址的远指针,指示装入模块中要重定位的那些段址相对于模块开头处的位置。装进ram后,加载程序建立起程序段前缀psp并根据系统当前可用ram地址修改这些段址,对装入模块重定位,使程序中所有参考绝对地址的量正确指向模块装入后的起始地址,然后执行(图1)。因此它可在ram中的任何位置上执行。

图dos对exe文件的定位过程。

.2嵌入式程序的定位。

嵌入式系统有rom和ram两类内存,程序被固化进rom而程序变量和堆栈应设在ram中。

因此,对exe文件的重定位过程与dos下不一样。定位程序必须根据系统的rom和ram地址,对定位表中各远指针指向的字进行修改。定位程序最后以一种可加载进测试系统或。

可烧入epr的形式输出程序,即rom图,它可以是二进制或int的hex格式,根据epr编程器、**器或调试程序的要求而定。可用两种方法把exe文件转换为rom图:

一是使用exe命令。若exe文件定位表中不含有定位远指针,ex便将它转换成com文件,它是可固化进epr的二进制文件,否则便放弃转换。这仅适用于较小的单段程序。

较新版本的exe在发现exe文件中含重定位项时,会提示用户提供一个基地址,进行重定位。若选用适当的内存模式,并限制使用远指针,它也可能用一个基地址进行定位。但对于规模较大的程序,ex无能为力。

二是根据标头和map文件所提供的信息进行定位,适用于所有的exe文件(图2)。若在连接时进行限定,可生成只含内存分配段表的简单map文件。段表的每行描述一个段,按**段、数据段和堆栈段的次序排列和bor的map文件每行长度略有区别,但行上各参数(段始址、段末址、段长、段名、段类)的位置是固定的。

定位程序根据第一个ram段的段名,从map文件中抽取出它的起始地址,它就是数据区的相对始址。再从标头内容计算出装入模块大小,即要占用的rom容量。将系统rom始址加上**段在装入模块中的。

相对地址,便得到程序开始执行的地址。然后,对定位指针进行自小到大排序。根据各段的始末地址逐段析出段址,并从装入模块中读入该段**或数据。

接着按定位指针顺序考察待定位的段址,若它落在该段范围内,便进行定位操作,即把此段址修改成实际的rom或ram地址。直到将属于这个段的定位指针全部处理好后,便把这段内容写到输出文件。对所有段都进行定位后,便获得rom图。

图280系统上嵌入式程序的定位过程。

启动程序。om中程序执行前,先要在ram中建立堆栈和数据区。串数据等常数与程序一起固化在rom中,程序可以访问它们,但ram的存取速度比e-p高,因此也被复制进ram以提高读出速度。

还需要建立c程序运行的环境,如对段寄存器和堆栈指针初始化、对静态变量和ram区清零、建立堆(he等。程序运行前还应设置必要的中断矢量,并让各未用中断指向一个只含ret指令的哑函数,以防止错误中断引起系统的混乱。此外,还要对系统硬件进行初始化,并根据具体的系统,加入出错时中止程序或重启动的程序段等。

这些工作都由用汇编语言编写的启动程序完成。启动程序是嵌入式程序的开头部分,应与应用程序一起固化在epr中,并首先在系统上运行(图2)。它应包含进各模块中可能出现的所有段类,并合理安排它们的次序。

当它作为第一个模块和应用程序等一起连接时,li将按照该次序归并类名相同的段。

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

嵌入式程序的运行。

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

启动程序完成上述的初始化后调mai函数,执行应用程序。80以上的cpu复位时,cs初值仍是但。

20以上地址线在cs寄存器被第一次装进新的内容前,一直保持高电平,即开始地址指向最高地址端。如只要求系统工作在实模式,可由译码电路将开始的高地址反射到低端的1mb空间,复位矢。

量仍是当上述jmp指令一执行,cs被改写,a2以上地址线将变低而进入实模式。要是希望启动后进入保护模式,就不需要进行地址反射,但是相应的复位地址上只能放一条近跳转指令,保证不改变cs值。然后进行必要的初始化,尽快进入保护模式。

嵌入式程序的编译和连接。

综上所述,设计嵌入式系统时要在pc机上编写三个程序:应用程序定位程序启动程序然后按以下步骤进行编译和连接,生成可编程的rom图:

将应用程序编译成。

将定位程序编译和连接成可执行程序将启动程序编译成。

对及必要的库函数进行连接,生成emb和简化的map文件必须是lin行上的第一个模块,保证它先执行。

执行以第一个ram段的段类名、ra和rom始址为输入参数,实现定位,输出rom图。

用deb命令在emb的位置上加进指令形成最终的rom图。

其它几个问题6.1系统内存考虑。

为确保正确复位,设计硬件时要让rom地址空间覆盖复位矢量。例如808系统的最高地址为若采用128的rom其地址范围应取地址则应从0开始,由于开头1kb字节ram要保留给中断矢量表,通常如图2那样将ram数据区设在地址处。

常数先固化在rom中,然后被复制进ram因此占用的存储器空间是dos下的两倍。可在程序设计中设法限制要复制进ram的常数数量。例如,系统若支持crt显示器,可能需要在屏幕上显示各种消息和菜单提示。

嵌入式ARM嵌入式系统设计

摘要 本系统设计了基于arm系统的嵌入式硬件平台,其中主要介绍了系统母版的具体电路实现,其硬件电路已经通过了信号完整性分析。中国 网 关键词 arm 嵌入式系统 中图分类号 tp368.1 文献标识码 a 文章编号 1007 9416 2012 12 0104 01 1 序言 本系统是设计一款基于a...

嵌入式linux与嵌入式系统设计

ustc bbs embedded斑竹d j主讲。感谢hongtao chen以及networking斑竹jun zxjun的大量幕后工作!感谢james zhang以及网络中心提供聚会的场地和大力支持!欢迎访问我的主页。聚会详情如下 名称 嵌入式系统设计以及嵌入式linux展望 时间 本周星期天 ...

嵌入式嵌入式系统原理与设计

第六章 iic总线。一 iic总线介绍 i2c总线 1.结构。2.工作原理 a b 主机 主设备 负责生成scl时钟,同时负责发出其实信号s和终止信号p 从机 从设备 被主机寻址的器件。1 a检测i2c总线是否 空闲 如果空闲 高 a发出起始信号 scl高,sda 2 寻址选择目标器件b,发送7位地...