基于嵌入式系統(tǒng)的手機(jī)應(yīng)用設(shè)計(jì)實(shí)驗(yàn)報(bào)告_第1頁
基于嵌入式系統(tǒng)的手機(jī)應(yīng)用設(shè)計(jì)實(shí)驗(yàn)報(bào)告_第2頁
基于嵌入式系統(tǒng)的手機(jī)應(yīng)用設(shè)計(jì)實(shí)驗(yàn)報(bào)告_第3頁
基于嵌入式系統(tǒng)的手機(jī)應(yīng)用設(shè)計(jì)實(shí)驗(yàn)報(bào)告_第4頁
基于嵌入式系統(tǒng)的手機(jī)應(yīng)用設(shè)計(jì)實(shí)驗(yàn)報(bào)告_第5頁
已閱讀5頁,還剩17頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

1、目錄第一章、 引言0第二章、嵌入式開發(fā)基本介紹11.1 嵌入式 linux 簡介11.2 嵌入式 linux 開發(fā)平臺(tái)簡介2第三章、嵌入式linux 開發(fā)21建立開發(fā)環(huán)境22建立開發(fā)環(huán)境32.1開發(fā)環(huán)境32.2引導(dǎo)裝載程序(bootloader)的建立與燒寫、配置32.3移植linux 內(nèi)核并燒寫52.4建立根文件系統(tǒng)并燒寫72.5開發(fā)應(yīng)用程序并植入linux7第四章、基于嵌入式系統(tǒng)的手機(jī)應(yīng)用設(shè)計(jì)91主函數(shù)的編寫92功能實(shí)現(xiàn)。93程序編譯與運(yùn)行9結(jié)束語11附錄12第一章、 引言 目前 linux已廣泛應(yīng)用于信息家電、數(shù)據(jù)網(wǎng)絡(luò)、工業(yè)控制、醫(yī)療衛(wèi)生航空航天等眾多領(lǐng)域。在嵌入式領(lǐng)域,隨著價(jià)格低廉、結(jié)

2、構(gòu)小巧的各種微處理器的產(chǎn)生為外設(shè)連接提供了穩(wěn)定可靠的硬件架構(gòu),限制嵌入式系統(tǒng)發(fā)展的瓶頸就突出表現(xiàn)在軟件方面。 盡管從八十年代末開始,陸續(xù)出現(xiàn)了一些嵌入式操作系統(tǒng),比較著名的有 vxwork、psos、neculeus 和 windows ce。但這些專用操作系統(tǒng)都是商業(yè)化產(chǎn)品,其高昂的價(jià)格使許多低端產(chǎn)品的小公司望而卻步,并且其源代碼的封閉性也大大限制了開發(fā)者的積極性。 結(jié)合中國實(shí)情,當(dāng)前國家對(duì)自主操作系統(tǒng)的大力支持,為源碼開放的 linux 的推廣提供的廣闊的發(fā)展前景。對(duì)上層應(yīng)用開發(fā)者而言,嵌入式系統(tǒng)需要的是一套高度簡練、界面友善、質(zhì)量可靠、應(yīng)用廣泛、易開發(fā)、多任務(wù),并且價(jià)格低廉的操作系統(tǒng)。l

3、inux 對(duì)廠商不偏不倚而且成本極低,能夠很快成為用于各種設(shè)備的操作系統(tǒng)。如今,業(yè)界已經(jīng)達(dá)成共識(shí):即嵌入式 linux 是大勢(shì)所趨,其巨大的市場潛力與醞釀的無限商機(jī)必然會(huì)吸引眾多的廠商進(jìn)入這一領(lǐng)域。第二章、嵌入式開發(fā)基本介紹1.1 嵌入式 linux 簡介 linux 正在嵌入式開發(fā)領(lǐng)域穩(wěn)步發(fā)展。因?yàn)?linux 使用 gpl,所以任何對(duì)將 linux 定制于自己特定開發(fā)板或 pda、掌上機(jī)、可佩帶設(shè)備感興趣的人都可以從因特網(wǎng)免費(fèi)下載其內(nèi)核和應(yīng)用程序,并開始移植或開發(fā)。許多 linux 改良品種迎合了嵌入式市場。它們包括 rtlinux(實(shí)時(shí) linux) 、uclinux(用于非 mmu 設(shè)

4、備的 linux) 、montavista linux(用于 arm、mips、ppc 的 linux 分發(fā)版) 、arm-linux(arm 上的 linux)和其它 linux 系統(tǒng)。 嵌入式 linux 的發(fā)展比較迅速。nec、索尼已經(jīng)在銷售個(gè)人視頻錄像機(jī)等基于 linux 的消費(fèi)類電子產(chǎn)品, 摩托羅拉則計(jì)劃在其未來的大多數(shù)手機(jī)上使用linux, ibm也制定了在手持機(jī)上運(yùn)行l(wèi)inux的計(jì)劃。 數(shù)年來,“l(fā)inux 標(biāo)準(zhǔn)庫”組織一直在從事對(duì)在服務(wù)器上運(yùn)行的 linux進(jìn)行標(biāo)準(zhǔn)化的工作,現(xiàn)在,嵌入式計(jì)算領(lǐng)域也開始了這一工作。嵌入式 linux 標(biāo)準(zhǔn)吸引了“l(fā)inux標(biāo)準(zhǔn)庫”以及 unix

5、組織中有益的元素。1.2 嵌入式 linux 開發(fā)平臺(tái)簡介 嵌入式 linux 可以運(yùn)行的硬件平臺(tái)十分廣泛,從 x86、mips、powerpc 到arm,以及其他許多硬件體系結(jié)構(gòu),目前在世界范圍,arm體系結(jié)構(gòu)的 soc 逐漸占領(lǐng)32 位嵌入式微處理器市場,并且在國內(nèi)市場上很容易購買到 arm 核的嵌入式處理器,我們所介紹的硬件平臺(tái)也是基于 arm 體系結(jié)構(gòu),intel 的xscale pxa270處理器,由北京博創(chuàng)興業(yè)科技有限公司開發(fā)的 up-techpxa270 實(shí)驗(yàn)儀器。 博創(chuàng)科技近日正式推出基于 intel xscale 架構(gòu)的兩款高端嵌入式系統(tǒng)教學(xué)科研平臺(tái) up-techpxa27

6、0 和up-techpxa270。 其中 up-techpxa270 采用 intel xscale 架構(gòu) pxa270 嵌入式微處理器, up-techpxa270基于 intel xscale 架構(gòu)最新的 pxa270 嵌入式微處理器。pxa270 最高主頻可達(dá) 624mhz,加入了 wireless mmx 技術(shù),大大提升了多媒體處理能力;同時(shí) pxa270 還加入了 intel speedstep 動(dòng)態(tài)電源管理技術(shù),在保證cpu 性能的情況下,最大限度地降低移動(dòng)設(shè)備功耗。pxa270 可以廣泛應(yīng)用于 pda、智能手機(jī)、pmp 產(chǎn)品中。 博創(chuàng)科技的 up-techpxa270 教學(xué)科研平

7、臺(tái)主要是面向計(jì)算機(jī)、軟件專業(yè)的高端平臺(tái),微處理器主頻穩(wěn)定運(yùn)行在 520mhz,采用1313mm vfbga 封裝,內(nèi)部集成 iwmmx 指令,加速處理器對(duì)多媒體數(shù)據(jù)的 處理速度??蛇\(yùn)行 linux 2.4.x 和linux 2.6.x 內(nèi)核,支持 qt/e、minigui 等嵌入式圖形界面,提供完整的驅(qū)動(dòng)和應(yīng)用程序。既適合作為計(jì)算機(jī)、軟件等專業(yè)開設(shè)嵌入式軟件課程的教學(xué)平臺(tái),又適合廣大從事 pmp、pda、智能手機(jī)的廠商和科研單位作為參考設(shè)計(jì)平臺(tái)。 up-techpxa270 教學(xué)科研平臺(tái)由處理器核心板、主板及 lcd 三部份組成。核心板和主板的接口設(shè)計(jì)充分考慮了升級(jí)產(chǎn)品的兼容性,核心板可以升級(jí)

8、到 pxa271、pxa272 微處理器,而主板資源不變。此外,除了具有豐富的接口資源,良好的可擴(kuò)展性也是 up-techpxa270 平臺(tái)的一大特色。up-techpxa270 預(yù)留了 32位擴(kuò)展總線接口,與博創(chuàng) up-netarm2410、up-netarm2410-s 平臺(tái)兼容,從而大大減輕了用戶擴(kuò)展新功能的負(fù)擔(dān)。第三章、嵌入式linux 開發(fā)1建立開發(fā)環(huán)境操作系統(tǒng)可以使用一般的linux發(fā)行版本,選擇定制安裝或全部安裝。安裝好后配置開發(fā)主機(jī)。先配置minicom,一般的參數(shù)為波特率115200,數(shù)據(jù)位8 位,停止位1,無奇偶校驗(yàn),軟件硬件流控設(shè)為無。在windows 下的超級(jí)終端的配置

9、也是這樣。minicom 軟件的作用是作為調(diào)試嵌入式開發(fā)板的信息輸出的監(jiān)視器和鍵盤輸入的工具。配置網(wǎng)絡(luò),主要是配置nfs網(wǎng)絡(luò)文件系統(tǒng),需要關(guān)閉防火墻,簡化嵌入式網(wǎng)絡(luò)調(diào)試環(huán)境設(shè)置過程。從網(wǎng)絡(luò)上下載一些公開源代碼的bootloader,如u-boot、blob、vivi、lilo、arm-boot、red-boot 等,根據(jù)自己具體芯片進(jìn)行移植修改。有些芯片沒有內(nèi)置引導(dǎo)裝載程序,比如三星的arm7、arm9 系列芯片,這樣就需要編寫燒寫開發(fā)板上flash 的燒寫程序,網(wǎng)絡(luò)上有免費(fèi)下載的windows 下通過jtag 并口簡易仿真器燒寫arm 外圍flash 芯片的燒寫程序。也有l(wèi)inux 下的公開

10、源代碼的j-flash 程序。如果不能燒寫自己的開發(fā)板,就需要根據(jù)自己的具體電路進(jìn)行源代碼修改。這是讓系統(tǒng)可以正常運(yùn)行的第一步。如果你購買了廠家的仿真器當(dāng)然比較容易燒寫flash 了,這對(duì)于需要迅速開發(fā)自己的應(yīng)用的人來說可以極大提高開發(fā)速度,但是其中的核心技術(shù)是無法了解的。linux內(nèi)核2.6系列。對(duì)于一些較常見的開發(fā)平臺(tái),linux內(nèi)核已經(jīng)加入了支持,可以直接使用。如果有專門針對(duì)你所使用的平臺(tái)移植好的linux 內(nèi)核補(bǔ)丁,我們則可以下載后對(duì)標(biāo)準(zhǔn)內(nèi)核打好補(bǔ)丁后即可。如果沒有對(duì)應(yīng)的補(bǔ)丁,我們則需要在標(biāo)準(zhǔn)內(nèi)核中添加自己的cpu的支持,再移植該平臺(tái)特定硬件的驅(qū)動(dòng)程序,進(jìn)行調(diào)試修改,直至符合要求。由于

11、上一步已經(jīng)移植好了bootloader,我們可以使用它來對(duì)移植好的內(nèi)核進(jìn)行燒寫。從 下載busybox進(jìn)行功能裁減,可以產(chǎn)生一個(gè)最基本的根文件系統(tǒng)。busybox已經(jīng)包含了linux系統(tǒng)的大部分命令,可以再根據(jù)自己的應(yīng)用需要添加其他程序。默認(rèn)的啟動(dòng)腳本一般不會(huì)符合應(yīng)用的需要,所以需要修改根文件系統(tǒng)中的啟動(dòng)腳本,它位于/etc 目錄下,包括:/etc/init.d/rc.s 、/etc/profile 、/etc/.profile 等, 自動(dòng)掛裝文件系統(tǒng)的配置文件/etc/fstab,具體情況會(huì)隨系統(tǒng)不同而不同。根文件系統(tǒng)在嵌入式系統(tǒng)中一般設(shè)為只讀,需要使用mkcramfs,genromfs 等

12、工具來生成映象文件。根文件系統(tǒng)一般也使用bootloader進(jìn)行燒寫。我們編寫好了針對(duì)目標(biāo)平臺(tái)的應(yīng)用程序代碼后,可以在pc機(jī)上對(duì)代碼進(jìn)行交叉編譯,編譯后生成可在目標(biāo)開發(fā)板上執(zhí)行的應(yīng)用程序文件。然后可以通過網(wǎng)絡(luò),串口,usb等方式,將應(yīng)用程序文件傳送在目標(biāo)板的文件系統(tǒng)中,進(jìn)行執(zhí)行調(diào)試。2建立開發(fā)環(huán)境2.1開發(fā)環(huán)境在基于linux的pc機(jī)上正確的嵌入式開發(fā)軟件環(huán)境包括1、minicom配置正確;2、arm-linux-gcc及其它交叉編譯工具可用;3、pc機(jī)nfs服務(wù)器和tftp服務(wù)器工作正常。2.2引導(dǎo)裝載程序(bootloader)的建立與燒寫、配置主要過程如下:運(yùn)行minicom,即在終端輸

13、入minicom回車,可以看到如下界面:啟動(dòng)pxa270 開發(fā)板,立即按ctlc 組合鍵進(jìn)入blob配置blob比較復(fù)雜,下面詳細(xì)敘述:首先,修改mac地址。由于開發(fā)板出廠時(shí)mac地址均相同,需要修改開發(fā)板的mac地址才能避免地址沖突。在blob 下使用下面的命令修改mac地址:blobifconfig mac 08:00:3e:2a:14:03 上述命令配置開發(fā)板的mac地址,08:00:3e:2a:14:03即為的開發(fā)板的mac地址,一定要更改得與別的開發(fā)板不同,只需要改后面的3個(gè)字節(jié)即可,注意是16進(jìn)制數(shù)。然后,為開發(fā)板設(shè)置ip參數(shù)blobifconfig server 192.168.

14、0.93 。其中3 為tftp 服務(wù)器(即pc機(jī))的ip地址。blobifconfig ip 55 。其中55為開發(fā)板的ip地址。再將配置參數(shù)燒寫進(jìn)flash芯片中,再用blobflash param save命令將mac地址保存到flash中,以便復(fù)位或斷電重啟的情況下這些參數(shù)仍然有效,不用重新更改:特別注意的是:由于這里設(shè)置的開發(fā)板ip地址僅在blob環(huán)境下有效。因此燒寫完內(nèi)核并進(jìn)入linux環(huán)境后,還需要重新設(shè)置開發(fā)板以太網(wǎng)接口eth0的ip地址,否則將自動(dòng)被設(shè)置為192.168.0.?。在linux環(huán)境下設(shè)置eth0的i

15、p地址命令如下:#ifconfig eth0 55,否則pc不能ping到板。另外,在pc的linux環(huán)境下也要#ifconfig eth0 3,否則板不能ping到pc。配置完以后用ping測試是否兩個(gè)ip地址是否可達(dá)。這里是用板ping主機(jī),100%丟包率說明不通。這里是用板ping主機(jī), 0%丟包率說明通。2.3移植linux 內(nèi)核并燒寫詳細(xì)步驟如下:已經(jīng)移植好的linux內(nèi)核壓縮包為/up-techpxa270/exp/kernel/up-linux-2.6.9-release-2006-6-9.tar.bz2。解壓內(nèi)核包local host

16、cdlocal hostmkdir kernellocal hostcd kernel local hosttar jxvf/up-techpxa270/exp/kernel/up-linux-2.6.9-release-2006-6-9.tar.bz2編譯內(nèi)核local hostcd linux-2.6.9-release local hostmake cleanlocal hostmake zimage生成的二進(jìn)制文件為arch/arm/boot/zimage,把它拷貝到pc機(jī)的tftp服務(wù)目錄命令為local hostcp arch/arm/boot/zimage /tftpboot/燒

17、寫內(nèi)核首先,運(yùn)行minicom.啟動(dòng)pxa270 開發(fā)板,按ctlc 組合鍵進(jìn)入blob。然后用blobtdownload kernel命令燒寫zimage 到ram。按用blobflash kernel命令燒寫zimage 到flash。2.4建立根文件系統(tǒng)并燒寫首先,解壓根文件系統(tǒng),生成root 目錄local hostcd /up-techpxa270/exp/root/local hosttar jxvf /up-techpxa270/exp/root/up-techpxa270-root-2006-05-31.tar.bz2然后,生成jffs2 文件系統(tǒng),先改變mkfs.jffs2文

18、件權(quán)限,用local host chmod 755 mkfs.jffs2命令使該文件可以執(zhí)行。再用local host./mkfs.jffs2 -r root -o rootfs.img -e 0x20000 -pad=0xd00000命令生成文件系統(tǒng)鏡像。其中的選項(xiàng)含義分別是:-r: -root=dir,由目錄生成鏡像文件;-e:flash 擦除扇區(qū)大小,默認(rèn)為64kb,此處指定為128kb-pad:指定創(chuàng)建的根文件系統(tǒng)的大小生成的映像文件為rootfs.img,用local hostcp rootfs.img /tftpboot/命令把它拷貝到pc機(jī)的tftp服務(wù)目錄。按照blobtdow

19、nload ramdisk命令燒寫rootfs.img 到ram。按blobflash ramdisk命令燒寫rootfs.img 到flash。最后blobboot,在blob 下啟動(dòng)linux。2.5開發(fā)應(yīng)用程序并植入linux首先要建立工作目錄:local hostcdlocal hostmkdir 01_hellolocal hostcd 01_hello 然后,編寫程序源代碼。這里舉例:c語言和匯編語言混合編程,鍵盤輸入1個(gè)十進(jìn)制數(shù)x, 用匯編語言計(jì)算3*x2+2*x3,由終端輸出計(jì)算結(jié)果。這里的主函數(shù)文件為ex3.c;包含計(jì)算3*x2+2*x3過程的文件為compute.s。最后編

20、寫makefile文件。這是因?yàn)橛捎诰幾g程序的過程較為繁瑣,因此編寫了一個(gè)簡單的makefile來組織這些源程序,因?yàn)槌绦蚴且陂_發(fā)板上運(yùn)行,因此指定了交叉編譯工具。這里的程序見附錄。在進(jìn)行編譯應(yīng)用程序pc機(jī)上,在程序目錄下運(yùn)行,(/nfsroot為nfs服務(wù)目錄)。local hostmakelocal hostcp ex3 /nfsroot開發(fā)板上,掛接宿主機(jī)的根目錄。成功之后在開發(fā)板上進(jìn)入/mnt 目錄,便相應(yīng)進(jìn)入宿主機(jī)nfs目錄,再進(jìn)入開發(fā)程序目錄運(yùn)行剛剛編譯好的ex3 程序,查看運(yùn)行結(jié)果。如果該程序不具有可執(zhí)行屬性,需要用chmod命令修改,使其可以執(zhí)行。pxa270mount -o

21、 nolock 3:/nfsroot /mnt/nfs這是將/mnt/nfs掛接于3的/nfsrootpxa270cd /mnt/nfspxa270chmod 755 ex3pxa270./ex3開發(fā)板掛接宿主機(jī)目錄只需要掛接一次便可,只要開發(fā)板沒有重起,就可以一直保持連接。這樣可以反復(fù)修改、編譯、調(diào)試,不需要下載到開發(fā)板的過程,當(dāng)然當(dāng)調(diào)試好程序后,就可以下載到開發(fā)板運(yùn)行。第四章、基于嵌入式系統(tǒng)的手機(jī)應(yīng)用設(shè)計(jì)1主函數(shù)的編寫首先進(jìn)行波特率的確定。在main函數(shù)中,輸入的參數(shù)有兩個(gè),分別是int argc,char* argv。用get_baudrate

22、(argc, argv)進(jìn)行波特率的選擇,這里用argv來確定其波特率的大小,分別有4800、9600、19200、38400、57600、115200。之后調(diào)用tty_init()進(jìn)行pc與實(shí)驗(yàn)板的通訊。由于實(shí)驗(yàn)板沒有輸入輸出設(shè)備,需要pc的minicom作為實(shí)驗(yàn)板的終端進(jìn)行操作使設(shè)備運(yùn)行。這里設(shè)置端口2以及波特率等。創(chuàng)建2個(gè)進(jìn)程,分別是讀取模塊和讀取鍵盤。讀取模塊使用pthread_create(&th_b, null, gprs_read, 0),其中g(shù)prs_read與modem通信,讀取modem模塊中的信息。另一個(gè)讀取鍵盤是為了讀取終端pc對(duì)于系統(tǒng)的控制,其函數(shù)為pthread_c

23、reate(&th_a, null, keyshell, 0),其中keyshell先顯示選項(xiàng)1是打電話,2是接電話,3是掛電話,4是發(fā)短信,5是換波特率,6是退出,*是幫助。然后讀取鍵盤輸入的命令,以執(zhí)行相應(yīng)功能。這里個(gè)功能的執(zhí)行方式將在下面進(jìn)行詳述。一切就緒后,進(jìn)行循環(huán)等待輸入,語句為while(!stop) usleep(100000)。最后,當(dāng)stop=1的時(shí)候跳出循環(huán),用tty_end();結(jié)束程序。2功能實(shí)現(xiàn)。打電話功能。當(dāng)選擇1的時(shí)候進(jìn)入電話功能,可以實(shí)現(xiàn)撥號(hào)并與他人手機(jī)進(jìn)行通話的功能。在用strncmp語句確定選擇后,提示輸入電話號(hào)碼。將它存到cmd變量,由gprs_call(

24、cmd, strlen(cmd);進(jìn)行處理。在這里先發(fā)送撥打命令atd,將輸入的數(shù)字串解析成號(hào)碼,再開始進(jìn)行呼叫。當(dāng)選擇2的時(shí)候,進(jìn)入接電話功能。用gprs_ans();函數(shù)完成,向模塊發(fā)送接聽命令ata。當(dāng)選擇3的時(shí)候,掛電話。用gprs_hold();函數(shù)完成,向模塊發(fā)送掛機(jī)命令ath。當(dāng)選擇4的時(shí)候,進(jìn)入發(fā)短信功能。先輸入發(fā)送短信的電話號(hào)碼get_line(cmd);,用gprs_msg(cmd, strlen(cmd);函數(shù)完成發(fā)送功能。具體gprs_msg的工作方式如下。先確定要發(fā)送的字符,即發(fā)的信息,向模塊發(fā)送發(fā)送修改字符集命令at+cmgf=1,再發(fā)送發(fā)短信命令at+cmgs=。

25、當(dāng)選擇5的時(shí)候,換波特率。先輸入要變換的波特率,再用gprs_baud(cmd, strlen(cmd);函數(shù)完成。當(dāng)選擇6的時(shí)候,退出程序。將stop置1,使main的while(!stop) usleep(100000)語句不滿足循環(huán)條件執(zhí)行tty_end()退出程序。3程序編譯與運(yùn)行通過建立makefile文件,將這些.c文件進(jìn)行編譯,形成gprs.exe程序。在運(yùn)行前,需要將nfs配置好,將編譯好的程序gprs放到/nfsroot中,為了開發(fā)板與pc連接成功,要開放/nfsroot的讀寫權(quán)限。將開發(fā)板的/mnt/nfs掛接到pc的/nfsroot。語句如下:mount -o noloc

26、k 1:/nfsroot /mnt/nfspxa270cd /mnt/nfspxa270./gprs其中,選1是打電話,2是接電話,3是掛電話,4是發(fā)短信,5是換波特率,6是退出,*是幫助例如可以選1打電話結(jié)束語這次課程設(shè)計(jì),雖然時(shí)間比較緊,但是,通過編程操作,學(xué)習(xí)和掌握構(gòu)建基于pxa270硬件平臺(tái)和嵌入式linux軟件開發(fā)環(huán)境的方法,基本的掌握gprs 通訊原理,認(rèn)識(shí)了gprs 通信電路的主要構(gòu)成,應(yīng)用arm 嵌入式開發(fā)平臺(tái)配置的gprs 擴(kuò)展板,通過編程應(yīng)用程序控制gprs 擴(kuò)展板,實(shí)現(xiàn)發(fā)送固定內(nèi)容的短信,接打語音電話等通信模塊的基本功能。實(shí)現(xiàn)gprs模塊的訪問與控制

27、,以及實(shí)現(xiàn)接打語音電話的功能,還有發(fā)送固定內(nèi)容的短信的功能。參考文獻(xiàn)1李俊.嵌入式linux設(shè)備驅(qū)動(dòng)開發(fā)詳解m.北京:人民郵電出版社,20082楊剛.32位risc嵌入式處理器及其應(yīng)用m.北京:電子工業(yè)出版社,20073石秀民,魏洪興.嵌入式系統(tǒng)原理與應(yīng)用-基于xscale與linuxm.北京:北京航空航天大學(xué)出版社,2007附錄主函數(shù)文件為ex3.c:#include extern int compute(int data);int main()int x;printf(input x=);scanf(%d,&x);printf(the result is %dn,compute(x);re

28、turn 0;包含計(jì)算3*x2+2*x3過程的文件為compute.s:.text.align.global compute compute:stmfd sp!,r4-r11,r14mul r1,r0,r0mov r3,#2mul r2,r1,r3mov r3,#3mul r4,r1,r3mla r0,r2,r0,r4ldmfd sp!,r4-r11,r15makefile文件cc= arm-linux-gccname = ex3 ex3 : ex3.c compute.s$(cc) ex3.c compute.s -o $(name)clean:rm -f $(name)(以上首行空格是ta

29、b鍵生成,否則會(huì)引起遺漏分隔符錯(cuò)誤)gprs.c#include #include #include /linux的系統(tǒng)調(diào)用,包含了許多 u n i x系統(tǒng)服務(wù)的函數(shù)原型#include /#include #include tty.h#includegprs.hvoid gprs_init() int i;for(i=0; i5; i+) tty_writecmd(cmdi, strlen(cmdi); /下面選擇通道0,使用普通電話話柄/* gprs_cmd(at+chfa=0r); /設(shè)置通話通道為0 usleep(1000); gprs_cmd(at+clvl=100r);/設(shè)置受話器

30、音量最大 usleep(1000); gprs_cmd(at+cmic=0,10r);/設(shè)置通道0的話筒增益 usleep(1000);*/void gprs_hold()tty_writecmd(at, strlen(at);tty_writecmd(ath, strlen(ath);/發(fā)送掛機(jī)命令athvoid gprs_ans() tty_writecmd(at, strlen(at);tty_writecmd(ata, strlen(ata);/發(fā)送接聽命令ata/撥叫 void gprs_call(char *number, int num) tty_write(atd, strle

31、n(atd); /發(fā)送撥打命令atdtty_write(number, num);tty_write(;r, strlen(;r);usleep(200000);/發(fā)送短信void gprs_msg(char *number, int num) char ctl=26,0;char text=welcome to use up-tech embedded platform!;tty_writecmd(at, strlen(at);tty_writecmd(at, strlen(at);tty_writecmd(at+cmgf=1, strlen(at+cmgf=1);/發(fā)送修改字符集命令tty

32、_write(at+cmgs=, strlen(at+cmgs=);/發(fā)送發(fā)短信命令,具體格式見手冊(cè)tty_writecmd(number, strlen(number);tty_write(text, strlen(text);tty_write(ctl, 1); /“ctrl+z的ascii碼usleep(300000);void gprs_baud(char *baud,int num)tty_write(at+ipr=, strlen(at+ipr=);tty_writecmd(baud, strlen(baud) );usleep(200000);keyshell.c#include

33、 #include #include #include #include #include #include #include char shell_s=nkeyshell$: ;/*int argc, char *argv*/#define cmd_tpye(0)#define phone_number(1)#define max_cmd_depth (2)extern volatile int stop ;int get_line(char *cmd) int i=0; char temp;while (1) temp = getchar();if (temp = r | temp = n

34、) return 0 ;cmdi=temp; if(cmdi=13) cmdi=0; break; fflush(stdout); i+;void * keyshell()char cmd256=0,;gprs_init();/gprs 初始化printf(n);printf(n 1 give a call);printf(n 2 respond a call);printf(n 3 hold a call);printf(n 4 send a msg);printf(n 5 change baudrate);printf(n 6 exit);printf(n * help menu);whi

35、le(1)printf(shell_s);fflush(stdout);get_line(cmd);printf(rn);/顯示必要的輸出if(strncmp(1,cmd,1)=0)printf(nyou select to gvie a call, please input number:);fflush(stdout);get_line(cmd);gprs_call(cmd, strlen(cmd);printf(ncalling.); else if(strncmp(2,cmd,1)=0)gprs_ans();printf(nanswering.); else if(strncmp(3,

36、cmd,1)=0)gprs_hold();printf(nhold a call);else if (strncmp(4,cmd,1)=0)printf(nyou select to send a message, please input number:);fflush(stdout);get_line(cmd);gprs_msg(cmd, strlen(cmd);printf(nsending.); else if(strncmp(6,cmd,1)=0)printf(nexit this program!n);stop=1;break; else if(strncmp(5,cmd,1)=0

37、)printf(nyou select to change baudrate, please input baudrate:);fflush(stdout);get_line(cmd);gprs_baud(cmd, strlen(cmd);printf(please exit and run as another baudrate.);else if (strncmp(*,cmd,2)=0)printf(n);printf(n 1 give a call);printf(n 2 respond a call);printf(n 3 hold a call);printf(n 4 send a

38、msg);printf(n 5 change baudrate);printf(n 6 exit);printf(n * help menu);else if(cmd0 != 0)system(cmd);main.c#include #include #include #include #include /#include #include #include tty.h#include gprs.h/*-*/#define endminiterm 27 /* esc to quit miniterm */#define false0#define true 1/*-*/volatile int

39、 stop=false;int get_gprs_ok=false;volatile int baud=b115200;char * cmd20=at,ate1,at+chfa=1, /設(shè)置通話通道為1,at+chfa 命令切換主副音頻通道at+clvl=100,/設(shè)置受話器音量最大, at+clvl 命令可以調(diào)節(jié)輸出音頻信號(hào)增益at+cmic=1,10/設(shè)置通道1的話筒增益/atd12345678r,;void * keyshell() ;/* modem input handler */void* gprs_read(void * data)int i=0;char c;char buf1

40、024; printf(nread modemn); while (stop=false) tty_read(&c,1); printf(%c,c); printf(exit from reading modemn); return null; int get_baudrate(int argc,char* argv)/看波特率的輸入值int v=atoi(argv1);switch(v)case 4800:return b4800;case 9600:return b9600;case 19200:return b19200;case 38400:return b38400;case 576

41、00:return b57600;case 115200:return b115200;default:return -1; /*-*/int main(int argc,char* argv)int ok; pthread_t th_a, th_b; void * retval;if (argc 1)baud=get_baudrate(argc, argv);/獲取波特率tty_init();/終端初始化,pc與實(shí)驗(yàn)版的通信設(shè)置,如波特率。pthread_create(&th_b, null, gprs_read, 0); /創(chuàng)建進(jìn)程,讀取模塊 pthread_create(&th_a, n

42、ull, keyshell, 0); /讀取鍵盤while(!stop) /循環(huán)等待usleep(100000); tty_end(); exit(0); tty.c#include #include #include #include #include extern volatile int baud;/#define com1 /dev/tts/0#define com2 /dev/ttse/0/#define com2 /dev/ttys0static int fd;static struct termios oldtio,newtio;/=int tty_end() tcsetattr

43、(fd,tcsanow,&oldtio); /* restore old modem setings */ close(fd);/=int tty_read(char *buf,int nbytes)return read(fd,buf,nbytes);/=int tty_write(char *buf,int nbytes)int i;for(i=0; inbytes; i+) write(fd,&bufi,1);usleep(100);return tcdrain(fd);/=int tty_writecmd(char *buf,int nbytes)int i;for(i=0; inby

44、tes; i+) write(fd,&bufi,1);usleep(100);write(fd,r,1);usleep(300000);return tcdrain(fd);/=int tty_init()fd = open(com2, o_rdwr ); /| o_nonblock);/if (fd 0) perror(com2); exit(-1); tcgetattr(fd,&oldtio); /* save current modem settings */bzero(&newtio, sizeof(newtio); /newtio.c_cflag = oldstdtio.c_cfla

45、g;/newtio.c_iflag = oldstdtio.c_iflag;/newtio.c_oflag = oldstdtio.c_oflag;/ newtio.c_lflag = oldstdtio.c_lflag;newtio.c_cflag = baud | /*crtscts |*/ cs8 /*| clocal | cread */;newtio.c_iflag = ignpar | icrnl; newtio.c_oflag = 0; newtio.c_lflag = icanon; newtio.c_ccvintr = 0; /* ctrl-c */ newtio.c_ccv

46、quit = 0; /* ctrl- */ newtio.c_ccverase = 0; /* del */ newtio.c_ccvkill = 0; /* */ newtio.c_ccveof = 4; /* ctrl-d */ newtio.c_ccvtime = 0; /* 不使用分割字元組的計(jì)時(shí)器 */ newtio.c_ccvmin = 1; /* 在讀取到 1 個(gè)字元前先停止 */ newtio.c_ccvswtc = 0; /* 0 */ newtio.c_ccvstart = 0; /* ctrl-q */ newtio.c_ccvstop = 0; /* ctrl-s */ newtio.c_ccvsusp = 0; /* ctrl

溫馨提示

  • 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)論