




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
1、嵌入式軟件開發(fā)嵌入式軟件開發(fā)嵌入式開發(fā)過程“PC軟件”獨(dú)立的嵌入式應(yīng)用當(dāng)程序員開始開發(fā)一個基于ARM應(yīng)用的時候,你可以使用ARM的ADS編寫類似于“HELLO WORLD”的程序,使用ARMulator或者在評估板上來調(diào)試,但當(dāng)你把他移植到獨(dú)立的嵌入式應(yīng)用設(shè)備中時,下面這些問題就成為我們首要考慮的: 硬件環(huán)境中所使用的C庫函數(shù) 目標(biāo)板上的存儲器資源 應(yīng)用程序的初始化嵌入式開發(fā)過程“PC軟件”獨(dú)立的嵌入式應(yīng)用當(dāng)程序員開始開發(fā)一議程PC軟件的構(gòu)造定制標(biāo)準(zhǔn)C庫函數(shù)到目標(biāo)板 定制IMAGE的存儲器映射到目標(biāo)板復(fù)位和初始化深層次的存儲器器映象考慮編譯和調(diào)試IMAGE議程PC軟件的構(gòu)造ADS默認(rèn)的標(biāo)準(zhǔn)C庫
2、ANSI Cinput/outputerror handlingstack &heapsetupotherSemihosting Support應(yīng)用程序調(diào)用的C庫函數(shù)eg: fputc()設(shè)備驅(qū)動層使用semihosting SWIseg: _sys_write()調(diào)試工具環(huán)境C LibraryDebug AgentC庫函數(shù)功能是支持PC軟件的,而目標(biāo)板上的可執(zhí)行軟件則依賴相關(guān)的硬件資源;在ARM體系中,我們可以采用semihosting通過相應(yīng)的驅(qū)動來進(jìn)行調(diào)試。ADS默認(rèn)的標(biāo)準(zhǔn)C庫ANSI Cinput/error stADS默認(rèn)的存儲器映射在默認(rèn)的情況下,我們鏈接、定位、運(yùn)行在0 x800
3、0heap 被直接放置在數(shù)據(jù)區(qū)的上面堆棧的基地址是通過調(diào)試環(huán)境從C庫函數(shù)的Startup Code 里讀取出來的。ARMulator = from configuration file (peripherals.ami) default = 0 x08000000Multi-ICE = from debugger internal variable $top_of_memorydefault = 0 x80000RORWZI0 x8000鏈接時確定由調(diào)試環(huán)境提供Heap(malloc,alloc)StackADS默認(rèn)的存儲器映射在默認(rèn)的情況下,我們鏈接、定位、運(yùn)行在C LibraryUser
4、Code應(yīng)用程序啟動_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 code程序入口點(diǎn)C LibraryUser Code應(yīng)用程序啟動_mainAgenda一個PC軟件的構(gòu)造定制標(biāo)準(zhǔn)C庫函數(shù)到
5、目標(biāo)板 定制IMAGE的存儲器映射到目標(biāo)板復(fù)位和初始化深層次的存儲器器映象考慮編譯和調(diào)試IMAGEAgenda一個PC軟件的構(gòu)造重定向C庫函數(shù) (1)SemihostingSupportANSI Cinput/output你可以使用適合你目標(biāo)板運(yùn)行的驅(qū)動來替換標(biāo)準(zhǔn)C庫中的設(shè)備驅(qū)動。 Eg: printf( ) 可打印到LCD上,而不是打印控制臺上input/outputANSI CC LibraryUser CodeDebug AgentTarget HardwareRetarget重定向C庫函數(shù) (1)SemihostingANSI Cin重定向C庫函數(shù)(2)要重定向C庫函數(shù),簡單的辦法是使
6、用你自己的可執(zhí)行的semihosting SWIs來代替原來的C庫函數(shù),從而來滿足你的系統(tǒng)要求 比如說, the printf()系列函數(shù)(sprintf()除外) 都會調(diào)用fputc(). 在默認(rèn)情況下fputc()的執(zhí)行使用了semihosting SWI. 用下面的語句來代替:extern 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;可查看在ADS Embedd
7、ed example目錄下的retarget.c,可看到更多的重定向例子 你可以確定有不在連接時使用semihosting SWI 的嗎?.重定向C庫函數(shù)(2)要重定向C庫函數(shù),簡單的辦法是使用你自己消除C庫函數(shù)中的semi hosting為了確保在連接時沒有函數(shù)使用了semi hosting SWIs ,你可以在程序中加入下面的句子:#pragma import(_use_no_semihosting_swi) 如果在程序中仍然使用了semihosting ,編譯時將會報錯:Error: Symbol _semihosting_swi_guard multiply defined修改: 如果
8、使用 (check -verbose linker output for occurrences of I use_ semihosting_ swi), 那么連接器將會把那些使用了smeihosting 的程序列出來, 然后:提供你自己可運(yùn)行的功能函數(shù)。在ADS 1.2 編譯器和庫函數(shù)手冊, 表4-2給出了所有使用了semihosting的C庫函數(shù)。注意: 連接器在用戶自己的應(yīng)用代碼中不會出現(xiàn)任何有關(guān) semihosting SWI使用的報告。消除C庫函數(shù)中的semi hosting為了確保在連接時沒有Agenda一個PC軟件的構(gòu)造定制標(biāo)準(zhǔn)C庫函數(shù)到目標(biāo)板 定制IMAGE的存儲器映射到目標(biāo)板
9、復(fù)位和初始化深層次的存儲器器映象考慮編譯和調(diào)試IMAGEAgenda一個PC軟件的構(gòu)造分散加載(Scatterloading)在一個實(shí)際應(yīng)用當(dāng)中,你可能并不想在0 x8000處開始運(yùn)行。大多數(shù)嵌入式系統(tǒng)都有存儲器設(shè)備,他們的地址空間是在整個存儲器映射中交叉出現(xiàn)的。分散加載提供了一種把你的代碼和數(shù)據(jù)放在不同的存儲器定位上的辦法分散加載定義了兩種類型的存儲器區(qū)域。Load 區(qū): - 在reset/load時保留了應(yīng)用程序的代碼和數(shù)據(jù) (典型應(yīng)用為 ROM).Execution 區(qū) 在程序執(zhí)行的同時保留了程序的代碼和數(shù)據(jù)。在應(yīng)用程序啟動 期間,每個load區(qū)都可創(chuàng)建一個或多個可執(zhí)行區(qū)。分散加載了的應(yīng)
10、用把詳細(xì)的存儲器映射保存在一個描述文件中,作為一個參數(shù)給armlink使用 eg: armlink program.o -scatter scatter.scf -o program.axf分散加載(Scatterloading)在一個實(shí)際應(yīng)用當(dāng)中,Execute 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 ViewRORWF
11、ill with zerosZICopyRWExecute ViewRAM0 x100000 x180000Execute ViewRAM0 x100000 x180000 x40000 x0000ROMROLOAD_ROM 0 x0000 0 x4000RAM0 x100000 x180000 x40000 x0000ROMLoad ViewRORWScatter 描述文件通配符(*)語法允許簡單的對CODE 和DATA 進(jìn)行分組EXEC_ROM 0 x0000 0 x4000 * (+RO)RAM 0 x10000 0 x8000 * (+RW,+ZI)RWZIExecute ViewRA
12、M0 x100000 x180000RORWZIROCODERO -DATARO -CODEAB鏈接器放置規(guī)則在每個可執(zhí)行區(qū),鏈接器通過一些基本的規(guī)則來放置CODE 和DATA基本的排序方法是通過屬性來安排的:RO 領(lǐng)先于RW ,RW 領(lǐng)先于ZI有相同的屬性時,CODE 在DATA之前放置。更多的排序方法決定于:輸入的組名按字母排序, 在ARMLINK命令行中指定的順序。eg: armlink file1.o file2.o Asection Afrom file1.osection Afrom file2.oRORWZIROCODERO -DATARO -CODEAB在SCATTOR 文件中
13、的對象排序?yàn)榱税烟囟ǖ腃ODE 和DATA 放在指定的地址上,你可以不考慮標(biāo)準(zhǔn)的放置規(guī)則使用+FIRST 和 +LAST ,直接把第一個和最后一個對象放在可執(zhí)行區(qū)。圖例:把VECTOR表放在區(qū)的開始。LOAD_ROM 0 x0000 0 x4000 EXEC_ROM 0 x0000 0 x4000 vectors.o (Vectors, +FIRST) file1.o (+RO) file2.o (+RO) :在可執(zhí)行區(qū)內(nèi),scattor 文件中要排序的對象對輸出image沒有影響鏈接器的標(biāo)準(zhǔn)放置規(guī)則仍然適用在SCATTOR 文件中的對象排序?yàn)榱税烟囟ǖ腃ODE 和DROOT區(qū)LOAD_ROM
14、 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 * (ZISection$Table) ; ZI addresses to zero RAM 0 x10000 0 x8000 * (+RO) ; All other RO areas * (+RW,+ZI) ; program variables Must
15、be in a root regionoutside root region一個 root 區(qū)是一個可執(zhí)行區(qū),它的加載地址等于執(zhí)行地址。ROOT區(qū)LOAD_ROM 0 x0000 0 x4000 Root區(qū)要點(diǎn)一個 root 區(qū)是一個可執(zhí)行區(qū),它的加載地址等于執(zhí)行地址.每個scatter描述文件必須最少包含一個root區(qū),并且最少要包含下列內(nèi)容:_main.o 含有拷貝code/data的代碼Region$Table 和 ZISection$Table 含有將要拷貝的code/data的地址,他是由鏈接器產(chǎn)生的,不是一個對象文件。(所以*必須用)Error: L6202E: Section R
16、egion$Table cannot be assigned to a non-root region.Error: L6202E: Section ZISection$Table cannot be assigned to a non-root region.注意: 如果 * (+RO)被定位在 root 區(qū),在此之前的將被自動放置Main應(yīng)用程序的入口點(diǎn)必須放在root區(qū)。Error: L6203E: Entry point (0 x08000000) lies within non-root region EXE_FLASH.Root區(qū)要點(diǎn)一個 root 區(qū)是一個可執(zhí)行區(qū),它的加載地址R
17、un-time 存儲器管理 SemihostingSupportANSI CStack &HeapSetupStack &HeapSetupANSI CC LibraryUser CodeDebug AgentTarget HardwareRetarget如何設(shè)置stack和 heap來滿足我們的目標(biāo)存儲器? 我們已經(jīng)通過執(zhí)行_user_initial_stackheap()把C標(biāo)準(zhǔn)庫的運(yùn)行存儲器模式修改到目標(biāo)平臺上。Run-time 存儲器管理 SemihostingANSIStack 和 Heap 初始化C LibraryUser Code_maincopy code and dataze
18、ro uninitialized data_rt_entryinitialize library functionscall top-level constructors (C+)Exit from applicationmain( )cause linker to pull in library initialization codeImage Entry Point_user_initial_stackheap( )set up application stack and heapStack 和 Heap 初始化C LibraryUser Run-time 存儲器模式你必須決定在放置sta
19、ck和heap時所使用的區(qū)域是單一的區(qū)(one-region model)或是不同的兩個區(qū)(two-region model)HeapStackStackOne region modelTwo region modelHBSBSBHBHL單一存儲器模式是默認(rèn)方式為了實(shí)現(xiàn)多區(qū)域模式,你可以使用 use_two_region_memory在所有的模式下,軟件堆棧檢查要許可。編譯開關(guān)是: -apcs /swst 指定堆棧限制 (為 two-region 模式)heap is checked against stack pointerHeapheap is checked against heap l
20、imit(SL)Run-time 存儲器模式你必須決定在放置stack和he_user_initial_stackheap( )可以用C或匯編來寫,他要返回:Heap 基地址在R0 ,STACK 的基地址在R1.Heap 的限制地址在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 的限制地址在單一模式是不
21、被使用的。Stack 的限制地址只在軟件堆棧檢查許可的情況下才有效。HB = 0 x80000SB = 0 x88000_user_initial_stackheap( )可以用警告! 當(dāng)使用分散加載時你必須執(zhí)行 _user_initial_stackheap()在C庫初始化代碼內(nèi)的_user_initial_stackheap() 的默認(rèn)執(zhí)行是在映像文件的RW/ZI數(shù)據(jù)段后放置HEAP。使用 Image$RW$Base / Image$ZI$Base 連接符號這些符號對scatterloading是無效的。在ADS 1.1和早期版本的軟件中:符號被設(shè)置為0X0, heap被定位在這!Heap
22、的并發(fā)使用,無論是直接(e.g. with malloc()或間接(by use of argc/argv)的都可能破壞向量表或其他代碼,典型的結(jié)果是不可預(yù)知的程序在運(yùn)行時出錯了。在ADS 1.2:符號沒有定義,應(yīng)用程序不會聯(lián)接:Error: L6218E: Undefined symbol Image$ZI$Limit (referred from sys_stackheap.o).警告! 當(dāng)使用分散加載時你必須執(zhí)行 _user_initiAgenda一個PC軟件的構(gòu)造裁減標(biāo)準(zhǔn)C庫函數(shù)到目標(biāo)板 定制IMAGE的存儲器映射到目標(biāo)板復(fù)位和初始化深層次的存儲器器映象考慮編譯和調(diào)試IMAGEAgen
23、da一個PC軟件的構(gòu)造The Vector TableAREA Vectors, CODE, READONLYIMPORT Reset_Handler; import other exception handlers; ENTRYBReset_HandlerBUndefined_HandlerBSWI_HandlerBPrefetch_HandlerBData_HandlerNOP; Reserved vectorBIRQ_Handler; FIQ_Handler will follow directlyEND在使用scatterloading+FIRST時直接定位在0X0(或 0 xFFFF
24、0000)ENTRY 直接告訴鏈接器這是一個入口點(diǎn),防止某些段被刪除中斷向量表The Vector TableAREA Vectors,初始化步驟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 Poi
25、nt_user_initial_stackheap( )set up stack & heapreset handlerinitialize stack pointersconfigure MMU/MPUsetup cache/enable TCM$Sub$main( )enable caches & interrupts初始化步驟C LibraryUser Code_main_ROM or RAM at 0 x0?需要一個有效的地址在 0 x0這項(xiàng)功能可被編碼在像RESET HANDLER 一樣的模塊中在本章結(jié)束的時候,我們還會講到。ROM0 x100000 x180000 x40000 x
26、0000AliasedROMReset HandlerROM/RAM RemappingRAM0 x100000 x180000 x40000 x0000ROMROM at 0 x0Reset HandlerVectorsReset Handler0 x40000 x0000RAMVectorsROM or RAM at 0 x0?需要一個有效的地址在 0ROM/RAM Remapping 下面的例子可像Reset handler 一樣在源碼中編碼。; - Integrator CM control regCM_ctl_reg EQU 0 x1000000C ; Address of CM C
27、ontrol RegisterRemap_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.
28、; The exception vectors must be copied from ROM to RAM (in _main); Reset_Handler follows on from here這個功能也可在有mmu時使用ROM/RAM的重定向ROM/RAM Remapping 下面的例子可像Reset初始化棧的指針; - Amount of memory (in bytes) allocated for stacksLen_FIQ_Stack EQU 256Len_IRQ_Stack EQU 256 Offset_FIQ_Stack EQU 0Offset_IRQ_Stack EQU
29、 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, r0,
30、 #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 file初始化棧的指針; - Amount of memory 局部存儲器設(shè)置run-time的存儲器必須在C庫初始化前定義如果你使用的ARM7芯片還有MMU/MPU,它必須設(shè)
31、置;ROM/RAM 的重新映射必須完成。TCMs(Tightly coupled memory) 如果有TCM,典型的必須使能它。請注意:在TCM使能之前,要屏蔽ROM在Cache打開之前要返回。在c庫初始化代碼運(yùn)行之后,如果cache被使能,可以避免與cache相關(guān)的問題;局部存儲器設(shè)置run-time的存儲器必須在C庫初始化前定義擴(kuò)展功能系統(tǒng)初始化代碼通常在進(jìn)入主應(yīng)用之前運(yùn)行當(dāng)然,reset handler 不是一個適合使能中斷和使能caches地方。在reset handler最后應(yīng)該放一個C運(yùn)行庫初始化代碼EG。 IMPORT _main B _main我們可使用$Sub和$Super
32、功能來包裝符號extern void $Super$main(void);void $Sub$main(void) cache_enable();/ enables caches int_enable(); / enables interrupts sys_to_usr_mode();/ change mode - see next slide $Super$main();/ calls original main()相關(guān)描述可在ADS 1.2 Linker and Utilities Guide - 4.4章查閱到。擴(kuò)展功能系統(tǒng)初始化代碼通常在進(jìn)入主應(yīng)用之前運(yùn)行運(yùn)行模式考慮主應(yīng)用程序運(yùn)行在何
33、種模式是要考慮的重要問題。用戶模式(User mode)是非特權(quán)模式(unprivileged mode)-保護(hù)你的系統(tǒng)系統(tǒng)初始化代碼只能運(yùn)行在特權(quán)模式(privileged mode)。需要執(zhí)行特權(quán)操作 比如:使能中斷。如果你的應(yīng)用要運(yùn)行在管理模式,簡單的在管理模式下退出你的reset handler 就可。如果你想在用戶模式下運(yùn)行你的應(yīng)用,你需在$Sub$main( )改變?yōu)橛脩裟J疆?dāng)然, _user_initial_stackheap( ) 必須有權(quán)使用你的應(yīng)用模式寄存器。解決辦法是在系統(tǒng)模式里退出reset handler所有C庫初始化代碼有權(quán)使用用戶寄存器,但是仍然可以執(zhí)行特權(quán)操作。
34、運(yùn)行模式考慮主應(yīng)用程序運(yùn)行在何種模式是要考慮的重要問題。Agenda一個PC軟件的構(gòu)造裁減標(biāo)準(zhǔn)C庫函數(shù)到目標(biāo)板 定制IMAGE的存儲器映射到目標(biāo)板復(fù)位和初始化深層次的存儲器器映象考慮編譯和調(diào)試IMAGEAgenda一個PC軟件的構(gòu)造長跳轉(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); :代碼段可被遠(yuǎn)距離分開放置
35、(比BL的跳轉(zhuǎn)范圍還遠(yuǎn))鏈接器可自動增加長跳轉(zhuǎn)Veneers,遠(yuǎn)距離的函數(shù)可被成功調(diào)用。0 x00000000 bl Ven$AA$L$farfunc:Ven$AA$L$farfunc ldr pc,pc,#-4dcd 0 x80000000:0 x80000000:mov pc,lr長跳轉(zhuǎn)VeneersROM_LOAD 0 x0000/* ma存儲器映射寄存器你可以使用scatterloading來放置外設(shè)寄存器的存儲器映射在文件中定義它 e.g. timer_reg.cstruct volatile unsigned reg1; /* timer control */ volatile u
36、nsigned reg2; /* timer value */ timer_reg;在存儲器映射的請求地址上增加另外的可執(zhí)行區(qū)來放置他們:LOAD_FLASH 0 x24000000 0 x04000000 : TIMER 0 x40000000 UNINIT timer_reg.o (+ZI) :UNINIT 顯示在 ZI 段沒有被初始化為0。存儲器映射寄存器你可以使用scatterloading來放置Stack 和 Heap 區(qū)(1)你也可以在SCATTER文件中放置stack和heap在匯編原文件里定義stack 和heap 區(qū) 比如. stackheap.s這個空間直接保留一個為0的存
37、儲器塊AREA stack, DATA, NOINITSPACE 0 x3000 ; Reserve stack spaceAREA heap, DATA, NOINITSPACE 0 x3000 ; Reserve heap spaceENDStack 和 Heap 區(qū)(1)你也可以在SCATTER文Stack 和 Heap 區(qū)(2)增加一個可執(zhí)行區(qū)來定位這個區(qū)域LOAD_FLASH 0X24000000 0 x04000000:STACK 0 x1000 UNINIT ; length = 0 x3000 stackheap.o (stack) ; stack = 0 x4000 to 0
38、 x1000HEAP 0 x15000 UNINIT ; length = 0 x3000 stackheap.o (heap) ; heap = 0 x15000 to 0 x18000Heap的基地址起始為 0 x15000. Stack的最大地址為 0 x4000.Stack 和 Heap 區(qū)(2)增加一個可執(zhí)行區(qū)來定位這個Stack 和 Heap 區(qū) (3)鏈接器將產(chǎn)生一個為每個可執(zhí)行區(qū)的基地址和限制地址的符號指針在你的代碼中引入這些符號IMPORT |Image$STACK$ZI$Base|IMPORT |Image$STACK$ZI$Limit|IMPORT |Image$HEAP
39、$ZI$Base|IMPORT |Image$HEAP$ZI$Limit|stack_baseDCD |Image$STACK$ZI$Limit|stack_limitDCD |Image$STACK$ZI$Base|heap_baseDCD |Image$HEAP$ZI$Base|heap_limitDCD |Image$HEAP$ZI$Limit|使用DCD指令為這些段命名Stack 和 Heap 區(qū) (3)鏈接器將產(chǎn)生一個為每個可_user_initial_stackheap( )在reset handler,這個stack指針 (r13)和stack 限制值(r10) 通常設(shè)置了,他們
40、分別通過R1和R3作為參數(shù)傳遞給 _user_initial_stackheapIMPORT _use_two_region_memoryEXPORT _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( )例子實(shí)現(xiàn)了兩個存儲器區(qū)域模式。 必須引用 _use_two
41、_region_memory,在這HEAP被檢查,它是HEAP的限制值,而不是STACK指針_user_initial_stackheap( )在re存儲器映射例子16 bitRAM0 x100000 x180000 x40000 x0000Fast32 bitRAMVector TableStackException HandlersRW & ZIHeapFlash0 x240000000 x28000000Reset HandlerROPeripherals0 x40000000外設(shè)控制寄存器的地址映射直接在FLASH運(yùn)行的代碼大小16位 RAM 被用來保存數(shù)據(jù)和HEAP區(qū)一些緊急的代碼和
42、數(shù)據(jù)可放在快速的RAM區(qū)存儲器映射例子16 bit0 x100000 x180000 x4SCATTER文件例子 : :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, +Fi
43、rst) handlers.o (+RO) STACK 0 x1000 UNINIT stackheap.o (stack) :這個scatter文件執(zhí)行上頁所顯示的存儲器映射。SCATTER文件例子 :FLASH 0 x240000Agenda一個PC軟件的構(gòu)造裁減標(biāo)準(zhǔn)C庫函數(shù)到目標(biāo)板 定制IMAGE的存儲器映射到目標(biāo)板復(fù)位和初始化深層次的存儲器器映象考慮編譯和調(diào)試IMAGEAgenda一個PC軟件的構(gòu)造不使用段的消除和程序的入口點(diǎn)在默認(rèn)的情況下,鏈接器將從最終的image文件中刪除一些從不使用的代碼段,或從未使用的數(shù)據(jù)段。要查看哪些段被刪除了,在鏈接時用: -info unused.為了確保不刪除重要的段(比如:中斷向量表) :使用匯編指令entry標(biāo)示所有的入口點(diǎn)(c庫有一個入口點(diǎn):_main(),使用-entry選擇其中一個入口點(diǎn)作為image的入口,否則,鏈接器將給警 告:Image does not have an entry point. (Not specified or not set due to multiple choices)在生成ROMmable image 使推薦使用下面的鏈接命令:armlink obj1.o obj2.o -scatter scatter.
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025-2030中國車輛地板墊行業(yè)市場發(fā)展趨勢與前景展望戰(zhàn)略研究報告
- 2025-2030中國覆盆子粉行業(yè)市場發(fā)展趨勢與前景展望戰(zhàn)略研究報告
- 2025-2030中國血凝酶行業(yè)市場發(fā)展趨勢與前景展望戰(zhàn)略研究報告
- 2025-2030中國蜂蜜行業(yè)市場現(xiàn)狀供需分析及市場深度研究發(fā)展前景及規(guī)劃可行性分析研究報告
- 2025-2030中國藥物檢測設(shè)備行業(yè)市場深度分析及發(fā)展趨勢與投資研究報告
- 2025-2030中國苯基乙醇行業(yè)市場發(fā)展趨勢與前景展望戰(zhàn)略研究報告
- 2025年丹東道路貨運(yùn)輸從業(yè)資格證模擬考試題庫
- 2025年太原貨物運(yùn)輸從業(yè)資格考試答題模板
- 2025年貴州貨運(yùn)從業(yè)資格證模擬考試題庫及答案大全
- 2025年阿勒泰道路客貨運(yùn)輸從業(yè)資格證b2考試題庫
- 新申請艾滋病篩查實(shí)驗(yàn)室驗(yàn)收指南
- 倉儲設(shè)備操作安全操作培訓(xùn)
- 上海電機(jī)學(xué)院計(jì)算機(jī)C語言專升本題庫及答案
- 幼兒園公開課:大班語言《相反國》課件(優(yōu)化版)
- 2023年寧波房地產(chǎn)市場年度報告
- 員工身心健康情況排查表
- 模擬小法庭劇本-校園欺凌
- 危險化學(xué)品經(jīng)營企業(yè)安全評價細(xì)則
- 哈利波特與死亡圣器下雙語電影臺詞
- 10以內(nèi)數(shù)字的分解和組成
- 課堂教學(xué)技能講座課件匯編
評論
0/150
提交評論