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