<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>

新聞中心

EEPW首頁(yè) > 嵌入式系統 > 設計應用 > 基于A(yíng)RM和Linux的嵌入式平臺的構建

基于A(yíng)RM和Linux的嵌入式平臺的構建

作者: 時(shí)間:2012-02-03 來(lái)源:網(wǎng)絡(luò ) 收藏

摘要: 首先介紹了系統的概念, 及相關(guān)硬件和軟件版本。然后, 主要介紹了 的引導程序U-Boot 的移植, 以及開(kāi)源、免費操作系統2.6.32.2 的移植。最后, Nand Flash 存儲器的Yaffs2 文件系統,利用BusyBox 創(chuàng )建根文件系統。 的嵌入式系統搭建基本完成,可以在此上添加更多驅動(dòng),以便更好地開(kāi)發(fā)應用程序。

本文引用地址:http://dyxdggzs.com/article/149793.htm

進(jìn)入后PC 時(shí)代以來(lái), 伴隨著(zhù)設計和制造技術(shù)的發(fā)展, 集成電路從當初的晶體管集成發(fā)展到現在的IP 集成, 即SoC(System ON Chip ) 設計技術(shù)。促使嵌入式系統滲透到了當今社會(huì )中的各個(gè)行業(yè), 并且發(fā)揮越來(lái)越重要的作用。嵌入式系統一般可定義為以應用為中心、以計算機技術(shù)為基礎、軟硬件可裁剪、適用于應用系統且對功能、成本、體積、功耗有嚴格要求的專(zhuān)用計算機系統,它的主要特點(diǎn)是嵌入、應用。

隨著(zhù)各種嵌入式設備功能越來(lái)越強大, 在設備中使用嵌入式操作系統也成為必然。Linux 操作系統具有開(kāi)放源代碼、易于移植、資源豐富、免費等特點(diǎn), 在嵌入式領(lǐng)域的地位越來(lái)越重要。嵌入式Linux 和PC 上的Linux是同一套內核代碼, 只是裁剪的程度不一樣, 所以, 很多在PC 上開(kāi)發(fā)的軟件, 經(jīng)過(guò)交叉編譯后可以直接在嵌入式設備上運行。本文主要涉及到Bootloader 移植和Linux-2.6.32.2 內核的移植、根文件系統移植、在S3C2440平臺上完整的嵌入式開(kāi)發(fā)平臺三個(gè)方面。

1 交叉開(kāi)發(fā)環(huán)境的建立

在進(jìn)行嵌入式軟件開(kāi)發(fā)之前, 必須要在PC 上建立 的交叉編譯環(huán)境。交叉編譯就是在PC 平臺上生成可以在 平臺上運行的代碼。其中主要包括ARM 的交叉編譯器arm-elf-gcc 和交叉連接器arm-elf-ld 。本文采用的交叉編譯器的版本是gcc -3.4.5 -glibc -2.3.6 。

交叉編譯流程如圖1 所示。

圖1 嵌入式系統交叉編譯流程

圖1 嵌入式系統交叉編譯流程

2 BootLoader 引導加載程序

BootLoader 是一段在系統上電時(shí)開(kāi)始執行的程序,用以初始化硬件設備, 準備好軟件環(huán)境, 設置好啟動(dòng)參數, 最后引導操作系統, 與PC 上的BIOS 程序相似。當前開(kāi)放源碼的Linux 引導程序主要有x86 架構的LILO、GRUB, 對于A(yíng)RM 架構的主要有Vivi 和U-Boot 。本文使用U-Boot 作為引導程序。U-Boot(Universal Boot Loader) ,即通用的BootLoader , 遵循GPL 條款開(kāi)放源代碼。U-Boot相對于Vivi 功能更加強大, 也更方便后續程序的調試。

BootLoader 的啟動(dòng)一般分為兩個(gè)階段, 第一階段的代碼主要是用匯編語(yǔ)言編寫(xiě), 主要的功能是完成硬件設備的初始化, 為加載第二階段的代碼準備RAM 空間, 設置好堆棧; 第二階段主要用C 語(yǔ)言編寫(xiě), 檢測內存映射, 將內核映像和根文件系統從Nand Flash 讀到RAM中, 為內核啟動(dòng)設置參數, 引導內核。

  U-Boot 的源代碼可以從ftp://ftp.denx.de/pub/u-boot/進(jìn)行下載, 本文使用的U-Boot 版本是U-Boot2009.08 。

移植U-Boot 的關(guān)鍵步驟如下:

(1) 首先, 將include/configs 目錄下的smdk2410.h 復制并改名為MINI2440.h , 根據U-Boot 的說(shuō)明可以知道,如果要使用開(kāi)發(fā)板board/board_name > , 則先執行“make board_nAME > ”_config 命令進(jìn)行配置, 然后執行“make all ” , 生成可執行文件。所以, 修改U-Boot 頂層的Makefile 文件, 添加下面一行mini2440_config : unconfig@ $ (MKCONFIG) $ (@:_config = ) arm arm920t mini2440frank s3c24x0 。這里有幾個(gè)重要的參數,arm 指CPU 的架構,arm920t 指CPU 的類(lèi)型,s3c24x0 指CPU 的型號。這樣就可以使用make mini2440_config 這條命令進(jìn)行配置。

(2)本文使用的U-Boot 是從Nand Flash 啟動(dòng)的, CPU可以直接訪(fǎng)問(wèn)Nand Flash 中前4 KB 代碼, 利用這4 KB代碼把U-Boot 中絕大部分代碼拷貝到內存中[ 3]。其中下面的代碼就是調用C 語(yǔ)言中的Nand Flash 的讀寫(xiě)函數, 該函數主要把Nand Flash 中4 KB 以后的代碼復制到RAM 中。在編寫(xiě)nand_read_ll 的函數時(shí), 注意參考Nand Flash 的數據手冊, 對大頁(yè)和小頁(yè)的Nand Flash , 其讀寫(xiě)的命令和時(shí)序是不同的。

  @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 內核和根文件系統時(shí), 使用的是tftp 方式, 所以必須添加DM9000EP 網(wǎng)卡的驅動(dòng)。在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 宏是最重要的, 因為它定義的是網(wǎng)卡的地址, 不同的網(wǎng)卡有不同的地址,DM9000EP 訪(fǎng)問(wèn)的基址為0x20000000, 之所以再偏移0x300 是由它的特性決定的。

(3) 要正確引導Linux 內核, 還需要配置下面幾個(gè)重要的宏定義, 這幾個(gè)宏定義不同, 意味著(zhù)引導Linux 內核的方式也不同。

  #define CONFIG_BOOTARGSnoinitrd root=/dev/mtdblock3

  init=/linuxrc console=ttySAC0,115200 mem=64M
其中,root =/dev/mtdblock3 是由Linux 中的Nand Flash 分區所決定的, 意味著(zhù)Nand Flash 的第4 個(gè)分區為根文件系統。

  #define CONFIG_BOOTCOMMANDnand read 0x32000000 0x60000 0x560000;bootm 0x32000000

這個(gè)宏定義是將Nand Flash 中0x60000 -0x560000( 和kernel 分區一致) 的內容讀到內存0x32000000 中, 然后用bootm 命令來(lái)執行。

要正常地引導Linux 內核, 必須要具備如下幾個(gè)條件:

 ?。?)CPU 寄存器

  R0=0 ;

  R1= 機器類(lèi)型ID ; 對于A(yíng)RM 結構的CPU, 其機器類(lèi)

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

  R2=啟動(dòng)參數標記列表在RAM 中起始基地址。

(2)CPU 工作模式

  必須禁止中斷(IRQs 和FIQs ) ;

  CPU 必須為SVC 模式。

(3)Cach 和MMU 的設置

  MMU 必須關(guān)閉;

  指令Cach 可以打開(kāi)也可以關(guān)閉;

  數據Cach 必須關(guān)閉。

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 命令, 對內核進(jìn)行適當的裁剪, 以適應硬件平臺。

  對內核進(jìn)行適當的裁剪, 以適應硬件平臺。

(1) 修改Makefile 文件

欲設置Linux 的默認平臺為ARM 平臺, 需進(jìn)入Linux-2.6.32 文件夾中, 修改此目錄下的Makefile 文件。

  export KBUILD_BUILDHOST := $(SUBARCH)

  ARCH ?=arm // 使用的目標平臺

  CROSS_COMPILE ?=arm-linux- // 使用的交叉編譯器,

這里使用系統默認的編譯器

(2) 關(guān)于機器碼

在啟動(dòng)內核時(shí), 根據BootLoader 傳入的機器碼(MACH_TYPE) 來(lái)決定應啟動(dòng)哪種目標平臺[ 6], 本開(kāi)發(fā)平臺的機器碼為1999 。機器碼存放在文件opt/kernel/linux-2.6.32.2/arch/arm/tools/mach-types 中。

  mini2440 MACH_MINI2440 MINI2440 1999 // 機器碼

如果機器碼不匹配, 引導內核不成功, 則會(huì )出現如下的錯誤提示:

  Uncompressing

  Linux……………………………………………………………………………done, booting the kernel.

(3) 修改時(shí)鐘源

將/kernel/linux -2.6.32.2/arch/arm/mach -s3c2440/ 目錄下的mach-smdk2440.c 文件改名為mach-mini2440.c。

因為mini2440 和mach-smdk2440.c 極其相似, 以該文件為基礎進(jìn)行修改, 在mach -mini2440.c 文件中將staticvoid__init smdk2440_map_io ( void ) 函數中的晶振頻率修改為mini2440 開(kāi)發(fā)板上實(shí)際使用的12000000。

(4) 為內核打上yaffs2 補丁

①Yaffs2 文件系統是專(zhuān)門(mén)針對嵌入式設備, 特別是使用Nand Flash 作為存儲器的嵌入式設備而創(chuàng )建的一種文件系統, 使用yaffs2 就可以支持大頁(yè)的Nand Flash。

進(jìn)入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 個(gè)分區, 第1 分區也是BootLoader 所在的分區, 對應dev/mtdblock0 ;第2 個(gè)分區是U-Boot 的參數分區, 對應dev/mtdblock1 ;第3 個(gè)分區是內核分區, 對應dev/mtdblock2 ; 第4 個(gè)分區為根文件系統分區對應dev/mtdblock3 。分區結構圖如表1 所示。

表1 128 MB Nand Flash 的分區結構圖

表1 128 MB Nand Flash 的分區結構圖

其部分實(shí)現代碼如下:

  static struct mtd_partition mini2440_default_nand_part[] ={

  [0] = {

  .name=U-boot,

  .offset= 0,

  .size= 0x00040000,

  }

其中name 是分區的名字,offset 是偏移的開(kāi)始地址,size是分區的大小, 其余部分的分區與此類(lèi)似。

②下面代碼是添加Nand Flash 的設置表, 因為板子上只有一片Nand Flash, 因此也就只有一個(gè)設置表。

  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 設備添加到開(kāi)發(fā)板的設備列表結構。

  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;

  }

現在可以進(jìn)入kernel/linux-2.6.32.2/arch/arm/boot 目錄,然后執行下面的命令, 就會(huì )在該目錄下生成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 進(jìn)行下載。

3.3 文件系統

所謂根文件系統, 就是創(chuàng )建各個(gè)目錄, 例如在/bin 、/sbin/ 目錄下存放各種可執行的程序, 在/etc 目錄下存放配置文件, 在/lib 目錄下存放庫文件。

可以利用Busybox 工具創(chuàng )建根文件系統,Bosybox 是一個(gè)遵循GPL v2 協(xié)議的開(kāi)源項目, 它在編寫(xiě)過(guò)程中對文件大小進(jìn)行優(yōu)化, 并考慮了系統資源有限( 例如內存)的情況, 使用Busybox 可以自動(dòng)生成根文件系統所需的bin、sbin、usr 目錄和linuxrc 文件, 可以使用make menuconfig對Busybox 的選項進(jìn)行配置。

(1) 進(jìn)入opt/kernel, 創(chuàng )建一個(gè)shell 腳本用于根文件系統的各個(gè)目錄, 并且為其增加執行權限;(2)Linux 中的init 進(jìn)程會(huì )根據etc/inittab 文件創(chuàng )建其他子進(jìn)程, 下面代碼是inittab 文件中的內容, 說(shuō)明了系統啟動(dòng)后首先執行的腳本文件是rcS, 虛擬的終端是串口0, 當按下ctr+alt+del 時(shí)重啟系統,inittab 文件的作用就是控制系統啟動(dòng)時(shí)和啟動(dòng)后一些程序的運行。

  #etc/inittab

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

  s3c2410_serial0::askfirst:-/bin/sh

  ::ctrlaltdel:/sbin/reboot

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

(3) 創(chuàng )建etc/init.d/rcS 文件, 這是一個(gè)腳本文件, 可以在里面添加要自動(dòng)執行的一些命令。

  #! /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 是大頁(yè)結構, 所以需要使用相應的大頁(yè)制作工具; 使用命令mkyaffs2image rootfsrootfs.img 生成根文件系統映像文件。

本文通過(guò)對U-Boot 移植和Linux 內核移植的討論,給出了移植U-Boot 和Linux 到大多數開(kāi)發(fā)板的關(guān)鍵部分。由于移植的復雜性, 不可能包括全部步驟, 但通過(guò)本文的闡述可以了解移植的基本流程和關(guān)鍵點(diǎn), 為移植不同版本到其他硬件平臺提供了參考, 也為應用程序的開(kāi)發(fā)搭建了一個(gè)比較完整的嵌入式平臺。

linux操作系統文章專(zhuān)題:linux操作系統詳解(linux不再難懂)


關(guān)鍵詞: 平臺 構建 嵌入式 Linux ARM 基于

評論


相關(guān)推薦

技術(shù)專(zhuān)區

關(guān)閉
国产精品自在自线亚洲|国产精品无圣光一区二区|国产日产欧洲无码视频|久久久一本精品99久久K精品66|欧美人与动牲交片免费播放
<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>