【正文】
ab鍵,如果出現(xiàn)相應(yīng)的armlinuxgcc等的一些命令,就說(shuō)明配置成功了。 Kermit配置Mini和kermit是linux下串口通信的中常用到的兩個(gè)協(xié)議。本課題中采用的是kermit協(xié)議。它的使用完全依靠鍵盤的操作,具有高效與便利等優(yōu)點(diǎn)。在嵌入式開發(fā)過(guò)程中需要將開移植后的測(cè)試結(jié)果反饋給給開發(fā)人員,最常用測(cè)試方法一般有三種,;;。Kermit協(xié)議就是串口測(cè)試的一種協(xié)議。這樣,開發(fā)人員就可以看到系統(tǒng)的運(yùn)行情況了。在windows中有ARM公司的提供的官方軟件用來(lái)進(jìn)行測(cè)試。只需要通過(guò)在windows中創(chuàng)建一個(gè)超級(jí)終端將串口與開發(fā)板相連,就可以很方便地對(duì)串口進(jìn)行配置,其中最主要的配置參數(shù)就是波特率、數(shù)據(jù)位、停止位、奇偶校驗(yàn)位和數(shù)據(jù)流控制位等,但是它們一定要根據(jù)實(shí)際情況進(jìn)行相應(yīng)配置。在linux系統(tǒng)下,ARM公司沒(méi)有給出官方的調(diào)試工具,但是在網(wǎng)上有提供用來(lái)進(jìn)行ARM軟件測(cè)試的源代碼,通過(guò)配置也可以進(jìn)行測(cè)試調(diào)試工作。 NFS網(wǎng)絡(luò)文件系統(tǒng)配置NFS為Network FileSystem的簡(jiǎn)稱,最早是由Sun公司提出發(fā)展起來(lái)的,其目的就是讓不同的機(jī)器、不同的操作系統(tǒng)之間可以彼此共享文件。NFS可以讓不同的主機(jī)通過(guò)網(wǎng)絡(luò)將遠(yuǎn)端的NFS服務(wù)器共享出來(lái)的文件安裝到自己達(dá)到系統(tǒng)中,從客戶端看來(lái),使用NFS的遠(yuǎn)端文件就像是使用本地文件一樣。在嵌入式中使用NFS會(huì)使應(yīng)用程序的開發(fā)變得十分方便,并且不用反復(fù)地進(jìn)行燒寫鏡像文件。NFS的使用分為服務(wù)端和客戶端,其中服務(wù)端是提供要共享的文件,而客戶端則通過(guò)掛載“mount”這一動(dòng)作來(lái)實(shí)現(xiàn)對(duì)共享文件的訪問(wèn)操作。NFS服務(wù)器端是通過(guò)讀入它的配置文件“/etc/exports”來(lái)決定所共享的文件目錄。在這個(gè)配置文件中,每一行都代表一項(xiàng)要共享的文件目錄以及所指定的客戶端對(duì)其操作權(quán)限。客戶端可以根據(jù)相應(yīng)的權(quán)限,對(duì)該目錄下的所有目錄文件進(jìn)行訪問(wèn)。配置文件中每一行的格式如下:[共享的目錄](méi) [主機(jī)名稱或IP] [參數(shù)1,參數(shù)2,]主機(jī)名稱或IP是可供共享的客戶端主機(jī)或IP,若對(duì)所有的IP都可以訪問(wèn),則可用“*”表示。選項(xiàng)參數(shù)含義Rw可讀寫的權(quán)限Ro只讀的權(quán)限no_root_squa shNFS客戶端分享目錄使用者的權(quán)限,即如果客戶端使用的是root用戶,那么對(duì)于這個(gè)共享目錄而言,該客戶端就具有root權(quán)限Sync資料同步寫入到內(nèi)存與硬盤當(dāng)中Async資料會(huì)先暫存于內(nèi)存當(dāng)中,而非直接寫入硬盤例:/root/arm2410cl *(rw,no_root_squash)在設(shè)定完配置文件之后,需要啟動(dòng)nfs服務(wù)和portmap服務(wù),這里的portmap服務(wù)時(shí)允許NFS客戶端查看NFS服務(wù)在用的端口,在它被激活之后,就會(huì)出現(xiàn)一個(gè)端口為111的sum RPC(遠(yuǎn)端過(guò)程調(diào)用)的服務(wù)。這是NFS服務(wù)中必須實(shí)現(xiàn)的一項(xiàng),因此,必須把它開啟:命令為:service portmap start Bootloader的移植和系統(tǒng)裁剪Bootloader就是在操作系統(tǒng)內(nèi)核運(yùn)行之前運(yùn)行的一段程序,它類似于PC機(jī)中的BIOS程序。通過(guò)這段程序,可以完成硬件設(shè)備的初始化,并建立內(nèi)存空間的映射圖的功能,從而將系統(tǒng)的軟硬件環(huán)境帶到一個(gè)合適的狀態(tài),為最終調(diào)用系統(tǒng)內(nèi)核做好準(zhǔn)備。一個(gè)嵌入式Linux系統(tǒng)從軟件的角度看通??梢苑譃樗膫€(gè)層次:引導(dǎo)加載程序。包括固化在固件(firmware)中的boot代碼(可選),和BootLoader兩大部分。Linux內(nèi)核。特定于嵌入式板子的定制內(nèi)核以及內(nèi)核的啟動(dòng)參數(shù)。文件系統(tǒng)。包括根文件系統(tǒng)和建立于 Flash內(nèi)存設(shè)備之上文件系統(tǒng)。通常用ramdisk來(lái)作為rootfs。用戶應(yīng)用程序。特定于用戶的應(yīng)用程序。有時(shí)在用戶應(yīng)用程序和內(nèi)核層之間可能還會(huì)包括一個(gè)嵌入式圖形用戶界面。常用的嵌入式GUI有:MicroWindows和MiniGUI等。一般用戶可以從網(wǎng)絡(luò)上下載一些公開源代碼的Bootloader程序,如UBoot、BLOB、VIVI、LILO、ARMBoot、RedBoot等,然后根據(jù)自己的芯片進(jìn)行移植修改。一個(gè)完整的嵌入式操作系統(tǒng)必須要有與硬件匹配的內(nèi)核,一般的做法是下載別人已經(jīng)一直好的linux操作系統(tǒng)。下載后根據(jù)自己的系統(tǒng)要求進(jìn)行裁減、配置,再添加自己的特定硬件的驅(qū)動(dòng)程序進(jìn)行調(diào)試修改,最終得到一個(gè)適合于自己平臺(tái)的內(nèi)核,將其進(jìn)行交叉編譯,就可以得到符合要求的內(nèi)核映像文件,最后將其下載到flash存儲(chǔ)器芯片的相應(yīng)分區(qū)中運(yùn)行。程序需要經(jīng)過(guò)移植方可在嵌入式開發(fā)板上正常運(yùn)行,移植流程如圖—所示。本小節(jié)主要介紹程序的配置過(guò)程。因?yàn)檫@本程序移植過(guò)程的主要難點(diǎn)。下圖是移植過(guò)程圖:配置程序生產(chǎn)makefile文件交叉編譯、修改生成可執(zhí)行文件在不同的系統(tǒng)下生成的文件大小也是不同的。在windows環(huán)境下,由于ARM有提供官方的軟件。由于在終端輸入命令進(jìn)行編譯時(shí)命令比較長(zhǎng),所以可以在配置的時(shí)候自己建一個(gè)腳本文件。配置完之后就直接輸入make命令進(jìn)行編譯。交叉編譯成功后就會(huì)安裝到指定目錄中。尋找需要的庫(kù)文件時(shí),在工程目錄下運(yùn)行armlinuxreadelf命令就可以查看文件所依賴的庫(kù)文件。把所依賴的庫(kù)文件用交叉編譯器ARMLinuxgcc 交叉編譯,生成ARM開發(fā)板上的庫(kù)文件,通過(guò)串口傳到板子上。5 功能測(cè)試在Ubuntu下字符界面的功能測(cè)試的步驟如下:(1)啟動(dòng)Ubuntu系統(tǒng)。(2)按Ctrl + Alt + F1進(jìn)入字符界面。(3)輸入系統(tǒng)的用戶名,用戶名為安裝系統(tǒng)時(shí)自己設(shè)置的名字。(4)輸入用戶密碼,密碼是在安裝系統(tǒng)時(shí)自己設(shè)置的密碼。(5)進(jìn)入項(xiàng)目主函數(shù)所在的目錄。(6)使用make命令運(yùn)行自己編寫的Makefile編譯、連接所有文件。(7)執(zhí)行bash腳本sh ./。(8)sudo ./dpf運(yùn)行程序。(9) 通過(guò)以上步驟進(jìn)入到數(shù)碼相框的主界面,在主界面中鼠標(biāo)左擊“音樂(lè)”按鈕進(jìn)入音樂(lè)界面,點(diǎn)擊“播放”按鈕播放,點(diǎn)擊“暫?!卑粹o暫停,點(diǎn)擊“下一曲”或“上一曲”切換歌曲,右擊推出音樂(lè)界面回到主界面;在主界面中點(diǎn)擊“預(yù)覽”按鈕,界面會(huì)自動(dòng)切換到“預(yù)覽”界面的照片墻界面的第一頁(yè),點(diǎn)擊“下一頁(yè)”會(huì)切換圖片到新的一頁(yè),再點(diǎn)擊“上一頁(yè)”會(huì)自動(dòng)切換照片墻到第一頁(yè),在每一頁(yè)中鼠標(biāo)左鍵點(diǎn)擊每一張圖片時(shí)這張圖片會(huì)在屏幕的中間位置放大,再次在圖片上點(diǎn)擊鼠標(biāo)左鍵會(huì)縮小并回到圖片原來(lái)的位置,鼠標(biāo)右擊切換界面回到主界面;在主界面中點(diǎn)擊“幻燈”會(huì)自動(dòng)切換到幻燈界面,同時(shí)播放幻燈圖片效果,幻燈片會(huì)循環(huán)播放,在循環(huán)播放的同時(shí)可以隨時(shí)點(diǎn)擊鼠標(biāo)右鍵回到主界面;在主界面中點(diǎn)擊“推出”按鈕結(jié)束數(shù)碼相框的演示,退出程序。 6主要程序清單 Mouse模塊程序清單1. 音樂(lè)模塊函數(shù)接口:void preview_operate (fb_info fb_inf, int x, int y, int click, int *flag, int page_num)。2. 幻燈片模塊函數(shù)接口:void slide_operate(fb_info fb_inf, pid_t *pid, int x, int y, int click, int *flag, int *page_num, int *mp3_page_num)。3. 音樂(lè)模塊函數(shù)接口:void music(fb_info fb_inf, int x, int y, int click, pid_t *mp3_id, int *flag, int *before, int *after, int *second, int *page_num)。 Music模塊程序清單1. int set_dsp()。初始化音頻設(shè)備,設(shè)置采樣頻率,量化位數(shù) ,聲道數(shù)2. int mp3_file() ,用于保存播放的音樂(lè)3. void save_area(fb_info fb_inf, int start_x, int start_y, int width, int height, u16_t (*array)[width]) 保存播放列表所在的位置; 4. void recover_area(fb_info fb_inf, int start_x, int start_y, int width, int height, u16_t (*array)[width])恢復(fù)播放列表所在位置原來(lái)的圖片5. void play(int id, char *filename)。 6. void disp_mp3_border(fb_info fb_inf) 。顯示播放列表對(duì)應(yīng)的圖片7. int list_name(fb_info fb_inf, int page_num, char *str)。顯示對(duì)應(yīng)的page_num的歌曲名稱8. void prev_song(fb_info fb_inf, int *page_num)。單擊上一首對(duì)應(yīng)的函數(shù)接口9. void next_song(fb_info fb_inf, int *page_num)單擊“下一首”對(duì)應(yīng)的函數(shù)接口10. void init_name_point(fb_info fb_inf) 。初始Mp3名稱列表的位置11. int list(fb_info fb_inf, char *str)。單擊“列表”按鈕對(duì)應(yīng)的函數(shù)接口12. int click_song(int x, int y)。判斷單擊鼠標(biāo)對(duì)應(yīng)mp3文件13. void play_song(fb_info fb_inf, int page_num, int num)。播放單擊對(duì)應(yīng)的mp3文件14. void draw_button(fb_info fb_inf, char *str) 。畫“播放”,“暫停”按鈕15. int mp3_area_assist(int c_x, int c_y, int p_x, int p_y, int width, int height)。對(duì)“音樂(lè)”操作時(shí),判斷鼠標(biāo)單擊位置是否在規(guī)定范圍內(nèi)16. int mp3_area(fb_info fb_inf, int x, int y)。判斷鼠標(biāo)單擊的位置,返回該位置所對(duì)應(yīng)值17. void draw_mp3(fb_info fb_inf)。畫mp3的背景圖片,并顯示“當(dāng)前播放”的歌曲18. void mp3_filename(fb_info fb_inf, char *filename, char *mode)。在播放列表中單擊對(duì)應(yīng)的歌曲,實(shí)現(xiàn)單擊播放功能19. void exchange_song(fb_info fb_inf, char *mode)。判斷“上一首”,“下一首”函數(shù)20. void start_mp3(fb_info fb_inf) 。開始播放 mp3歌曲 Prevvirew模塊程序清單1. int filename_list()。2.Void disp_border(fb_info fb_inf, char *filename, int x, int y)。顯示播放列表的邊框3.int display_jpeg(fb_info fb_inf)。顯示圖片,每張圖片以一種特效展示出來(lái)4. void which_jpeg_file(char *str, int page_num, int pic_num)。根據(jù)所點(diǎn)擊的page_num和pic_num顯示圖片。5. int enlarge_area(fb_info fb_inf, int x, int y)。圖片的放大區(qū)域6. void recover_enlarge_pic(fb_info fb_inf)。將放大的圖片還原7. int picture_enlarge(fb_info fb_inf,int page_num,int pic_num)。單擊放大圖片8. void disp_reduce_pic(fb_info fb_inf, char *filename, int x, int y)。顯示縮小后的圖片,形預(yù)覽界面9. int print_page(fb_info fb_inf)。在規(guī)定位置上顯示“上一頁(yè)”,“下一頁(yè)”字樣10.void init_coord(fb_info fb_inf)。保存縮小圖片將要顯示的位置11.int which_pic_click(fb_info fb_inf, int x, int y)。根據(jù)單擊區(qū)域判斷單擊了哪張圖片12.int pickup_filename(fb_info fb_inf, int page_num)。13.int check_up_file(int page_num)。14.void print_background(fb_info fb_inf)。重刷背景圖片15.void page_next(fb_info fb_inf,int *page_num)。單擊“下一頁(yè)”時(shí)對(duì)應(yīng)的圖片16.void page_prev(fb_info fb_inf,int *page_num)。單擊“上一頁(yè)”時(shí)對(duì)應(yīng)的圖片17.void preview(fb_info fb_inf,int page_num)。根據(jù)page_num實(shí)現(xiàn)預(yù)覽效果 Silde模塊程序清單1. int filename_list() 。2. void disp_border(fb_info fb_inf, char *filename, int x, int y)。顯示播放列表的邊框3.int display_jpeg(fb_info fb_inf);顯示圖片,每張圖片以一種特效展示出來(lái)4. void which_jpeg_file(char *str, int page_num, int pic_num)。根據(jù)所點(diǎn)擊的page_num和Pic_num顯示圖片5. int enlarge_area(fb_info fb_inf,