基于ARM和Linux的嵌入式平臺(tái)的構(gòu)建-設(shè)計(jì)應(yīng)用_第1頁
基于ARM和Linux的嵌入式平臺(tái)的構(gòu)建-設(shè)計(jì)應(yīng)用_第2頁
基于ARM和Linux的嵌入式平臺(tái)的構(gòu)建-設(shè)計(jì)應(yīng)用_第3頁
基于ARM和Linux的嵌入式平臺(tái)的構(gòu)建-設(shè)計(jì)應(yīng)用_第4頁
基于ARM和Linux的嵌入式平臺(tái)的構(gòu)建-設(shè)計(jì)應(yīng)用_第5頁
已閱讀5頁,還剩7頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

精品文檔-下載后可編輯基于ARM和Linux的嵌入式平臺(tái)的構(gòu)建-設(shè)計(jì)應(yīng)用摘要:首先介紹了嵌入式系統(tǒng)的概念,及相關(guān)硬件平臺(tái)和軟件版本。然后,主要介紹了嵌入式Linux的引導(dǎo)程序U-Boot的移植,以及開源、操作系統(tǒng)Linux的移植。,構(gòu)建了基于NandFlash存儲(chǔ)器的Yaffs2文件系統(tǒng),利用BusyBox創(chuàng)建根文件系統(tǒng)?;贏RM和嵌入式Linux的嵌入式系統(tǒng)平臺(tái)搭建基本完成,可以在此平臺(tái)上添加更多驅(qū)動(dòng),以便更好地開發(fā)應(yīng)用程序。

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

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

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

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

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

圖1嵌入式系統(tǒng)交叉編譯流程

2BootLoader引導(dǎo)加載程序

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

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

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

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

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

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

@copyU-BoottoRAM

ldrr0,=TEXT_BASE

movr1,#0x0

movr2,#0x60000

blnand_read_ll

tstr0,#0x0

beqok_nand_read

由于在后面加載Linux內(nèi)核和根文件系統(tǒng)時(shí),使用的是tftp方式,所以必須添加DM9000EP網(wǎng)卡的驅(qū)動(dòng)。在mini2440.h文件中,其主要的配置如下:

#defineCONFIG_DRIVER_DM90001

#defineCONFIG_NET_MULTI1

#defineCONFIG_DM9000_NO_SROM1

#defineCONFIG_DM9000_BASE0x20000300

#defineDM9000_DATA(CONFIG_DM9000_BASE+4)

其中,CONFIG_DM9000_BASE宏是重要的,因?yàn)樗x的是網(wǎng)卡的地址,不同的網(wǎng)卡有不同的地址,DM9000EP訪問的基址為0x20000000,之所以再偏移0x300是由它的特性決定的。

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

#defineCONFIG_BOOTARGS"noinitrdroot=/dev/mtdblock3

init=/linuxrcconsole=ttySAC0,115200mem=64M"

其中,root=/dev/mtdblock3是由Linux中的NandFlash分區(qū)所決定的,意味著NandFlash的第4個(gè)分區(qū)為根文件系統(tǒng)。

#defineCONFIG_BOOTCOMMAND"nandread0x320000000x600000x560000;bootm0x32000000"

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

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

(1)CPU寄存器

R0=0;

R1=機(jī)器類型ID;對(duì)于ARM結(jié)構(gòu)的CPU,其機(jī)器類

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

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

(2)CPU工作模式

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

CPU必須為SVC模式。

(3)Cach和MMU的設(shè)置

MMU必須關(guān)閉;

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

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

3Linux內(nèi)核的移植

3.1內(nèi)核的獲取

Linux內(nèi)核的更新很快,可以從/pub/linux/kernel/得到的Linux內(nèi)核版本,本文使用的Linux內(nèi)核版本是Linux-,交叉編譯工具使用符合EABI標(biāo)準(zhǔn)的arm-linux-gcc-4.3.2。

3.2內(nèi)核的移植

可以在內(nèi)核的根目錄下,運(yùn)行makemenuconfig命令,對(duì)內(nèi)核進(jìn)行適當(dāng)?shù)牟眉簦赃m應(yīng)硬件平臺(tái)。

對(duì)內(nèi)核進(jìn)行適當(dāng)?shù)牟眉簦赃m應(yīng)硬件平臺(tái)。

(1)修改Makefile文件

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

exportKBUILD_BUILDHOST:=$(SUBARCH)

ARCH?=arm//使用的目標(biāo)平臺(tái)

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

這里使用系統(tǒng)默認(rèn)的編譯器

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

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

mini2440MACH_MINI2440MINI24401999//機(jī)器碼

如果機(jī)器碼不匹配,引導(dǎo)內(nèi)核不成功,則會(huì)出現(xiàn)如下的錯(cuò)誤提示:

Uncompressing

Linux……………done,bootingthekernel.

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

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

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

(4)為內(nèi)核打上yaffs2補(bǔ)丁

①Yaffs2文件系統(tǒng)是專門針對(duì)嵌入式設(shè)備,特別是使用NandFlash作為存儲(chǔ)器的嵌入式設(shè)備而創(chuàng)建的一種文件系統(tǒng),使用yaffs2就可以支持大頁的NandFlash。

進(jìn)入yaffs2源代碼目錄執(zhí)行如下命令:

#./patch-ker.shc/opt/FriendlyARM/mini2440/linux-

②配置內(nèi)核以支持Yaffs2文件系統(tǒng)

在Linux內(nèi)核源代碼根目錄運(yùn)行makexconfig,在“FileSystems”選項(xiàng)中,找到“Miscellaneousfilesystems”菜單項(xiàng),找到“YAFFS2filesystemsupport”并選中它,這樣就在內(nèi)核中添加了yaffs2文件系統(tǒng)的支持,保存并退出。然后在命令行中,執(zhí)行makezImage。

(5)修改NandFlash分區(qū)信息

①在mach-mini2440.c文件中添加NandFlash的分區(qū)信息,下面的代碼將NandFlash分成了4個(gè)分區(qū),第1分區(qū)也是BootLoader所在的分區(qū),對(duì)應(yīng)dev/mtdblock0;第2個(gè)分區(qū)是U-Boot的參數(shù)分區(qū),對(duì)應(yīng)dev/mtdblock1;第3個(gè)分區(qū)是內(nèi)核分區(qū),對(duì)應(yīng)dev/mtdblock2;第4個(gè)分區(qū)為根文件系統(tǒng)分區(qū)對(duì)應(yīng)dev/mtdblock3。分區(qū)結(jié)構(gòu)圖如表1所示。

表1128MBNandFlash的分區(qū)結(jié)構(gòu)圖

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

staticstructmtd_partitionmini2440_default_nand_part[]={

[0]={

.name="U-boot",

.offset=0,

.size=0x00040000,

}

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

②下面代碼是添加NandFlash的設(shè)置表,因?yàn)榘遄由现挥幸黄琋andFlash,因此也就只有一個(gè)設(shè)置表。

staticstructs3c2410_nand_setmini2440_nand_sets[]={

[0]={

.name="NAND",

.nr_chips=1,

.nr_partitions=

ARRAY_SIZE(mini2440_default_nand_part),

.partitions=mini2440_default_nand_part,

}

}

③上面的設(shè)置完成后,還需要將NandFlash設(shè)備注冊到系統(tǒng)中。下面這段代碼就是將NandFlash設(shè)備添加到開發(fā)板的設(shè)備列表結(jié)構(gòu)。

staticstructplatform_device*mini2440_devices[]__initdata

={

s3c_device_nand,

}

④在mini2440_machine_init函數(shù)中添加平臺(tái)的數(shù)據(jù)信息。

staticvoid__initmini2440_machine_init(void){

s3c_device_nand.dev.platform_data=mini2440_nand_info;

}

現(xiàn)在可以進(jìn)入kernel/linux-/arch/arm/boot目錄,然后執(zhí)行下面的命令,就會(huì)在該目錄下生成uImage.img格式的、U-Boot可以引導(dǎo)的內(nèi)核鏡象。

Mkimage–n‘linux-’–Aarm–Olinux–Tkernel–Cnone–a0x30008000–e0x30008000–dzImageuImage.img

至此,可以把生成的uImage.img格式的鏡像文件復(fù)制到tftp目錄下,使用tftp進(jìn)行。

3.3文件系統(tǒng)

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

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

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

#etc/inittab

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

s3c2410_serial0::askfirst:-/bin/sh

::ctrlaltdel:/sbin/rebo

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論