基于ARM和Linux的嵌入式平台的构建

发布者:朱颜素韵最新更新时间:2011-09-21 关键字:ARM  Linux  嵌入式平台 手机看文章 扫描二维码
随时随地手机看文章

进入后PC 时代以来, 伴随着设计和制造技术的发展, 集成电路从当初的晶体管集成发展到现在的IP 集成, 即SoC(System on Chip ) 设计技术。促使嵌入式系统渗透到了当今社会中的各个行业, 并且发挥越来越重要的作用。嵌入式系统一般可定义为以应用为中心、以计算机技术为基础、软硬件可裁剪、适用于应用系统且对功能、成本、体积、功耗有严格要求的专用计算机系统,它的主要特点是嵌入、应用。

  随着各种嵌入式设备功能越来越强大, 在设备中使用嵌入式操作系统也成为必然。Linux 操作系统具有开放源代码、易于移植、资源丰富、免费等特点, 在嵌入式领域的地位越来越重要。嵌入式Linux 和PC 上的Linux是同一套内核代码, 只是裁剪的程度不一样, 所以, 很多在PC 上开发的软件, 经过交叉编译后可以直接在嵌入式设备上运行。本文主要涉及到Bootloader 移植和Linux-2.6.32.2 内核的移植、根文件系统移植、在S3C2440平台上构建完整的嵌入式开发平台三个方面。

  1 交叉开发环境的建立

  在进行嵌入式软件开发之前, 必须要在PC 上建立ARM 的交叉编译环境。交叉编译就是在PC 平台上生成可以在ARM 平台上运行的代码。其中主要包括ARM 的交叉编译器arm-elf-gcc 和交叉连接器arm-elf-ld 。本文采用的交叉编译器的版本是gcc -3.4.5 -glibc -2.3.6 。

  交叉编译流程如图1 所示。

图1 嵌入式系统交叉编译流程

  2 BootLoader 引导加载程序

  BootLoader 是一段在系统上电时开始执行的程序,用以初始化硬件设备, 准备好软件环境, 设置好启动参数, 最后引导操作系统, 与PC 上的BIOS 程序相似。当前开放源码的Linux 引导程序主要有x86 架构的LILO、GRUB, 对于ARM 架构的主要有Vivi 和U-Boot 。本文使用U-Boot 作为引导程序。U-Boot(Universal Boot Loader) ,即通用的BootLoader , 遵循GPL 条款开放源代码。U-Boot相对于Vivi 功能更加强大, 也更方便后续程序的调试。

  BootLoader 的启动一般分为两个阶段, 第一阶段的代码主要是用汇编语言编写, 主要的功能是完成硬件设备的初始化, 为加载第二阶段的代码准备RAM 空间, 设置好堆栈; 第二阶段主要用C 语言编写, 检测内存映射, 将内核映像和根文件系统从Nand Flash 读到RAM中, 为内核启动设置参数, 引导内核。

  U-Boot 的源代码可以从ftp://ftp.denx.de/pub/u-boot/进行下载, 本文使用的U-Boot 版本是U-Boot2009.08 。

  移植U-Boot 的关键步骤如下:

  (1) 首先, 将include/configs 目录下的smdk2410.h 复制并改名为mini2440.h , 根据U-Boot 的说明可以知道,如果要使用开发板board/ , 则先执行“make ”_config 命令进行配置, 然后执行“make all ” , 生成可执行文件。所以, 修改U-Boot 顶层的Makefile 文件, 添加下面一行mini2440_config : unconfig@ $ (MKCONFIG) $ (@:_config = ) arm arm920t mini2440frank s3c24x0 。这里有几个重要的参数,arm 指CPU 的架构,arm920t 指CPU 的类型,s3c24x0 指CPU 的型号。这样就可以使用make mini2440_config 这条命令进行配置。

  (2)本文使用的U-Boot 是从Nand Flash 启动的, CPU可以直接访问Nand Flash 中前4 KB 代码, 利用这4 KB代码把U-Boot 中绝大部分代码拷贝到内存中[ 3]。其中下面的代码就是调用C 语言中的Nand Flash 的读写函数, 该函数主要把Nand Flash 中4 KB 以后的代码复制到RAM 中。在编写nand_read_ll 的函数时, 注意参考Nand Flash 的数据手册, 对大页和小页的Nand Flash , 其读写的命令和时序是不同的。

  @copy U-Boot to RAM

  ldr r0,=TEXT_BASE

  mov r1,#0x0

  mov r2,#0x60000

  bl nand_read_ll

  tst r0,#0x0

  beq ok_nand_read

  由于在后面加载Linux 内核和根文件系统时, 使用的是tftp 方式, 所以必须添加DM9000EP 网卡的驱动。在mini2440.h 文件中, 其主要的配置如下:

  #define CONFIG_DRIVER_DM9000 1

  #define CONFIG_NET_MULTI 1

  #define CONFIG_DM9000_NO_SROM 1

  #define CONFIG_DM9000_BASE 0x20000300

  #define DM9000_DATA (CONFIG_DM9000_BASE +4)

  其中,CONFIG_DM9000_BASE 宏是最重要的, 因为它定义的是网卡的地址, 不同的网卡有不同的地址,DM9000EP 访问的基址为0x20000000, 之所以再偏移0x300 是由它的特性决定的。

  (3) 要正确引导Linux 内核, 还需要配置下面几个重要的宏定义, 这几个宏定义不同, 意味着引导Linux 内核的方式也不同。

  #define CONFIG_BOOTARGS"noinitrd root=/dev/mtdblock3

  init=/linuxrc console=ttySAC0,115200 mem=64M"

  其中,root =/dev/mtdblock3 是由Linux 中的Nand Flash 分区所决定的, 意味着Nand Flash 的第4 个分区为根文件系统。

  #define CONFIG_BOOTCOMMAND"nand read 0x32000000 0x60000 0x560000;bootm 0x32000000"

  这个宏定义是将Nand Flash 中0x60000 -0x560000( 和kernel 分区一致) 的内容读到内存0x32000000 中, 然后用bootm 命令来执行。

  要正常地引导Linux 内核, 必须要具备如下几个条件:

  (1)CPU 寄存器

  R0=0 ;

  R1= 机器类型ID ; 对于ARM 结构的CPU, 其机器类

  型ID 在linux/arch/arm/tools/mach-types ;

  R2=启动参数标记列表在RAM 中起始基地址。

  (2)CPU 工作模式

  必须禁止中断(IRQs 和FIQs ) ;

  CPU 必须为SVC 模式。

  (3)Cach 和MMU 的设置

  MMU 必须关闭;

  指令Cach 可以打开也可以关闭;

  数据Cach 必须关闭。

  3 Linux2.6.32.2 内核的移植

  3.1 内核的获取

  Linux 内核的更新很快, 可以从http://www.kernel.org/pub/linux/kernel/ 得到最新的Linux 内核版本, 本文使用的Linux 内核版本是Linux -2.6.32.2, 交叉编译工具使用符合EABI 标准的arm-linux-gcc-4.3.2 。

  3.2 内核的移植

  可以在内核的根目录下, 运行make menuconfig 命令, 对内核进行适当的裁剪, 以适应硬件平台。

  对内核进行适当的裁剪, 以适应硬件平台。

  (1) 修改Makefile 文件

  欲设置Linux 的默认平台为ARM 平台, 需进入Linux-2.6.32 文件夹中, 修改此目录下的Makefile 文件。

  export KBUILD_BUILDHOST := $(SUBARCH)

  ARCH ?=arm // 使用的目标平台

  CROSS_COMPILE ?=arm-linux- // 使用的交叉编译器,

  这里使用系统默认的编译器

  (2) 关于机器码

  在启动内核时, 根据BootLoader 传入的机器码(MACH_TYPE) 来决定应启动哪种目标平台[ 6], 本开发平台的机器码为1999 。机器码存放在文件opt/kernel/linux-2.6.32.2/arch/arm/tools/mach-types 中。

  mini2440 MACH_MINI2440 MINI2440 1999 // 机器码

  如果机器码不匹配, 引导内核不成功, 则会出现如下的错误提示:

  Uncompressing

  Linux……………………………………………………………………………done, booting the kernel.[page]

(3) 修改时钟源

  将/kernel/linux -2.6.32.2/arch/arm/mach -s3c2440/ 目录下的mach-smdk2440.c 文件改名为mach-mini2440.c。

  因为mini2440 和mach-smdk2440.c 极其相似, 以该文件为基础进行修改, 在mach -mini2440.c 文件中将staticvoid__init smdk2440_map_io ( void ) 函数中的晶振频率修改为mini2440 开发板上实际使用的12000000。

  (4) 为内核打上yaffs2 补丁

  ①Yaffs2 文件系统是专门针对嵌入式设备, 特别是使用Nand Flash 作为存储器的嵌入式设备而创建的一种文件系统, 使用yaffs2 就可以支持大页的Nand Flash。

  进入yaffs2 源代码目录执行如下命令:

  #./patch -ker.sh c /opt/FriendlyARM/mini2440/linux -2.6.32.2

  ②配置内核以支持Yaffs2 文件系统

  在Linux 内核源代码根目录运行make xconfig, 在“File systems ” 选项中, 找到“Miscellaneous filesystems ” 菜单项, 找到“YAFFS2 file system support ” 并选中它, 这样就在内核中添加了yaffs2 文件系统的支持, 保存并退出。然后在命令行中, 执行make zImage 。

  (5) 修改Nand Flash 分区信息

  ①在mach-mini2440.c 文件中添加Nand Flash 的分区信息, 下面的代码将Nand Flash 分成了4 个分区, 第1 分区也是BootLoader 所在的分区, 对应dev/mtdblock0 ;第2 个分区是U-Boot 的参数分区, 对应dev/mtdblock1 ;第3 个分区是内核分区, 对应dev/mtdblock2 ; 第4 个分区为根文件系统分区对应dev/mtdblock3 。分区结构图如表1 所示。

表1 128 MB Nand Flash 的分区结构图

  其部分实现代码如下:

  static struct mtd_partition mini2440_default_nand_part[] ={

  [0] = {

  .name="U-boot",

  .offset= 0,

  .size= 0x00040000,

  }

  其中name 是分区的名字,offset 是偏移的开始地址,size是分区的大小, 其余部分的分区与此类似。

  ②下面代码是添加Nand Flash 的设置表, 因为板子上只有一片Nand Flash, 因此也就只有一个设置表。

  static struct s3c2410_nand_set mini2440_nand_sets[] = {

  [0] = {

  .name= "NAND",

  .nr_chips= 1,

  .nr_partitions=

  ARRAY_SIZE(mini2440_default_nand_part),

  .partitions= mini2440_default_nand_part,

  }

  }

  ③上面的设置完成后, 还需要将Nand Flash 设备注册到系统中。下面这段代码就是将Nand Flash 设备添加到开发板的设备列表结构。

  static struct platform_device *mini2440_devices [] __initdata

  = {

  &s3c_device_nand,

  }

  ④在mini2440_machine_init 函数中添加平台的数据信息。

  static void __init mini2440_machine_init(void){

  s3c_device_nand.dev.platform_data=&mini2440_nand_info;

  }

  现在可以进入kernel/linux-2.6.32.2/arch/arm/boot 目录,然后执行下面的命令, 就会在该目录下生成uImage.img格式的、U-Boot 可以引导的内核镜象。

  Mkimage – n ‘linux-2.6.32.2 ’ –A arm – O linux–T kernel –C none – a 0x30008000 – e 0x30008000 –d zImage uImage.img

  至此, 可以把生成的uImage.img 格式的镜像文件复制到tftp 目录下, 使用tftp 进行下载。

  3.3 文件系统

  所谓根文件系统, 就是创建各个目录, 例如在/bin 、/sbin/ 目录下存放各种可执行的程序, 在/etc 目录下存放配置文件, 在/lib 目录下存放库文件。

  可以利用Busybox 工具创建根文件系统,Bosybox 是一个遵循GPL v2 协议的开源项目, 它在编写过程中对文件大小进行优化, 并考虑了系统资源有限( 例如内存)的情况, 使用Busybox 可以自动生成根文件系统所需的bin、sbin、usr 目录和linuxrc 文件, 可以使用make menuconfig对Busybox 的选项进行配置。

  (1) 进入opt/kernel, 创建一个shell 脚本用于构建根文件系统的各个目录, 并且为其增加执行权限;(2)Linux 中的init 进程会根据etc/inittab 文件创建其他子进程, 下面代码是inittab 文件中的内容, 说明了系统启动后首先执行的脚本文件是rcS, 虚拟的终端是串口0, 当按下ctr+alt+del 时重启系统,inittab 文件的作用就是控制系统启动时和启动后一些程序的运行。

  #etc/inittab

  ::sysinit:/etc/init.d/rcS

  s3c2410_serial0::askfirst:-/bin/sh

  ::ctrlaltdel:/sbin/reboot

  ::shutdown:/bin/umount -a-r

  (3) 创建etc/init.d/rcS 文件, 这是一个脚本文件, 可以在里面添加要自动执行的一些命令。

  #! /bin/sh

  PATH=/sbin:/bin:/usr/sbin:/usr/bin

  runlevel=S // 运行的级别

  prevlevel=N

  umask 022 // 文件夹的掩码

  mount -a // 挂载/etc/fstab/ 文件指定的所有的文件系统

  mdev-s

  /bin/hostname -F /etc/sysconfig/HOSTNAME// 主机的名字

  使用yaffs 源码提供的工具制作文件系统的映像文件。由于128 MB 的Nand Flash 是大页结构, 所以需要使用相应的大页制作工具; 使用命令mkyaffs2image rootfsrootfs.img 生成根文件系统映像文件。

  本文通过对U-Boot 移植和Linux 内核移植的讨论,给出了移植U-Boot 和Linux 到大多数开发板的关键部分。由于移植的复杂性, 不可能包括全部步骤, 但通过本文的阐述可以了解移植的基本流程和关键点, 为移植不同版本到其他硬件平台提供了参考, 也为应用程序的开发搭建了一个比较完整的嵌入式平台。
 

 

 

关键字:ARM  Linux  嵌入式平台 引用地址:基于ARM和Linux的嵌入式平台的构建

上一篇:基于ARM的RFID中间件系统设计
下一篇:基于ARM的小区供水嵌入式智能控制系统

推荐阅读最新更新时间:2024-03-16 12:41

学习嵌入式ARM的步骤--对初学者
看到很多 arm的论坛里有 很多 人想学arm,但不知如何去学~现在我就 列出一下学习这方面的步骤-----基于linux系统的,还有哪位大侠觉得步骤与方法不对,请及时纠正 学习步骤如下:(一步步来哦:) 1、Linux 基础 安装Linux操作系统 Linux文件系统 Linux常用命令 Linux启动过程详解 熟悉Linux服务 能够独立安装Linux操作系统 能够熟练使用Linux系统的基本命令 认识Linux系统的常用服务 安装Linux操作系统 Linux基本命令实践 设置Linux环境变量 定制Linux的服务 Shell 编程基础使用vi编辑文件 使用Emacs编辑文件?? 使用其他编辑器?? 2、S
[单片机]
集成ARM硬核 Altera嵌入式计划能否二度开花
一年前Altera宣布获得了MIPS架构授权,随后其竞争对手Xilinx宣布与ARM合作。就在业界默认两家公司将分别成为MIPS及ARM在FPGA领域的“代表”后,Altera于近日公布了其最新的嵌入式计划,打破了业界的猜测:Altera的嵌入式合作伙伴中包括了ARM、MIPS以及Intel,涵盖了所有主流的CPU架构商,从规模来看,已远超Xilinx。 这是十年来,Altera第二次宣布嵌入式计划,2000年时,其推出了嵌入处理器Excalibur系列,包括其自主NIOS软核以及集成ARM922T和MIPS32 4Kc两款产品,但很遗憾该计划的三款内核中,只有NIOS软核系列有后续开发,其他两款产品陆续退出市场。Alt
[EEWORLD独家]
arm学习笔记006之redhat5.0的安装定制以及tftp服务器的安装
一、小红帽的安装定制 新建虚拟机时Ethernet要选择Bridged方式; 要定制; 定制中有程序配置的选择:服务器- 老的网络服务器- 可选的软件包- tftp-server-0.42-3.1.i386,如下图 在重新引导中: 防火墙我选的是禁用; SELinux选的是默认的强制,选择“禁用“麻烦,其实在后面配置tftp服务器是查看到的SELinux是disable的 Kdump可以选择”启用“ 设置软件更新:以后注册 注意:这样安装好的小红帽,其中的tftp服务器是不能用的,需要进行下面的配置 在”定制“中没有选择tftp时,小红帽中是没有”/tftpboot“的文件夹路径的
[单片机]
<font color='red'>arm</font>学习笔记006之redhat5.0的安装定制以及tftp服务器的安装
基于S3C6410的ARM11学习(四) 核心初始化之设置处理器模式
之前已经设置中断向量表了,下面就要进行设置处理器的模式。 对于ARM11,有8种模式,不同的模式,权限是不一样的。在bootloader开发的时候,我们需要将处理器的模式设置为Supervisor模式,即SVC模式。这样,权限就高了,可以访问ARM的所有资源。用户模式的权限是最低的,而且要从用户模式切换到其他模式的话,只能通过异常的方式。 用户模式(User): ARM处理器正常的程序执行状态 快速中断模式(FIQ): 高速数据传输或通道处理 外部中断模式(IRQ): 通用的中断处理 管理模式(Supervisor): 操作系统使用保护模式 数据访问终止模式(Abort): 当数据或指令预取终止时进入该
[单片机]
基于S3C6410的<font color='red'>ARM</font>11学习(四) 核心初始化之设置处理器模式
2006 ARM Code-O-Rama设计大赛成果揭晓
遴选出冠、亚、季军及三名佳作队伍 参与竞赛同学均感获益良多,并期待今年有更好的表现   由全球IP供应领导厂商ARM与国家芯片系统设计中心(台湾)(National Chip  Implementation Center, CIC)共同主办的第一届ARM Code-O-Rama 设计大赛,历 经二个多月的激烈赛事后,成绩已于1月26日揭晓。在评审委员仔细审核后,遴选 出冠、亚、季军三支优秀队伍,将获得主办单位颁发的高额奖金及奖状。此外,评 审委员有感于此次参与竞赛的队伍,在极短时间内所展现出的努力与潜力,经严密 讨论后,额外增设三名佳作奖项,并颁发奖状以资鼓励。此次竞赛的得奖名单如 下:
[焦点新闻]
ARM核心板之--电平转换电路(上)
电子工程师在电路设计过程中,经常会碰到处理器MCU的I/O电平与模块的I/O电平不相同的问题,为了保证两者的正常通信,需要进行电平转换。以下,我们将针对电平转换电路做出详细的分析。 对于多数MCU,其引脚基本上是CMOS结构,因此输入电压范围是:高电平不低于0.7VCC,低电平不高于0.3VCC。 但在介绍电平转换电路之前,我们需要先来了解以下几点: ⒈ 解决电平转换问题,最根本的就是要解决电平的兼容问题,而电平兼容原则有两条:①VOH VIH ②VOL VIL 图 1 阈值电压 ⒉ 对于多电源系统,某些器件不允许输入电平超过电源电压,针对有类似要求的器件,电路上应适当做些保护。 ⒊ 电平转换电路会影
[嵌入式]
<font color='red'>ARM</font>核心板之--电平转换电路(上)
I2C总线在Linux系统中的驱动设计
引言   Linux操作系统因具有源代码公开、便于裁减、有广泛的处理器支持等优点,成为当前嵌入式系统的热门选择。基于I2C总线的键盘扩展设备主要用于满足嵌入式设备中对多按键的需求,驱动程序在系统启动时对硬件进行初始化。在系统启动后实现硬件和应用程序之间的数据交互。针对S3C2410微处理器和键盘扫描管理器件,深入讨论如何在嵌入式操作系统ARM Linux中实现ZLG7290的驱动。   2 I2C总线   I2C总线是器件间串行传输总线,以其规范和带I2C接口的外围器件获得广泛应用。S3C2410处理器内置有I2C总线接口。I2C总线是由数据线SDA和时钟SCL构成的串行总线,可发送和接收数据,每个器件都有一个唯一的地址识
[单片机]
I2C总线在<font color='red'>Linux</font>系统中的驱动设计
基于arm920T嵌入式Linux的实验平台环境的构建
面向A R M微处理器构架的嵌入式操作系统的使用量这些年持续增长,在各种嵌入式操作系统中, L inux是获得支持最多的第三大力量。 目前,ARM L inux支持包括ARM610、A RM710、ARM720T cores、ARM920T cores、StrongARM 110、StrongARM1100、XScale等系列的arm处理器。 Gameboy是目前比较流行的8位掌上游戏机,通常被简称为GB,它的最终态Game Boy Color (GBC)是完全向后兼容的。Gnuboy是GB /GBC的软件模拟器,是一种自由软件,它是基于Qt系统的,能够运行几乎所有的黑白和彩色的GB /GBC游戏ROM,但运行复杂
[单片机]
基于<font color='red'>arm</font>920T<font color='red'>嵌入式</font><font color='red'>Linux</font>的实验<font color='red'>平台</font>环境的构建
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
  • 学习ARM开发(16)
    ARM有很多东西要学习,那么中断,就肯定是需要学习的东西。自从CPU引入中断以来,才真正地进入多任务系统工作,并且大大提高了工作效率。采 ...
  • 学习ARM开发(17)
    因为嵌入式系统里全部要使用中断的,那么我的S3C44B0怎么样中断流程呢?那我就需要了解整个流程了。要深入了解,最好的方法,就是去写程序 ...
  • 学习ARM开发(18)
    上一次已经了解ARM的中断处理过程,并且可以设置中断函数,那么它这样就可以工作了吗?答案是否定的。因为S3C44B0还有好几个寄存器是控制中 ...
  • 嵌入式系统调试仿真工具
    嵌入式硬件系统设计出来后就要进行调试,不管是硬件调试还是软件调试或者程序固化,都需要用到调试仿真工具。 随着处理器新品种、新 ...
  • 最近困扰在心中的一个小疑问终于解惑了~~
    最近在驱动方面一直在概念上不能很好的理解 有时候结合别人写的一点usb的例子能有点感觉,但是因为arm体系里面没有像单片机那样直接讲解引脚 ...
  • 学习ARM开发(1)
  • 学习ARM开发(2)
  • 学习ARM开发(4)
  • 学习ARM开发(6)
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved