標簽: 雜談 |
首先, Flash28_API 和 ramfuncs 是兩個(gè)段名,{...}大括號中表示這個(gè)段的內容,如果為空則表示全部?jì)热荨?br>
其次,LOAD和RUN是段的兩個(gè)屬性,分別規定段將裝載在存儲器內何處以及在存儲器內何處運行。
再次,LOAD_START, LOAD_END, RUN_START 這幾個(gè)并非是參數,而是能夠生成指全局符號的指令,生成的全局符號(你這里是:Flash28_API_LoadStart, Flash28_API_LoadEnd 和Flash28_API_RunStart)決定了裝載地址、運行地址、段長(cháng)度
最后,要了解以上的工作只是在cmd中定義了段的屬性,意思是說(shuō),Flash28_API 這個(gè)段將裝載入FLASHA,而需要在RAM中運行。因此要把FLAHA中的地址復制到RAM區中去,那么你需要再做一步工作:在main中的初始化代碼段中,調用支持庫里面的函數memcpy()將上面定義的段從FLAHA中的地址復制到RAM區。
memcpy(&Flash28_API_RunStart,
這樣才算完整。
補充:為什么需要將一些段從FLASH中復制到RAM中運行
1,初始化中斷向量。由于上電時(shí),外設擴展中斷(PIE)的中斷向量必須位于非易失性存儲器(如Flash)中,因此初始化時(shí)必須要把中斷向量從FLASH中拷貝到PIEVECT RAM中,完成中斷向量表的初始化。
2,初始化Flash控制寄存器。Flash控制寄存器FOPT、FPWR、:FSTDBY-WAIT、FACTIVEWAIT、FBANKWAIT、FOTPWAIT的初始化代碼不能從Flash存儲器當中運行.否則就會(huì )有不可預料的結果出現。所以,Flash控制寄存器的初始化函數在運行時(shí)必須從Flash(它的裝載地址)拷貝到RAM(它的運行地址)。同時(shí)要注意的是,Flash控制寄存器由Code Security Module(CSM)保護。如果CSM被保護起來(lái)了,那么必須從被保護的RAM(例如:L0或者L1 SARAM)運行Flash控制寄存器的初始化代碼,否則Flash控制寄存器的初始化代碼無(wú)法訪(fǎng)問(wèn)Flash控制寄存器。
3,性能最優(yōu)化。由于分立式嵌入式系統要求所有的初始化數據最初都是位于非易失性存儲器中(如FLASH),訪(fǎng)問(wèn)片上RAM中的常數與常數表必須花費多個(gè)時(shí)鐘去訪(fǎng)問(wèn)FLASH,為提高效率,必須為想訪(fǎng)問(wèn)的RAM中的常數建立獨立的裝載和運行地址。在運行時(shí)把這些常數從片上Flash中拷貝到RAM中。
聯(lián)系客服