论文部分内容阅读
摘要:介绍了一种基于ARM的嵌入式系统的设计方法;首先简要介绍了嵌入式硬件设计方案,然后重点阐述了BootLoader程序的设计、uCLinux的编译与移植,最后对uCLinux下的网络编程进行了分析。
关键词:ARM;嵌入式系统;linux;BootLoader
中图分类号:TP274文献标识码:A文章编号:1009-3044(2008)09-11724-02
The Design and Realization of Embedded System Based on ARM
LIN Hua
(Computer Science College of Yangtze University, Jingzhou 434023, China)
Abstract: This paper designed a new embedded system based on ARM.Firstly, it introduced the embedded system hardware design, Secondly, it analyzed detailedly the compile and transplant course of the uCLinux, in the end it discussed on the communication software design for uCLinux.
Key words: ARM; Embedded System; Linux; BootLoader
随着计算机技术和半导体技术的发展,嵌入式系统在个人数据处理、多媒体通信、在线事务处理、生产过程控制、交通控制等各个领域内得到了广泛的应用,各种嵌入式相关的新产品纷纷涌现。嵌入式系统越来越引起人们的关注,对嵌入式系统的研究,是掌握信息技术的核心。本文以处理器S3C44B0为核心,设计出一个基于ARM uCLinux的嵌入式系统,对于嵌入式系统有独到的研究。
1 嵌入式硬件方案设计
1.1 系统硬件平台
系统的硬件平台主要是由嵌入式处理器、FLASH、SDRAM、以太网接口、USB接口、UART接口、JTAG接口、I/O接口、I2C、系统电源、复位电路等组成。系统硬件结构图如图1所示:
1.2 主要硬件的设计
1.2.1 ARM嵌入式处理器的设计
处理器采用Samsung公司的S3C44B0微处理器,S3C44B0最突出的特点是它的CPU核使用ARM公司的16/32位ARM7TDMI RISC结构。ARM7TDMI系统扩充包括Thumb协处理器、片上ICE中断调试支持和32位硬件乘法器。S3C44B0通过在ARM7TDMI内容基础上扩展一系列完整的通用外围器件,主要包括:8KB的Cache,外部存储器控制器,LCD控制器,2通道UART,4通道DMA, 71个通用I/O端口,8个外部中断源等。
1.2.2 网络接口的设计
采用RTL8019AS芯片作为网络接口芯片,RTL8019AS是一种高度集成的以太网芯片,能简单的实现Plug and Play并兼容NE2000,芯片内部集成了DMA控制器、ISA总线控制器、16KSRAM,用户可以通过DMA方式把需要发送的数据写入片内SRAM中,让芯片自动将数据发送出去;而芯片在接收到数据后,用户可以通过DMA方式将数据读出。
1.2.3 USB接口的设计
采用PDIUSBD12作为USB接口芯片,PDIUSBD12是一款性价比很高的USB器件,完全符合USB1,1版的规范,它通常用作微控制器系统中实现与微控制器进行通信的高速通用并行接口,它还支持本地的DMA传输。
2 软件体系的设计
软件开发过程包括BootLoader设计、uCLinux的编译和移植、uCLinux下的网络编程和应用程序开发等。
2.1 BootLoader的设计与实现
在嵌入式系统中,BootLoader的作用与PC机上的BIOS类似,BootLoader可以完成对系统板上的主要部件进行初始化,也可以下载文件到系统板、对CPU、SDRAM、Flash,通过串行口Flash进行擦除与编程。
BootLoader作为系统复位或上电后首先运行的代码,一般应写入Flash存储器中并从起始物理地址0x0开始。BootLoader根据实现的功能不同,其复杂程度也各不相同。一个简单的BootLoader程序可以仅仅完成串行口的初始化,并进行通信,而功能完善的BootLoader可以支持比较复杂的命令集,对系统的软硬件资源进行合理的配置与管理。因此,用户可根据自身的需求实现相应的功能。BootLoader的设计步骤一般如下:
2.1.1 系统初始化
系统初始化主要实现以下的几个功能:
(1)进入SVC32工作模式(管理模式),以取得访问一些系统资源的权限。
(2)禁止所有的中断并清除所有中断标志。
(3)初始化SYSCFG寄存器。
(4)导入链接器预定义的变量,为存储器的重映射做准备。
2.1.2 Memory Remap的实现
Memory Remap就是地址重映射,即存储空间的重新分配,主要分为以下几个步骤:
2.1.2.1 初始化SDRAM
系统刚上电后,只有Flash是可用的, SDRAM没有被初始化,是不可用的。此时Flash被映射到0-2M的地方。通过配置相关寄存器完成SDRAM的初始化后,SDRAM被映射到了2-18M的位置上。此时的Memory Map为:0-2M是Flash,2-18M是SDRAM
2.1.2.2 将BootLoader从Flash中复制到SDRAM中
在此之前,BootLoader一直是在Flash里面执行的。为了实现Memory Remap,并且保证remap后BootLoader可以继续执行,需要把BootLoader自己全部复制到SDRAM里面去。BootLoader的大小利用链接器预定义的程序段变量。此时,在SDRAM里己经有了一个BootLoader的拷贝,但是必须注意,BootLoader还是在Flash里面执行。此时的Memory Map为:0-2M还是Flash,2-18 M还是SDRAM,但是SDRAM里面多了一个BootLoader的拷贝。
2.1.2.3 地址重映射
通过设置S3C44B0的相关寄存器,可以完成最后的地址重映射。SDRAM在0-16M的位置,而Flash被Map到了16-18M的位置。由于在SDRAM有一份BootLoader的拷贝,所以Remap以后BootLoader将转到SDRAM里面来执行。
2.1.3 Kernel的装载
此处的Kernel即为uClinux的内核映像,完成Kernel把控制权交给了uClinux来管理,Kernel将被装载到的装载后,系统就0x8000处。Kernel的装载过程如下所示:
(1)将RW段复制到OxA0,0000处,ZI段清零。
(2)设置堆栈指针SP=0x80,0000。
(3)跳转到函数loadkernel()中。
(4)将Kernel装载到0x8000,同时将PC指向0x8000。
(5)Kernel获得控制权,接管整个系统。
2.2 嵌入式操作系统的编译与移植
本系统采用uCLinux作为操作系统,uCLinux包含一整套的编译、调试等开发工具、内核源代码、各种文件系统、图形接口、各种协议、驱动程序以及丰富的应用程序。uCLinux操作系统主要由内核、Shell、文件结构组成;其中内核是系统的心脏,是运行程序和管理磁盘、打印机等硬件设备的核心程序。Linux的内核主要由5个子系统构成:进程调度、内存管理、虚拟文件系统、网络接口和进程间通信,在设计时,可以根据需要配置内核选择体系结构和裁剪内核。
2.2.1 uClinux交叉编译环境
uClinux交叉编译环境的建立可分为以下两个步骤:
(1)要在宿主PC机上安装标准Linux操作系统(也可以在Windows环境下安装Cygwin,模拟Linux环境,但可能在开发过程中产生兼容性错误,因此不推荐),如RedHat Linux,并对计算机的硬件设备如网卡进行配置,确认网络配置正确。
(2)要在宿主PC机上安装交又编译的一些工具链,主要有以下这些: arm-elf-binutils,arm-elf-gcc, genromfs,arm-elf-gdb, elf2flt等。
2.2.2 uClinux内核的编译和移植
uClinux内核采用模块化的组织结构,通过增减内核模块的方式来增减系统的功能,因此,通过正确合理的设置内核的功能模块,只编译系统所需功能的代码以减少内核的大小。编译工作的具体步骤下所示:
(1)解压源代码文件并进入到uClinux-Samsung目录中。
(2)make menuconfig进行内核配置。
(3)make dep寻找文件依赖关系。
(4)make clean清除无用文件。
(5)make lib only 编译库文件。
(6)make user_ only编泽用户应用程序文件。
(7)make image编泽内核文件。
(8)make编译完成,生成内核文件。
编译上述步骤后,会在images目录下看到一些文件,如:linux.text,linux.data,romfs.img,image.bin,image.rom,image.ram,boot.rom。
最后,将image.rom烧写入Flash存储器的0x0处,当系统复位或上电时,内核会自解压到SDRAM,并开始运行。可以通过串行口观察uClinux的启动情况。
如果编译和加载的过程都正确,就可以在超级终端中看到uClinux移植成功的相关提示。
2.3 uCLinux下的网络编程
2.3.1 uCLinux下的网络编程协议简介
uCLinux下的TCP/IP网络协议栈的各层之间是通过一系列互相连接层的软件来实现Internet地址族的。其中BSD socket层由专门用来处理BSD socket的通用套接字管理软件来处理,它由INET socket层来支持。INET socket为基于IP的协议TCP和UDP管理传输端点。 UDP是一个无连接协议,而TCP(传输控制协议)是一个,TCP靠的端对端协议。传输UDP包的时候,uCLinux不知道也不关心它们是否安全到达了口的地。TCP则不同。在TCP连接的两端都需要加上一个编号,以保证传输的数据被正确接收。在IP层,实现了Internet协议代码,这些代码要给传输的数据加上一个IP头,并且知道如何把传入的IP包送给TCP或者UDP协议。在IP层以下,就是网络设备来支持所有的uCLinux 网络工作,如PLIP, SLIP和以太网。
2.3.2 uCLinux环境下的socket编程
网络的socket数据传输是一种特殊的I/O,socket也是一种文件描述符,也具有一个类似文件的函数调用socket()。该函数返回一个整型的socket描述符,随后的连接建立、数据传输等操作都是通过该socket函数实现的。常用的socket类型有两种:流式socket和数据报式socket。两者的去别在于:前者对应于TCP服务,后者对应于UDP服务。uCLinux中socket编程中用到的函数有:
(1)socket函数:为了执行I/O,一个进程必须做的第一件事情就是调用socket函数,指定期望的通信协议类型(使用IPv4的TCP、使用IPv6的UDP, Unix域字节流协议等)。
(2)connect函数:TCP客户用connect函数来建立一个与TCP服务器的连挂。
(3)bind函数: 函数bind给套接口分配一个本地协议地址,对于网际协议,协议地址是非颠倒2位IPv4地址16位的TCP或UDP端口号的组合。
(4)listen函数:仅被除数TCP服务器调用。将未连接的套接口转换成被动套接口,指示内核应接受指向此套接口的连接请求。根据TCP状态转换调用函数listen导致套接口从CLOSED状态转换到LISEN状态。listen函数还规定了内核为此套接口排队的最大连接个数。
(5)accept函数:accept函数由TCP服务器调用,从已完成连接队列头返回下一个己完成连接。若己完成连接队列为空,则进程睡眠。
3 小结
嵌入式系统是以应用为中心、以计算机技术为基础、软硬件可裁剪、适应应用系统对功能、可靠性、成本、体积、功耗严格要求的专用计算机系统。嵌入式系统已经在各个领域 得到了广泛的应用,如远程监控、智能仪表、数控系统、消费产品等。随着嵌入式系统软硬件技术的飞速发展,其在行业的应用领域必将更为广阔,嵌入式系统的研究将会有非常广泛的前景。
参考文献:
[1] 魏忠,蔡勇,雷红卫.嵌入式开发详解[M].北京:电子工业出版社,2003.
[2] 王陈赜.ARM嵌入式技术实践教程[M].北京:航空航天大学出版社,2005.
[3] 李驹光,聂雪原,姜泽明,等.ARM应用系统开发详解[M].北京:清华大学出版社,2003.
[4] 杜春蕾.ARM体系结构与编程[M].清华大学出版社,2003.
关键词:ARM;嵌入式系统;linux;BootLoader
中图分类号:TP274文献标识码:A文章编号:1009-3044(2008)09-11724-02
The Design and Realization of Embedded System Based on ARM
LIN Hua
(Computer Science College of Yangtze University, Jingzhou 434023, China)
Abstract: This paper designed a new embedded system based on ARM.Firstly, it introduced the embedded system hardware design, Secondly, it analyzed detailedly the compile and transplant course of the uCLinux, in the end it discussed on the communication software design for uCLinux.
Key words: ARM; Embedded System; Linux; BootLoader
随着计算机技术和半导体技术的发展,嵌入式系统在个人数据处理、多媒体通信、在线事务处理、生产过程控制、交通控制等各个领域内得到了广泛的应用,各种嵌入式相关的新产品纷纷涌现。嵌入式系统越来越引起人们的关注,对嵌入式系统的研究,是掌握信息技术的核心。本文以处理器S3C44B0为核心,设计出一个基于ARM uCLinux的嵌入式系统,对于嵌入式系统有独到的研究。
1 嵌入式硬件方案设计
1.1 系统硬件平台
系统的硬件平台主要是由嵌入式处理器、FLASH、SDRAM、以太网接口、USB接口、UART接口、JTAG接口、I/O接口、I2C、系统电源、复位电路等组成。系统硬件结构图如图1所示:
1.2 主要硬件的设计
1.2.1 ARM嵌入式处理器的设计
处理器采用Samsung公司的S3C44B0微处理器,S3C44B0最突出的特点是它的CPU核使用ARM公司的16/32位ARM7TDMI RISC结构。ARM7TDMI系统扩充包括Thumb协处理器、片上ICE中断调试支持和32位硬件乘法器。S3C44B0通过在ARM7TDMI内容基础上扩展一系列完整的通用外围器件,主要包括:8KB的Cache,外部存储器控制器,LCD控制器,2通道UART,4通道DMA, 71个通用I/O端口,8个外部中断源等。
1.2.2 网络接口的设计
采用RTL8019AS芯片作为网络接口芯片,RTL8019AS是一种高度集成的以太网芯片,能简单的实现Plug and Play并兼容NE2000,芯片内部集成了DMA控制器、ISA总线控制器、16KSRAM,用户可以通过DMA方式把需要发送的数据写入片内SRAM中,让芯片自动将数据发送出去;而芯片在接收到数据后,用户可以通过DMA方式将数据读出。
1.2.3 USB接口的设计
采用PDIUSBD12作为USB接口芯片,PDIUSBD12是一款性价比很高的USB器件,完全符合USB1,1版的规范,它通常用作微控制器系统中实现与微控制器进行通信的高速通用并行接口,它还支持本地的DMA传输。
2 软件体系的设计
软件开发过程包括BootLoader设计、uCLinux的编译和移植、uCLinux下的网络编程和应用程序开发等。
2.1 BootLoader的设计与实现
在嵌入式系统中,BootLoader的作用与PC机上的BIOS类似,BootLoader可以完成对系统板上的主要部件进行初始化,也可以下载文件到系统板、对CPU、SDRAM、Flash,通过串行口Flash进行擦除与编程。
BootLoader作为系统复位或上电后首先运行的代码,一般应写入Flash存储器中并从起始物理地址0x0开始。BootLoader根据实现的功能不同,其复杂程度也各不相同。一个简单的BootLoader程序可以仅仅完成串行口的初始化,并进行通信,而功能完善的BootLoader可以支持比较复杂的命令集,对系统的软硬件资源进行合理的配置与管理。因此,用户可根据自身的需求实现相应的功能。BootLoader的设计步骤一般如下:
2.1.1 系统初始化
系统初始化主要实现以下的几个功能:
(1)进入SVC32工作模式(管理模式),以取得访问一些系统资源的权限。
(2)禁止所有的中断并清除所有中断标志。
(3)初始化SYSCFG寄存器。
(4)导入链接器预定义的变量,为存储器的重映射做准备。
2.1.2 Memory Remap的实现
Memory Remap就是地址重映射,即存储空间的重新分配,主要分为以下几个步骤:
2.1.2.1 初始化SDRAM
系统刚上电后,只有Flash是可用的, SDRAM没有被初始化,是不可用的。此时Flash被映射到0-2M的地方。通过配置相关寄存器完成SDRAM的初始化后,SDRAM被映射到了2-18M的位置上。此时的Memory Map为:0-2M是Flash,2-18M是SDRAM
2.1.2.2 将BootLoader从Flash中复制到SDRAM中
在此之前,BootLoader一直是在Flash里面执行的。为了实现Memory Remap,并且保证remap后BootLoader可以继续执行,需要把BootLoader自己全部复制到SDRAM里面去。BootLoader的大小利用链接器预定义的程序段变量。此时,在SDRAM里己经有了一个BootLoader的拷贝,但是必须注意,BootLoader还是在Flash里面执行。此时的Memory Map为:0-2M还是Flash,2-18 M还是SDRAM,但是SDRAM里面多了一个BootLoader的拷贝。
2.1.2.3 地址重映射
通过设置S3C44B0的相关寄存器,可以完成最后的地址重映射。SDRAM在0-16M的位置,而Flash被Map到了16-18M的位置。由于在SDRAM有一份BootLoader的拷贝,所以Remap以后BootLoader将转到SDRAM里面来执行。
2.1.3 Kernel的装载
此处的Kernel即为uClinux的内核映像,完成Kernel把控制权交给了uClinux来管理,Kernel将被装载到的装载后,系统就0x8000处。Kernel的装载过程如下所示:
(1)将RW段复制到OxA0,0000处,ZI段清零。
(2)设置堆栈指针SP=0x80,0000。
(3)跳转到函数loadkernel()中。
(4)将Kernel装载到0x8000,同时将PC指向0x8000。
(5)Kernel获得控制权,接管整个系统。
2.2 嵌入式操作系统的编译与移植
本系统采用uCLinux作为操作系统,uCLinux包含一整套的编译、调试等开发工具、内核源代码、各种文件系统、图形接口、各种协议、驱动程序以及丰富的应用程序。uCLinux操作系统主要由内核、Shell、文件结构组成;其中内核是系统的心脏,是运行程序和管理磁盘、打印机等硬件设备的核心程序。Linux的内核主要由5个子系统构成:进程调度、内存管理、虚拟文件系统、网络接口和进程间通信,在设计时,可以根据需要配置内核选择体系结构和裁剪内核。
2.2.1 uClinux交叉编译环境
uClinux交叉编译环境的建立可分为以下两个步骤:
(1)要在宿主PC机上安装标准Linux操作系统(也可以在Windows环境下安装Cygwin,模拟Linux环境,但可能在开发过程中产生兼容性错误,因此不推荐),如RedHat Linux,并对计算机的硬件设备如网卡进行配置,确认网络配置正确。
(2)要在宿主PC机上安装交又编译的一些工具链,主要有以下这些: arm-elf-binutils,arm-elf-gcc, genromfs,arm-elf-gdb, elf2flt等。
2.2.2 uClinux内核的编译和移植
uClinux内核采用模块化的组织结构,通过增减内核模块的方式来增减系统的功能,因此,通过正确合理的设置内核的功能模块,只编译系统所需功能的代码以减少内核的大小。编译工作的具体步骤下所示:
(1)解压源代码文件并进入到uClinux-Samsung目录中。
(2)make menuconfig进行内核配置。
(3)make dep寻找文件依赖关系。
(4)make clean清除无用文件。
(5)make lib only 编译库文件。
(6)make user_ only编泽用户应用程序文件。
(7)make image编泽内核文件。
(8)make编译完成,生成内核文件。
编译上述步骤后,会在images目录下看到一些文件,如:linux.text,linux.data,romfs.img,image.bin,image.rom,image.ram,boot.rom。
最后,将image.rom烧写入Flash存储器的0x0处,当系统复位或上电时,内核会自解压到SDRAM,并开始运行。可以通过串行口观察uClinux的启动情况。
如果编译和加载的过程都正确,就可以在超级终端中看到uClinux移植成功的相关提示。
2.3 uCLinux下的网络编程
2.3.1 uCLinux下的网络编程协议简介
uCLinux下的TCP/IP网络协议栈的各层之间是通过一系列互相连接层的软件来实现Internet地址族的。其中BSD socket层由专门用来处理BSD socket的通用套接字管理软件来处理,它由INET socket层来支持。INET socket为基于IP的协议TCP和UDP管理传输端点。 UDP是一个无连接协议,而TCP(传输控制协议)是一个,TCP靠的端对端协议。传输UDP包的时候,uCLinux不知道也不关心它们是否安全到达了口的地。TCP则不同。在TCP连接的两端都需要加上一个编号,以保证传输的数据被正确接收。在IP层,实现了Internet协议代码,这些代码要给传输的数据加上一个IP头,并且知道如何把传入的IP包送给TCP或者UDP协议。在IP层以下,就是网络设备来支持所有的uCLinux 网络工作,如PLIP, SLIP和以太网。
2.3.2 uCLinux环境下的socket编程
网络的socket数据传输是一种特殊的I/O,socket也是一种文件描述符,也具有一个类似文件的函数调用socket()。该函数返回一个整型的socket描述符,随后的连接建立、数据传输等操作都是通过该socket函数实现的。常用的socket类型有两种:流式socket和数据报式socket。两者的去别在于:前者对应于TCP服务,后者对应于UDP服务。uCLinux中socket编程中用到的函数有:
(1)socket函数:为了执行I/O,一个进程必须做的第一件事情就是调用socket函数,指定期望的通信协议类型(使用IPv4的TCP、使用IPv6的UDP, Unix域字节流协议等)。
(2)connect函数:TCP客户用connect函数来建立一个与TCP服务器的连挂。
(3)bind函数: 函数bind给套接口分配一个本地协议地址,对于网际协议,协议地址是非颠倒2位IPv4地址16位的TCP或UDP端口号的组合。
(4)listen函数:仅被除数TCP服务器调用。将未连接的套接口转换成被动套接口,指示内核应接受指向此套接口的连接请求。根据TCP状态转换调用函数listen导致套接口从CLOSED状态转换到LISEN状态。listen函数还规定了内核为此套接口排队的最大连接个数。
(5)accept函数:accept函数由TCP服务器调用,从已完成连接队列头返回下一个己完成连接。若己完成连接队列为空,则进程睡眠。
3 小结
嵌入式系统是以应用为中心、以计算机技术为基础、软硬件可裁剪、适应应用系统对功能、可靠性、成本、体积、功耗严格要求的专用计算机系统。嵌入式系统已经在各个领域 得到了广泛的应用,如远程监控、智能仪表、数控系统、消费产品等。随着嵌入式系统软硬件技术的飞速发展,其在行业的应用领域必将更为广阔,嵌入式系统的研究将会有非常广泛的前景。
参考文献:
[1] 魏忠,蔡勇,雷红卫.嵌入式开发详解[M].北京:电子工业出版社,2003.
[2] 王陈赜.ARM嵌入式技术实践教程[M].北京:航空航天大学出版社,2005.
[3] 李驹光,聂雪原,姜泽明,等.ARM应用系统开发详解[M].北京:清华大学出版社,2003.
[4] 杜春蕾.ARM体系结构与编程[M].清华大学出版社,2003.