1. 程式人生 > >MDK(KEIL)中設定變數或陣列到指定的位置

MDK(KEIL)中設定變數或陣列到指定的位置

定位變數到指定的位置

使用定義在標頭檔案 absacc.h中的 __at巨集,可以將變數以如下方式定位到絕對地址處:

C 例子:
#include <absacc.h>  

const char MyText[] __at (0x1F00) = "TEXT AT ADDRESS 0x1F00"; 

int x __at (0x40003000);                         // variable at address 0x40003000

unsigned char xArray[128] __at (0x68000000);     // Array start at address 0x68000000
彙編例子:

在彙編檔案中可以使用段名,由|.ARM.__AT_<addr>|

組成來定義位置。下面的例子是將一個段定義到地址0xFFE0處:

     AREA |.ARM.__AT_0xFFE0|, CODE, READONLY
u8 a[10] __attribute__ ((at(0x2000002c)));
編譯說
..\List\ALL.axf: Error: L6971E: Section .data from object usart.o with type RW incompatible with 
Section .ARM.__AT_0x2000002C from object hal.o with type ZI in er RW_IRAM1.

似乎是定位了這個絕對地址後,其他變數不會為它讓位~
NONO,這個方法不行的,因為編譯器並沒有真正開闢一個變數,你僅僅是強行操作某個地址而已,但這個地址是否被其他資料利用了,你管不到也不知道~(0字)電子白菜[8次]2009-9-5 2:08:47
編譯器裡面應該有設定,比如系統總共有多少記憶體,你可以故意設定的少一些,這樣在編譯的時候他就會避開你沒有指定的了
通過*.map檔案可以檢視空間分配