
我們繼續深入點,看看testsram[]這個大數組到處編譯在到哪里去了,用IDA64來反匯編下編譯出來的AXF文件

可以看到testsram這個大數組自動編譯到外部sram的0x68000000這個地址上。我們再試試再定義幾個大數組看看

再來看看編譯后的結果

可以看到每個大數組都由編譯器自己分配了內存的地址,壓根不用我們自己去定義。
到這里相信大家會有一個疑問,那編譯是怎么來決定把哪些變量定義在內部SRAM,那些定義在外部SRAM。這一點我也研究清楚,我只知道編譯會優先把變量都定義外部SRAM,當外部SRAM不夠用情況才會定義在內部SRAM上,至于怎么讓編譯優先使用內部SRAM,我也沒有搞明白。目前我能做到的是把已經初始化的全局變量都放在SRAM,做法是修改散列文件,讓RW只在內存SRAM上編譯。

去掉小紅框的勾,然后點擊Edit我們來修改SRAM.sct文件,也就是編譯散列文件

把RW_RAM1中(也就是外部SRAM)的+RW去掉,這樣已經初始化的全局變量就只會編譯在內部SRAM中

重新編譯下工程,再來反匯編下看看編譯結果

可以看到usmart_nametab[]這個已經初始化的數組編譯在內部SRAM上,adc2[]這個未初始化的數組,數組的大小比較而且能在內部Sram編譯得下的,卻還是編譯在外部SRAM上。
最后散列相關的知識,大家可以看看這里http://blog.csdn.net/lindabell/article/details/8957968#0-qzone-1-11984-d020d2d2a4e8d1a374a433f596ad1440
前面沒有修改啟動文件,其它變量全部在內部SRAM的時候,程序運行是沒有問題,減小數組的時候程序運行不起來,修改前面的紅字部分后,程序就可以運行起來,但是LCD偶爾正常,偶爾不正常,調試下感覺是延時的問題,沒有再繼續調試了
評論