AT91RM9200嵌入式Linux系统开发

更新时间:2024-03-20 21:10:01 阅读量: 综合文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

1 嵌入式系统基础

1.1 嵌入式系统概述

随着电子技术的快速发展,特别是大规模集成电路的产生而出现的微型机,使现代科学研究得到了质的飞跃,而嵌入式微控制器技术的出现则给现代工业控制领域带来了一次新的技术革命。由嵌入式微控制器组成的系统,最明显的优势就是可以嵌入到任何微型或小型仪器、设备中。

嵌入式系统被定义为:以应用为中心、以计算机技术为基础、软件硬件可裁剪、适应应用系统,对功能、可靠性、成本、体积、功耗严格要求的专用计算机系统[1]。嵌入式系统是将先进的计算机技术、半导体技术、电子技术和各个行业的具体应用相结合后的产物,这一点就决定了它必然是一个技术密集、资金密集、高度分散、不断创新的知识集成系统。

嵌入式系统是以嵌入式计算机为技术核心,面向用户、面向产品、面向应用,软硬件可裁减的,适用于对功能、可靠性、成本、体积、功耗等综合性严格要求的专用计算机系统。和通用计算机不同,嵌入式系统是针对具体应用的专用系统,目的就是要把一切变得更简单、更方便、更普遍、更适用;它的硬件和软件都必须高效率地设计,量体裁衣、去除冗余,力争在同样的硅片面积上实现更高的性能[1][2][3]。

[2]

1.2 嵌入式系统组成

嵌入式系统通常由嵌入式处理器、外围设备、嵌入式操作系统和应用软件等极大部分组成。

1.2.1 嵌入式处理器

嵌入式处理器是嵌入式系统的核心部件。嵌入式处理器与通用处理器的最大不同在于其大多工作在为特定用户群设计的系统中。它通常把通用计算机的许多由板卡完成的功能集成在芯片内部,从而有利于嵌入式系统设计趋于小型化,并具有高效率、高可靠性等特点。

嵌入式系统主要应用领域有:工业控制、POS机、网络设备、图像处理、手机、PDA等。目前主要使用ARM、MIPS、PowerPC、DSP等16~32位处理器,以32位为主。各种

1

类型的处理器都有其一定的应用针对性。例如,DSP对数字信号处理技术中用到常用运算、算法作了优化设计,主要用于运算量较大的实时信号处理领域,如实时音频、视频处理,电机控制等。MIPS处理器性能好,但功耗大,适合于固定应用,如固定的网络设备、机顶盒等。ARM处理器性能高、功耗低,适合于电池便携、手持设备。由于其高性能低功耗的特点,ARM处理器已经成为32位处理器的主力产品。本文将介绍ATMEL公司的AT91RM9200,这款基于ARM920T的外设丰富的、功能强大的、非常适合工控领域的微处理器,并在该处理器上进行的嵌入式linux的开发[11][12][13]。

1.2.2 外围设备

外围设备是指在一个嵌入式系统中,除了嵌入式处理器以外,用于完成存储、通讯、显示等辅助功能的其他部件。根据外围设备的功能可以分为如下3类:

? 存储设备:静态易失性存储设备(RAM)、动态存储设备(DRAM)和非易失存

储器(FLASH)。其中,Flash可以擦写次数多、存储速度快、容量大价格低等特点,在嵌入式系统中得到广泛的应用。

? 通讯接口设备:应用广泛的包括并口,串口,SPI串行外围设备,I2C总线接

口、USB接口和以太网接口等等。 ? 人机交换设备:LCD、键盘和触摸屏等。

1.2.3 嵌入式操作系统

在大型的嵌入式应用系统中,为了使嵌入式开发更为方便、快捷,需要具备

一种稳定完全的软件模块集合,用以管理存储设备、中断处理、任务间通讯和定时器响应,以及提供多任务处理器等,即嵌入式操作系统。嵌入式系统的引入大大提高了嵌入式系统的功能,方便了应用软件设计,但同时占用了嵌入式系统的宝贵资源。一般在比较大型或者需要多任务的应用场合,才考虑嵌入式操作系统

[14][15][16]

1.2.4 应用软件

嵌入式应用软件是针对特定的实际专业领域,基于相应的嵌入式硬件平台,并能完成用户任务的计算机软件。由于嵌入式系统自身的特点要求嵌入式应用软

2

件有高可靠性,高代码密度,高度优化等特点,以适应嵌入式系统的实时性和成本敏感的特性要求,另外嵌入式应用软件需要在特定的编译环境下编译。

1.3 嵌入式系统特点

由于嵌入式系统是应用于特定的环境下,面对专业领域的应用系统,所以与通用计算机的多样化和适用性不同。它与通用计算机系统相比具有如下特点:

? 嵌入式系统通常是面向特定应用的。

? 嵌入式系统是将先进的计算机技术、半导体工艺、电子技术和通信网络技术

与各个领域的具体应用相结合的产物。这一特点决定了它必然是一个技术密集、资金密集、高度分散、不断创新的知识集成系统。

? 嵌入式系统的硬件软件都必须高效率的设计,在保证稳定、安全、可靠的基

础上量体裁衣,去除冗余,力争在同样的硅片面积上实现更高的性能。这样,才能最大限度的降低应用成本。在具体的应用中,对处理器的选择决定了其市场竞争力。

? 嵌入式系统常常有低功耗的要求。

? 可靠性和稳定性对与嵌入式系统有着特别重要的意义。

? 嵌入式系统本身不具有自举开发能力。既使设计完成后,用户也通常不能对

其中的程序进行修改,必须有一套交叉开发工具和环境才能开发。 ? 嵌入式系统有时要求实时性较高,特别是对于特定的应用。

嵌入式系统是面向用户、面向产品、面向应用的,它必须与具体用于相结合才会具有生命力,才会更具有优势。嵌入式系统必须根据应用要求对软硬件进行裁减,满足应用系统的功能、可靠性、成本、体积等要求。

1.4 嵌入式系统发展前景

后PC 时代是一个真实的阶段,而且是一个可以预测的时代。嵌入式系统就是与这一时代紧密相关的产物,它将拉近人与计算机的距离,形一个人机和谐的工作与生活环境。从某一个角度来看,嵌入式系统可应用于人类工作与生活的各个领域,具有极其广阔的应用前景。嵌入式系统在传统的工业控制和商业管理领域已经具有广泛的应用空间,如智能工控设备、POS/ATM 机、IC 卡等;在家庭领域更具有广泛的应用潜力,如机顶盒、数字电视、WebTV、网络冰箱、网络空调等众多消费类和医疗保健类

3

电子设备等;此外还有在媒体手机、袖珍电脑、掌上电脑、车载导航器等方面应用,将极大地推动嵌入式技术深入到生活和工作的方方面面[8][4][10]。它在娱乐、军事方面的应用潜力也是巨大的,而且是有目共睹的。

1.5 嵌入式操作系统概述

早期的嵌入式系统很多都不采用操作系统,它们只是为了实现某个控制功能,使用一个简单的循环控制对外界的控制请求进行处理。当应用系统越来越复杂、应用的范围愈来愈广泛的时候,每添加一项新的功能,就能需要从头开始设计,所以没有操作系统已经是一个最大的缺点。嵌入式操作系统是一种支持嵌入式系统应用的操作系统软件,它是嵌入式系统(包括软、硬件系统)极为重要的组成部分,通常包括与硬件相关的底层驱动软件、系统内核、设备驱动接口、通讯协议、图形界面等。嵌入式操作系统既有通用操作系统的基本特点,如能够有效的管理越来越复杂的系统资源;能够把硬件虚拟化,使得开发人员从繁忙的驱动程序移植和维护中解脱出来;能够提供库函数、驱动程序、工具集以及应用程序。与通用操作系统相比较,嵌入式操作系统的系统实时高效性、硬件的相关依赖性、软件固态化以及应用的专用性等方面具有较为突出的特点。

嵌入式操作系统负责嵌入式系统的全部软、硬件资源的分配、调度、控制、协调并发活动;它必须体现其所在系统的特征,能够通过装卸某些模块来达到系统所要求的功能[35] [38] [40]。

1.5.1 操作系统的概念和分类

操作系统OS(Operation System)是一组计算机程序的组合,用来有效的控制和

管理计算机的硬件和软件的资源,即合理的对资源进行调度,并为用户提供更为方便的应用接口。它为应用支持软件提供运行环境,即对程序开发者提供功能强、使用方便的开发环境[11][12][13]。

从资源管理的角度,操作系统主要包含如下功能:

? 处理器管理。对处理器进行分配,并对其运行进行有效的管理和控制。在多任务

环境下,合理分配由任务分享的处理器,使得CPU能够满足各程序运行的需要提高处理器的利用率,并能在恰当的时候收回分配给任务的处理器。处理器的分配和运行都是以进程为基本单元进行的,因此,对处理器的管理可以归结为对进程的

4

管理,包括进程控制、进程同步、进程通讯、作业调度和进程调度等。 ? 存储器管理。存储器管理的主要任务是为多道程序的运行提供良好的环境,包括

内存分配、内存保护、地址映射、内存扩充。例如,为每道程序分配必要的内存空间,使它们各得其所,且不致因相互重叠而失去信息;不因某个程序出现异常而破坏其他程序得运行;方便用户使用存储器;提高存储器得利用率;并能从逻辑上扩充内存等。

? 设备管理。完成用户提出得设备请求,为用户分配I/O设备;提高CPU和I/O得利用

率;提高I/O速度,方便用户使用I/O设备。设备管理包括缓存管理、设备分配、设备处理、形成虚拟逻辑设备等。

? 文件管理。在计算机中,大量得程序和数据是以文件的形式存放的。文件管理的

主要任务就是对系统文件和用户文件进行管理,方便用户使用,保证文件的安全性。文件管理包括对文件存储空间的管理、目录管理、文件的读写管理,以及文件的共享与保护等。

? 用户接口。用户与操作系统的接口是用户能够方便的使用操作系统的关键。用户

通常只需以命令形式、系统调用(即程序接口)形式与系统打交道。图形用户接口(GUI),可以将文字图形和图像集成在一起,用非常容易识别的图标将系统的各种功能、各种应用程序和文件直观的表示出来,用户可以通过鼠标来取得操作系统的服务。

操作系统的分类,按程序进行调度的方法,可以将计算机操作系统分为以下几种类型:

? 顺序执行系统。即系统内只有一个运行程序。它独占CPU时间,按语句顺序执行该

程序,直至执行完毕,另一个程序才能启动运行。DOS就是这种操作系统。 ? 分时操作系统。系统内同时可有多道程序运行。所谓同时,只是从宏观上来看的,

实际上系统把CPU时间按顺序分为若干时间片,每个时间片内执行不同的程序。这类系统支持多用户、当今广泛用于商业、金融领域。Unix操作系统就属于这类系统。

? 实时操作系统。系统内部同时有多道程序运行,每道程序个有不同的优先级,操

作系统按事件触发使程序运行。当多个事件发生时,系统按优先级高低来确定哪道程序在此时此刻能占用CPU,以保证优先级高的事件、实时信息及时被采集。实时操作系统是操作系统的一个分支,也是最为复杂的一个分支。

5

1.5.2 嵌入式操作系统的特点

嵌入式操作系统是相对于一般的操作系统而言的,它除了具备一般操作系统最基本的功能,如任务调度、同步机制、终端处理、文件处理等外,还有如下特点[14][15][16]:

? 可装卸性。具有开放性、可伸缩性的体系结构。

? 有时需要强实时性。嵌入式操作系统的实时性一般较强,可用与各种设备控

制当中。

? 统一的接口。提供各种设备的驱动接口。 ? 操作方便、简单,提供友好的用户界面。

? 提供强大的网络功能。支持TCP/IP协议及其他协议,提供TCP/UDP/IP/PPP等

协议支持,以及统一的MAC访问层接口,为各种移动计算机设备预留接口。 ? 强稳定性,若交互性。嵌入式系统一旦开始运行,就不需要用户过多的干预,

这就要求负责系统管理的嵌入式操作系统具有较强的稳定性。嵌入式操作系统的用户接口一般不提供操作命令,它通过系统的调用命令,向用户程序提供服务。

? 固化代码。在嵌入式系统中,嵌入式操作系统和应用软件被固化在嵌入式系

统计算机的ROM中。辅助存储器在嵌入式系统中很少使用,嵌入式操作系统的文件管理功能应该能够很容易的拆卸,而用各种内存文件系统。 ? 更好的硬件适应性,即良好的移植性。

1.5.3 常见的嵌入式操作系统

国际上用于信息电器的嵌入式操作系统有40多种左右。现在,市场上非常流行的产品包括3Com公司下属子公司的Palm OS、Microsoft公司的 Windows CE、美国WindRiver公司的VxWorks、开放源码的Linux。

1)Palm OS

Palm 是3Com公司的产品,其操作系统为Palm OS。Palm OS是一种32位的嵌入式操作系统。Palm提供了串行通讯接口和红外传输接口,利用它可以方便的与其他外部设备通信、传输数据:拥有开放的OS应用程序接口,开发商可根据需要自行开发所需的应用程序。Palm OS是一套具有很强开放性的系统,现在有大约数千种转为Palm OS编写的应用程序,从程序内容上看,小到个人管理、游戏,大到行业解决方案,Palm OS

6

无所不包。在丰富的软件支持下,基于Palm OS的掌上电脑功能不断扩展。

Palm OS是一套专门为掌上电脑开发的OS。在编写程序时,Palm OS充分考虑了掌上电脑内存相对较小的情况,因此它占有非常小的内存。由于基于Palm OS编写应用程序占用的空间也非常小,基于Palm OS的掌上电脑可以运行多种应用程序。

2)Windows CE

Windows CE时微软开发的一个开放的、可升级的32位嵌入式操作系统,是基于掌上电脑类的电子设备操作。它是精简的Windows 95。Windows CE的图像用户界面相当出色。与Windows 95/98、Windows NT不同的是,Windows CE是所有源代码全部是微软自行开发的嵌入式新型操作系统,其操作界面来源于Windows 95/98,但是Windows CE是基于Win32 API重新开发的、新型的信息设备平台。Windows CE具有模块化、结构化和基于Win32应用程序接口以及与处理器无关等特点。Windows CE不仅继承了传统的Windows 图像界面,更有利的是可以使用类似于Visual Basic、Visual C++的集成开发工具(Embedded Visual Basic和 Embedded Visual C++)在Windows平台上方便快捷的开发运行于Windows CE平台上的应用程序,使用同样的函数、使用同样的界面网络,使绝大多数的应用软件只需简单的修改和移植就可以在Windows CE平台上继续使用。

3)VxWorks

VxWorks操作系统使美国WindRiver公司于1983年设计开发的一种实时操作系统。VxWorks拥有良好的继续发展能力、高性能的内核以及友好的用户开发环境,在实时操作系统领域占据一席之地。它以良好的可靠性和卓越的实时性能被广泛的应用到通信、军事、航天等高精尖技术及实时性要求较高的领域种。在美国的F-16、FA-18战斗机、B-2隐形轰炸机和爱国者导弹上,甚至1997年火星表面登陆的火星探测器上也使用了VxWorks。它是目前嵌入式系统领域中使用最广泛、市场占有率最高的系统。VxWorks支持多种处理器,如ARM、x86、MIPS、PowerPC、StrongARM等等。大多数的VxWorks的API是专用的。

VxWorks具有一个高性能实时微内核,其任务切换时间短、中断延迟小、网络流量大的特点使得VxWorks的性能得到很大的提高。VxWorks与POSIX兼容,用户在其他符合POSIX标准的系统如Linux上运行的软件,基本上只要重新编译一下就可以移植到VxWorks上运行。VxWorks提供了良好的可配置能力,可配置的组建超过80个,用户可以根据自己系统的功能需求进行合理的配置。而且,VxWorks提供了一个强大的开发

7

调试环境Tornado,以方便广大嵌入式系统开发人员的开发使用。

4)Linux

Linux是一个类似Unix的操作系统。它起源于芬兰一个名为Linus Torvalds的业余爱好,但是现在已经是最为流行的一款开放源代码的操作系统。Linux从1991年问世到现在,短短十几年的时间已经发展成为一个功能强大、设计完善的操作系统,伴随网络技术进步而发展起来的Linux已经成为微软公司Windows的强劲对手。Linux系统不仅能够运行于PC平台,还在嵌入式系统方面大放光芒,在各种嵌入式linux迅速发展的情况下,linux逐渐形成了可与Windows CE等嵌入式操作系统进行抗衡的局面。目前正在开发的嵌入式系统中,49%的项目选择Linux作为嵌入式操作系统。Linux现已成为嵌入式操作的理想选择[20][22][23]。

嵌入式linux操作系统的有点在于:

? Linux是源码开放的,不存在黑箱技术,遍布全球的众多linux爱好者都是

linux开发者的强大技术支持者。

? Linux的源代码随处可得,注释丰富,文档齐全,易于解决各种问题。 ? Linux的内核小,效率高。

? Linux是开放源代码的操作系统,在价格上极具竞争力,适合中国国情 ? Linux不仅支持x86芯片,还是一个跨平台的系统,到目前为止,它可以支持

30~40种CPU,很多CPU厂商开始作Linux的平台移植工作,而且移植的速度远远超过Java的开发环境。如果今天采用Linux环境开发产品,那么将来更换CPU时就不会遇到更换平台的困扰。

? Linux内核的结构在网络方面时非常完整的,它提供了对于包括10兆位百兆位

及千兆位的以太网络,还有无线网络、Token ring和光纤甚至卫星的支持。 ? Linux在内核结构的设计中,考虑适应系统的可裁减性的要求。

作为嵌入式系统核心的嵌入式操作系统时开发嵌入式应用的关键一环,在这个领域内,没有通常操作系统环境下的Windows系统那样一支独秀的商品。因此,目前国内外相继推出了很多商业化嵌入式操作系统,都在努力为自己争取着嵌入式市场的份额。而Linux凭借其价格免费、源码公开的特点在嵌入式应用中占有一席之地,由于Linux自身的诸多优势,吸引了许多开发上的目光,已经渐渐成为了嵌入式操作系统领域的新宠。本论文将介绍在基于AT91RM9200微处理器的开发平台上,进行嵌入式Linux的移植。

8

1.6 研究目标

本课题来源于北京理工大学同北京康拓工业电脑公司的合作项目“基于ARM平台的嵌入式控制系统开发”。本文主要研究ARM920T核CPU的应用与嵌入式Linux操作系统的移植和底层驱动的开发,底层硬件采用康拓电脑公司自主开发的ARM人机界面卡。开发主机采用Redhat9.0操作系统,开发平台使用GNU交叉开发环境。最终目标是实现人机界面板卡的各种功能,完成在μC/OS-II下的各种驱动的调用,为用户提供一个完整的应用平台。

9

2 ARM920T硬件平台设计

2.1 ARM体系结构

ARM公司把ARM作为知识产权IP推向嵌入式处理器市场,目前已经占有80%左右的市场。市场上出现的ARM体系结构有多种形式,既有处理器内核(如ARM9TDMI)形式,也有处理器核如(ARM9T)形式。半导体厂商或片上系统SOC设计应用厂商采用ARM体系结构,生产相应的MCU/MPU(如ATMEL公司的AT91系列)或SOC芯片。

ARM即Advanced RISC Machines的缩写。ARM公司是知识产权(IP)供应商,本身不生产芯片,靠转让设计许可,由合作伙伴公司来生产各具特色的芯片。作为32位嵌入式RISC微处理器业界的领先供应商,ARM公司商业模式的强大之处在于它在世界范围内有超过100个合作伙伴――包括半导体工业的著名公司,从而保证了大量的开发工具和丰富的第三方资源,它们共同保证了基于ARM的处理器核的设计可以很快的投入市场[1][2][3]。

ARM嵌入式处理器作为一种高端嵌入式处理器,以其高性能、低功耗的特性,广泛地应用于PDA、机顶盒、网络通信、无线产品等领域。

ARM体系结构的主要特点包括: 1)RISC型处理器结构

为减少复杂功能的指令,减少指令条件,选用使用频率最高的指令,简化处理器的结构,减少处理器的集成度,并使每一条指令都在一个机器周期内完成,以提高处理器的速度。ARM采用RISC结构,并使的一个机器周期可执行一条指令。

2)Thumb指令集

由于RISC型处理器的指令功能相对比较弱,ARM为了弥补此不足,在新型的ARM体系结构中定义了16位的Thumb指令集。Thumb指令集比通常的8位和16位CISC/RISC处理器具有更好的代码密度,而芯片的面积增加了6%,可以使得程序存储器更小。

3)多处理器状态模式

ARM可以支持用户、快中断、中断、中止、系统和为定义等7种处理器模式,除了用户模式外,其余的均为特权模式。这也是ARM的特色之一,可以大大提高ARM处理器的效率。

4)嵌入式在线仿真调试

10

ARM体系结构的处理器芯片都嵌入了在线仿真ICE-RT逻辑,便于通过JTAG来仿真调试ARM体系结构芯片,可以省去价格昂贵的在线仿真器。另外,在处理器核中还具有嵌入式跟踪单元ETM,用于监控内部总线,实时跟踪指令和数据的执行。

5)灵活方便的接口

ARM体系结构具有协处理器接口,这样,既可以使基本的ARM处理器内核尽可能的小,又可以方便的扩充各种功能。另外,ARM处理器核还具有片上总线AMBA(Advanced Microcontroller Bus Architechture)。

AMBA定义了3组总线:AHB(Advanced High performance Bus)、ASB(Advanced System Bus)和APB(Advanced Peripheral Bus)。通过AMBA来方便的扩充各种处理器及I/O口,这样,就可以把DSP、其他处理器和I/O(如UART、定时器和接口等)都集成到一块芯片中[8]。

ARM当前有5个产品系列:ARM7、ARM9、ARM9E、ARM10和SecurCore。其中,ARM7、ARM9、ARM9E和ARM10是四个通用处理器系列。每个系列提供一套特定的性能,以满足设计者对功耗、性能&体积的要求、SecurCore是第五个产品系列,是专门为安全设备而设计的。ARM作为嵌入式系统中的处理器,以其低电压、低功耗&的集成度等特点,及其开放&可扩展性,实际上已经成为嵌入式系统首选的处理器体系结构

[18]

[7] [9]

2.2 AT91RM9200微处理器简介

AT91RM9200是美国ATMEL公司于2003年推出的一款针对系统控制、通讯领域的基于ARM9内核的微处理器。AT91RM9200微控制器与ATMEL以前推出的ARM7的AT91系列微处理器兼容,同时,AT91RM9200微处理器还提供了启动/禁用片上存储器的功能,以配合外围设备的需要。如图1所示 AT91RM9200 结构框图[86] [87] [88]。

11

图1 AT91RM9200 结构框图

2.2.1 ARM920T处理器的特点

ARM920TTM高速缓存处理器,是ARM9 Thumb?高性能32位片上系统处理器系列中的一款。它提供了一个完全的高性能CPU系统,包括:

? ARM9TDMITMRISC整型CPU

? 16K字节的指令缓存和16K字节的数据缓存 ? 指令和数据存储管理单元(MMU) ? 写缓存功能

? 高级微处理器总线构架(AMBA)总线接口 ? 嵌入式跟踪宏单元(ETM)接口

ARM920TTM的内核ARM9TDMITM可以执行32位的ARM指令集和16位的Thumb指令集。ARM9TDMITM处理器采用哈佛结构的处理器,实现5级流水线操作,包括指令、译码、执行、存储和写。

12

ARM920TTM处理器包含两个写处理器:CP14和CP15。其中,CP14负责控制软件调试通信通道,而CP15是系统控制处理器,提供另外16个寄存器,用于配置&控制高速缓存、MMU、保护系统、时钟模式和其他系统功能。ARM920TTM处理器的主要特点是:

1)基于ARM9TDMITM,ARMv4T结构;

2)具有两种指令集,包括ARM高性能32位指令集和Thumb高代码率的16位指令集;

3)5级流水线指令结构:取指令(F)、指令译码(D)、执行(E)、数据存储访问(M)和写寄存器(W);

4)16K字节的数据缓存,16K字节的指令缓存

5)具有写缓冲器,可以实现16字的数据缓冲,以及4地址的地址缓冲; 6)标准的ARMv4存储管理单元(MMU),支持按区访问:对于页的每个Quarter,可以进行独立配置,以支持大页访问,或者小页访问;具有16个嵌入区;拥有64输入的指令TLB,以及64输入的数据TLB;

7)8位、16位和32位数据总线,支持指令和数据的传输。

2.2.2 AT91RM9200微处理器的特点

ATMEL公司的AT91RM9200是基于ARM?Thumb?的ARM920T微处理器,时钟频率为180MHz时,运算速度可以达到200MIPS,内部分别有16KB的数据缓存和16KB的指令缓存,具有写缓冲。嵌入式存储器包括16KB的SRAM和128KB的ROM。此外,AT91RM9200采用了完全的低功耗设计,VDDCORE的电流为30.4mA,待机模式下的电流仅为3.1mA。

AT91RM9200内部集成了一个16KB的高速片上的SRAM,以及一个外围总线接口(EBI),可以与片外存储器进行连接。外围总线接口为同步动态随机存储器(SDRAM)、Burst Flash和静态存储器提供了控制器,并且因为其内部的特殊电路,可以方便的提供SmartMedia、CompactFlash和NAND Flash的接口。

高级中断控制器(AIC)提供了对歌具有优先级的向量中断源,缩短了传输到一个中断处理器的时间,从而提高了ARM920T处理器的中断处理性能。

外围数据控制器(PDC)为所有的串行外设提供了DMA通道,以允许外设在没有处理器干涉的情况下,与片内或片外存储器进行数据的传输。因此,在处理连续的数据流时,减少了处理器的系统开销。

13

并行I/O(PIO)控制器将外围输入/输出线与通用数据I/O分时复用,为设备的配置提供了最大的灵活性。

电源管理控制器(PMC)通过软件,选择性的使能和禁用处理器以及各种外围设备,从而保持系统的功耗最小。其中使用了增强的时钟发生器,提供了时钟信号的选择,包括一个慢时钟(32KHz),以达到在所以时间内优化功耗和性能的目的。

AT91RM9200集成了多种标准接口,包括USB2.0高速主机端和客户端,以太网10/100M Base-T媒体访问控制器(MAC),可以提供与多种外围设备,以及广泛使用的网络层的接口。另外,AT91RM9200还提供了符合工业标准的众多外围设备,包括音频、远程通讯、Flash卡、红外线和智能卡应用。

2.3 嵌入式系统平台的硬件设计

我们采用的硬件环境是北京康拓公司提供的ARM人机界面板。ARM人机界面板是基于ARM CPU(AT91RM9200)开发的人机界面,可用于设备的人机交互设备及通讯网关装置。

此人机界面板包括:240X128的宽温黄绿底液晶(液晶背光可温度控制),可选彩色蓝底液晶;9个键盘按键;支持4个LED显示灯(其余6个由DSP控制);一个隔离的RS232口作为维护口(DBGU);两个RS232串口;两个RS422串口;两个外扩的RS485串口;外扩8M32位SDRAM;8M8位NVRAM;2片8M串行dataflash;外扩10M以太网,加上内部自带10M/100M自适应以太网,提供双以太网接口。它可以应用在电力系统保护设备的人机界面、工业控制系统的人机界面、仪表的人机界面和通讯网关。ARM人机界面板的资源分配如表1所示:

表1 ARM人机界面板的资源分配表

地址端口 0x1000 0000H~0x1fff ffffH 0x2000 0000H~0x2fff ffffH 0x3000 0000H~0x307f ffffH 0x3080 0000H~0x30ff ffffH 0x30c0 0000H~0x30c0 7fffH 0x5000 0000H~0x7fff ffffH

片选 Ncs0 Ncs1 Ncs2 Ncs2 Ncs2 Ncs4-6 读 FLASH SDRAM 第一片NVRAM 第二片NVRAM 看门狗3808 CF卡 写 FLASH SDRAM 第一片NVRAM 第二片NVRAM 看门狗3808 CF卡 14

0x8060 0000H~0x8060 0001H 0x8040 0000H~0x8040 000fH 0x8020 0000H~0x8020 001fH 0x8080 0000H 0x8080 0001H 0x8080 0002H 0x8080 0003H 0x8080 0004H 0x8080 0005H

Ncs7 Ncs7 Ncs7 Ncs7 Ncs7 Ncs7 Ncs7 Ncs7 Ncs7 LCD 外括串口 以太网8019 键盘数据 键盘状态 串口中断状态 无效 无效 无效 LCD 外括串口 以太网8019 指示灯 LCD背光 使能看门狗 3808写保护 运行指示灯 刷新键盘状态

15

答\、\或\。其中\表示将相应特性的支持或设备驱动程序编译进内核;\表示将相应特性的支持或设备驱动程序编译成可加载模块,在需要时,可由系统或用户自行加入到内核中去;\不选择,表示内核不提供相应特性或驱动程序的支持。由于内核的配置选项非常多,本文只介绍一些比较重要的选项。

1、Code maturity level options(代码成熟度选项) Prompt for development and/or incomplete code/drivers

(CONFIG_EXPERIMENTAL) [N/y/?] 如果用户想要使用还处于测试阶段的代码或驱动,可以选择“*”。如果想编译出一个稳定的内核,则要选择“ ”。如图6

图6 用户选择内核编译模式界面

2、 Processor type and features(处理器类型和特色)

(1)、ARM system type 选择处理器类型,这里选择AT91RM9200。如图7

图7 CPU类型选择

(2)、Maximum Physical Memory (1GB, 2GB) [1GB] 内核支持的最大内存数,

31

缺省为1G。

(3)、Math emulation (CONFIG_MATH_EMULATION) [N/y/?] 协处理器仿真,缺省为不仿真。

(4)、MTRR (Memory Type Range Register) support (CONFIG_MTRR) [N/y/?] 选择该选项,系统将生成/proc/mtrr文件对MTRR进行管理,供X server使用。

(5)、Symmetric multi-processing support (CONFIG_SMP) [Y/n/?] 选择“y”,内核将支持对称多处理器。

3、 Loadable module support(可加载模块支持)

(1)、Enable loadable module support (CONFIG_MODULES) [Y/n/?] 选择“y”,内核将支持加载模块。

(2)、Kernel module loader (CONFIG_KMOD) [N/y/?] 选择“y”,内核将自动加载那些可加载模块,否则需要用户手工加载。

4、 Plug and Play configuration(即插即用设备支持)

(1)、Plug and Play support (CONFIG_PNP) [Y/m/n/?] 选择“y”,内核将自动配置即插即用设备。

(2)、ISA Plug and Play support (CONFIG_ISAPNP) [Y/m/n/?] 选择“y”,内核将自动配置基于ISA总线的即插即用设备。

5、 Block devices(块设备)

(1)、Normal PC floppy disk support (CONFIG_BLK_DEV_FD) [Y/m/n/?] 选择“y”,内核将提供对软盘的支持。

(2)、Enhanced IDE/MFM/RLL disk/cdrom/tape/floppy support

(CONFIG_BLK_DEV_IDE) [Y/m/n/?] 选择“y”,内核将提供对增强IDE硬盘、CDROM和磁带机的支持。

6、 Networking options(网络选项)

(1)、Packet socket (CONFIG_PACKET) [Y/m/n/?] 选择“y”,一些应用程序将使用Packet协议直接同网络设备通讯,而不通过内核中的其它中介协议。

(2)、Network firewalls (CONFIG_FIREWALL) [N/y/?] 选择“y”,内核将支持防火墙。

(3)、TCP/IP networking (CONFIG_INET) [Y/n/?] 选择“y”,内核将支持TCP/IP协议。

32

(4)The IPX protocol (CONFIG_IPX) [N/y/m/?] 选择“y”,内核将支持IPX协议。

(5)、Appletalk DDP (CONFIG_ATALK) [N/y/m/?] 选择“y”,内核将支持Appletalk DDP协议。

7、Character devices(字符设备)

(1)、Virtual terminal (CONFIG_VT) [Y/n/?] 选择“y”,内核将支持虚拟终端。

(2)、Support for console on virtual terminal (CONFIG_VT_CONSOLE) [Y/n/?] 选择“y”,内核可将一个虚拟终端用作系统控制台。

(3)、Standard/generic (dumb) serial support (CONFIG_SERIAL) [Y/m/n/?] 选择“y”,内核将支持串行口。

(4)、Support for console on serial port (CONFIG_SERIAL_CONSOLE) [N/y/?] 选择“y”,内核可将一个串行口用作系统控制台。如下图8 为字符设备配置界面。

图8 字符设备配置界面

8、Filesystems(文件系统)

(1)、Quota support (CONFIG_QUOTA) [N/y/?] 选择“y”,内核将支持磁盘限额。

(2)、Kernel automounter support (CONFIG_AUTOFS_FS) [Y/m/n/?] 选择“y”,内核将提供对automounter的支持,使系统在启动时自动 mount远程文件系统。

(3)、DOS FAT fs support (CONFIG_FAT_FS) [N/y/m/?] 选择“y”,内核将支

33

持DOS FAT文件系统。

(4)、ISO 9660 CDROM filesystem support (CONFIG_ISO9660_FS) [Y/m/n/?] 选择“y”,内核将支持ISO 9660 CDROM文件系统。

(5)、NTFS filesystem support (read only) (CONFIG_NTFS_FS) [N/y/m/?]选择“y”,用户就可以以只读方式访问NTFS文件系统。

(6)、/proc filesystem support (CONFIG_PROC_FS) [Y/n/?] /proc是存放Linux系统运行状态的虚拟文件系统,该项必须选择“y”。如下图

(7)、Second extended fs support (CONFIG_EXT2_FS) [Y/m/n/?] EXT2是Linux的标准文件系统,该项也必须选择“y”。如下图9为文件系统配置界面,该界面是为以后文件系统开发和设置提高操作系统的支持。

图9 文件系统配置界面

9、Network File Systems(网络文件系统)

(1)、NFS filesystem support (CONFIG_NFS_FS) [Y/m/n/?] 选择“y”,内核将支持NFS文件系统。

(2)、SMB filesystem support (to mount WfW shares etc.) (CONFIG_SMB_FS) 选择“y”,内核将支持SMB文件系统。

34

(3)、NCP filesystem support (to mount NetWare volumes) (CONFIG_NCP_FS) 选择“y”,内核将支持NCP文件系统。如图10给出了网络文件系统的支持界面。

图10 网络文件系统配置界面

3) 编译内核

1、建立编译时所需的从属文件

# cd /usr/src/linux # make dep

图11给出了操作系统内核编译结果,该结果给出了内核根据配置文件所需求的依附关系的文件。以便进行内核编译时进行编译。

图11 make dep 执行结果

2、清除内核编译的目标文件

35

# make clean 3、编译内核

# make zImage

内核编译成功后,会在/usr/src/linux/arch/i386/boot目录中生成一个新内核的映像文件zImage。如果编译的内核很大的话,系统会提示你使用make bzImage命令来编译。这时,编译程序就会生成一个名叫bzImage的内核映像文件。 4、编译可加载模块

如果用户在配置内核时设置了可加载模块,则需要对这些模块进行编译,以便将来使用insmod命令进行加载。

# make modules

# make modelus_install

编译成功后,系统会在/lib/modules目录下生成一个2.4.18子目录,里面存放着新内核的所有可加载模块。值得一提的是,可加载模块提供了调试的便利,但是正加了所编译内核的大小,同时需要手动加载才能使用,所以在嵌入式应用中,只有调试阶段才会使用,调试成功之后一般不使用模块形式。

36

4 Linux系统设备驱动程序概述

4.1 Linux设备驱动程序分类

Linux设备驱动程序在Linux的内核源代码中占有很大的比例,源代码的长度日益增加,主要是驱动程序的增加。在Linux内核的不断升级过程中,驱动程序的结构还是相对稳定。

Linux系统的设备分为字符设备(char device),块设备(block device)和网络设备(network device)三种。字符设备是指存取时没有缓存的设备。块设备的读写都有缓存来支持,并且块设备必须能够随机存取(random access),字符设备则没有这个要求。典型的字符设备包括鼠标,键盘,串行口等。块设备主要包括硬盘软盘设备,CD-ROM等。一个文件系统要安装进入操作系统必须在块设备上[89] [30] [31]。

网络设备在Linux里做专门的处理。Linux的网络系统主要是基于BSD unix的socket机制。在系统和驱动程序之间定义有专门的数据结构(sk_buff)进行数据的传递。系统里支持对发送数据和接收数据的缓存,提供流量控制机制,提供对多协议的支持。

4.2 编写驱动程序的一些基本概念

无论是什么操作系统的驱动程序,都有一些通用的概念。操作系统提供给驱动程序的支持也大致相同。下面简单介绍一下网络设备驱动程序的一些基本要求。

1)发送和接收

这是一个网络设备最基本的功能。一块网卡所做的无非就是收发工作。所以驱动程序里要告诉系统你的发送函数在哪里,系统在有数据要发送时就会调用你的发 送程序。还有驱动程序由于是直接操纵硬件的,所以网络硬件有数据收到最先能得到这个数据的也就是驱动程序,它负责把这些原始数据进行必要的处理然后送给系统。这里,操作系统必须要提供两个机制,一个是找到驱动程序的发送函数,一个是驱动程序把收到的数据送给系统。

2) 中断

中断在现代计算机结构中有重要的地位。操作系统必须提供驱动程序响应中断的能力。一般是把一个中断处理程序注册到系统中去。操作系统在硬件中断发生后 调

37

用驱动程序的处理程序。Linux支持中断的共享,即多个设备共享一个中断。

3) 时钟

在实现驱动程序时,很多地方会用到时钟。如某些协议里的超时处理,没有中断机制的硬件的轮询等。操作系统应为驱动程序提供定时机制。一般是在预定的时 间过了以后回调注册的时钟函数。在网络驱动程序中,如果硬件没有中断功能,定时器可以提供轮询(poll)方式对硬件进行存取。或者是实现某些协议时需要的超时重传等。

4.3 Linux系统网络设备驱动程序

1) 网络驱动程序的结构

所有的Linux网络驱动程序遵循通用的接口。设计时采用的是面向对象的方法。一个设备就是一个对象(device 结构),它内部有自己的数据和方法。每一个设备的方法被调用时的第一个参数都是这个设备对象本身。这样这个方法就可以存取自身的数据(类似面向对象程序设计时的this引用)。一个网络设备最基本的方法有初始化、发送和接收[37] 380] [39]。

初始化程序完成硬件的初始化、device中变量的初始化和系统资源的申请。发送程序是在驱动程序的上层协议层有数据要发送时自动调用的。一般驱动程序中不对发送数据进行缓存,而是直接使用硬件的发送功能把数据发送出去。接收数据一般是通过硬件中断来通知的。在中断处理程序里,把硬件帧信息填入一个skbuff结构中,然后调用netif_rx()传递给上层处理。

2) 网络驱动程序的基本方法

络设备做为一个对象,提供一些方法供系统访问。正是这些有统一接口的方法,掩蔽了硬件的具体细节,让系统对各种网络设备的访问都采用统一的形式,做到硬件无关性。下面解释最基本的方法

① 初始化(initialize)

驱动程序必须有一个初始化方法。在把驱动程序载入系统的时候会调用这个初始化程序。它做以下几方面的工作。检测设备。在初始化程序里你可以根据硬件的特征检查硬件是否存在,然后决定是否启动这个驱动程序。配置和初始化硬件。在初始化程序里你可以完成对硬件资源的配置,比如即插即用的硬件就可以在这个时候进行配置(Linux内核对PnP功能没有很好的支持,可以在驱动程序里完成这个功能)。配置

38

[49] [50] [51]

或协商好硬件占用的资源以后,就可以向系统申请这些资源。有些资源是可以和别的设备共享的,如中断。有些是不能共享的,如IO、DMA。接下来你要初始化device结构中的变量。最后,你可以让硬件正式开始工作。

② 打开(open)

open这个方法在网络设备驱动程序里是网络设备被激活的时候被调用(即设备状态由down-->up)。所以实际上很多在initialize中的工作可以放到这里来做。比如资源的申请,硬件的激活。如果dev->open返回非0(error),则硬件的状态还是down。

open方法另一个作用是如果驱动程序做为一个模块被装入,则要防止模块卸载时设备处于打开状态。在open方法里要调用MOD_INC_USE_COUNT宏。

③ 关闭(stop)

lose方法做和open相反的工作。可以释放某些资源以减少系统负担。close是在设备状态由up转为down时被调用的。另外如果是做为模块装入的驱动程序,close里应该调用MOD_DEC_USE_COUNT,减少设备被引用的次数,以使驱动程序可以被卸载。

另外close方法必须返回成功(0==success)。 ④ 发送(hard_start_xmit)

有的网络设备驱动程序都必须有这个发送方法。在系统调用驱动程序的xmit时,发送的数据放在一个sk_buff结构中。一般的驱动程序把数据传给硬件发出去。也有一些特殊的设备比如loopback把数据组成一个接收数据再回送给系统,或者dummy设备直接丢弃数据。

如果发送成功,hard_start_xmit方法里释放sk_buff,返回0(发送成功)。如果设备暂时无法处理,比如硬件忙,则返回1。这时如果dev->tbusy置为非0,则系统认为硬件忙,要等到dev->tbusy置0以后才会再次发送。tbusy的置0任务一般由中断完成。硬件在发送结束后产生中断,这时可以把tbusy置0,然后用mark_bh()调用通知系统可以再次发送。在发送不成功的情况下,也可以不置dev->tbusy为非0,这样系统会不断尝试重发。如果hard_start_xmit发送不成功,则不要释放sk_buff。传送下来的sk_buff中的数据已经包含硬件需要的帧头。所以在发送方法里不需要再填充硬件帧头,数据可以直接提交给硬件发送。sk_buff是被锁住的(locked),确保其他程序不会存取它。

⑤ 接收(reception)

驱动程序并不存在一个接收方法。有数据收到应该是驱动程序来通知系统的。一

39

般设备收到数据后都会产生一个中断,在中断处理程序中驱动程序申请一块sk_buff(skb),从硬件读出数据放置到申请好的缓冲区里。接下来填充sk_buff中 的一些信息。skb->dev = dev,判断收到帧的协议类型,填入skb->protocol(多协 议的支持)。把指针skb->mac.raw指向硬件数据然后丢弃硬件帧头(skb_pull)。还要设置skb->pkt_type,标明第二层(链路层)数据类型。可以是以下类型:

PACKET_BROADCAST : 链路层广播 PACKET_MULTICAST : 链路层组播 PACKET_SELF : 发给自己的帧

PACKET_OTHERHOST : 发给别人的帧(监听模式时会有这种帧)

最后调用netif_rx()把数据传送给协议层。netif_rx()里数据放入处理队列然后返回,真正的处理是在中断返回以后,这样可以减少中断时间。调用netif_rx()以后,

驱动程序就不能再存取数据缓冲区skb。 ⑥ 硬件帧头(hard_header)

硬件一般都会在上层数据发送之前加上自己的硬件帧头,比如以太网(Ethernet)就有14字节的帧头。这个帧头是加在上层ip、ipx等数据包的前面的。驱动程序提供一个hard_header方法,协议层(ip、ipx、arp等)在发送数据之前会调用这段程序。

硬件帧头的长度必须填在dev->hard_header_len,这样协议层回在数据之前保留好硬件帧头的空间。这样hard_header程序只要调用skb_push然后正确填入硬件帧头就可以了。

在协议层调用hard_header时,传送的参数包括(2.0.xx):数据的sk_buff,device指针,protocol,目的地址(daddr),源地址(saddr),数据长度(len)。数据长度不要使用sk_buff中的参数,因为调用hard_header时数据可能还没完全组织好。saddr是NULL的话是使用缺省地址(default)。daddr是NULL表明协议层不知道硬件目的地址。如果hard_header完全填好了硬件帧头,则返回添加的字节数。如果硬件帧头中的信息还不完全(比如daddr为NULL,但是帧头中需要目的硬件地址。典型的情况是以太网需要地址解析(arp)),则返回负字节数。hard_header返回负数的情况下,协议层会做进一步的build header的工作。目前Linux系统里就是做arp (如果hard_header返回正,dev->arp=1,表明不需要做arp,返回负,dev->arp=0,做arp)。

对hard_header的调用在每个协议层的处理程序里。如ip_output。 ⑦ 地址解析(xarp)

40

本文来源:https://www.bwwdw.com/article/ivo8.html

Top