




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
ARM嵌入式系統(tǒng)
第七章嵌入式Linux
嵌入式Linux嵌入式Linux概述ARMLinux在PXA270實(shí)驗(yàn)系統(tǒng)上的移植ARMLinux的設(shè)備驅(qū)動(dòng)ARMLinux下應(yīng)用程序設(shè)計(jì)嵌入式Linux概述
Linux介紹嵌入式Linux系統(tǒng)交叉開發(fā)環(huán)境開發(fā)工具GNU的介紹Linux介紹Linux是類UNIX操作系統(tǒng)。最初是由LinusTorvalds于1991年在基于Intel80386處理器的IBM兼容機(jī)上開發(fā)的操作系統(tǒng)。出現(xiàn)在二十世紀(jì)九十年代,在短短的十幾年的時(shí)間里發(fā)展成為功能強(qiáng)大,設(shè)計(jì)完善的操作系統(tǒng)。源程序可以在/下載。Linux有著異常豐富的驅(qū)動(dòng)程序資源,支持各種主流的硬件設(shè)備與技術(shù)。嵌入式Linux能夠固化在容量只有幾KB或者幾MB的存儲(chǔ)芯片或者微控制器中,Linux包含了現(xiàn)代的UNIX操作系統(tǒng)的所有功能特性,這些功能包括多任務(wù)、虛擬內(nèi)存、虛擬文件系統(tǒng)、SVR4進(jìn)程間通信、對(duì)稱多處理器(SMP)、多用戶支持等功能。Linux介紹Linux具有以下特性:?jiǎn)我粌?nèi)核支持多處理器良好的開放性設(shè)備獨(dú)立性支持多線程搶占式內(nèi)核功能文件系統(tǒng)
嵌入式Linux操作系統(tǒng)的應(yīng)用領(lǐng)域:手機(jī)、PDA數(shù)字相機(jī)、數(shù)字電視機(jī)、數(shù)碼相機(jī)VCD/DVD音響設(shè)備、可視電話家庭網(wǎng)絡(luò)設(shè)備洗衣機(jī)、電冰箱智能玩具Linux介紹廣泛應(yīng)用的原因:公開源代碼沒有專利費(fèi)外部設(shè)備驅(qū)動(dòng)豐富網(wǎng)絡(luò)協(xié)議及中間件非常豐富非常穩(wěn)定嵌入式Linux嵌入式Linux(EmbeddedLinux)是指對(duì)標(biāo)準(zhǔn)Linux經(jīng)過小型化裁剪處理之后,能夠固化在容量只有幾KB或者幾MB字節(jié)的存儲(chǔ)器芯片或者單片機(jī)中,是適合于特定嵌入式應(yīng)用場(chǎng)合的專用Linux操作系統(tǒng)。在目前已經(jīng)開發(fā)成功的嵌入式系統(tǒng)中,大約有一半使用的是Linux。這與它自身的優(yōu)良特性是分不開的。嵌入式Linux同Linux一樣,具有低成本、多種硬件平臺(tái)支持、優(yōu)異的性能和良好的網(wǎng)絡(luò)支持等優(yōu)點(diǎn)。
嵌入式Linux
嵌入式Linux還在Linux基礎(chǔ)上做了部分改進(jìn),主要的改動(dòng)有:改善的內(nèi)核結(jié)構(gòu)提高的系統(tǒng)實(shí)時(shí)性嵌入式Linux同Linux一樣,也有眾多的版本,其中不同的版本分別針對(duì)不同的需要在內(nèi)核等方面加入了特定的機(jī)制。
嵌入式Linux系統(tǒng)交叉開發(fā)環(huán)境交叉開發(fā)模型主要思想是,首先在宿主機(jī)(Host)上安裝開發(fā)工具,編輯、編譯目標(biāo)板(Target)的Linux引導(dǎo)程序、內(nèi)核和文件系統(tǒng),然后下載到目標(biāo)板上運(yùn)行。通常這種在宿主機(jī)環(huán)境下開發(fā),在目標(biāo)機(jī)上運(yùn)行的開發(fā)模式叫做交叉開發(fā)。交叉開發(fā)模型見圖所示。
開發(fā)工具GNU的介紹
GNU(GNU’sNotUnix)項(xiàng)目是自由軟件基金會(huì)(FreeSoftwareFoundation)的董事長(zhǎng)RichardM.Stallman于1984年發(fā)起,意在軟件開發(fā)團(tuán)體中發(fā)起支持開發(fā)自由軟件的運(yùn)動(dòng)。GNU軟件包括:C編譯器gccC++編譯器g++GNU的匯編器asGNU的鏈接器ld二進(jìn)制轉(zhuǎn)換工具(objcopy、objdump)調(diào)試工具(gdb、gdbserver、kgdb)和基于不同硬件平臺(tái)的開發(fā)庫(kù)。開發(fā)工具GNU的介紹1.GNUBinutils工具工具集GNUBinutils主要是一套用來構(gòu)造和使用二進(jìn)制代碼所需的工具集。建立嵌入式交叉編譯環(huán)境,GNUBinutils工具包是不可缺少的,沒有Binutils,GNU的C編譯器gcc將無法正常工作。Binutils的官方下載地址是:ftp:///gnu/binutils/,在這可以下載到不同版本的Binutils工具包。目前比較新的版本是Binutils-2.17。GNUBinutils工具集主要有以下一系列的部件。開發(fā)工具GNU的介紹ldGNU的鏈接器匯編器產(chǎn)生的目標(biāo)代碼生成可執(zhí)行文件asGNU的匯編器匯編語言編寫的源程序換成二進(jìn)制形式的目標(biāo)代碼add2line將地址轉(zhuǎn)換成文件名或行號(hào)對(duì)C++filt過濾掉C++符號(hào),防止重載沖突gprof顯示程序調(diào)用段的各種數(shù)據(jù)nlmconv將目標(biāo)代碼轉(zhuǎn)換成NLnm從目標(biāo)代碼中列出所有變量objdump顯示目標(biāo)文件信息strings從文件中列出可打印的字符串ranlib對(duì)歸檔文件生成索引windresWindows源程序的編譯器開發(fā)工具GNU的介紹2.編譯器gccgcc是GNU推出的功能強(qiáng)大,性能優(yōu)越的多平臺(tái)編譯器,是Linux中最重要的軟件開發(fā)工具。是GNU的代表作品之一。編譯器被成功地移植到不同的處理平臺(tái)上,標(biāo)準(zhǔn)的臺(tái)式Linux上的gcc是針對(duì)IntelCPU的,而ARM系列開發(fā)軟件使用的是針對(duì)ARM系列處理器的gcc編譯器arm-elf-gcc、arm-elf-as及相應(yīng)的GNUBinutils工具集。使用gcc編譯器編譯C語言程序時(shí),通常會(huì)經(jīng)過四個(gè)處理階段,即預(yù)處理階段、編譯階段、匯編階段和鏈接階段。gcc是通過文件的后綴來區(qū)別文件的類別,下面的表中給出gcc的部分約定規(guī)則。在使用gcc編譯器時(shí),需要給出一系列調(diào)用參數(shù)和文件名,當(dāng)沒有給出時(shí),gcc將使用缺省參數(shù),gcc基本的用法是:
gcc[options][filename]開發(fā)工具GNU的介紹
其中,options就是參數(shù)選項(xiàng),filename是相關(guān)的文件名稱。常用的選項(xiàng)有:–c:只編譯生成目標(biāo)文件,不鏈接成可執(zhí)行文件。–DMACRO=DEFN:以字符串“DEFN”定義MACRO宏。–E: 只對(duì)程序進(jìn)行預(yù)處理。–g: 生成調(diào)試信息,GNU調(diào)試器可利用該信息。–llibrary: 用來指定所使用的庫(kù)文件。–ldirectory:為include文件的搜索指定目錄。–ofilename:生成指定的文件名的可執(zhí)行文件。
開發(fā)工具GNU的介紹開發(fā)工具GNU的介紹3.調(diào)試器gdb
gdb是GnuDeBugger的縮寫,是GNUC的用來調(diào)試C和C++程序的調(diào)試工具。開發(fā)者在使用它時(shí),可以了解程序在運(yùn)行時(shí)的詳細(xì)情況,如程序的內(nèi)部結(jié)構(gòu)和內(nèi)存等信息。gdb能夠通過完成以下幾個(gè)任務(wù)來幫助你查找程序中的錯(cuò)誤。啟動(dòng)程序,設(shè)置影響程序運(yùn)行的調(diào)試條件。能使程序在特定條件下停止。在程序停止時(shí),檢查程序的運(yùn)行情況。調(diào)整程序,改正錯(cuò)誤后繼續(xù)調(diào)試。gdb調(diào)試命令的使用方法以下程序是漢諾塔的源程序:
#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調(diào)試命令的使用方法為了方便調(diào)試可執(zhí)行程序,可以用下面的語句來編譯程序。#gcc–g–otesttest.c開始調(diào)試:#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調(diào)試命令的使用方法2.運(yùn)行源程序,使用run命令。(gdb)runStartingprogram/home/ding/test.exeInputthenumberofdisks;3Thesteptomove3disks:A-->CA-->BC-->BA-->CB-->AB-->CA-->CProgramexitednormally(gdb)如上所述,使用run命令會(huì)執(zhí)行一個(gè)可執(zhí)行程序。gdb調(diào)試命令的使用方法設(shè)置斷點(diǎn)使用breakN命令來設(shè)置斷點(diǎn),N表示在源代碼的第N行處設(shè)置斷點(diǎn),如果想看程序中斷點(diǎn)數(shù)量與位置,可以使用infobreak命令來查看。清除斷點(diǎn)gdb用clear指令來清除斷點(diǎn)。它的使用格式如下;(gdb)clearn查看變量的值gdb用print指令查看變量的值。執(zhí)行時(shí)鍵入print或p。如果想看變量的類型時(shí),用whatis命令。單步執(zhí)行g(shù)db用step指令進(jìn)行單步執(zhí)行方式。此指令可以跟蹤到函數(shù)內(nèi)部,執(zhí)行時(shí)鍵入step或s。另外一個(gè)指令是next指令,只用于單步執(zhí)行,不進(jìn)入到函數(shù)內(nèi)部。退出程序調(diào)試如果程序執(zhí)行完了,則直接退出。如果程序在執(zhí)行中,則提示程序在執(zhí)行中,是否要退出的提示,確認(rèn)后即可結(jié)束調(diào)試。ARMLinux在PXA270實(shí)驗(yàn)系統(tǒng)上的移植ARMLinux的開發(fā)環(huán)境的建立ARMLinux的交叉編譯
ARMLinux內(nèi)核的配置與編譯嵌入式Linux文件系統(tǒng)的建立與設(shè)置
ARMLinux的開發(fā)環(huán)境的建立
1.Toolchain簡(jiǎn)介ARM交叉編譯環(huán)境不同于X86系列桌面的編譯環(huán)境。PXA270芯片同樣是基于ARM體系結(jié)構(gòu)的,所以在基于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)境所需的全部資源文件已經(jīng)全部在光盤中提供,在開發(fā)主機(jī)上以root用戶登錄,放入光盤之后使用mount命令將其掛載,這樣主機(jī)就可以將光盤當(dāng)作文件來讀取。當(dāng)光盤放入光驅(qū)之后,linux系統(tǒng)可以自動(dòng)的掛載,可以跳過這個(gè)步驟:[rootlocalhostroot]#mount/dev/cdrom/mnt/cdrom[rootlocalhostroot]#cd/mnt/cdromARMLinux的開發(fā)環(huán)境的建立
檢查CD-ROM正確掛載后,需要在開發(fā)主機(jī)上創(chuàng)建目錄,并將光盤內(nèi)容拷貝到目錄中。在根目錄創(chuàng)建了一個(gè)名為PXA270_Linux的目錄,將光盤中的內(nèi)容拷貝到了該目錄中。[rootlocalhostroot]#mkdir/PXA270_Linux[rootlocalhostroot]#cd/PXA270_Linux[rootlocalhostPXA270_Linux]#cp/mnt/cdrom/PXA270_Linux/*-a./ARMLinux的開發(fā)環(huán)境的建立
移動(dòng)到bin目錄下使用ls命令查看,可以看到這些編譯工具。
ARMLinux的開發(fā)環(huán)境的建立
為了之后在任何目錄下面都能夠使用Toolchain,必須要對(duì)路徑進(jìn)行設(shè)置。打開/root/.bash_profile文件來設(shè)置路徑,使用vi編譯器來改.bash_profile文件。[rootlocalhostroot]#vi~/.bash_profile
用vi編輯器打開/root/.bash_profile文件并添加下述的路徑:PATH=$PATH:/opt/xscalev1/binARMLinux的開發(fā)環(huán)境的建立
現(xiàn)在在任何的目錄下都能打開/opt/xscalev1/bin。保存并退出該文件,使用source命令來使路徑生效。此時(shí),使用arm-linux-命令時(shí),Toolchain中的工具會(huì)被使用。ARMLinux的交叉編譯
使用vi編輯器創(chuàng)建一個(gè)hello.c文件。編寫一個(gè)簡(jiǎn)單的程序來打印出一行簡(jiǎn)單的信息: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的交叉編譯下載該二進(jìn)制(hello-arm)文件到EELIOD并執(zhí)行將會(huì)輸出“HelloWorld.”。若要下載到目標(biāo)板,將會(huì)使用到minicom中的串口下載功能。首先需要配置minicom。配置完成之后,可以通過minicom來對(duì)目標(biāo)板進(jìn)行操作。下面幾幅圖minicom的配置過程以及程序下載到目標(biāo)板的方法:Minicom的使用Minicom的使用Minicom的使用Minicom的使用Minicom的使用ARMLinux內(nèi)核的配置與編譯
arch包括所有與體系結(jié)構(gòu)相關(guān)的內(nèi)核代碼include包括編譯內(nèi)核所需要的頭文件init包含內(nèi)核的初始化代碼,但不是系統(tǒng)的引導(dǎo)代碼,其中所包含main.c和version.c文件是研究Linux內(nèi)核的起點(diǎn)mm該目錄包含所有獨(dú)立于CPU體系結(jié)構(gòu)的內(nèi)存管理代碼,如頁式存儲(chǔ)管理內(nèi)存的分配和釋放等。與ARM體系結(jié)構(gòu)相關(guān)的代碼在arch/arm/mm中kernel包括主要的內(nèi)核代碼,此目錄下的文件實(shí)現(xiàn)大多數(shù)Linux的內(nèi)核函數(shù),其中最重要的文件是sched.c。ARMLinux內(nèi)核的配置與編譯2.內(nèi)核配置系統(tǒng)的基本結(jié)構(gòu)
Makefile分布在Linux內(nèi)核源碼中的Makefile,定義Linux內(nèi)核的編譯規(guī)則;頂層Makefile是整個(gè)內(nèi)核配置、編譯的總體控制文件。config.in給用戶提供配置選擇的功能;.config:內(nèi)核配置文件,包括由用戶選擇的配置選項(xiàng),用來存放內(nèi)核配置后的結(jié)果。配置工具包括對(duì)配置腳本中使用的配置命令進(jìn)行解釋的配置命令解釋器和配置用戶界面(基于字符界面:makeconfig;基于Ncurses圖形界面:makemenuconfig;基于XWindows圖形界面:makexconfig)。rules.make規(guī)則文件,被所有的Makefile使用。ARMLinux內(nèi)核的配置與編譯3.編譯內(nèi)核的常用命令Makeconfig:內(nèi)核配置。makedep:尋找依存關(guān)系。。makeclean:清除以前所產(chǎn)生的所有的目標(biāo)文件,模塊文件,核心以及一些臨時(shí)文件等,不產(chǎn)生任何文件。makermproper:刪除所有以前在生成內(nèi)核過程中所產(chǎn)生的所有文件,及除了做makeclean外,還要?jiǎng)h除.config,.depend等文件,把核心源碼恢復(fù)到最原始的狀態(tài)。makezImage:在make的基礎(chǔ)上產(chǎn)生壓縮的核心映像文件./arch/$(ARCH)/boot/zImage以及./arch/$(ARCH)/boot/compressed目錄下產(chǎn)生一些臨時(shí)文件。makebzImage:在make的基礎(chǔ)上產(chǎn)生壓縮比例更大的的核心映像文件./arch/$(ARCH)/boot/bzImage及./arch/$(ARCH)/boot/compressed目錄下產(chǎn)生一些臨時(shí)文件。ARMLinux內(nèi)核的配置與編譯4.內(nèi)核編譯過程makemrproper刪除所有以前在生成內(nèi)核過程中所產(chǎn)生的所有文件makemenuconfig內(nèi)核配置makedep尋找依存關(guān)系makezImage產(chǎn)生壓縮的核心映像文件內(nèi)核編譯完畢之后,生成zImage內(nèi)核映象文件保存在源代碼的arch/arm/boot/目錄下。ARMLinux內(nèi)核的配置與編譯5.內(nèi)核配置項(xiàng)介紹首先將壓縮的linux內(nèi)核源代碼文件linux-2.4.21-PXA270.tar.gz解壓,進(jìn)入linux內(nèi)核源代碼所在的目錄,并在終端輸入makemenuconfig,系統(tǒng)彈出基于Ncurses內(nèi)核配置圖形界面,便可進(jìn)行內(nèi)核選項(xiàng)的配置。[rootlocalhostroot]#tarxvfzlinux-2.4.21-PXA270.tar.gz[rootlocalhostroot]#cdPXA270_Linux/kernel/[rootlocalhostkernel]#makexsbase270_config[rootlocalhostkernel]#makeoldconfig[rootlocalhostkernel]#makemenuconfigARMLinux內(nèi)核的配置與編譯6.下載Linux內(nèi)核鏡像如果bootp和tftp命令能夠正常工作,可以使用如下命令來下載內(nèi)核,具體步驟如下:設(shè)置需要下載的鏡像名:在菜單模式下,選擇“a”,按提示輸入內(nèi)核鏡像和文件系統(tǒng)鏡像名,用戶必須保證在/tftpboot目錄下存在同名的鏡像文件。下載內(nèi)核鏡像:在菜單模式下,選擇“3”,此時(shí),內(nèi)核鏡像通過以太網(wǎng)下載到開發(fā)板的sdram上;若傳輸超時(shí)或失敗,請(qǐng)重新執(zhí)行。燒寫到flash:在菜單模式,選擇“4”,將剛下載的內(nèi)核鏡像燒到flash上。以上步驟正常結(jié)束后,內(nèi)核鏡像已燒入flash中。嵌入式Linux文件系統(tǒng)的建立與設(shè)置1Linux文件系統(tǒng)的類型EXT文件系統(tǒng)NFS文件系統(tǒng)JFFS2文件系統(tǒng)2文件系統(tǒng)的制作Busybox介紹Busybox的編譯配制文件系統(tǒng)
ARMLinux的設(shè)備驅(qū)動(dòng)
Linux的設(shè)備管理設(shè)備驅(qū)動(dòng)程序結(jié)構(gòu)GPIO驅(qū)動(dòng)程序設(shè)計(jì)基于輪循的UART驅(qū)動(dòng)程序設(shè)計(jì)基于中斷UART驅(qū)動(dòng)程序設(shè)計(jì)Linux的設(shè)備管理嵌入式Linux設(shè)備驅(qū)動(dòng)程序的設(shè)計(jì)大致包括以下步驟:向系統(tǒng)申請(qǐng)也可以動(dòng)態(tài)獲得主、次設(shè)備號(hào)。實(shí)現(xiàn)設(shè)備初始化和卸載模塊。設(shè)計(jì)對(duì)設(shè)備文件操作。如定義file_operations結(jié)構(gòu)。設(shè)計(jì)對(duì)設(shè)備文件操作調(diào)用。如read、write等操作。實(shí)現(xiàn)中斷服務(wù)函數(shù),用request_irq向內(nèi)核注冊(cè)。將驅(qū)動(dòng)程序編譯到內(nèi)核或編譯成模塊,用ismod命令加載。生成設(shè)備節(jié)點(diǎn)文件。Linux的設(shè)備管理驅(qū)動(dòng)程序的加載方法在設(shè)計(jì)完主要數(shù)據(jù)結(jié)構(gòu)和函數(shù)接口后就要把設(shè)備驅(qū)動(dòng)加入到內(nèi)核中。內(nèi)核模塊是Linux內(nèi)核的重要組成要素,內(nèi)核模塊能在Linux系統(tǒng)啟動(dòng)之后能夠動(dòng)態(tài)進(jìn)行裝載和卸載,因此不需對(duì)內(nèi)核進(jìn)行重新編譯或重啟系統(tǒng)就可將內(nèi)核的一部分替換掉。GPIO驅(qū)動(dòng)程序的設(shè)計(jì)主要包括以下四個(gè)函數(shù)的設(shè)計(jì):加載本驅(qū)動(dòng)時(shí)執(zhí)行init_module函數(shù)卸載驅(qū)動(dòng)時(shí)執(zhí)行cleanup_module函數(shù)打開驅(qū)動(dòng)程序文件時(shí)執(zhí)行g(shù)pio_open函數(shù)關(guān)閉驅(qū)動(dòng)程序文件時(shí)執(zhí)行g(shù)pio_release函數(shù)
基于輪循的UART驅(qū)動(dòng)程序設(shè)計(jì)基于輪循的UART驅(qū)動(dòng)程序,主要函數(shù)的功能如下:init_module()初始化串口模塊,加載串口設(shè)備驅(qū)動(dòng);uart_open()打開一個(gè)串口設(shè)備節(jié)點(diǎn),當(dāng)一個(gè)設(shè)備節(jié)點(diǎn)被打開時(shí),計(jì)數(shù)器MOD_INC_USE_COUNT加一;uart_release()關(guān)閉一個(gè)設(shè)備節(jié)點(diǎn),當(dāng)一個(gè)設(shè)備節(jié)點(diǎn)被關(guān)閉時(shí),MOD_DEC_USE_COUNT減一;uart_write()調(diào)用copy_from_user()函數(shù)將用戶空間的數(shù)據(jù)拷貝到內(nèi)核空間,然后通過BTuart發(fā)送出去,在該函數(shù)中調(diào)用了SerialOutputByte()函數(shù);uart_read()首先讀BTRBR寄存器,將接收到的數(shù)據(jù)讀到內(nèi)核空間,然后通過copy_to_user()函數(shù)將接收數(shù)據(jù)拷貝到用戶空間;cleanup_module()將BTuart設(shè)備驅(qū)動(dòng)卸載;基于中斷UART驅(qū)動(dòng)程序設(shè)計(jì)基于中斷UART驅(qū)動(dòng)程序設(shè)計(jì),主要函數(shù)的功能如下:init_module()初始化串口模塊,加載串口設(shè)備驅(qū)動(dòng);uart_open()打開一個(gè)串口設(shè)備節(jié)點(diǎn),當(dāng)一個(gè)設(shè)備節(jié)點(diǎn)被打開時(shí),計(jì)數(shù)器MOD_INC_USE_COUNT加一;uart_release()關(guān)閉一個(gè)設(shè)備節(jié)點(diǎn),當(dāng)一個(gè)設(shè)備節(jié)點(diǎn)被關(guān)閉時(shí),MOD_DEC_USE_COUNT減一;uart_write()首先調(diào)用copy_from_user()函數(shù)將用戶空間的數(shù)據(jù)拷貝到內(nèi)核空間,然后通過BTuart發(fā)送出去,在該函數(shù)中調(diào)用了SerialOutputByte()函數(shù);uart_read()interruptible_sleep_on()使接收進(jìn)程進(jìn)入睡眠狀態(tài),等待中斷喚醒睡眠狀態(tài);uart_init(void)配置串口的波特率、數(shù)據(jù)位、停止位、奇偶校驗(yàn)和開啟串口接收中斷;SerialOutputByte(constcharc)串口發(fā)送,將字符C通過串口發(fā)送出去;
ARMLinux下應(yīng)用程序設(shè)計(jì)
UART應(yīng)用程序設(shè)計(jì)基于SOCKET的網(wǎng)絡(luò)應(yīng)用程序設(shè)計(jì)USB攝像頭接口應(yīng)用程序設(shè)計(jì)
Framebuffer圖片顯示應(yīng)用程序設(shè)計(jì)
UART應(yīng)用程序設(shè)計(jì)
在Linux操作系統(tǒng)中對(duì)底層終端的處理是一個(gè)非常復(fù)雜的過程,需要處理許多不同類型的設(shè)備。Linux系統(tǒng)處理終端的方法是通過串行接口連接的控制臺(tái)與系統(tǒng)通信并運(yùn)行程序。1.終端控制函數(shù)介紹在對(duì)底層終端操作中有一個(gè)用于查詢和操作終端的標(biāo)準(zhǔn)接口結(jié)構(gòu)體termios,該結(jié)構(gòu)體對(duì)終端的輸入、輸出、硬件特性、控制協(xié)議等方面進(jìn)行了定義,具體定義如下:c_iflag:用來控制輸入處理選項(xiàng);c_oflag:控制輸出數(shù)據(jù)的處理;c_cflag:設(shè)置決定終端硬件特性的控制標(biāo)志;c_lflag:存放本地模式標(biāo)志,用來操縱終端特性;c_line:表示控制協(xié)議;c_cc:包含特殊字符序列的值以及它們所代表的操作。UART應(yīng)用程序設(shè)計(jì)1)終端屬性控制函數(shù)對(duì)終端的操作主要通過屬性設(shè)置函數(shù)tcsetattr()和屬性獲取函數(shù)tcgetattr()來實(shí)現(xiàn)。tcsetattr()和tcgetattr()的調(diào)用形式如下:inttcsetattr(intfd,intaction,structtermios*tp)函數(shù)tcsetattr()使用由tp引用的termios數(shù)據(jù)結(jié)構(gòu)來設(shè)置與文件描述符fd相關(guān)聯(lián)的終端參數(shù)inttcgetattr(intfd,structtermios*tp)查詢和文件描述符相關(guān)聯(lián)的終端參數(shù),并將參數(shù)存儲(chǔ)到由tp所引用的termios數(shù)據(jù)結(jié)構(gòu)體中。UART應(yīng)用程序設(shè)計(jì)
2)終端速度控制函數(shù)終端速度控制函數(shù)用來設(shè)置終端設(shè)備的輸入、輸出速度,速度以波特率來定義。這些函數(shù)都是成對(duì)出現(xiàn),其中的兩個(gè)用來獲取和設(shè)置輸入的速度,另兩個(gè)用來獲取和設(shè)置輸出線路的速度,它們定義形式如下:intcfgetispeed(structtermios*tp)intcfsetispeed(structtermios*tp,speed_tspeed)intcfgetospeed(structtermios*tp)intcfsetospeed(structtermios*tp,speed_tspeed)UART應(yīng)用程序設(shè)計(jì)
2串口操作函數(shù)步驟1)打開串口函數(shù),返回操作標(biāo)志2)關(guān)閉串口子程序,返回操作標(biāo)志3)向串口寫數(shù)據(jù),返回寫入串口的總長(zhǎng)度4)設(shè)置串口參數(shù),主要設(shè)置數(shù)據(jù)位、停止位、奇偶校驗(yàn)位、速度、超時(shí)設(shè)置等參數(shù),返回操作標(biāo)志。5)讀取串口數(shù)據(jù)UART應(yīng)用程序設(shè)計(jì)
3串口通信源代碼的編譯1)PC平臺(tái)的串口通信程序編譯將光盤提供的serial.c的源代碼復(fù)制到硬盤中(假設(shè)將源碼復(fù)制在/root/PAX270_Linux目錄下)對(duì)源碼進(jìn)行編譯。[rootlocalhostPAX270_Linux]#cdserial[rootlocalhostserial]#gcc–oserialserial.c在PC機(jī)上運(yùn)行serial程序;[rootlocalhostserial]#./serial1UART應(yīng)用程序設(shè)計(jì)
2)ARM平臺(tái)的串口通信程序的編譯將光盤提供的serialarm的源代碼復(fù)制到硬盤中(假設(shè)將源碼復(fù)制在/root/PAX270_Linux目錄下)設(shè)置交叉編譯工具參數(shù)(arm-linux-gcc)。對(duì)源代碼進(jìn)行編譯。[rootlocalhostPAX270_Linux]#cdserialarm[rootlocalhost
serialarm]#arm-linux-gcc–oserialarmserialarm.c將編譯好的程序serial下載到開發(fā)板的/usr/qpe/bin目錄下。在目標(biāo)板上利用chm
溫馨提示
- 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. 人人文庫(kù)網(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 南街小學(xué)考試題及答案
- 衛(wèi)生政策改革與公共衛(wèi)生服務(wù)的對(duì)接試題及答案
- 2024年專利代理人考試述評(píng)試題及答案
- 初二數(shù)學(xué)全套試題及答案
- 衛(wèi)生管理職業(yè)發(fā)展策略試題及答案
- 專利申請(qǐng)中的技術(shù)內(nèi)容與法律要求試題及答案
- 心理咨詢師考試中如何解決臨床問題試題及答案
- 厭學(xué)心理測(cè)試題及答案
- 深度解析光電工程師證書考試試題及答案
- 咸陽定向面試試題及答案
- 施工風(fēng)險(xiǎn)技術(shù)風(fēng)險(xiǎn)
- (高清版)JGT 225-2020 預(yù)應(yīng)力混凝土用金屬波紋管
- 酸棗仁湯的臨床應(yīng)用研究
- 河北省廊坊市安次區(qū)2023-2024學(xué)年八年級(jí)下學(xué)期4月期中物理試題
- 前庭神經(jīng)炎病人的護(hù)理
- 招標(biāo)代理服務(wù) 投標(biāo)方案(技術(shù)方案)
- 寺院宣傳法治知識(shí)講座
- 《多源圖像融合技術(shù)及其遙感應(yīng)用-圖像融合技術(shù)》課件
- 直播帶崗方案
- 網(wǎng)絡(luò)安全前沿技術(shù)與未來趨勢(shì)研究
- 遼寧省沈陽市鐵西區(qū)2024屆英語三年級(jí)第二學(xué)期期中調(diào)研試題含答案
評(píng)論
0/150
提交評(píng)論