




版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領
文檔簡介
1、1TMT H E A R C H I T E C T U R E F O R T H E D I G I T A L W O R L D嵌入式軟件開發(fā)嵌入式軟件開發(fā)2TM266v06 Embedded Software Development嵌入式開發(fā)過程嵌入式開發(fā)過程“PC軟件軟件hello world獨立的嵌入式運用獨立的嵌入式運用當程序員開場開發(fā)一個基于ARM運用的時候,他可以運用ARM的ADS編寫類似于“HELLO WORLD的程序,運用ARMulator或者在評價板上來調(diào)試,但當他把他移植到獨立的嵌入式運用設備中時,下面這些問題就成為我們首要思索的: 硬件環(huán)境中所運用的C庫函數(shù) 目的
2、板上的存儲器資源 運用程序的初始化3TM366v06 Embedded Software Development議程議程nPC軟件的構造軟件的構造n定制規(guī)范定制規(guī)范C庫函數(shù)到目的板庫函數(shù)到目的板n 定制定制IMAGE的存儲器映射到目的板的存儲器映射到目的板n復位和初始化復位和初始化n深層次的存儲器器映象思索深層次的存儲器器映象思索n編譯和調(diào)試編譯和調(diào)試IMAGE4TM466v06 Embedded Software DevelopmentADS默許的規(guī)范默許的規(guī)范C庫庫ANSI Cinput/outputerror handlingstack &heapsetupotherSemiho
3、sting Support運用程序調(diào)用的運用程序調(diào)用的C庫庫函數(shù)函數(shù)eg: fputc()設備驅(qū)動層設備驅(qū)動層運用運用semihosting SWIseg: _sys_write()調(diào)試工具環(huán)境調(diào)試工具環(huán)境C LibraryDebug AgentC庫函數(shù)功能是支持PC軟件的,而目的板上的可執(zhí)行軟件那么依賴相關的硬件資源;在ARM體系中,我們可以采用semihosting經(jīng)過相應的驅(qū)動來進展調(diào)試。5TM566v06 Embedded Software DevelopmentADS默許的存儲器映射默許的存儲器映射n在默許的情況下,我們鏈接、定位、在默許的情況下,我們鏈接、定位、運轉(zhuǎn)在運轉(zhuǎn)在0 x8
4、000nheap 被直接放置在數(shù)據(jù)區(qū)的上面被直接放置在數(shù)據(jù)區(qū)的上面n堆棧的基地址是經(jīng)過調(diào)試環(huán)境從堆棧的基地址是經(jīng)過調(diào)試環(huán)境從C庫庫函數(shù)的函數(shù)的Startup Code 里讀取出來的。里讀取出來的。nARMulator = from configuration file (peripherals.ami) ndefault = 0 x08000000nMulti-ICE = from debugger internal variable $top_of_memoryndefault = 0 x80000RORWZI0 x8000鏈接時確定由調(diào)試環(huán)境提供Heap(malloc,alloc)Stac
5、k6TM666v06 Embedded Software DevelopmentC LibraryUser Code運用程序啟動運用程序啟動_maincopy code and datazero uninitialized data_rt_entryset up application stack and heapinitialize library functionscall top-level constructors (C+)Exit from applicationmain( )causes the linker to pull in library initialization co
6、de程序入口點7TM766v06 Embedded Software DevelopmentAgenda一個PC軟件的構造定制規(guī)范C庫函數(shù)到目的板 定制IMAGE的存儲器映射到目的板復位和初始化深層次的存儲器器映象思索編譯和調(diào)試IMAGE8TM866v06 Embedded Software Development重定向重定向C庫函數(shù)庫函數(shù) (1)SemihostingSupportANSI Cinput/outputn他可以運用適宜他目的板運轉(zhuǎn)的驅(qū)動來交換規(guī)范他可以運用適宜他目的板運轉(zhuǎn)的驅(qū)動來交換規(guī)范C庫中的設備驅(qū)動。庫中的設備驅(qū)動。n Eg: printf( ) 可打印到可打印到LCD上,
7、而不是打印控制臺上上,而不是打印控制臺上input/outputANSI CC LibraryUser CodeDebug AgentTarget HardwareRetarget9TM966v06 Embedded Software Development重定向重定向C庫函數(shù)庫函數(shù)(2)n要重定向要重定向C庫函數(shù)庫函數(shù),簡單的方法是運用他本人的可執(zhí)行的簡單的方法是運用他本人的可執(zhí)行的semihosting SWIs來替來替代原來的代原來的C庫函數(shù),從而來滿足他的系統(tǒng)要求庫函數(shù),從而來滿足他的系統(tǒng)要求n 比如說比如說, the printf()系列函數(shù)系列函數(shù)(sprintf()除外除外) 都
8、會調(diào)用都會調(diào)用fputc(). 在默許情況下在默許情況下fputc()的執(zhí)行運用了的執(zhí)行運用了semihosting SWI. 用下面的語句來替代:用下面的語句來替代:nextern void sendchar(char *ch);int fputc(int ch, FILE *f) /* e.g. write a character to an LCD */ char tempch = ch; sendchar(&tempch); return ch;n可查看在可查看在ADS Embedded example目錄下的目錄下的retarget.c,可看到更多的重定向例可看到更多的重定向
9、例子子 n他可以確定有不在銜接時運用他可以確定有不在銜接時運用semihosting SWI 的嗎的嗎?.10TM1066v06 Embedded Software Development消除消除C庫函數(shù)中的庫函數(shù)中的semi hostingn為了確保在銜接時沒有函數(shù)運用了為了確保在銜接時沒有函數(shù)運用了semi hosting SWIs ,他可以在程序中參與,他可以在程序中參與下面的句子:下面的句子:n#pragma import(_use_no_semihosting_swi) n假設在程序中依然運用了假設在程序中依然運用了semihosting ,編譯時將會報錯:編譯時將會報錯:nErro
10、r: Symbol _semihosting_swi_guard multiply definedn修正修正:n 假設運用假設運用 (check -verbose linker output for occurrences of I use_ semihosting_ swi), 那么銜接器將會把那些運用了那么銜接器將會把那些運用了smeihosting 的程序列出來的程序列出來, 然后:然后:n提供他本人可運轉(zhuǎn)的功能函數(shù)。提供他本人可運轉(zhuǎn)的功能函數(shù)。n在在ADS 1.2 編譯器和庫函數(shù)手冊編譯器和庫函數(shù)手冊, 表表4-2給出了一切運用了給出了一切運用了semihosting的的C庫函庫函數(shù)。
11、數(shù)。n留意留意: 銜接器在用戶本人的運用代碼中不會出現(xiàn)任何有關銜接器在用戶本人的運用代碼中不會出現(xiàn)任何有關 semihosting SWI運運用的報告。用的報告。11TM1166v06 Embedded Software DevelopmentAgenda一個一個PC軟件的構造軟件的構造定制規(guī)范定制規(guī)范C庫函數(shù)到目的板庫函數(shù)到目的板 定制定制IMAGE的存儲器映射到目的板的存儲器映射到目的板復位和初始化復位和初始化深層次的存儲器器映象思索深層次的存儲器器映象思索編譯和調(diào)試編譯和調(diào)試IMAGE12TM1266v06 Embedded Software Development分散加載分散加載Sca
12、tterloadingn在一個實踐運用當中,他能夠并不想在在一個實踐運用當中,他能夠并不想在0 x8000處開場運轉(zhuǎn)。處開場運轉(zhuǎn)。n大多數(shù)嵌入式系統(tǒng)都有存儲器設備,他們的地址空間是在整個存儲器映射中交大多數(shù)嵌入式系統(tǒng)都有存儲器設備,他們的地址空間是在整個存儲器映射中交叉出現(xiàn)的。叉出現(xiàn)的。n分散加載提供了一種把他的代碼和數(shù)據(jù)放在不同的存儲器定位上的方法分散加載提供了一種把他的代碼和數(shù)據(jù)放在不同的存儲器定位上的方法n分散加載定義了兩種類型的存儲器區(qū)域。分散加載定義了兩種類型的存儲器區(qū)域。nLoad 區(qū):區(qū): - 在在reset/load時保管了運用程序的代碼和數(shù)據(jù)時保管了運用程序的代碼和數(shù)據(jù) (典
13、型運用為典型運用為 ROM).nExecution 區(qū)區(qū) 在程序執(zhí)行的同時保管了程序的代碼和數(shù)據(jù)。在運用程序啟動在程序執(zhí)行的同時保管了程序的代碼和數(shù)據(jù)。在運用程序啟動 期間,每個期間,每個load區(qū)都可創(chuàng)建一個或多個可執(zhí)行區(qū)。區(qū)都可創(chuàng)建一個或多個可執(zhí)行區(qū)。n分散加載了的運用把詳細的存儲器映射保管在一個描畫文件中,作為一個參數(shù)分散加載了的運用把詳細的存儲器映射保管在一個描畫文件中,作為一個參數(shù)給給armlink運用運用 neg: armlink program.o -scatter scatter.scf -o program.axf13TM1366v06 Embedded Software D
14、evelopmentExecute ViewRAM0 x100000 x180000 x40000 x0000ROMRO分散加載分散加載(簡單例子簡單例子)只讀代碼和數(shù)據(jù)保管在ROM中C庫函數(shù)初始化代碼 (在 _main) 將 :從ROM拷貝RW數(shù)據(jù)到RAM在RAM中的ZI 數(shù)據(jù)初始化RAM0 x100000 x180000 x40000 x0000ROMLoad ViewRORWFill with zerosZICopyRW14TM1466v06 Embedded Software DevelopmentExecute ViewRAM0 x100000 x180000 x40000 x000
15、0ROMROLOAD_ROM 0 x0000 0 x4000RAM0 x100000 x180000 x40000 x0000ROMLoad ViewRORWScatter 描畫文件描畫文件n通配符*語法允許簡單的對CODE 和DATA 進展分組EXEC_ROM 0 x0000 0 x4000 * (+RO)RAM 0 x10000 0 x8000 * (+RW,+ZI)RWZI15TM1566v06 Embedded Software DevelopmentRORWZIROCODERO -DATARO -CODEAB鏈接器放置規(guī)那么鏈接器放置規(guī)那么n在每個可執(zhí)行區(qū),鏈接器經(jīng)過一些根本的規(guī)那么
16、來放置在每個可執(zhí)行區(qū),鏈接器經(jīng)過一些根本的規(guī)那么來放置CODE 和和DATAn根本的排序方法是經(jīng)過屬性來安排的根本的排序方法是經(jīng)過屬性來安排的:nRO 領先于領先于RW ,RW 領先于領先于ZIn有一樣的屬性時,有一樣的屬性時,CODE 在在DATA之前放置。之前放置。n更多的排序方法決議于:更多的排序方法決議于:n輸入的組名按字母排序輸入的組名按字母排序, n在在ARMLINK命令行中指定的順序。命令行中指定的順序。neg: armlink file1.o file2.o Asection Afrom file1.osection Afrom file2.o16TM1666v06 Embed
17、ded Software Development在在SCATTOR 文件中的對象排序文件中的對象排序n為了把特定的為了把特定的CODE 和和DATA 放在指定的地址上,他可以不思索規(guī)范的放置規(guī)那放在指定的地址上,他可以不思索規(guī)范的放置規(guī)那么么n運用運用+FIRST 和和 +LAST ,直接把第一個和最后一個對象放在可執(zhí)行區(qū)。,直接把第一個和最后一個對象放在可執(zhí)行區(qū)。n圖例:把圖例:把VECTOR表放在區(qū)的開場。表放在區(qū)的開場。LOAD_ROM 0 x0000 0 x4000 EXEC_ROM 0 x0000 0 x4000 vectors.o (Vectors, +FIRST) file1.o
18、 (+RO) file2.o (+RO) :在可執(zhí)行區(qū)內(nèi),scattor 文件中要排序的對象對輸出image沒有影響鏈接器的規(guī)范放置規(guī)那么依然適用17TM1766v06 Embedded Software DevelopmentROOT區(qū)區(qū)LOAD_ROM 0 x0000 0 x4000 ; start address and length EXEC_ROM 0 x0000 0 x4000 ; root (load = exec address) _main.o (+RO) ; copying code * (Region$Table) ; RO/RW addresses to copy *
19、(ZISection$Table) ; ZI addresses to zero RAM 0 x10000 0 x8000 * (+RO) ; All other RO areas * (+RW,+ZI) ; program variables Must be in a root regionoutside root region一個 root 區(qū)是一個可執(zhí)行區(qū),它的加載地址等于執(zhí)行地址。18TM1866v06 Embedded Software DevelopmentRoot區(qū)要點區(qū)要點n一個 root 區(qū)是一個可執(zhí)行區(qū),它的加載地址等于執(zhí)行地址.n每個scatter描畫文件必需最少包含一個
20、root區(qū),并且最少要包含以下內(nèi)容:n_main.o 含有拷貝code/data的代碼nRegion$Table 和 ZISection$Table 含有將要拷貝的code/data的地址,他是由鏈接器產(chǎn)生的,不是一個對象文件。所以*必需用nError: L6202E: Section Region$Table cannot be assigned to a non-root region.nError: L6202E: Section ZISection$Table cannot be assigned to a non-root region.n留意: 假設 * (+RO)被定位在 roo
21、t 區(qū),在此之前的將被自動放置nMain運用程序的入口點必需放在root區(qū)。nError: L6203E: Entry point (0 x08000000) lies within non-root region EXE_FLASH.19TM1966v06 Embedded Software DevelopmentRun-time 存儲器管理存儲器管理 SemihostingSupportANSI CStack &HeapSetupStack &HeapSetupANSI CC LibraryUser CodeDebug AgentTarget HardwareRetarge
22、t如何設置stack和 heap來滿足我們的目的存儲器? n我們曾經(jīng)經(jīng)過執(zhí)行我們曾經(jīng)經(jīng)過執(zhí)行_user_initial_stackheap()把把C規(guī)范庫的運轉(zhuǎn)存儲器方式修規(guī)范庫的運轉(zhuǎn)存儲器方式修正到目的平臺上。正到目的平臺上。20TM2066v06 Embedded Software DevelopmentStack 和和 Heap 初始化初始化C LibraryUser Code_maincopy code and datazero uninitialized data_rt_entryinitialize library functionscall top-level construct
23、ors (C+)Exit from applicationmain( )cause linker to pull in library initialization codeImage Entry Point_user_initial_stackheap( )set up application stack and heap21TM2166v06 Embedded Software DevelopmentRun-time 存儲器方式存儲器方式n他必需決議在放置他必需決議在放置stack和和heap時所運用的區(qū)域是單一的區(qū)時所運用的區(qū)域是單一的區(qū)(one-region model)或是不同的兩個
24、區(qū)或是不同的兩個區(qū)(two-region model)HeapStackStackOne region modelTwo region modelHBSBSBHBHL單一存儲器方式是默許方式為了實現(xiàn)多區(qū)域方式,他可以運用 use_two_region_memory在一切的方式下,軟件堆棧檢查要答應。編譯開關是: -apcs /swst 指定堆棧限制 (為 two-region 方式)heap is checked against stack pointerHeapheap is checked against heap limit(SL)22TM2266v06 Embedded Softwar
25、e Development_user_initial_stackheap( )n可以用可以用C或匯編來寫,他要前往:或匯編來寫,他要前往:nHeap 基地址在基地址在R0 ,STACK 的基地址在的基地址在R1.nHeap 的限制地址在的限制地址在R2,STACK的限制地址在的限制地址在R3EXPORT _user_initial_stackheap_user_initial_stackheapLDR r0, =0 x80000 ;HBLDR r1, =0 x88000 ;SB; r2 not used (HL); r3 not used (SL)MOV pc, lrHeapStackHeap
26、 的限制地址在單一方式是不被運用的。Stack 的限制地址只在軟件堆棧檢查答應的情況下才有效。HB = 0 x80000SB = 0 x8800023TM2366v06 Embedded Software Development警告警告! n當運用分散加載時他必需執(zhí)行當運用分散加載時他必需執(zhí)行 _user_initial_stackheap()n在在C庫初始化代碼內(nèi)的庫初始化代碼內(nèi)的_user_initial_stackheap() 的默許執(zhí)行是在映像文件的的默許執(zhí)行是在映像文件的RW/ZI數(shù)據(jù)段后放置數(shù)據(jù)段后放置HEAP。n運用運用 Image$RW$Base / Image$ZI$Base
27、 銜接符號銜接符號n這些符號對這些符號對scatterloading是無效的。是無效的。n在在ADS 1.1和早期版本的軟件中:和早期版本的軟件中:n符號被設置為符號被設置為0X0, heap被定位在這被定位在這!nHeap的并發(fā)運用,無論是直接的并發(fā)運用,無論是直接(e.g. with malloc()或間接或間接(by use of argc/argv)的都能夠破壞向量表或其他代碼,典型的結(jié)果是不可預知的程序在的都能夠破壞向量表或其他代碼,典型的結(jié)果是不可預知的程序在運轉(zhuǎn)時出錯了。運轉(zhuǎn)時出錯了。n在在ADS 1.2:n符號沒有定義,運用程序不會聯(lián)接:符號沒有定義,運用程序不會聯(lián)接:nErr
28、or: L6218E: Undefined symbol Image$ZI$Limit (referred from sys_stackheap.o).24TM2466v06 Embedded Software DevelopmentAgenda一個PC軟件的構造裁減規(guī)范C庫函數(shù)到目的板 定制IMAGE的存儲器映射到目的板復位和初始化深層次的存儲器器映象思索編譯和調(diào)試IMAGE25TM2566v06 Embedded Software DevelopmentThe Vector TableAREA Vectors, CODE, READONLYIMPORT Reset_Handler; imp
29、ort other exception handlers; ENTRYBReset_HandlerBUndefined_HandlerBSWI_HandlerBPrefetch_HandlerBData_HandlerNOP; Reserved vectorBIRQ_Handler; FIQ_Handler will follow directlyEND在運用scatterloading+FIRST時直接定位在0X0或 0 xFFFF0000ENTRY 直接通知鏈接器這是一個入口點,防止某些段被刪除中斷向量表中斷向量表26TM2666v06 Embedded Software Developm
30、ent初始化步驟初始化步驟C LibraryUser Code_maincopy code and datazero uninitialized data_rt_entryinitialize library functionscall top-level constructors (C+)Exit from applicationmain( )tells linker to link in library initialization codeImage Entry Point_user_initial_stackheap( )set up stack & heapreset han
31、dlerinitialize stack pointersconfigure MMU/MPUsetup cache/enable TCM$Sub$main( )enable caches & interrupts27TM2766v06 Embedded Software DevelopmentROM or RAM at 0 x0?n需求一個有效的地址在需求一個有效的地址在 0 x0這項功能可被編碼在像RESET HANDLER 一樣的模塊中在本章終了的時候,我們還會講到。ROM0 x100000 x180000 x40000 x0000AliasedROMReset HandlerRO
32、M/RAM RemappingRAM0 x100000 x180000 x40000 x0000ROMROM at 0 x0Reset HandlerVectorsReset Handler0 x40000 x0000RAMVectors28TM2866v06 Embedded Software DevelopmentROM/RAM Remapping 下面的例子可像Reset handler 一樣在源碼中編碼。; - Integrator CM control regCM_ctl_reg EQU 0 x1000000C ; Address of CM Control RegisterRema
33、p_bit EQU 0 x04 ; Bit 2 is remap bit of CM_ctl ENTRY; On reset, an alias of ROM is at 0 x0, so jump to real ROM. LDR pc, =Instruct_2 Instruct_2 ; Remap by setting Remap bit of the CM_ctl register LDR r1, =CM_ctl_reg LDR r0, r1 ORR r0, r0, #Remap_bit STR r0, r1; RAM is now at 0 x0.; The exception vec
34、tors must be copied from ROM to RAM (in _main); Reset_Handler follows on from here這個功能也可在有mmu時運用ROM/RAM的重定向的重定向29TM2966v06 Embedded Software Development初始化棧的指針初始化棧的指針; - Amount of memory (in bytes) allocated for stacksLen_FIQ_Stack EQU 256Len_IRQ_Stack EQU 256 Offset_FIQ_Stack EQU 0Offset_IRQ_Stack
35、EQU Offset_FIQ_Stack + Len_FIQ_Stack Reset_Handler LDR r0, stack_base ; located by scatter file; Enter each mode in turn and set up the stack pointer MSR CPSR_c, #Mode_FIQ:OR:I_Bit:OR:F_Bit ; No interrupts SUB sp, r0, #Offset_FIQ_Stack MSR CPSR_c, #Mode_IRQ:OR:I_Bit:OR:F_Bit ; No interrupts SUB sp,
36、r0, #Offset_IRQ_Stack ; System mode stack is set up last MSR CPSR_c, #Mode_SYS:OR:I_Bit:OR:F_Bit ; No interrupts SUB sp, r0, #Offset_SYS_Stack; Set up stack limit if needed LDR r10, stack_limit ; located by scatter file30TM3066v06 Embedded Software Development部分存儲器設置部分存儲器設置nrun-time的存儲器必需在的存儲器必需在C庫初
37、始化前定義庫初始化前定義n假設他運用的假設他運用的ARM7芯片還有芯片還有MMU/MPU,它必需設置;它必需設置;nROM/RAM 的重新映射必需完成。的重新映射必需完成。nTCMsTightly coupled memory 假設有假設有TCM,典型的必需使能它。典型的必需使能它。n請留意:在請留意:在TCM使能之前,要屏蔽使能之前,要屏蔽ROMn在在Cache翻開之前要前往。翻開之前要前往。n在在c庫初始化代碼運轉(zhuǎn)之后,假設庫初始化代碼運轉(zhuǎn)之后,假設cache被使能,可以防止與被使能,可以防止與cache相關的問題;相關的問題;31TM3166v06 Embedded Software D
38、evelopment擴展功能擴展功能n系統(tǒng)初始化代碼通常在進入主運用之前運轉(zhuǎn)系統(tǒng)初始化代碼通常在進入主運用之前運轉(zhuǎn)n當然,當然,reset handler 不是一個適宜使能中斷和使能不是一個適宜使能中斷和使能caches地方。地方。n在在reset handler最后應該放一個最后應該放一個C運轉(zhuǎn)庫初始化代碼運轉(zhuǎn)庫初始化代碼nEG。 IMPORT _mainn B _mainn我們可運用我們可運用$Sub和和$Super功能來包裝符號功能來包裝符號nextern void $Super$main(void);nvoid $Sub$main(void)nn cache_enable();/ en
39、ables cachesn int_enable(); / enables interruptsn sys_to_usr_mode();/ change mode - see next sliden $Super$main();/ calls original main()nn相關描畫可在相關描畫可在ADS 1.2 Linker and Utilities Guide - 4.4章查閱到。章查閱到。32TM3266v06 Embedded Software Development運轉(zhuǎn)方式思索運轉(zhuǎn)方式思索n主運用程序運轉(zhuǎn)在何種方式是要思索的重要問題。主運用程序運轉(zhuǎn)在何種方式是要思索的重要問題。n
40、用戶方式用戶方式User mode是非特權方式是非特權方式unprivileged mode-維護他的系統(tǒng)維護他的系統(tǒng)n系統(tǒng)初始化代碼只能運轉(zhuǎn)在特權方式系統(tǒng)初始化代碼只能運轉(zhuǎn)在特權方式(privileged mode)。n需求執(zhí)行特權操作需求執(zhí)行特權操作 比如比如:使能中斷。使能中斷。n假設他的運用要運轉(zhuǎn)在管理方式假設他的運用要運轉(zhuǎn)在管理方式,簡單的在管理方式下退出他的簡單的在管理方式下退出他的reset handler 就可。就可。n假設他想在用戶方式下運轉(zhuǎn)他的運用,他需在假設他想在用戶方式下運轉(zhuǎn)他的運用,他需在$Sub$main( )改動為用戶方式改動為用戶方式n當然當然, _user_i
41、nitial_stackheap( ) 必需有權運用他的運用方式存放器。必需有權運用他的運用方式存放器。n處理方法是在系統(tǒng)方式里退出處理方法是在系統(tǒng)方式里退出reset handlern一切一切C庫初始化代碼有權運用用戶存放器,但是依然可以執(zhí)行特權操作。庫初始化代碼有權運用用戶存放器,但是依然可以執(zhí)行特權操作。33TM3366v06 Embedded Software DevelopmentAgenda一個PC軟件的構造裁減規(guī)范C庫函數(shù)到目的板 定制IMAGE的存儲器映射到目的板復位和初始化深層次的存儲器器映象思索編譯和調(diào)試IMAGE34TM3466v06 Embedded Software
42、Development長跳轉(zhuǎn)長跳轉(zhuǎn)VeneersROM_LOAD 0 x0000 ROM_EXEC 0 x0000 * (+RO) RAM 0 x80000000 farfunc.o (+RO) * (+RW,+ZI) /* main.c */int main(void) farfunc(); /* farfunc.c */ void farfunc(void); :代碼段可被遠間隔分開放置 (比BL的跳轉(zhuǎn)范圍還遠)鏈接器可自動添加長跳轉(zhuǎn)Veneers,遠間隔的函數(shù)可被勝利調(diào)用。0 x00000000 bl Ven$AA$L$farfunc:Ven$AA$L$farfunc ldr pc,pc
43、,#-4dcd 0 x80000000:0 x80000000:mov pc,lr35TM3566v06 Embedded Software Development存儲器映射存放器存儲器映射存放器n他可以運用他可以運用scatterloading來放置外設存放器的存儲器映射來放置外設存放器的存儲器映射n在文件中定義它在文件中定義它 e.g. timer_struct n volatile unsigned reg1; /* timer control */n volatile unsigned reg2; /* timer value */n timer_reg;在存儲器映射的懇求地址上添加另
44、外的可執(zhí)行區(qū)來放置他們在存儲器映射的懇求地址上添加另外的可執(zhí)行區(qū)來放置他們:nnLOAD_FLASH 0 x24000000 0 x04000000nn :n TIMER 0 x40000000 UNINITn n timer_reg.o (+ZI)n n :nUNINIT 顯示在顯示在 ZI 段沒有被初始化為段沒有被初始化為0。36TM3666v06 Embedded Software DevelopmentStack 和和 Heap 區(qū)區(qū)(1)n他也可以在他也可以在SCATTER文件中放置文件中放置stack和和heapn在匯編原文件里定義在匯編原文件里定義stack 和和heap 區(qū)區(qū)
45、n比如比如. stackheap.sn這個空間直接保管一個為這個空間直接保管一個為0的存儲器塊的存儲器塊nAREA stack, DATA, NOINITnSPACE 0 x3000 ; Reserve stack spacenAREA heap, DATA, NOINITnSPACE 0 x3000 ; Reserve heap spacenEND37TM3766v06 Embedded Software DevelopmentStack 和和 Heap 區(qū)區(qū)(2)n添加一個可執(zhí)行區(qū)來定位這個區(qū)域添加一個可執(zhí)行區(qū)來定位這個區(qū)域nLOAD_FLASH 0X24000000 0 x0400000
46、0nn:nSTACK 0 x1000 UNINIT ; length = 0 x3000 n n stackheap.o (stack) ; stack = 0 x4000 to 0 x1000nnHEAP 0 x15000 UNINIT ; length = 0 x3000n n stackheap.o (heap) ; heap = 0 x15000 to 0 x18000nnnHeap的基地址起始為的基地址起始為 0 x15000. Stack的最大地址為的最大地址為 0 x4000.38TM3866v06 Embedded Software DevelopmentStack 和和 He
47、ap 區(qū)區(qū) (3)n鏈接器將產(chǎn)生一個為每個可執(zhí)行區(qū)的基地址和限制地址的符號指針鏈接器將產(chǎn)生一個為每個可執(zhí)行區(qū)的基地址和限制地址的符號指針n在他的代碼中引入這些符號在他的代碼中引入這些符號nIMPORT |Image$STACK$ZI$Base|nIMPORT |Image$STACK$ZI$Limit|nIMPORT |Image$HEAP$ZI$Base|nIMPORT |Image$HEAP$ZI$Limit|nstack_baseDCD |Image$STACK$ZI$Limit|nstack_limitDCD |Image$STACK$ZI$Base|nheap_baseDCD |Im
48、age$HEAP$ZI$Base|nheap_limitDCD |Image$HEAP$ZI$Limit|n運用運用DCD指令為這些段命名指令為這些段命名39TM3966v06 Embedded Software Development_user_initial_stackheap( )n在在reset handler,這個,這個stack指針指針 (r13)和和stack 限制值限制值(r10) 通常設置了,他通常設置了,他們分別經(jīng)過們分別經(jīng)過R1和和R3作為參數(shù)傳送給作為參數(shù)傳送給 _user_initial_stackheapIMPORT _use_two_region_memoryEX
49、PORT _user_initial_stackheap_user_initial_stackheapLDR r0, heap_base; SB value setup in reset handler LDR r2, heap_limit; SL value setup in reset handlerMOV pc, lrStackHeap這個_user_initial_stackheap( )例子實現(xiàn)了兩個存儲器區(qū)域方式。 必需援用 _use_two_region_memory,在這HEAP被檢查,它是HEAP的限制值,而不是STACK指針40TM4066v06 Embedded Soft
50、ware Development存儲器映射例子存儲器映射例子16 bitRAM0 x100000 x180000 x40000 x0000Fast32 bitRAMVector TableStackException HandlersRW & ZIHeapFlash0 x240000000 x28000000Reset HandlerROPeripherals0 x40000000外設控制存放器的地址映射直接在FLASH運轉(zhuǎn)的代碼大小16位 RAM 被用來保管數(shù)據(jù)和HEAP區(qū)一些緊急的代碼和數(shù)據(jù)可放在快速的RAM區(qū)41TM4166v06 Embedded Software Develo
51、pmentSCATTER文件例子文件例子 : :16bitRAM 0 x10000 * (+RW,+ZI) HEAP 0 x15000 UNINIT stackheap.o (heap) TIMER 0 x40000000 UNINIT timer_reg.o (+ZI) FLASH 0 x24000000 0 x04000000 FLASH 0 x24000000 0 x04000000 init.o (Init, +First) * (+RO) 32bitRAM 0 x0000 vectors.o (Vect, +First) handlers.o (+RO) STACK 0 x1000
52、UNINIT stackheap.o (stack) :這個scatter文件執(zhí)行上頁所顯示的存儲器映射。42TM4266v06 Embedded Software DevelopmentAgenda一個PC軟件的構造裁減規(guī)范C庫函數(shù)到目的板 定制IMAGE的存儲器映射到目的板復位和初始化深層次的存儲器器映象思索編譯和調(diào)試IMAGE43TM4366v06 Embedded Software Development不運用段的消除和程序的入口點不運用段的消除和程序的入口點n在默許的情況下,鏈接器將從最終的在默許的情況下,鏈接器將從最終的image文件中刪除一些從不運用的代碼文件中刪除一些從不運用的
53、代碼段,或從未運用的數(shù)據(jù)段。段,或從未運用的數(shù)據(jù)段。n要查看哪些段被刪除了,在鏈接時用:要查看哪些段被刪除了,在鏈接時用: -info unused.n為了確保不刪除重要的段為了確保不刪除重要的段(比如:中斷向量表比如:中斷向量表) :n運用匯編指令運用匯編指令entry標示一切的入口點標示一切的入口點c庫有一個入口點:庫有一個入口點:_main(),n運用運用-entry選擇其中一個入口點作為選擇其中一個入口點作為image的入口,否那么,鏈接器將給警的入口,否那么,鏈接器將給警 告:告:Image does not have an entry point. (Not specified or not set due to multiple choices)n在生成在生成ROMmable image 使引薦運用下面的鏈接命令:使引薦運用下面的鏈接命令:armlink obj1.o obj2.o -scatter
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年公關銷售面試試題及答案
- 2025年社工招聘考試試題及答案
- LNG購銷合同范例
- 公司對公司正規(guī)合同范例
- 中歐客機采購合同范例
- 入學租房合同范例
- 使用天津市商品房合同范例
- 綠色古風屈原人物介紹
- 2025年宿遷中考試題及答案英語
- 會議服務策劃合同范例
- 醫(yī)院醫(yī)用耗材SPD服務項目投標方案
- 2025年保密知識試題庫附參考答案(精練)
- 全國普通高等學校2025屆高三第二次調(diào)研數(shù)學試卷含解析
- 南昌起義模板
- “互聯(lián)網(wǎng)+”大學生創(chuàng)新創(chuàng)業(yè)大賽計劃書一等獎
- 2024年10月高等教育自學考試13015計算機系統(tǒng)原理試題及答案
- GB/T 3324-2024木家具通用技術條件
- 2024秋期國家開放大學本科《古代小說戲曲專題》一平臺在線形考(形考任務4)試題及答案
- 血吸蟲病知識宣傳講座
- 詩經(jīng)的課件教學課件
- 人工智能講座模板
評論
0/150
提交評論