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

Placing variables in absolute memory location (IAR C/C++)

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

如何使用 pragma 或其他方法修复多个变量的起始位置?

当我尝试下面的代码时,编译器给出了这个错误信息:

Error[Lp025]: absolute section .near.bss (main.o #12) ([0x000100-0x000100]) overlaps with absolute section .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;    

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

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