2017-09-22 51 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 };

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