基于ARM的嵌入式TCP/IP网络系统设计-PLC技术网(www.plcjs.com)-可编程控制器技术门户


基于ARM的嵌入式TCP/IP网络系统设计

 (点击题目 可以在互 联 网中搜索该题 目的相关内容)
日期:2006-7-7 23:16:31     来源:本文摘自《PLC&FA》   作者: 点击:
点击【  大   中  小 】,可以选 择字 体的大小,以便 你阅读.

1  引言
随着嵌入式技术的发展,人们对系统的智能化、小型化的要求也越来越高。基于ARM结构的微处理器以其高性能、低功耗、低价格等方面的优势被广泛应用于各种电子产品,特别是一些高端的嵌入式控制应用中,例如移动电话、工业控制、网络通信等方面。ARM技术具有很好的性能和功效,其合作伙伴包括许多世界顶级的半导体公司。可以说ARM技术几乎无处不在。
TCP/IP互联网协议族在全世界范围内已经成为开放系统互联的协议,它提供了很好的交互操作能力,可兼容多种网络技术。嵌人式技术与TCP/IP技术的结合已经展现出强劲的发展势头和巨大的市场潜力。如何开发面向ARM的高效代码,尤其是提高类似于TCP/IP协议栈等基础性的软件模块的执行效率已成为每个从事基于ARM的嵌入式系统开发人员必须思考的问题。

2  ARM微处理器的应用领域极其特点
作为一种16/32位的高性能、低成本、低功耗的嵌入式RISC微处理器,ARM微处理器目前已经成为应用最为广泛的嵌入式微处理器。
2.1  ARM微处理器的应用领域
到目前为止,ARM微处理器及技术的应用几乎已经深入到各个领域。
(1) 工业控制领域:作为32位的RISC架构,基于ARM核的微控制器芯片不但占据了高端微控制器市场的大部分市场份额,同时也逐渐向低端微控制器应用领域扩展,ARM微控制器的低功耗、高性价比,向传统的8位/16位微控制器提出了挑战。
(2) 无线通讯领域:目前已有超过85%的无线通讯设备采用了ARM技术, ARM以其高性能和低成本,在该领域的地位日益巩固。
(3) 网络应用:随着宽带技术的推广,采用ARM技术的ADSL芯片正逐步获得竞争优势。此外,ARM在语音及视频处理上进行了优化,并获得广泛支持,也对DSP的应用领域提出了挑战。
(4) 消费类电子产品:ARM技术在目前流行的数字音频播放器、数字机顶盒和游戏机中得到广泛采用。
(5) 成像和安全产品:现在流行的数码相机和打印机中绝大部分采用ARM技术。手机中的32位SIM智能卡也采用了ARM技术。
除此以外,ARM微处理器及技术还应用到许多不同的领域,并会在将来取得更加广泛的应用。
2.2  ARM微处理器的特点
(1) 采用RISC架构;
(2) 体积小、低功耗、低成本、高性能;
(3) 支持Thumb(16位)/ARM(32位)双指令集,能很好的兼容8位/16位器件;
(4) 大量使用寄存器,指令执行速度更快;
(5) 大多数数据操作都在寄存器中完成;
(6) 寻址方式灵活简单,执行效率高;
(7) 指令长度固定。
2. 3  ARM微处理器的指令结构
ARM微处理器在较新的体系结构中支持两种指令集:ARM指令集和Thumb指令集。其中,ARM指令为32位的长度,Thumb指令为16位长度。Thumb指令集为ARM指令集的功能子集,但与等价的ARM代码相比较,可节省30%~40%以上的存储空间,同时具备32位代码的所有优点。

3  嵌入式系统开发设计
嵌入式开发的流程与高层开发大体类似,编码—编译、链接—运行。中间当然可以有联机调试,重新编码等递归过程。但有一些不同之处。
首先,开发平台不同。受嵌入式平台处理能力所限,嵌入式开发一般都采用交叉编译环境开发。所谓交叉编译就是在A平台上编译B平台上运行的目标程序。在A平台上运行的B平台程序编译器就被称为交叉编译器。一个初入门者,建立一套这样的编译环境也许就要花掉几天的时间。
其次,调试方式不同。我们在Windows或者Linux上开发的程序可以马上运行察看运行结果,也可以利用IDE来调试运行过程,但是嵌入式开发者却至少需要作一系列工作才能达到这种地步。目前最流行的是采用JTAG方式连接到目标系统上,将编译成功的代码下载运行,高级的调试器几乎可以像VC环境一样任意的调试程序。
再者,开发者所了解层次结构不同。高层软件开发者把工作的重点放在对应用需求的理解和实现上。嵌入式开发者对整个过程细节必须比高层开发者有更深的认识。最大不同之处在于有操作系统支持的程序不需要你关心程序的运行地址以及程序链接后各个程序块最后的位置。像Windows,Linux这类需要MMU支持的操作系统,其程序都是放置在虚拟地址空间的一个固定的内存地址。不管程序在真正RAM空间的地址位置在哪里,最后都由MMU映射到虚拟地址空间的一个固定的地址。为什么程序的运行与存放的地址要相关呢?学过汇编原理,或者看过最后编译成机器码程序的人就知道,程序中的变量、函数最后都在机器码中体现为地址,程序的跳转,子程序的调用,以及变量调用最后都是CPU通过直接提取其地址来实现的。编译时指定的TEXT_BASE就是所有一切地址的参考值。如果你指定的地址与最后程序放置的地址不一致显然不能正常运行。但也有例外,不过不寻常的用法当然要付出不寻常的努力。有两种方法可以解决这个问题。一种方法是在程序的最起始编写与地址无关的代码,最后将后面的程序自搬移到你真正指定的TEXT_BASE然后跳转到你将要运行的代码处。另一种方法是,TEXT_ BASE指定为你程序的存放地址,然后将程序搬移到真正运行的地址,有一个变量将后者的地址记录下来作为参考值,在以后的符号表地址都以此值作为参考与偏移值合成为其真正的地址。听起来很拗口,实现起来也很难,在后面的内容中有更好的解决办法—用一个BootLoader支持。另外,一个完整的程序必然至少有三个段TEXT(正文,也就是最后用程序编译后的机器指令)段、BSS(未初始变量)段DATA(初始化变量)段。前面讲到的TEXT_BASE只是TEXT段的基址,对于另外的BSS段和DATA段,如果最后的整个程序放在RAM中,那么三个段可以连续放置,但是,如果程序是放置在ROM或者FLASH这种只读存储器中,那么你还需要指定你的其他段的地址,因为代码在运行中是不改变的,而后两者却不同。这些工作都是在链接的时候完成,编译器必然为你提供了一些手段让你完成这些工作。还是那句话,有操作系统支持的编程屏蔽了这些细节,让你完全不用考虑这些头痛的问题。但是嵌入式开发者没有那么幸运,他们总是在一个冷冰冰的芯片上从头做起。CPU上电复位总是从一个固定的地址去找程序,开始其繁忙的工作。对于我们的PC来说这个地址就是我们的BIOS程序,对于嵌入式系统,一般没有BIOS支持,RAM不能在掉电情况下保留你的程序,所以必须将程序存放在ROM或FLASH中,但是一般来讲,这些存储器的宽度和速度都无法与RAM相提并论。程序在这些存储器上运行会降低运行速率。大多数的方案是在此处存放一个BootLoader,BootLoader所完成的功能可多可少,一个基本的BootLoader只完成一些系统初始化并将用户程序搬移到一定地址,然后跳转到用户程序即交出CPU控制权,功能强大的BootLoad还可以支持网络、串口下载,甚至调试功能。但不要指望有一个像PC BIOS那样通用的BootLoader供你使用,至少你需要作一些移植工作使其符合你的系统,这个移植工作也是你开发的一个部分,作为嵌入式开发的入门者来讲,移植或者编写一个BootLoader会使你受益匪浅。没有BootLoader 行不行?当然可以,要么你就牺牲效率直接从ROM中运行,要么你就自己编写程序搬移代码去RAM运行,最主要的是,开发过程中你要有好的调试工具支持在线调试,否则你就得在改动哪怕一个变量的情况下都要去重新烧片验证。继续程序入口的话题,不管过程如何,程序最后在执行时都是变成了机器指令,一个纯的执行程序就是这些机器指令的集合。像我们在操作系统上的可运行程序都不是纯的执行程序,而是带有格式的。一般除了包含上面提到的几个段以外,还有程序的长度,校验以及程序入口——就是从哪儿开始执行用户程序。为什么有了程序地址还需要有程序的入口呢?这是因为你要真正开始执行的代码并非一定放置在一个文件的最开始,就算放在最开始,除非你去控制链接,否则在多文件的情况下,编译器也不一定将你的这段程序放置在最后程序的最顶端。像我们一般有操作系统支持的程序,只需在你的代码中有一个main作为程序入口—注意这个main只是大多数编译器约成定俗的入口,除非你利用了别人的初始化库,否则程序入口可以自行设定—即可。显然,带有格式的这种执行文件使用更加灵活,但需要BootLoader的支持。有关执行文件格式的内容可以看看ELF文件格式。

本新闻共2页,当前在第11 2  

上一篇: CAN总线在智能配电系统中的应用
下一: 基于OPC技术的上位机与PLC之间的通信