版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、.ADS1 2進(jìn)行嵌入式軟件開發(fā) jepsen1 新浪嵌入式應(yīng)用程序通常都是在樣機(jī)環(huán)境下調(diào)試與開發(fā)的,這種環(huán)境與最終產(chǎn)品之間并不完全一樣。因此,在系統(tǒng)調(diào)試階段就考慮應(yīng)用程序在最終目的硬件中的運(yùn)行情況是非常重要的。本文旨在討論怎么將一個(gè)開發(fā)/調(diào)試環(huán)境下的嵌入式應(yīng)用程序轉(zhuǎn)移到最終獨(dú)立運(yùn)行的目的系統(tǒng)中去,并提到了ARM ADS1.2開發(fā)工具包的一些功能特性及其在這個(gè)過程中所起到的作用。使用ADS開發(fā)嵌入式程序時(shí),需要著重考慮以下幾個(gè)提出問題:1.與硬件相關(guān)的C語言庫(kù)函數(shù)的使用;2.某些C語言庫(kù)函數(shù)使用了調(diào)試環(huán)境中的資源,要把這些使用的資源重定向到目的系統(tǒng)中的硬件上來;3.可執(zhí)行映象文件的存儲(chǔ)器映射必
2、須根據(jù)目的硬件的存儲(chǔ)器分布進(jìn)展裁剪;4.在主程序執(zhí)行前,嵌入式應(yīng)用程序必須先完成系統(tǒng)的初始化。一個(gè)完好的初始化包括用戶的啟動(dòng)執(zhí)行代碼和ADS中C庫(kù)函數(shù)的初始化過程。圖1 Semihosting的實(shí)現(xiàn)舉個(gè)例子圖2 C語言庫(kù)函數(shù)構(gòu)造圖3缺省的存儲(chǔ)器映射圖4連接器布局規(guī)那么缺省的工程工程設(shè)置剛開場(chǎng)一個(gè)嵌入式應(yīng)用軟件開發(fā)時(shí),ADS用戶可能并不完全清楚目的硬件的一些參數(shù)指標(biāo)。比方有關(guān)外設(shè)、存儲(chǔ)器地址分布,甚至處理器類型等一些細(xì)節(jié),可能還沒有最終確定。為了在所有這些細(xì)節(jié)全部就緒前就能進(jìn)展軟件開發(fā),ADS工具有一套程序構(gòu)建和調(diào)試的缺省設(shè)置。理解這套缺省的工程工程設(shè)置方法,對(duì)于把握最終的移植步驟非常有好處。A
3、DS1.2 C語言函數(shù)庫(kù)Semihosting在ADS的C語言函數(shù)庫(kù)中,某些ANSIC的功能是由主機(jī)的調(diào)試環(huán)境來提供的,這套機(jī)制有一個(gè)專門術(shù)語叫Semihosting。Semihosting通過一組軟件中斷SWI指令來實(shí)現(xiàn)。如圖1所示,當(dāng)一個(gè)Semihosting軟中斷被執(zhí)行時(shí),調(diào)試系統(tǒng)先識(shí)別這個(gè)SWI懇求,然后掛起正在運(yùn)行的程序,調(diào)用Semihosting的效勞,完成后再恢復(fù)原來的程序執(zhí)行。因此,主機(jī)執(zhí)行的任務(wù)對(duì)于程序來說是透明的。C語言庫(kù)函數(shù)構(gòu)造從概念上來講,C語言庫(kù)函數(shù)可以被分成兩部分,一是ANSIC語言標(biāo)準(zhǔn)本身的一部分,一是只受某一特定ANSIC層次支持的函數(shù),如圖2所示。其中一些AN
4、SIC的功能是由主機(jī)調(diào)試環(huán)境調(diào)用驅(qū)動(dòng)程序級(jí)的函數(shù)完成的。例如,ADS的庫(kù)函數(shù)printf把輸出信息輸出到調(diào)試器的控制臺(tái)窗口,這個(gè)功能通過調(diào)用_sys_write實(shí)現(xiàn),_sys_write執(zhí)行了一個(gè)把字符串輸出到主機(jī)控制臺(tái)的Semihosting軟中斷效勞程序。缺省的存儲(chǔ)器映射假設(shè)用戶在程序編譯時(shí)沒有指定映象的存儲(chǔ)器映射分布,ADS將為生成的目的代碼和數(shù)據(jù)分配一個(gè)缺省的存儲(chǔ)器映射圖,如圖3所示。目的印象被連接至地址0x8000,存儲(chǔ)和執(zhí)行區(qū)域都位于該地址開場(chǎng)的空間。RO只讀部分放在前面,接著是RW讀寫部分,最后是ZI零初始化部分。在ZI部分之上緊跟著HEAP,所以HEAP確實(shí)切地址要在連接時(shí)才能
5、確定。STACK的基地址是在應(yīng)用程序啟動(dòng)時(shí)由一個(gè)Semihosting操作提供。這項(xiàng)Semihosting操作返回的地址值視不同調(diào)試環(huán)境而定:ARMulator返回配置文件peripherals.ami中的設(shè)置值;缺省為0x 08000000。Multi-ICE返回的是調(diào)試器內(nèi)部變量$top_of_memory的值;缺省為0x 00080000。連接器布局規(guī)那么連接器對(duì)代碼和數(shù)據(jù)在存儲(chǔ)器系統(tǒng)中的分配,遵循一套規(guī)那么,如圖4所示。映象首先按照屬性以RO-RW-ZI的次序進(jìn)展排列,在同一種屬性里面代碼先于數(shù)據(jù)。然后連接器將輸入段根據(jù)名字的字母順序進(jìn)展排列,輸入段的名字與匯編代碼里面的塊名字指示一致
6、在匯編程序中用AREA要害字。在輸入段中,來自不同對(duì)象的代碼和數(shù)據(jù)放置次序與在連接器命令行中指定的對(duì)象文件次序一致。在需要靈敏分配代碼和數(shù)據(jù)放置位置的情況下,建議用戶不要簡(jiǎn)單地依靠這些規(guī)那么。后面會(huì)介紹一種怎么控制代碼和數(shù)據(jù)布局的機(jī)制Scatterloading。圖5缺省的ADS初始化過程圖6 C庫(kù)函數(shù)重定向圖7 scatter文件語法圖8分散加載的簡(jiǎn)單樣例啟動(dòng)應(yīng)用程序大多數(shù)嵌入式系統(tǒng)在進(jìn)入應(yīng)用主程序之前有一個(gè)初始化的過程,該過程完成系統(tǒng)的啟動(dòng)和初始化功能。缺省的ADS初始化過程如圖5所示??傮w上,初始化過程可以分成兩部分來看:_main負(fù)責(zé)設(shè)置運(yùn)行映像存儲(chǔ)器映射;_rt_entry負(fù)責(zé)庫(kù)函數(shù)
7、的初始化。_main完成代碼和數(shù)據(jù)的復(fù)制,并把ZI數(shù)據(jù)區(qū)清零。這一步只有當(dāng)代碼和數(shù)據(jù)區(qū)在存儲(chǔ)和運(yùn)行時(shí)處于不同的存儲(chǔ)器位置時(shí)才有意義。接著_main跳進(jìn)_rt_entry,進(jìn)展STACK和HEAP等的初始化。最后_rt_entry跳進(jìn)應(yīng)用程序的入口main。當(dāng)應(yīng)用程序執(zhí)行完時(shí),_rt_entry又將控制權(quán)交還給調(diào)試器。函數(shù)main在ADS中有非凡的意義。當(dāng)一個(gè)程序工程工程中存在main時(shí),連接器會(huì)把_main和_rt_entry中的初始化代碼連接進(jìn)來;假設(shè)沒有main函數(shù),初始化過程就不會(huì)被連接,結(jié)果就會(huì)導(dǎo)致一些標(biāo)準(zhǔn)的C庫(kù)函數(shù)無效。根據(jù)目的環(huán)境裁減C庫(kù)函數(shù)缺省狀態(tài)下C庫(kù)函數(shù)利用Semihotst
8、ing機(jī)制來實(shí)現(xiàn)設(shè)備驅(qū)動(dòng)的功能。但一個(gè)真正的嵌入式系統(tǒng),要使用到詳細(xì)的外設(shè)或硬件獨(dú)立于主機(jī)環(huán)境運(yùn)行。C庫(kù)函數(shù)重定向用戶可以定義自己的C語言庫(kù)函數(shù),連接器在連接時(shí)自動(dòng)使用這些新的功能函數(shù)。這個(gè)過程叫做重定向C語言庫(kù)函數(shù),如圖6所示。舉個(gè)例子來說,用戶有一個(gè)I/O設(shè)備如UART。本來庫(kù)函數(shù)fputc是把字符輸出到調(diào)試器控制窗口中去的,但用戶把輸出設(shè)備改成了UART端口,這樣一來,所有基于fputc函數(shù)的printf系列函數(shù)輸出都被重定向到UART端口上去了。下面是實(shí)現(xiàn)fputc重定向的一個(gè)例子:externvoidsendcharchar*ch;intfputcintch,FILE*fcharte
9、mpch=ch;sendchar&tempch;returnch;這個(gè)例子簡(jiǎn)單地將輸入字符重新定向到另一個(gè)函數(shù)sendchar,sendchar假定是一個(gè)另外定義的串口輸出函數(shù)。在這個(gè)地方,fputc就似乎目的硬件和標(biāo)準(zhǔn)C庫(kù)函數(shù)之間的一個(gè)抽象層。在C語言庫(kù)函數(shù)中禁用Semihosting在一個(gè)獨(dú)立的嵌入式應(yīng)用程序中,應(yīng)當(dāng)不存在SemihostingSWI操作。因此,用戶必須確定在所有調(diào)用到的庫(kù)函數(shù)中沒有使用Semihosting。為了保證這一點(diǎn),在程序中可以引進(jìn)一個(gè)符號(hào)要害字_use_no_semihosting:在C代碼中,使用#prgrama#pragmaimport_use_no
10、_semihosting_swi在匯編程序中,使用IMPORT IMPORT_use_no_semihosting_swi這樣,當(dāng)有使用SWI機(jī)制的庫(kù)函數(shù)被連接時(shí),連接器會(huì)進(jìn)展報(bào)錯(cuò):Error:Symbol_semihosting_swi_guardmultiplydefined為了確定詳細(xì)是哪一個(gè)函數(shù),連接時(shí)翻開-verbose選項(xiàng)。這樣在結(jié)果信息輸出時(shí),該庫(kù)函數(shù)上將有一個(gè)_I_use_semihosting_swi的標(biāo)記。Loadingmembersys_wxit.ofromc_a_un.1.Definition:_sys_exit Reference:_I_use_semihosting
11、_swi用戶必需要把這些函數(shù)定義成自己的執(zhí)行內(nèi)容。有一點(diǎn)需要注重,連接器只能報(bào)告庫(kù)函數(shù)中被調(diào)用的Semihosting,對(duì)用戶自定義函數(shù)中使用的Semihosting那么不會(huì)報(bào)錯(cuò)。根據(jù)目的硬件定制存儲(chǔ)器映射分散裝載Scatlerloading在實(shí)際的嵌入式系統(tǒng)中,ADS提供的缺省存儲(chǔ)器映射是不能滿足要求的。用戶的目的硬件通常有多個(gè)存儲(chǔ)器設(shè)備位于不同的位置,并且這些存儲(chǔ)器設(shè)備在程序裝載和運(yùn)行時(shí)可能還有不同的配置。Scattertoading可以通過一個(gè)文本文件來指定一段代碼或數(shù)據(jù)在加載和運(yùn)行時(shí)在存儲(chǔ)器中的不同位置。這個(gè)文本文件scatterfile在命令行中由-scatter開關(guān)指定,例如:ar
12、mlink_scatterscat.scffilel.ofile2.0在scatterfile中可以為每一個(gè)代碼或數(shù)據(jù)區(qū)在裝載和執(zhí)行時(shí)指定不同的存儲(chǔ)區(qū)域地址,Scatlertoading的存儲(chǔ)區(qū)塊可以分成二種類型:裝載區(qū):當(dāng)系統(tǒng)啟動(dòng)或加載時(shí)應(yīng)用程序的存放區(qū)。執(zhí)行區(qū):系統(tǒng)啟動(dòng)后,應(yīng)用程序進(jìn)展執(zhí)行和數(shù)據(jù)訪問的存儲(chǔ)器區(qū)域,系統(tǒng)在實(shí)時(shí)運(yùn)行時(shí)可以有一個(gè)或多個(gè)執(zhí)行塊。映像中所有的代碼和數(shù)據(jù)都有一個(gè)裝載地址和運(yùn)行地址二者可能一樣也可能不同,視詳細(xì)情況而定。在系統(tǒng)啟動(dòng)時(shí),C函數(shù)庫(kù)中的_main初始化代碼會(huì)執(zhí)行必要的復(fù)制及清零操作,使應(yīng)用程序的相應(yīng)代碼和數(shù)據(jù)段從裝載狀態(tài)轉(zhuǎn)入執(zhí)行狀態(tài)。1.scatter文件語法s
13、catter文件是一個(gè)簡(jiǎn)單的文本文件,包含一些簡(jiǎn)單的語法。My_Region0x00000x1000thecontextofregion每個(gè)塊由一個(gè)頭標(biāo)題開場(chǎng)定義,頭中至少包含塊的名字和起始地址,另外還有最大長(zhǎng)度和其他一些屬性選項(xiàng)。塊定義的內(nèi)容包括在緊接的一對(duì)花括號(hào)內(nèi),依靠于詳細(xì)的系統(tǒng)情況。一個(gè)加載塊必須至少含有一個(gè)執(zhí)行塊;理論中通常有多個(gè)執(zhí)行塊。一個(gè)執(zhí)行塊必須至少含有一個(gè)代碼或數(shù)據(jù)段;這些通常來自源文件或庫(kù)函數(shù)等的目的文件;通配符號(hào)*可以匹配指定屬性項(xiàng)中所有沒有在文件中定義的余下部分。2.簡(jiǎn)單分散加載樣例圖8所示樣例中,只有一個(gè)加載塊,包含了所有的代碼和數(shù)據(jù),起始地址為0。這個(gè)加載塊一共對(duì)應(yīng)
14、兩個(gè)執(zhí)行塊。一個(gè)包含所有的RO代碼和數(shù)據(jù),執(zhí)行地址與裝載地址一樣;同時(shí)另一個(gè)起始地址為0x10000的執(zhí)行塊,包含所有的RW和ZI數(shù)據(jù)。這樣當(dāng)系統(tǒng)開場(chǎng)啟動(dòng)時(shí),從第一個(gè)執(zhí)行塊開場(chǎng)運(yùn)行執(zhí)行地址等于裝載地址,在執(zhí)行過程中,有一段初始化代碼會(huì)把裝載塊中的一部分代碼轉(zhuǎn)移到另外的執(zhí)行塊中。下面是這個(gè)scatter描繪文件,該文件描繪了上述存儲(chǔ)器映射方式。LOAD_ROM0x4000EXE_ROM0x00000x4000;Rootregion*+RO;AllcodeandconstantdataRAM0x 100000x8000*+RW,+ZI;Allnon-constantdata3.在分散文件中放置對(duì)象
15、在大多數(shù)應(yīng)用中,并不是像前例那樣,簡(jiǎn)單地把所有屬性都放在一起,用戶需要控制特定代碼和數(shù)據(jù)段的放置位置。這可以通過在scatter文件中對(duì)單個(gè)目的文件進(jìn)展定義實(shí)現(xiàn),而不是只簡(jiǎn)單地依靠通配符。為了覆蓋標(biāo)準(zhǔn)的連接器布局規(guī)那么,我們可以使用+FIRST和+LAST分散加載指令。典型的例子是在執(zhí)行塊的開場(chǎng)處放置中斷向量表格:LOAD_ROM0x00000x4000EXEC_ROM0x00000x4000vectors.oVect,+FIRST*+RO;moreexecregions.在這個(gè)scatter文件中,保證了vextors.o中的Vect域被放置于地址0x0000。4.RootRegion根區(qū)根
16、區(qū)是一個(gè)執(zhí)行塊,它的加載地址與執(zhí)行地址是一致的。每個(gè)scatter文件至少有一個(gè)根區(qū)。分散加載有一個(gè)限制:創(chuàng)立執(zhí)行塊的代碼和數(shù)據(jù)即完成復(fù)制和清零的代碼和數(shù)據(jù)無法自行復(fù)制到另一個(gè)位置。因此,在根區(qū)中必須含有下面的部分:_main.o,包含復(fù)制代碼/數(shù)據(jù)的代碼;連接器輸出變量$Table和ZISection$Table,包含被復(fù)制代碼/數(shù)據(jù)的地址。由于上面兩個(gè)部分的屬性是只讀的,因此他們被*+RO通配符語法匹配。假設(shè)*+RO被用在了非根區(qū)中,那么在根區(qū)中必須顯式地指明另一個(gè)RO區(qū)域。下面是一個(gè)例子:LOAD_ROM0x00000x4000EXE_ROM0x00000x4000;rootregion
17、_main.o+RO;copyingcode*Region$Tabl0e;RO/RWaddressestocopy*ZISection$Table;ZIaddressestozeroRAM0x 100000x8000*+RO;allotherROsections*+RW,+ZI;allRWandZIsections放置堆棧和heap Scatterloading機(jī)制提供了一種指定代碼和靜態(tài)數(shù)據(jù)布局的方法。下面介紹怎么放置應(yīng)用程序的堆棧和heap。*_user_initial_stackheap重定向應(yīng)用程序的堆棧和heap是在C庫(kù)函數(shù)初始化過程中建立起來的??梢酝ㄟ^重定向?qū)?yīng)的子程序來改變堆棧
18、和heap的位置,在ADS的庫(kù)函數(shù)中,即_user_initial_stackheap函數(shù)。_user_initial_stackheap可以用C或匯編來實(shí)現(xiàn),它必須返回如下參數(shù):r0:heap基地址;r1:堆?;刂罚籸2:heap長(zhǎng)度限制值需要的話;r3:堆棧長(zhǎng)度限制值。當(dāng)用戶使用分散裝載功能的時(shí)候,必須重調(diào)用_user_initial_stackheap,要不然連接器會(huì)報(bào)錯(cuò):Error:L6218E:Undefined symbol Image$ZI$Limitreferred from sys_stackheap.o*存儲(chǔ)器模型ADS提供了兩種實(shí)時(shí)存儲(chǔ)器模型。缺省時(shí)為one-regio
19、n,應(yīng)用程序的堆棧和heap位于同一個(gè)存儲(chǔ)器區(qū)塊,使用的時(shí)候相向生長(zhǎng),當(dāng)在heap區(qū)分配一塊存儲(chǔ)器空間時(shí)需要檢查堆棧指針。另一種情況是堆棧和heap使用兩塊獨(dú)立的存儲(chǔ)器區(qū)域。對(duì)于速度非凡快的RAM,可選擇只用來作堆棧使用。為了使用這種two-region模型,用戶需要導(dǎo)入符號(hào)use_two_region_memory,heap使用需要檢查heap的長(zhǎng)度限制值。對(duì)這兩種模型來說,缺省情況下對(duì)堆棧的生長(zhǎng)都不進(jìn)展檢查。用戶可以在程序編譯時(shí)使用-apcs/swst編譯器選項(xiàng)來進(jìn)展軟件堆棧檢查。假設(shè)使用two-region模型,必須得在執(zhí)行_user_initial_stackheap時(shí)指定一個(gè)堆棧限制
20、值。圖9重定向_user_initial_stackheap圖10根底初始化過程圖11 ROM/RAM重定向和映射表1系統(tǒng)復(fù)位和初始化目前情況,一般假設(shè)程序從C庫(kù)函數(shù)的初始化入口_main開場(chǎng)執(zhí)行。實(shí)際上,所有的嵌入式程序在啟動(dòng)時(shí)都要執(zhí)行一些系統(tǒng)級(jí)的初始化操作。在此討論這方面的內(nèi)容。初始化過程圖10中顯示了一個(gè)基于ARM的嵌入式系統(tǒng)的根底初始化過程??梢钥吹?,在_main之前參加了一個(gè)復(fù)位處理模塊reset handler,它在系統(tǒng)上電復(fù)位時(shí)立即啟動(dòng)。標(biāo)識(shí)為$sub$main的新代碼塊在進(jìn)入主程序之前執(zhí)行。復(fù)位處理模塊reset handler通常是一小段匯編代碼,在系統(tǒng)復(fù)位時(shí)執(zhí)行。它至少完成
21、應(yīng)用程序中使用到的所有處理器形式的堆棧初始化工作。對(duì)于含有本地存儲(chǔ)器系統(tǒng)的內(nèi)核比方含cache的ARM內(nèi)核,配置工作也必須在這一段初始化過程中完成。當(dāng)完成系統(tǒng)初始化之后,通常程序會(huì)跳向_main,開場(chǎng)C庫(kù)函數(shù)的初始化過程。系統(tǒng)初始化過程一般還包括另外一些內(nèi)容,中斷使能等,這些大多安排在C庫(kù)函數(shù)的初始化完成之后執(zhí)行。$sub$main完成這部分功能。向量表vector table所有的ARM系統(tǒng)都有一張中斷向量表當(dāng)出現(xiàn)異常需要處理時(shí),必須調(diào)用向量表。向量表一般要位于0地址處。表2表3表4表5表6表7表8表9表10存儲(chǔ)器配置*ROM/RAM重定向當(dāng)系統(tǒng)啟動(dòng)的時(shí)候,為了保證0地址處有正確的啟動(dòng)代碼存
22、在,需要非易失性的存儲(chǔ)器。一種簡(jiǎn)單的方法,就是把系統(tǒng)0x0000開場(chǎng)的一塊地址分配給ROM。其缺點(diǎn)是,由于ROM的訪問速度比RAM慢很多,當(dāng)執(zhí)行中斷響應(yīng)需要從中斷向量表跳轉(zhuǎn)時(shí),會(huì)給系統(tǒng)性能帶來?yè)p失;同時(shí),在ROM中的向量表內(nèi)容也不能被用戶程序動(dòng)態(tài)修改。另外一種可行的方案如圖11所示。ROM位于地址0x1000開場(chǎng)的地方,但是在系統(tǒng)復(fù)位時(shí)又被存儲(chǔ)器控制器映射到0x0000地址處。這樣當(dāng)系統(tǒng)啟動(dòng)之后,在地址0x0000看到的是ROM,系統(tǒng)執(zhí)行這塊ROM中的啟動(dòng)代碼,啟動(dòng)代碼跳轉(zhuǎn)到真正的ROM的地址,并讓存儲(chǔ)器控制器移除對(duì)ROM的地址映射。這時(shí)0x0000地址處的存儲(chǔ)器又恢復(fù)回了RAM。_main中
23、的代碼把向量表copy到0x0000處的RAM中去,使得異常時(shí)能被正確響應(yīng)。表1為ARM匯編中執(zhí)行ROM/RAM重定向和映射的一個(gè)例子。它以ARM公司的Integrator平臺(tái)為根底的,該方法適用于類似ROM/RAM重定向方法的所有平臺(tái)。第一條指令完成從ROM的映射地址0x00000到真實(shí)地址的跳轉(zhuǎn)。地址標(biāo)號(hào)instrUCt_2是ROM的真實(shí)地址0x 180004。然后通過設(shè)置Integrator平臺(tái)上的相應(yīng)控制存放器,移除ROM的地址映射。代碼在系統(tǒng)一啟動(dòng)就被執(zhí)行。所有關(guān)于地址重定向/映射的操作必須在C庫(kù)函數(shù)初始化之前完成。*本地存儲(chǔ)器配置許多ARM處理器都有片上存儲(chǔ)器系統(tǒng),如cache和嚴(yán)
24、密耦合存儲(chǔ)器TCM、存儲(chǔ)器治理單元MMU或存儲(chǔ)器保護(hù)單元MPU。這些設(shè)備都要在系統(tǒng)初始化過程中正確配置,并且有一些非凡的要求需要考慮。由前文可知,_main中的C庫(kù)函數(shù)初始化代碼負(fù)責(zé)程序運(yùn)行時(shí)的存儲(chǔ)器系統(tǒng)設(shè)置。因此,整個(gè)存儲(chǔ)器系統(tǒng)本身必須得在_main之前完成初始化工作,如MMU或MPU必須在reset handler里面完成配置。嚴(yán)密耦合存儲(chǔ)器TCM的初始化同樣須在_main之前完成通常在MMU/MPU之前,因?yàn)橐话愠绦蚨夹枰汛a和數(shù)據(jù)分散裝入TCM。需要注重的是當(dāng)TCM被使能后,不再訪問被TCM屏蔽的存儲(chǔ)器。關(guān)于cache的一致性問題,假設(shè)cache在_main之前使能的話,那么當(dāng)_ma
25、in里面進(jìn)展從裝載區(qū)到執(zhí)行區(qū)的代碼和數(shù)據(jù)拷貝時(shí)因?yàn)樵诳截愡^程中指令和數(shù)據(jù)在本質(zhì)上都是被當(dāng)作數(shù)據(jù)處理,指令會(huì)出如今數(shù)據(jù)緩沖區(qū)。防止此問題的方法是在C庫(kù)函數(shù)初始化完成后再使能cache。*Scatter loading與存儲(chǔ)器配置不管是通過ROM/RAM重定向還是MMU配置的方法,假設(shè)系統(tǒng)在啟動(dòng)和運(yùn)行時(shí)存儲(chǔ)器分布不一致,scatterloading文件中的定義就要按照系統(tǒng)重定向后的存儲(chǔ)器分布情況進(jìn)展。以上文ROM/RAM重定向?yàn)槔篖OAD_ROM 0x10000 0x8000EXE_ROM 0x10000 0x8000reset_handler.o+RO,+FIRST.RAM 0x0000 0x
26、4000vectors.o+RO,+FIRST.裝載區(qū)LOAD_ROM被放置在0x10000處,代表了重定向之后代碼和數(shù)據(jù)的裝載地址。堆棧的初始化程序中可能用到的處理器形式,都需要定義一個(gè)堆棧指針。在表2中,堆棧位于stack_base標(biāo)識(shí)的地址中。這個(gè)符號(hào)可以是存儲(chǔ)器系統(tǒng)中的一個(gè)直接地址,也可以在另外的匯編文件中定義,由scatter文件來定義分配地址。表2代碼為FIQ和IRQ形式各分配了一個(gè)256字節(jié)的堆棧,用戶可以用同樣的方法為其他形式也分配堆棧。最簡(jiǎn)單的方法就是進(jìn)入相應(yīng)的形式,然后為SP存放器指定相應(yīng)的值。假設(shè)想使用軟件堆棧檢查,還必須指定一個(gè)堆棧長(zhǎng)度限制值。堆棧指針和堆棧限制的數(shù)值會(huì)
27、作為參數(shù)自動(dòng)傳遞到C庫(kù)函數(shù)的初始化代碼_user_initial_stackheap中,在_user_initial_stackheap中不應(yīng)當(dāng)修改這些值。硬件初始化$sub$main一般來說,應(yīng)當(dāng)把所有的系統(tǒng)初始化代碼與主應(yīng)用程序別分開來,但是有幾個(gè)例外,比方cache和中斷的使能,需要在C庫(kù)函數(shù)初始化之后執(zhí)行。表3代碼顯示了怎么使用$sub和$supper。連接器把呼叫main的函數(shù)交換成呼叫$sub$main,完成cache和中斷的使能,并最終跳向main。執(zhí)行形式考慮為主應(yīng)用程序選擇一個(gè)處理器執(zhí)行形式非常重要,這取決于系統(tǒng)的初始化代碼。許多在啟動(dòng)過程中使用到的功能,如MMU/MPU的配
28、置、中斷的使能等,只能在特權(quán)級(jí)形式下進(jìn)展。假設(shè)需要在特權(quán)極形式下運(yùn)行自己的應(yīng)用程序,只要在退出初始化過程之前改變到相應(yīng)的形式就行了,沒有其他任何問題。假設(shè)使用user形式,必須保證所有只能在特權(quán)形式下執(zhí)行的功能完成之后,才能進(jìn)入user形式。因?yàn)閟ystem形式和user形式使用一樣的存放器組,reset handler應(yīng)當(dāng)從system形式退出,_user_initial_stackheap在system形式下完成應(yīng)用程序堆棧的初始化。這樣在處理器進(jìn)入user形式后,所有的堆??臻g都已經(jīng)被正確設(shè)置好了。對(duì)存儲(chǔ)器布局的進(jìn)一步考慮在scatter文件中分配硬件地址雖然可以在一個(gè)scatter文件
29、中描繪代碼和數(shù)據(jù)的分分布局,但是目的硬件中的外設(shè)存放器,堆棧和heap配置仍然直接采用硬件地址在程序源代碼中進(jìn)展設(shè)置。假設(shè)把所有存儲(chǔ)器地址相關(guān)的信息都在scatter文件中進(jìn)展定義,防止在源文件中引用絕對(duì)硬件地址,對(duì)程序的工程化治理是有大好處的。*在scatter文件中定義目的外設(shè)地址通常外設(shè)存放器的地址在程序文件或頭文件中定義,也可以聲明一個(gè)構(gòu)造類型指向外設(shè)存放器,構(gòu)造的地址定位在scatter文件中完成。舉個(gè)例子來說,目的定時(shí)器上有2個(gè)32位的存放器,可以用表4來映射這些存放器。為了把構(gòu)造放置在指定的存儲(chǔ)器地址上面,創(chuàng)立一個(gè)新的執(zhí)行區(qū)見表5。scatter文件便把timer_regs構(gòu)造定位在了地址0x 40000000。注重,在啟動(dòng)過程當(dāng)中這些存放
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 二零二五年度鏟車租賃及保養(yǎng)維護(hù)合同范本2篇
- 二零二五版影視作品獨(dú)家發(fā)行及宣傳推廣合同3篇
- 標(biāo)題5:2025版智能交通系統(tǒng)建設(shè)承包合同范本3篇
- 二零二五年礦山資產(chǎn)轉(zhuǎn)讓與礦山安全生產(chǎn)監(jiān)督合同3篇
- 浙江省購(gòu)房合同2025年度7月1日起實(shí)施修訂2篇
- 二零二五年度水電安裝與施工監(jiān)理兼職合同2篇
- 二零二五版鈑金展柜環(huán)保認(rèn)證與綠色產(chǎn)品采購(gòu)合同3篇
- 二零二五版單位間融資保證借款合同3篇
- 二零二五年鋼筋原材料市場(chǎng)風(fēng)險(xiǎn)管理合同2篇
- 二零二五版?zhèn)€性化家庭貨物配送服務(wù)合同范本3篇
- 河南省鄭州外國(guó)語高中-【高二】【上期中】【把握現(xiàn)在 蓄力高三】家長(zhǎng)會(huì)【課件】
- 天津市武清區(qū)2024-2025學(xué)年八年級(jí)(上)期末物理試卷(含解析)
- 2025年中煤電力有限公司招聘筆試參考題庫(kù)含答案解析
- 企業(yè)內(nèi)部控制與財(cái)務(wù)風(fēng)險(xiǎn)防范
- 高端民用航空復(fù)材智能制造交付中心項(xiàng)目環(huán)評(píng)資料環(huán)境影響
- 建設(shè)項(xiàng)目施工現(xiàn)場(chǎng)春節(jié)放假期間的安全管理方案
- 胃潴留護(hù)理查房
- 污水處理廠運(yùn)營(yíng)方案計(jì)劃
- 山東省高等學(xué)校精品課程
- 三菱張力控制器LE-40MTA-E說明書
- 生活垃圾填埋場(chǎng)污染控制標(biāo)準(zhǔn)
評(píng)論
0/150
提交評(píng)論