2

我正在使用 IAR 编译器开发 STM8S 微控制器。

如何使用编译指示或另一种方法修复多个变量的起始位置?

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

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

1 回答 1

1

使用#pragma location = "my_abs"_Pragma("location=\"my_abs\"")将您想要的变量放置在同一 elf 部分的绝对区域中。由于#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 };

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

于 2017-09-22T11:19:26.083 回答