将变量放在绝对内存位置(IAR C / C ++)

时间:2017-09-22 08:05:26

标签: c++ c pragma iar stm8

我正在研究带有IAR编译器的STM8S微控制器。

如何使用pragma或其他方法修改起始位置多于一个变量。

当我尝试这些代码时,编译器会给出以下错误消息:

  

错误[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;    

1 个答案:

答案 0 :(得分: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 };

请注意,您不能在同一部分中混合初始化和未初始化的变量。