2017-09-22 49 views
1

我正在使用帶IAR編譯器的STM8S微控制器。將變量放置在絕對內存位置(IAR C/C++)

如何使用編譯指示或其他方法修復起始位置多於一個變量。

當我嘗試這些代碼,編譯器給出了這樣的錯誤消息:

錯誤[Lp025]:絕對部.near.bss(main.o#12) ([0x000100-0x000100])與重疊絕對段.near.bss (main.o#8)([0x000100-0x000100])

我搜索的IAR技術說明 「絕對定位變量」,但我不能這樣做。

#pragma location = 0x100 /* Start address of absolute location */ 

extern uint8_t  R0, 
         R1, 
         R2, 
         R3, 
extern uint16_t  M1;   
extern uint8_t  M2,  
         M3;  
+0

也許[this](http://www.keil.com/support/docs/2829.htm)有幫助。 –

+0

@Michael Walz我在你發送的鏈接中發現了類似的IAR指令。我保持嘗試。 – mryldz

回答

1

使用#pragma location = "my_abs"_Pragma("location=\"my_abs\"")的地方,你在同一個精靈段的絕對區域所需的變量。由於#pragma location僅適用於以下聲明,因此您可能希望創建一個在絕對塊中聲明變量時可以加前綴的定義。請注意,在預處理器宏中只允許使用_Pragma("location=\"my_abs\"")語法。

#pragma section="my_abs" 
#define IN_ABS _Pragma("location=\"my_abs\"") 

IN_ABS char R0, R1, R2, R3; 
IN_ABS short M1;   
IN_ABS char M2, M3; 

int no_abs; 

然後在鏈接器配置中添加一行以將此段放在指定地址。

place at address mem:0x100 { rw section my_abs };

注意,你不能混用初始化,並在同一部分未初始化的變量。