- 相關(guān)推薦
嵌入式實驗心得體會
嵌入式實驗心得體會
學(xué)期開始,我們開始學(xué)習(xí)《嵌入式系統(tǒng)及應(yīng)用》,由于初次接觸嵌入式系統(tǒng),感覺蠻難的,所以收獲不是很大,很多的概念都比較模糊,等到學(xué)期結(jié)束開始做嵌入式課程設(shè)計時,真是茫然無從下手,自從拿到設(shè)計主題后,我就像熱鍋上的螞蟻,一個字“急”。最后實在沒有辦法,逼著自己去學(xué)習(xí),查資料,總算對嵌入式有了淺層理解。
嵌入式系統(tǒng)本身是一個相對模糊的定義,一個手持的MP3和一個PC104的微型工業(yè)控制計算機(jī)都可以認(rèn)為是嵌入式系統(tǒng)?傮w來說,嵌入式系統(tǒng)是“用于控制,監(jiān)視或者輔助操作機(jī)器和設(shè)備的裝備”。
一個典型的桌面Linux系統(tǒng)包括3個主要的軟件層---linux內(nèi)核、C庫和應(yīng)用程序代碼。內(nèi)核是唯一可以完全控制硬件的層,內(nèi)核驅(qū)動程序代表應(yīng)用程序與硬件之間進(jìn)行會話。內(nèi)核之上是C庫,負(fù)責(zé)把POSIX API轉(zhuǎn)換為內(nèi)核可以識別的形式,然后調(diào)用內(nèi)核,從應(yīng)用程序向內(nèi)核傳遞參數(shù)。應(yīng)用程序依靠驅(qū)動內(nèi)核來完成特定的任務(wù)。
在了解了基礎(chǔ)知識之后,我開始進(jìn)行上機(jī)操作,當(dāng)然,其中遇到很多的難題,很多東西都是第一次接觸,又沒有別人在旁邊指導(dǎo)操作,完全憑借自己去摸索練習(xí)。其中的困難可想而知。然而堅持就是勝利,牙一咬眼一閉堅持做下去,而通過本次實驗,我感覺收獲還是蠻多的?赡芪覍τ谇度胧降闹R學(xué)習(xí)的還是不太多,但是這之外的東西收獲頗豐。
它讓我學(xué)會了如何通過自己的努力去認(rèn)知一個新事物,更重要的是端正自己的學(xué)習(xí)態(tài)度,只有真正下功夫去學(xué)習(xí),才能有收獲,正所謂“一份耕耘,一份收獲。”沒有付出,何談回報呢?再者,通過本次實驗,我也學(xué)會了如何去分析問題,如何找出自己設(shè)計中的不足,繼而去排除解決問題,這就是一個自我學(xué)習(xí)的過程。當(dāng)我們通過實驗去學(xué)習(xí)理論知識時,自己動手得出的結(jié)論,不僅能加深我們對嵌入式的理解,更能加深我們對此的記憶。
當(dāng)然,在這其中,我也發(fā)現(xiàn)自己的許多不足之處,由于學(xué)期伊始我沒有好好學(xué)習(xí),才落到如此地步,這也可以說是一個教訓(xùn)吧!我相信在以后的學(xué)習(xí)工作中,我一定會端正自己的學(xué)習(xí)態(tài)度,一絲不茍的去對待每一件事。只有做好足夠的準(zhǔn)備,才能事半功倍!
《嵌入式系統(tǒng)原理》課程設(shè)計實驗報告
一、 Uboot簡介
Uboot是1999年由德國DENX軟件工程中心的Wolfgang Denk發(fā)起的,全稱Universal Bootloader。具有如下特點:
★支持多種硬件構(gòu)架:包括ARM、x86、PPC、MIPS、m68k、NIOS、Blackfin
★支持多種操作系統(tǒng):包括Linux、VxWorks、NETBSD、QNX、RTEMS、ARTOS、LynxOS
★支持多達(dá)216種以上的開發(fā)板
★開放源代碼,遵循GPL條款
★易于移植、調(diào)試
二、 實驗?zāi)康?/strong>
1、進(jìn)一步了解Uboot的啟動流程
2、進(jìn)一步分析Uboot的啟動過程
3、實現(xiàn)Uboot的移植
三、 實驗內(nèi)容
分析Uboot的啟動流程,實現(xiàn)Uboot的移植
四、 實驗步驟及結(jié)果
1、Uboot的啟動流程、分析
U-Boot的啟動過程可以分成3個階段。首先在Flash中運(yùn)行匯編程序,將Flash中的啟動代碼部分復(fù)制到SDRAM中,同時創(chuàng)造環(huán)境準(zhǔn)備運(yùn)行C程序;然后在SDRAM中執(zhí)行,對硬件進(jìn)行初始化;最后設(shè)置內(nèi)核參數(shù)的標(biāo)記列表,復(fù)制鏡像文件,進(jìn)入內(nèi)核的入口函數(shù)。
1) 程序首先在Flash中運(yùn)行CPU入口函數(shù)/cpu/arm920t/start.s。具體工作包括:設(shè)置異常的入口地址和異常處理函數(shù);配置PLLCON寄存器,確定系統(tǒng)的主頻;屏蔽看門狗和中斷;初始化I/O寄存器;關(guān)閉MMU功能;初始化存儲器空間,設(shè)置刷新頻率;將U-Boot的內(nèi)容復(fù)制到SDRAM中;設(shè)置堆棧的大小,ldr pc, _start_armboot。board/yqliu2410中config.mk文件(TEXT_BASE = 0x31F00000)用于設(shè)置程序編譯連接的起始地址,在程序中要特別注意與地址相關(guān)指令的使用。當(dāng)程序在Flash中運(yùn)行時,執(zhí)行程序跳轉(zhuǎn)時必須要使用跳轉(zhuǎn)指令,而不能使用絕對地址的跳轉(zhuǎn)(即直接對PC操作)。如果使用絕對地址,那么,程序的取指是相對于當(dāng)前PC位置向前或者向后的32MB空間內(nèi),而不會跳入SDRAM中。
2) 程序跳轉(zhuǎn)到SDRAM中執(zhí)行/lib_arm/board.c中的start_armboot()函數(shù)。該
函數(shù)將完成如下工作:
*設(shè)置通用端口;設(shè)置處理器類型;設(shè)置啟動參數(shù)地址;
* env_init:設(shè)置環(huán)境變量,初始化環(huán)境;
* init_baudrate:設(shè)置串口的波特率;
* serial_init:設(shè)置串口的工作方式;
* flash_init:設(shè)置ID號、每個分頁的起始地址等信息,將信息送到相應(yīng)的結(jié)構(gòu)體中;
* dram_init:設(shè)置SDRAM的起始地址和大小;
* env_relocate:將環(huán)境變量的地址送到全局變量結(jié)構(gòu)體中;
* enable_interrupts:開啟中斷;
* main_loop:該函數(shù)主要用于設(shè)置延時等待,從而確定目標(biāo)板是進(jìn)入下載操作模式還是下載鏡像文件啟動內(nèi)核。在設(shè)定的延時時間范圍內(nèi),目標(biāo)板將在串口等待輸入命令,當(dāng)目標(biāo)板接到正確的命令后,系統(tǒng)進(jìn)入下載模式。在延時時間到達(dá)后,如果沒有接收到相關(guān)命令系統(tǒng)將自動進(jìn)入裝載模式。
3) 裝載模式下系統(tǒng)將執(zhí)行do_bootm_linux()函數(shù),0x30008000是內(nèi)核在SDRAM中的起始地址;0x30800000是ramdisk在SDRAM中的起始地址;0x40000是內(nèi)核在Flash中的位置,0x100000是數(shù)據(jù)塊的大小;0x140000是ramdisk在FLASH中的位置,0x440000是數(shù)據(jù)塊的大小。系統(tǒng)調(diào)用memcpy()函數(shù)將內(nèi)核從flash和ramdisk復(fù)制到SDRAM中,具體如下:
memcpy((void *)0x30008000, (void *)0x40000, 0x100000);//復(fù)制數(shù)據(jù)塊
memcpy((void *)0x30800000, (void *)0x140000, 0x440000);//復(fù)制數(shù)據(jù)塊
通常,將內(nèi)核參數(shù)傳遞給Linux操作系統(tǒng)有兩種方法:采用struct param_struct
結(jié)構(gòu)體或標(biāo)記列表。
一個合法的標(biāo)記列表開始于ATAG_CORE,結(jié)束于ATAG_NONE。ATAG_CORE可以為
空,一個空的ATAG_CORE的size字段設(shè)為“2”(0x00000002)。ATAG_NONE 的size
字段必須設(shè)為“0”。標(biāo)記列表可以有任意多的標(biāo)記(tag)。在嵌入式Linux系統(tǒng)中,
通常由U-Boot設(shè)置的啟動參數(shù)有:ATAG_CORE、ATAG_MEM、ATAG_CMDLINE、ATAG_RAMDISK、ATAG_INITRD等。
在本系統(tǒng)中,傳遞參數(shù)時分別調(diào)用了以下tag:
setup_start_tag(bd); //標(biāo)記列表開始
setup_memory_tags(bd); //設(shè)置內(nèi)存的起始位置和大小
setup_commandline_tag(bd, commandline); /*Linux內(nèi)核在啟動時可以命令
行參數(shù)的形式來接收信息,利用這一點可以向內(nèi)核提供那些內(nèi)核不能檢測的硬件參
數(shù)信息,或者重載(override)內(nèi)核檢測到的信息。
setup_ramdisk_tag(bd); //表示內(nèi)核解壓后ramdisk的大小
setup_initrd_tag(bd, initrd_start, initrd_end); //設(shè)置ramdisk的大小
和物理起始地址
setup_end_tag(bd); //標(biāo)記列表結(jié)束
其中bd_t *bd = gd->bd是指向bd_t 結(jié)構(gòu)體的指針,在該結(jié)構(gòu)體中存放了關(guān)于
開發(fā)板配置的基本信息。
系統(tǒng)采用下列代碼來進(jìn)入內(nèi)核函數(shù):
theKernel = (void (*)(int, int))ntohl(hdr->ih_ep);
hdr是image_header_t類型的結(jié)構(gòu)體,hdr->ih_ep指向內(nèi)核的第一條指令地址,
即Linux操作系統(tǒng)下的/kernel/arch/arm/boot/compressed/head.S匯編程序。theKernel()函數(shù)調(diào)用應(yīng)該不會返回,如果該調(diào)用返回,則說明出錯。
2、Uboot的移植步驟
1)建立板級支持包
根據(jù)S3C2410處理器,在board目錄下依照smdk2410目錄配置,創(chuàng)建自己開發(fā)板的板級資源目錄,相應(yīng)的在include/configs目錄下創(chuàng)建頭文件。修改規(guī)則文件Makfile,添加開發(fā)板編譯參數(shù)支持
2)添加外設(shè)支持
添加存儲設(shè)備支持:NANDFLASH啟動支持
添加網(wǎng)絡(luò)設(shè)備支持:DM9000A
添加USB接口支持
添加文件系統(tǒng)支持
3)設(shè)置環(huán)境變量
U-Boot中提供了豐富的命令,smdk2410開發(fā)板配置了一部分命令,我們需要通過相應(yīng)的環(huán)境變量為自己的開發(fā)板增加一些命令:
² #define CONFIG_CMD_NAND
² #define CONFIG_CMD_PING
² #define CONFIG_CMD_DLF
² #define CONFIG_CMD_ENV
² #define CONFIG_CMD_NET
² #define CONFIG_BOOTDELAY 3
² #define CFG_LOAD_ADDR 0x30008000
² #define CFG_TFTP_LOAD_ADDR 0x30008000
² ……
4)編譯U-boot
配置開發(fā)板:# make uptech_2410class_config
Configuring for uptech_2410class board.
嵌入式開發(fā)心得
從實習(xí)到現(xiàn)在搞嵌入式開發(fā)快一年了,驀然回首好像一年過得挺快,挺順利的。細(xì)細(xì)品味,發(fā)現(xiàn)這一年還是有很多值得回憶和總結(jié)的東西。至少這一年看書挺多,大概二十幾本,當(dāng)然和那些一年看一百多本書的人沒法比,但是我已經(jīng)超越了自己。這是我大學(xué)畢業(yè)的第一年,初次走上社會,很想一展身手,可是.....其實也不用可是了,和很多朋友一樣碰了很多釘子,現(xiàn)在我和老板的關(guān)系就挺一般的,只是我性格還不錯。呵呵~~,做優(yōu)秀員工看來還得慢慢學(xué)。
今年最大的收獲就是做了一個半項目,是在uClinux下面跑的。半個是SNMP-Agent的實現(xiàn),因為我去的時候snmpd已經(jīng)跑起來了,我只是實現(xiàn)部分管理功能;一個是基于Web的管理系統(tǒng),使公司的主打產(chǎn)品微波通信設(shè)備上網(wǎng)。這個項目是我一手策劃,一手實現(xiàn)(界面設(shè)計是一位女同事,很優(yōu)秀的程序員),從中學(xué)到的東西也最多,感情不可謂不深。
SNMP即簡單網(wǎng)絡(luò)管理協(xié)議,其實一點都不簡單。在我所知的網(wǎng)絡(luò)協(xié)議里面,它僅僅比OSI的CMIP簡單一點,而CMIP直到現(xiàn)在還沒得到廣泛應(yīng)用。我們能夠?qū)崿F(xiàn)SNMP-Agent不能不感謝Carnegie Mellon大學(xué)免費(fèi)發(fā)布的ucd-snmp軟件包。它使得開發(fā)人員專注于實現(xiàn)對特定設(shè)備的管理功能。
我在項目中的工作主要是擴(kuò)展MIB,實現(xiàn)相應(yīng)的管理功能以及網(wǎng)絡(luò)功能的擴(kuò)展。我們公司的MIB庫比較龐大,但是程序運(yùn)行還是挺快的。因為ucd-snmp軟件包中大量使用回調(diào)函數(shù),而且它將MIB樹以二叉樹形式表示,但是每個結(jié)點不是單個的MIB結(jié)點,而是一個表,包括了多個結(jié)點。回調(diào)函數(shù)和兩層表示法的使用是操作快速的主要因素。
基于Web的管理系統(tǒng)我原本是打算在設(shè)備外實現(xiàn)SNMP-Manager的功能,因為設(shè)備中已經(jīng)嵌入了Agent。這樣管理人員可以在世界各地通過WWW登錄公司的管理平臺,實現(xiàn)對所有設(shè)備的管理。但是老板想在設(shè)備中嵌入一個管理系統(tǒng),可以通過www管理單個設(shè)備就行。呵呵~~,這樣工作又輕松了一點,就按老板的意思做了。
我用的http服務(wù)器是BOA,它比現(xiàn)在市場占有率第一的Apache速度要快。目前還只支持CGI,我就用C寫CGI程序,古老了點。但是在開發(fā)過程中感覺用CGI比用現(xiàn)在流行的ASP,JSP要爽,可以隨心所欲,哈哈~~,而且這也是用C\C++語言的優(yōu)點。CGI程序很簡單,它的輸入就是標(biāo)準(zhǔn)輸入,它的輸出就是標(biāo)準(zhǔn)輸出。BOA在uClinux上面跑總要出點問題的,出問題好,出了問題我就能找到問題,一來一往,我對socket編程,I/O多路等編程技術(shù)了解也就越來越深了。
在Linux下面搞了一年,不愛上Linux都難,個人認(rèn)為軟件開發(fā)人員在Linux下面進(jìn)步是最快的。那么多優(yōu)秀的開源代碼供我們研究,猶如每天與世界上最優(yōu)秀的程序員打交道,進(jìn)步于不經(jīng)意間。哈哈~~。正所謂“熟讀唐詩三百首,不會作詩也會吟”。GCC編譯器的優(yōu)秀不用多說,我覺得寫Makefile也是很件開心的事。不推薦程序員搞開發(fā)都用IDE,隔靴捎癢很不爽。但是Linux缺點也很明顯,聽歌、看碟、玩游戲不如Windows。恰巧公司的電腦沒音箱,干脆我就懶得用Windows了。
用Linux而不講開源是不道德的,我們程序員享受著開源的好處,自然也要為開源做點貢獻(xiàn)。我開發(fā)的所有軟件都開源,但是我也有個“怪癖”:不喜歡別人在我代碼未完成的時候問我要源代碼。
做嵌入式開發(fā)一年,稍稍有點心得?偨Y(jié)了一下,有以下幾點經(jīng)驗:
1 .不要玩Linux。這一點主要是對像我這樣在Linux下面開發(fā)的程序員來說的。因為Linux對程序員的吸引力很大,但它下面可以直接用的軟件還是比較少。于是我們總想到網(wǎng)上找一些開源的軟件裝到我們的機(jī)器上,從無到有讓人很有成就感的,呵呵~~。要是裝上的不是最新版本的還不滿意,于是又開始忙升級。在Windows下這個過程大概沒什么意思,全都next了。在Linux下就不一樣了,直接拿過來的源代碼很多編譯都不能通過,最新版本更是這樣,得我們自己改,而且往往時改了又改。這個過程很花時間,我就在這方面浪費(fèi)了很多時間,本來有個月工作比較輕松,打算閱讀Linux kernel代碼(也想成高手,呵呵~~),當(dāng)時我機(jī)子上沒有好的閱讀工具,于是先弄了個source navigator,覺得不夠又裝了個open office,然后又找來了幾份不同版本的kernel代碼。結(jié)果一個月過去了,一個文件夾還沒看完。后面工作緊了,只能把看kernel當(dāng)休息,直到現(xiàn)在才粗略看完fs,mm兩個文件夾。
2.不要滿足于C語言。C語言很優(yōu)秀,也很簡單。程序設(shè)計能力不等同于用C語言能力。嵌入式開發(fā)程序員要有扎實的數(shù)據(jù)結(jié)構(gòu)基礎(chǔ),要積極的學(xué)習(xí)操作系統(tǒng),積極的學(xué)習(xí)網(wǎng)絡(luò)編程,要是想進(jìn)行驅(qū)動開發(fā)還需要積極的學(xué)習(xí)硬件知識。
3.了解幾種芯片體系結(jié)構(gòu)。嵌入式不像PC領(lǐng)域x86一統(tǒng)天下,在嵌入式領(lǐng)域ARM、MIPS、M68k等各顯神通。例如ARM7是沒有MMU的,uClinux在它上面跑是最合適了,但是沒有MMU我們也必須實現(xiàn)簡單的MM功能,同時沒有MMU一些常用庫函數(shù)是不能實現(xiàn)的,這些嵌入式開發(fā)程序員必須要了解。
4.編寫無錯的C程序。關(guān)于這一點建議閱讀Steve Maguire的《Writing Clean Code》。我對MS沒有好感,但這不影響我對MS里面大牛們的尊敬。嵌入式的調(diào)試是非常麻煩的,很耗時。雖然有g(shù)dbserver這類工具,但是你用的開發(fā)工具鏈中不一定包括它,而且就算用上了調(diào)試仍然是很花時間的。所以要是不想天天通宵調(diào)程序呢,那就要時時以編寫無錯程序為目標(biāo)。
5.了解一點編譯知識。這對編寫高性能程序很有幫助。
6.學(xué)習(xí)設(shè)計模式。設(shè)計模式一般在高級語言中討論較多,但是好東西應(yīng)該大家一起分享。學(xué)習(xí)設(shè)計模式對提高我們的設(shè)計能力非常有幫助。用C語言也可以實現(xiàn)一些模式思想,例如我們常用的回調(diào)函數(shù),就可看作是Command模式的C語言版本。
7.要有前瞻性,要積極學(xué)習(xí)新技術(shù)。目前的嵌入式開發(fā)一般都是將PC應(yīng)用加以剪裁,移植到嵌入式系統(tǒng)中。但是隨著通信技術(shù)的發(fā)展,IPv6的廣泛應(yīng)用,設(shè)備上網(wǎng)是大勢所趨。許多新技術(shù)有可能在嵌入式領(lǐng)域率先應(yīng)用。把握住這個趨勢,嵌入式程序員大有可為。
現(xiàn)在很多公司招程序員要求有嵌入式開發(fā)經(jīng)驗,其實本質(zhì)上嵌入式開發(fā)和我們平常的開發(fā)沒什么不同,只是要求嚴(yán)格一點。我寫下這些希望對學(xué)習(xí)嵌入式開發(fā)的朋友們有所幫助。
【嵌入式實驗心得體會】相關(guān)文章:
嵌入式的實驗心得09-29
嵌入式實訓(xùn)心得體會07-19
嵌入式學(xué)習(xí)心得體會04-04
嵌入式實訓(xùn)心得體會通用12-14
嵌入式實訓(xùn)心得體會10篇12-13
嵌入式實訓(xùn)心得體會(10篇)12-15
嵌入式程序的優(yōu)化10-07
嵌入式系統(tǒng)設(shè)計10-07