将变量放在绝对内存位置 (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 };
请注意,您不能在同一部分混合使用已初始化和未初始化的变量。
我正在使用 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 };
请注意,您不能在同一部分混合使用已初始化和未初始化的变量。