1. 程式人生 > >MDK在連結時提示空間不夠(No space in execution regions with .ANY selector... )的解決方案總結

MDK在連結時提示空間不夠(No space in execution regions with .ANY selector... )的解決方案總結

RealView MDK具有強大的編譯、連結功能。嵌入式裝置擁有的資源往往有限,如果一個程式編譯、連結之後的可執行檔案大小略大於儲存大小時,則不能生成可執行檔案進行除錯或固化到Flash中。在這種情況下我們一般不去從硬體上調整儲存空間的大小(有些儲存空間在片內,實在無法調整),而是去修改程式,試圖將程式簡化、將快取減小、減少全域性變數、少用大陣列多用指標等等人工方法,有些時候這些方法很有效。但如果使用的開發工具是RealView MDK,則有一系列方法,可以達到這一目的,比起手動方法只有過之而無不及。這些方法僅僅需要在編譯、連結之前對某些配置做一些修改即可,使用非常簡單。當然,如果將這些方法和人工修改程式的方法結合起來,效果更佳。有時單獨使用以下三種方法中的一種即可解決問題,有時需要結合其中兩種,甚至三種才能解決問題。下面以

開發板Embest ATEB9200(採用的SOC 為AT91RM9200)的例程USARTPDC_test為例,由於片內SRAM空間比較小(大小為16KB,起始地址為0x200000),本例程在片內SRAM中進行除錯時需要使用一些技巧,下面介紹如何使用這些方法。

在預設設定下,將例程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如下圖:


圖四 選較高優化級別針對空間進行優級化以減小程式碼大小