1、什么是分散加載 ??
??????簡(jiǎn)單來(lái)說(shuō)就是讓編譯器高速MCU內(nèi)核哪里存的是代碼、哪里存的是數(shù)據(jù),去哪個(gè)特定的地址找到下一步需要運(yùn)行的函數(shù),就是高速編譯器把每一個(gè)編譯好的函數(shù)、數(shù)據(jù)放到具體的哪一個(gè)物理地址。
?
2、分散加載常見(jiàn)應(yīng)用場(chǎng)景
????????* Bootloader & 程序升級(jí)
?????Bootloader的原理就簡(jiǎn)單來(lái)說(shuō)在MCU的Flash里面同時(shí)擺放2個(gè)(或多個(gè))不同工程的程序,一個(gè)Bootloader程序和一個(gè)用戶(hù)程序,那么這就需要調(diào)整分散加載文件,以達(dá)成在一個(gè)Flash里面同時(shí)擺放兩個(gè)不同程序的目的。
???????程序升級(jí)都是為了增加一個(gè)小功能或修復(fù)一個(gè)小BUG,不需要全部升級(jí)而是只升級(jí)一點(diǎn)點(diǎn)。當(dāng)然要實(shí)現(xiàn)這個(gè)功能同樣需要分散加載的配合,把可能會(huì)后續(xù)升級(jí)的部分函數(shù)或數(shù)據(jù)事先分配好空間,留好空間上的余量,這些都需要分散加載來(lái)完成。
?
????????* 加速程序運(yùn)行速度(如:對(duì)速度有較高要求的算法等、RTOS kernel)
????????在SRAM中運(yùn)行的程序要比在XIP Flash中執(zhí)行要快,性能提升明顯。
?
????????* 訪(fǎng)問(wèn)擴(kuò)展存儲(chǔ)&對(duì)存儲(chǔ)區(qū)的劃分
???????如果要把外擴(kuò)的存儲(chǔ)用于運(yùn)行代碼/擴(kuò)展RW數(shù)據(jù)段等用途,簡(jiǎn)單來(lái)說(shuō)就是把片內(nèi)地址映射到片外,需要按照尋址空間的方式來(lái)訪(fǎng)問(wèn)擴(kuò)展存儲(chǔ)的話(huà),比如擴(kuò)展Nor-Flash、擴(kuò)展SDRAM、擴(kuò)展SRAM等,那就需要分散加載配合。(只作存儲(chǔ)數(shù)據(jù)的話(huà),分散加載不是必要的?。。。?/span>
?
3、分散加載的基本結(jié)構(gòu)定義以及分散加載的目的
?
????Code段:表示程序代碼部分
????RO-data段:程序定義的所有常量以及const類(lèi)型數(shù)據(jù)
????RW-data段:已經(jīng)初始化的所有靜態(tài)變量
????ZI-data段:未初始化的靜態(tài)變量
????RO段:指Code以及RO-data的統(tǒng)稱(chēng)
????????????具體分布可查看對(duì)應(yīng)的*.map文件。
????RW+ZI數(shù)據(jù)段最終運(yùn)行時(shí)會(huì)占用片內(nèi)SRAM或外擴(kuò)的RAM存儲(chǔ)器,而Code+RO-data+RW-data數(shù)據(jù)最終會(huì)產(chǎn)生對(duì)片內(nèi)Flash的占用或外擴(kuò)程序存儲(chǔ)區(qū)的占用。
所以分散加載的根本目的就是:
????????* 指引把RO-data數(shù)據(jù)段、RW數(shù)據(jù)段從片內(nèi)程序存儲(chǔ)區(qū)里面(一般是片內(nèi)Flash),搬到片內(nèi)程序運(yùn)行區(qū)(一般是片內(nèi)SRAM);
????????* 在片內(nèi)程序運(yùn)行區(qū)(一般是片內(nèi)SRAM)內(nèi)分配ZI數(shù)據(jù)段運(yùn)行需要的空間并把這段數(shù)據(jù)初始化為0;
????????* 初始化堆棧;
????????* 對(duì)于有些指定加載到程序運(yùn)行區(qū)(一般是片內(nèi)SRAM)的RO數(shù)據(jù)段,把他們加載到程序運(yùn)行區(qū)(一般是片內(nèi)SRAM)里面。
?
{ 類(lèi)比:這個(gè)和使用的電腦運(yùn)行操作系統(tǒng)或者軟件原理類(lèi)似,電腦就是把硬盤(pán)里面的操作系統(tǒng)加載到內(nèi)存里面,然后CPU從內(nèi)存里面取數(shù)據(jù)以及程序指令來(lái)運(yùn)行的。}
TIP:
??????RW以及ZI數(shù)據(jù)段的初始化是在分散加載過(guò)程中完成的,也就是在__main中完成的,比如你定義一個(gè)全局變量,并給它賦值,只有在__main結(jié)束后你才能看到這個(gè)全局變量被賦值成功的,也就是說(shuō)在__main之前,使用全局變量是行不通的。
關(guān)于億道電子
億道電子是國(guó)內(nèi)最全面的開(kāi)發(fā)工具提供商,致力于將全球先進(jìn)的軟件產(chǎn)品引薦給國(guó)內(nèi)研發(fā)型企業(yè)使用,為企業(yè)提供研發(fā)、設(shè)計(jì)、管理過(guò)程中使用的各種軟件工具,并致力于和客戶(hù)一同提高研發(fā)、設(shè)計(jì)效率,縮短設(shè)計(jì)周期。億道電子先后與arm、Altium、Ansys、QT、TestPlant、CollabNet、Parasoft以及TouchGFX等多家全球知名公司建立戰(zhàn)略合作伙伴關(guān)系,并成為他們?cè)谥袊?guó)區(qū)的重要分銷(xiāo)合作伙伴。億道電子專(zhuān)注開(kāi)發(fā)、設(shè)計(jì)、管理工具數(shù)十年,客戶(hù)超過(guò)6000家,具有豐富的工具使用及客戶(hù)支持經(jīng)驗(yàn)積累,可以為客戶(hù)提供從arm開(kāi)發(fā)、EDA板級(jí)設(shè)計(jì)、軟件編譯及測(cè)試工具、結(jié)構(gòu)設(shè)計(jì)工具、多物理場(chǎng)仿真工具以及嵌入式GUI工具等產(chǎn)品與服務(wù)。億道電子在北京、上海、深圳設(shè)有分公司,業(yè)務(wù)遍布全國(guó)。
摘自21ic網(wǎng)