MDK在連結時提示空間不夠(No space in execution regions with .ANY selector... )的解決方案總結
RealView MDK具有強大的編譯、連結功能。嵌入式裝置擁有的資源往往有限,如果一個程式編譯、連結之後的可執行檔案大小略大於儲存大小時,則不能生成可執行檔案進行除錯或固化到Flash中。在這種情況下我們一般不去從硬體上調整儲存空間的大小(有些儲存空間在片內,實在無法調整),而是去修改程式,試圖將程式簡化、將快取減小、減少全域性變數、少用大陣列多用指標等等人工方法,有些時候這些方法很有效。但如果使用的開發工具是RealView MDK,則有一系列方法,可以達到這一目的,比起手動方法只有過之而無不及。這些方法僅僅需要在編譯、連結之前對某些配置做一些修改即可,使用非常簡單。當然,如果將這些方法和人工修改程式的方法結合起來,效果更佳。有時單獨使用以下三種方法中的一種即可解決問題,有時需要結合其中兩種,甚至三種才能解決問題。下面以
在預設設定下,將例程USARTPDC_test選擇在片上SRAM中除錯時,編譯通過、在連結時會提示以下錯誤資訊提示空間不夠:
compiling init.c...
compiling interrupt_Usart.c...
compiling main.c...
linking...
.\Int_RAM\USARTPDC_test.axf: Error: L6406W: No space in execution regions with .ANY selector matching Section .text(_scanf_int.o).
.\Int_RAM\USARTPDC_test.axf: Error: L6406W: No space in execution regions with .ANY selector matching Section .text(_scanf_longlong.o).
.\Int_RAM\USARTPDC_test.axf: Error: L6406W: No space in execution regions with .ANY selector matching Section .text(aeabi_sdiv.o).
Target not created
一、使用微庫
使用微庫時,將以更精簡短小的C庫替代標準C庫,減小程式碼大小,使用微庫的方法如下:
開啟Project->Options->Target,將Use MicroLIB前面的複選框勾上。如下圖:
圖一 使用微庫
點選確定之後,重新編譯、連結。發現還是會提示空間不夠的錯誤資訊,但錯誤資訊明顯比以前少了:
Build target 'USARTPDC_test Int RAM'
assembling RM9200.s...
compiling init.c...
compiling interrupt_Usart.c...
compiling main.c...
linking...
.\Int_RAM\USARTPDC_test.axf: Error: L6406W: No space in execution regions with .ANY selector matching Section .text(interrupt_usart.o).
.\Int_RAM\USARTPDC_test.axf: Error: L6406W: No space in execution regions with .ANY selector matching Section i._printf_core(printf8.o).
.\Int_RAM\USARTPDC_test.axf: Error: L6407W: Sections of aggregate size 0x86cbytes could not fit into .ANY selector(s).
Target not created
二、修改連結指令碼
修改連結指令碼的方法有兩種一種是直接修改分散載入檔案,另一種是使用預設分散載入檔案,這時僅需修改Project->Options->Target中的儲存空間起始和大小。為了簡單直觀,本例中使用後者。在使用後者時,需要在Project->Options->Linker中將Use Memory Layout from Target Dialog前面的複選框勾上。如下圖:
圖二 使用預設的分散載入檔案
然後在Project->Options->Target中修改儲存空間中只讀部分和可讀寫部分的起始和大小,一般來說加大隻讀部分大小(該部分存放程式中的指令),而減小可讀寫部分的大小(該部分存放堆疊、區域性變數等)。
根據錯誤提示可知,只讀部分空間最少需要加大0x86c bytes,總空間固定16KB,相應地需要減小可讀寫部分大小。修改之前如圖一,修改後如下圖:
圖三 增大隻讀部分大小,減小可讀寫部分大小
點選確定之後,重新編譯、連結:
Build target 'USARTPDC_test Int RAM'
assembling RM9200.s...
compiling init.c...
compiling interrupt_Usart.c...
compiling main.c...
linking...
Program Size: Code=9388 RO-data=380 RW-data=4 ZI-data=1244
".\Int_RAM\USARTPDC_test.axf" - 0 Error(s), 0 Warning(s).
編譯連結成功!
三、修改優化級別,著重對空間進行優化
在編譯時著重對空間進行優化,讓編譯器自動減小程式碼大小。可使用編譯選項-Ospace
進行編譯以達到目的,另外可以選更高的選優化級別―-03如下圖:
圖四 選較高優化級別針對空間進行優級化以減小程式碼大小