我們繼續(xù)深入點(diǎn),看看testsram[]這個(gè)大數(shù)組到處編譯在到哪里去了,用IDA64來(lái)反匯編下編譯出來(lái)的AXF文件
可以看到testsram這個(gè)大數(shù)組自動(dòng)編譯到外部sram的0x68000000這個(gè)地址上。我們?cè)僭囋囋俣x幾個(gè)大數(shù)組看看
再來(lái)看看編譯后的結(jié)果
可以看到每個(gè)大數(shù)組都由編譯器自己分配了內(nèi)存的地址,壓根不用我們自己去定義。
到這里相信大家會(huì)有一個(gè)疑問(wèn),那編譯是怎么來(lái)決定把哪些變量定義在內(nèi)部SRAM,那些定義在外部SRAM。這一點(diǎn)我也研究清楚,我只知道編譯會(huì)優(yōu)先把變量都定義外部SRAM,當(dāng)外部SRAM不夠用情況才會(huì)定義在內(nèi)部SRAM上,至于怎么讓編譯優(yōu)先使用內(nèi)部SRAM,我也沒(méi)有搞明白。目前我能做到的是把已經(jīng)初始化的全局變量都放在SRAM,做法是修改散列文件,讓RW只在內(nèi)存SRAM上編譯。
去掉小紅框的勾,然后點(diǎn)擊Edit我們來(lái)修改SRAM.sct文件,也就是編譯散列文件
把RW_RAM1中(也就是外部SRAM)的+RW去掉,這樣已經(jīng)初始化的全局變量就只會(huì)編譯在內(nèi)部SRAM中
重新編譯下工程,再來(lái)反匯編下看看編譯結(jié)果
可以看到usmart_nametab[]這個(gè)已經(jīng)初始化的數(shù)組編譯在內(nèi)部SRAM上,adc2[]這個(gè)未初始化的數(shù)組,數(shù)組的大小比較而且能在內(nèi)部Sram編譯得下的,卻還是編譯在外部SRAM上。
最后散列相關(guān)的知識(shí),大家可以看看這里http://blog.csdn.net/lindabell/article/details/8957968#0-qzone-1-11984-d020d2d2a4e8d1a374a433f596ad1440
前面沒(méi)有修改啟動(dòng)文件,其它變量全部在內(nèi)部SRAM的時(shí)候,程序運(yùn)行是沒(méi)有問(wèn)題,減小數(shù)組的時(shí)候程序運(yùn)行不起來(lái),修改前面的紅字部分后,程序就可以運(yùn)行起來(lái),但是LCD偶爾正常,偶爾不正常,調(diào)試下感覺(jué)是延時(shí)的問(wèn)題,沒(méi)有再繼續(xù)調(diào)試了
評(píng)論