第7章-嵌入式Linux課件_第1頁
第7章-嵌入式Linux課件_第2頁
第7章-嵌入式Linux課件_第3頁
第7章-嵌入式Linux課件_第4頁
第7章-嵌入式Linux課件_第5頁
已閱讀5頁,還剩55頁未讀 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

ARM嵌入式系統

第七章嵌入式Linux

嵌入式Linux嵌入式Linux概述ARMLinux在PXA270實驗系統上的移植ARMLinux的設備驅動ARMLinux下應用程序設計嵌入式Linux概述

Linux介紹嵌入式Linux系統交叉開發(fā)環(huán)境開發(fā)工具GNU的介紹Linux介紹Linux是類UNIX操作系統。最初是由LinusTorvalds于1991年在基于Intel80386處理器的IBM兼容機上開發(fā)的操作系統。出現在二十世紀九十年代,在短短的十幾年的時間里發(fā)展成為功能強大,設計完善的操作系統。源程序可以在/下載。Linux有著異常豐富的驅動程序資源,支持各種主流的硬件設備與技術。嵌入式Linux能夠固化在容量只有幾KB或者幾MB的存儲芯片或者微控制器中,Linux包含了現代的UNIX操作系統的所有功能特性,這些功能包括多任務、虛擬內存、虛擬文件系統、SVR4進程間通信、對稱多處理器(SMP)、多用戶支持等功能。Linux介紹Linux具有以下特性:單一內核支持多處理器良好的開放性設備獨立性支持多線程搶占式內核功能文件系統

嵌入式Linux操作系統的應用領域:手機、PDA數字相機、數字電視機、數碼相機VCD/DVD音響設備、可視電話家庭網絡設備洗衣機、電冰箱智能玩具Linux介紹廣泛應用的原因:公開源代碼沒有專利費外部設備驅動豐富網絡協議及中間件非常豐富非常穩(wěn)定嵌入式Linux嵌入式Linux(EmbeddedLinux)是指對標準Linux經過小型化裁剪處理之后,能夠固化在容量只有幾KB或者幾MB字節(jié)的存儲器芯片或者單片機中,是適合于特定嵌入式應用場合的專用Linux操作系統。在目前已經開發(fā)成功的嵌入式系統中,大約有一半使用的是Linux。這與它自身的優(yōu)良特性是分不開的。嵌入式Linux同Linux一樣,具有低成本、多種硬件平臺支持、優(yōu)異的性能和良好的網絡支持等優(yōu)點。

嵌入式Linux

嵌入式Linux還在Linux基礎上做了部分改進,主要的改動有:改善的內核結構提高的系統實時性嵌入式Linux同Linux一樣,也有眾多的版本,其中不同的版本分別針對不同的需要在內核等方面加入了特定的機制。

嵌入式Linux系統交叉開發(fā)環(huán)境交叉開發(fā)模型主要思想是,首先在宿主機(Host)上安裝開發(fā)工具,編輯、編譯目標板(Target)的Linux引導程序、內核和文件系統,然后下載到目標板上運行。通常這種在宿主機環(huán)境下開發(fā),在目標機上運行的開發(fā)模式叫做交叉開發(fā)。交叉開發(fā)模型見圖所示。

開發(fā)工具GNU的介紹

GNU(GNU’sNotUnix)項目是自由軟件基金會(FreeSoftwareFoundation)的董事長RichardM.Stallman于1984年發(fā)起,意在軟件開發(fā)團體中發(fā)起支持開發(fā)自由軟件的運動。GNU軟件包括:C編譯器gccC++編譯器g++GNU的匯編器asGNU的鏈接器ld二進制轉換工具(objcopy、objdump)調試工具(gdb、gdbserver、kgdb)和基于不同硬件平臺的開發(fā)庫。開發(fā)工具GNU的介紹1.GNUBinutils工具工具集GNUBinutils主要是一套用來構造和使用二進制代碼所需的工具集。建立嵌入式交叉編譯環(huán)境,GNUBinutils工具包是不可缺少的,沒有Binutils,GNU的C編譯器gcc將無法正常工作。Binutils的官方下載地址是:ftp:///gnu/binutils/,在這可以下載到不同版本的Binutils工具包。目前比較新的版本是Binutils-2.17。GNUBinutils工具集主要有以下一系列的部件。開發(fā)工具GNU的介紹ldGNU的鏈接器匯編器產生的目標代碼生成可執(zhí)行文件asGNU的匯編器匯編語言編寫的源程序換成二進制形式的目標代碼add2line將地址轉換成文件名或行號對C++filt過濾掉C++符號,防止重載沖突gprof顯示程序調用段的各種數據nlmconv將目標代碼轉換成NLnm從目標代碼中列出所有變量objdump顯示目標文件信息strings從文件中列出可打印的字符串ranlib對歸檔文件生成索引windresWindows源程序的編譯器開發(fā)工具GNU的介紹2.編譯器gccgcc是GNU推出的功能強大,性能優(yōu)越的多平臺編譯器,是Linux中最重要的軟件開發(fā)工具。是GNU的代表作品之一。編譯器被成功地移植到不同的處理平臺上,標準的臺式Linux上的gcc是針對IntelCPU的,而ARM系列開發(fā)軟件使用的是針對ARM系列處理器的gcc編譯器arm-elf-gcc、arm-elf-as及相應的GNUBinutils工具集。使用gcc編譯器編譯C語言程序時,通常會經過四個處理階段,即預處理階段、編譯階段、匯編階段和鏈接階段。gcc是通過文件的后綴來區(qū)別文件的類別,下面的表中給出gcc的部分約定規(guī)則。在使用gcc編譯器時,需要給出一系列調用參數和文件名,當沒有給出時,gcc將使用缺省參數,gcc基本的用法是:

gcc[options][filename]開發(fā)工具GNU的介紹

其中,options就是參數選項,filename是相關的文件名稱。常用的選項有:–c:只編譯生成目標文件,不鏈接成可執(zhí)行文件。–DMACRO=DEFN:以字符串“DEFN”定義MACRO宏。–E: 只對程序進行預處理。–g: 生成調試信息,GNU調試器可利用該信息。–llibrary: 用來指定所使用的庫文件。–ldirectory:為include文件的搜索指定目錄。–ofilename:生成指定的文件名的可執(zhí)行文件。

開發(fā)工具GNU的介紹開發(fā)工具GNU的介紹3.調試器gdb

gdb是GnuDeBugger的縮寫,是GNUC的用來調試C和C++程序的調試工具。開發(fā)者在使用它時,可以了解程序在運行時的詳細情況,如程序的內部結構和內存等信息。gdb能夠通過完成以下幾個任務來幫助你查找程序中的錯誤。啟動程序,設置影響程序運行的調試條件。能使程序在特定條件下停止。在程序停止時,檢查程序的運行情況。調整程序,改正錯誤后繼續(xù)調試。gdb調試命令的使用方法以下程序是漢諾塔的源程序:

#include"stdio.h"

main()

{voidhanoi(int,char,char,char);

intm;

printf("inputthenumberofdisks:");

scanf("%d",&m);

printf("Thesteptomoving%ddisks:\n",m);

hanoi(m,'A','B','C');}

voidhanoi(intn,chara,charb,charc)

{voidmove(char,char);

if(n==1)move(a,c);

else

{hanoi(n-1,a,c,b);

move(a,c);

hanoi(n-1,b,a,c);}}

voidmove(charx,chary)

{printf("%c-->%c\n",x,y);

}gdb調試命令的使用方法為了方便調試可執(zhí)行程序,可以用下面的語句來編譯程序。#gcc–g–otesttest.c開始調試:#gdb–Qtest(gdb)

1.查看源代碼,使用list命令(gdb)list

1 #include<stdio.h>2 main()3 {4 voidHanoi(int,char,char,char);5 intm;6 scanf("%d",&m);7 printf("Thesteptomove%ddisks:\n",m);8 hanoi(m,'A','B','C');9 }10 voidhanoi(intn,chara,charb,charc)(gdb)gdb調試命令的使用方法2.運行源程序,使用run命令。(gdb)runStartingprogram/home/ding/test.exeInputthenumberofdisks;3Thesteptomove3disks:A-->CA-->BC-->BA-->CB-->AB-->CA-->CProgramexitednormally(gdb)如上所述,使用run命令會執(zhí)行一個可執(zhí)行程序。gdb調試命令的使用方法設置斷點使用breakN命令來設置斷點,N表示在源代碼的第N行處設置斷點,如果想看程序中斷點數量與位置,可以使用infobreak命令來查看。清除斷點gdb用clear指令來清除斷點。它的使用格式如下;(gdb)clearn查看變量的值gdb用print指令查看變量的值。執(zhí)行時鍵入print或p。如果想看變量的類型時,用whatis命令。單步執(zhí)行gdb用step指令進行單步執(zhí)行方式。此指令可以跟蹤到函數內部,執(zhí)行時鍵入step或s。另外一個指令是next指令,只用于單步執(zhí)行,不進入到函數內部。退出程序調試如果程序執(zhí)行完了,則直接退出。如果程序在執(zhí)行中,則提示程序在執(zhí)行中,是否要退出的提示,確認后即可結束調試。ARMLinux在PXA270實驗系統上的移植ARMLinux的開發(fā)環(huán)境的建立ARMLinux的交叉編譯

ARMLinux內核的配置與編譯嵌入式Linux文件系統的建立與設置

ARMLinux的開發(fā)環(huán)境的建立

1.Toolchain簡介ARM交叉編譯環(huán)境不同于X86系列桌面的編譯環(huán)境。PXA270芯片同樣是基于ARM體系結構的,所以在基于PXA270的嵌入式的開發(fā)過程中必須使用ARM的交叉編譯環(huán)境。

Toolchain具體包括如下:GNUgcccompilersforC,C++GNUbinutilGNUCLibraryGNUCheaderARMLinux的開發(fā)環(huán)境的建立2.Toolchain的安裝與配置

在本書使用的所有的Toolchain均以壓縮文件的形式提供,如下所示:binutils-2.15.tar.gzgcc-3.3.2.tar.gzglibc-2.3.2.tar.gzglibc-linuxthreads-2.3.2.tar.gzARMLinux的開發(fā)環(huán)境的建立搭建開發(fā)環(huán)境所需的全部資源文件已經全部在光盤中提供,在開發(fā)主機上以root用戶登錄,放入光盤之后使用mount命令將其掛載,這樣主機就可以將光盤當作文件來讀取。當光盤放入光驅之后,linux系統可以自動的掛載,可以跳過這個步驟:[rootlocalhostroot]#mount/dev/cdrom/mnt/cdrom[rootlocalhostroot]#cd/mnt/cdromARMLinux的開發(fā)環(huán)境的建立

檢查CD-ROM正確掛載后,需要在開發(fā)主機上創(chuàng)建目錄,并將光盤內容拷貝到目錄中。在根目錄創(chuàng)建了一個名為PXA270_Linux的目錄,將光盤中的內容拷貝到了該目錄中。[rootlocalhostroot]#mkdir/PXA270_Linux[rootlocalhostroot]#cd/PXA270_Linux[rootlocalhostPXA270_Linux]#cp/mnt/cdrom/PXA270_Linux/*-a./ARMLinux的開發(fā)環(huán)境的建立

移動到bin目錄下使用ls命令查看,可以看到這些編譯工具。

ARMLinux的開發(fā)環(huán)境的建立

為了之后在任何目錄下面都能夠使用Toolchain,必須要對路徑進行設置。打開/root/.bash_profile文件來設置路徑,使用vi編譯器來改.bash_profile文件。[rootlocalhostroot]#vi~/.bash_profile

用vi編輯器打開/root/.bash_profile文件并添加下述的路徑:PATH=$PATH:/opt/xscalev1/binARMLinux的開發(fā)環(huán)境的建立

現在在任何的目錄下都能打開/opt/xscalev1/bin。保存并退出該文件,使用source命令來使路徑生效。此時,使用arm-linux-命令時,Toolchain中的工具會被使用。ARMLinux的交叉編譯

使用vi編輯器創(chuàng)建一個hello.c文件。編寫一個簡單的程序來打印出一行簡單的信息:HelloWorld。程序如下所示:#include"stdio.h"

main()

{printf("HelloWorld\n");

return0;}保存并退出該文件。使用如下的命令來編譯該文件。[rootlocalhostroot]#gcc–ohellohello.c[rootlocalhostroot]#arm-linux-gcc–ohello-armhello.c[rootlocalhostroot]#filehello

[rootlocalhostroot]#filehello-arm

ARMLinux的交叉編譯下載該二進制(hello-arm)文件到EELIOD并執(zhí)行將會輸出“HelloWorld.”。若要下載到目標板,將會使用到minicom中的串口下載功能。首先需要配置minicom。配置完成之后,可以通過minicom來對目標板進行操作。下面幾幅圖minicom的配置過程以及程序下載到目標板的方法:Minicom的使用Minicom的使用Minicom的使用Minicom的使用Minicom的使用ARMLinux內核的配置與編譯

arch包括所有與體系結構相關的內核代碼include包括編譯內核所需要的頭文件init包含內核的初始化代碼,但不是系統的引導代碼,其中所包含main.c和version.c文件是研究Linux內核的起點mm該目錄包含所有獨立于CPU體系結構的內存管理代碼,如頁式存儲管理內存的分配和釋放等。與ARM體系結構相關的代碼在arch/arm/mm中kernel包括主要的內核代碼,此目錄下的文件實現大多數Linux的內核函數,其中最重要的文件是sched.c。ARMLinux內核的配置與編譯2.內核配置系統的基本結構

Makefile分布在Linux內核源碼中的Makefile,定義Linux內核的編譯規(guī)則;頂層Makefile是整個內核配置、編譯的總體控制文件。config.in給用戶提供配置選擇的功能;.config:內核配置文件,包括由用戶選擇的配置選項,用來存放內核配置后的結果。配置工具包括對配置腳本中使用的配置命令進行解釋的配置命令解釋器和配置用戶界面(基于字符界面:makeconfig;基于Ncurses圖形界面:makemenuconfig;基于XWindows圖形界面:makexconfig)。rules.make規(guī)則文件,被所有的Makefile使用。ARMLinux內核的配置與編譯3.編譯內核的常用命令Makeconfig:內核配置。makedep:尋找依存關系。。makeclean:清除以前所產生的所有的目標文件,模塊文件,核心以及一些臨時文件等,不產生任何文件。makermproper:刪除所有以前在生成內核過程中所產生的所有文件,及除了做makeclean外,還要刪除.config,.depend等文件,把核心源碼恢復到最原始的狀態(tài)。makezImage:在make的基礎上產生壓縮的核心映像文件./arch/$(ARCH)/boot/zImage以及./arch/$(ARCH)/boot/compressed目錄下產生一些臨時文件。makebzImage:在make的基礎上產生壓縮比例更大的的核心映像文件./arch/$(ARCH)/boot/bzImage及./arch/$(ARCH)/boot/compressed目錄下產生一些臨時文件。ARMLinux內核的配置與編譯4.內核編譯過程makemrproper刪除所有以前在生成內核過程中所產生的所有文件makemenuconfig內核配置makedep尋找依存關系makezImage產生壓縮的核心映像文件內核編譯完畢之后,生成zImage內核映象文件保存在源代碼的arch/arm/boot/目錄下。ARMLinux內核的配置與編譯5.內核配置項介紹首先將壓縮的linux內核源代碼文件linux-2.4.21-PXA270.tar.gz解壓,進入linux內核源代碼所在的目錄,并在終端輸入makemenuconfig,系統彈出基于Ncurses內核配置圖形界面,便可進行內核選項的配置。[rootlocalhostroot]#tarxvfzlinux-2.4.21-PXA270.tar.gz[rootlocalhostroot]#cdPXA270_Linux/kernel/[rootlocalhostkernel]#makexsbase270_config[rootlocalhostkernel]#makeoldconfig[rootlocalhostkernel]#makemenuconfigARMLinux內核的配置與編譯6.下載Linux內核鏡像如果bootp和tftp命令能夠正常工作,可以使用如下命令來下載內核,具體步驟如下:設置需要下載的鏡像名:在菜單模式下,選擇“a”,按提示輸入內核鏡像和文件系統鏡像名,用戶必須保證在/tftpboot目錄下存在同名的鏡像文件。下載內核鏡像:在菜單模式下,選擇“3”,此時,內核鏡像通過以太網下載到開發(fā)板的sdram上;若傳輸超時或失敗,請重新執(zhí)行。燒寫到flash:在菜單模式,選擇“4”,將剛下載的內核鏡像燒到flash上。以上步驟正常結束后,內核鏡像已燒入flash中。嵌入式Linux文件系統的建立與設置1Linux文件系統的類型EXT文件系統NFS文件系統JFFS2文件系統2文件系統的制作Busybox介紹Busybox的編譯配制文件系統

ARMLinux的設備驅動

Linux的設備管理設備驅動程序結構GPIO驅動程序設計基于輪循的UART驅動程序設計基于中斷UART驅動程序設計Linux的設備管理嵌入式Linux設備驅動程序的設計大致包括以下步驟:向系統申請也可以動態(tài)獲得主、次設備號。實現設備初始化和卸載模塊。設計對設備文件操作。如定義file_operations結構。設計對設備文件操作調用。如read、write等操作。實現中斷服務函數,用request_irq向內核注冊。將驅動程序編譯到內核或編譯成模塊,用ismod命令加載。生成設備節(jié)點文件。Linux的設備管理驅動程序的加載方法在設計完主要數據結構和函數接口后就要把設備驅動加入到內核中。內核模塊是Linux內核的重要組成要素,內核模塊能在Linux系統啟動之后能夠動態(tài)進行裝載和卸載,因此不需對內核進行重新編譯或重啟系統就可將內核的一部分替換掉。GPIO驅動程序的設計主要包括以下四個函數的設計:加載本驅動時執(zhí)行init_module函數卸載驅動時執(zhí)行cleanup_module函數打開驅動程序文件時執(zhí)行gpio_open函數關閉驅動程序文件時執(zhí)行gpio_release函數

基于輪循的UART驅動程序設計基于輪循的UART驅動程序,主要函數的功能如下:init_module()初始化串口模塊,加載串口設備驅動;uart_open()打開一個串口設備節(jié)點,當一個設備節(jié)點被打開時,計數器MOD_INC_USE_COUNT加一;uart_release()關閉一個設備節(jié)點,當一個設備節(jié)點被關閉時,MOD_DEC_USE_COUNT減一;uart_write()調用copy_from_user()函數將用戶空間的數據拷貝到內核空間,然后通過BTuart發(fā)送出去,在該函數中調用了SerialOutputByte()函數;uart_read()首先讀BTRBR寄存器,將接收到的數據讀到內核空間,然后通過copy_to_user()函數將接收數據拷貝到用戶空間;cleanup_module()將BTuart設備驅動卸載;基于中斷UART驅動程序設計基于中斷UART驅動程序設計,主要函數的功能如下:init_module()初始化串口模塊,加載串口設備驅動;uart_open()打開一個串口設備節(jié)點,當一個設備節(jié)點被打開時,計數器MOD_INC_USE_COUNT加一;uart_release()關閉一個設備節(jié)點,當一個設備節(jié)點被關閉時,MOD_DEC_USE_COUNT減一;uart_write()首先調用copy_from_user()函數將用戶空間的數據拷貝到內核空間,然后通過BTuart發(fā)送出去,在該函數中調用了SerialOutputByte()函數;uart_read()interruptible_sleep_on()使接收進程進入睡眠狀態(tài),等待中斷喚醒睡眠狀態(tài);uart_init(void)配置串口的波特率、數據位、停止位、奇偶校驗和開啟串口接收中斷;SerialOutputByte(constcharc)串口發(fā)送,將字符C通過串口發(fā)送出去;

ARMLinux下應用程序設計

UART應用程序設計基于SOCKET的網絡應用程序設計USB攝像頭接口應用程序設計

Framebuffer圖片顯示應用程序設計

UART應用程序設計

在Linux操作系統中對底層終端的處理是一個非常復雜的過程,需要處理許多不同類型的設備。Linux系統處理終端的方法是通過串行接口連接的控制臺與系統通信并運行程序。1.終端控制函數介紹在對底層終端操作中有一個用于查詢和操作終端的標準接口結構體termios,該結構體對終端的輸入、輸出、硬件特性、控制協議等方面進行了定義,具體定義如下:c_iflag:用來控制輸入處理選項;c_oflag:控制輸出數據的處理;c_cflag:設置決定終端硬件特性的控制標志;c_lflag:存放本地模式標志,用來操縱終端特性;c_line:表示控制協議;c_cc:包含特殊字符序列的值以及它們所代表的操作。UART應用程序設計1)終端屬性控制函數對終端的操作主要通過屬性設置函數tcsetattr()和屬性獲取函數tcgetattr()來實現。tcsetattr()和tcgetattr()的調用形式如下:inttcsetattr(intfd,intaction,structtermios*tp)函數tcsetattr()使用由tp引用的termios數據結構來設置與文件描述符fd相關聯的終端參數inttcgetattr(intfd,structtermios*tp)查詢和文件描述符相關聯的終端參數,并將參數存儲到由tp所引用的termios數據結構體中。UART應用程序設計

2)終端速度控制函數終端速度控制函數用來設置終端設備的輸入、輸出速度,速度以波特率來定義。這些函數都是成對出現,其中的兩個用來獲取和設置輸入的速度,另兩個用來獲取和設置輸出線路的速度,它們定義形式如下:intcfgetispeed(structtermios*tp)intcfsetispeed(structtermios*tp,speed_tspeed)intcfgetospeed(structtermios*tp)intcfsetospeed(structtermios*tp,speed_tspeed)UART應用程序設計

2串口操作函數步驟1)打開串口函數,返回操作標志2)關閉串口子程序,返回操作標志3)向串口寫數據,返回寫入串口的總長度4)設置串口參數,主要設置數據位、停止位、奇偶校驗位、速度、超時設置等參數,返回操作標志。5)讀取串口數據UART應用程序設計

3串口通信源代碼的編譯1)PC平臺的串口通信程序編譯將光盤提供的serial.c的源代碼復制到硬盤中(假設將源碼復制在/root/PAX270_Linux目錄下)對源碼進行編譯。[rootlocalhostPAX270_Linux]#cdserial[rootlocalhostserial]#gcc–oserialserial.c在PC機上運行serial程序;[rootlocalhostserial]#./serial1UART應用程序設計

2)ARM平臺的串口通信程序的編譯將光盤提供的serialarm的源代碼復制到硬盤中(假設將源碼復制在/root/PAX270_Linux目錄下)設置交叉編譯工具參數(arm-linux-gcc)。對源代碼進行編譯。[rootlocalhostPAX270_Linux]#cdserialarm[rootlocalhost

serialarm]#arm-linux-gcc–oserialarmserialarm.c將編譯好的程序serial下載到開發(fā)板的/usr/qpe/bin目錄下。在目標板上利用chm

溫馨提示

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

評論

0/150

提交評論