IAR C/C++ 编译器和 GCC 之间的兼容性

Compatibility between IAR C/C++ Compiler and GCC

我有一个代码块,它是用 C 语言为 IAR C/C++ 编译器编写的。

__no_init uint8_t u8ramPhysStart_startUp @ 0x20000000;
__no_init uint8_t u8ramPhysEnd_startUp @ 0x2002FFFF;
__no_init uint8_t u8ramTestStart_startUp @ 0x20004008;
__no_init uint8_t u8ramTestEnd_startUp @ 0x20008008;

#define START_ASM  (&u8ramPhysStart_startUp)
#define RAMSTART_STRTUP     ((uint32_t)START_ASM)

我的目标是转换它或者让它与 GCC 兼容。为此,我将上面的代码重写为:

unsigned char u8ramPhysStart_startUp __asm("@ 0x20000000");
unsigned char u8ramPhysEnd_startUp __asm("@ 0x2002FFFF");
unsigned char u8ramTestStart_startUp __asm("@ 0x20004008");
unsigned char u8ramTestEnd_startUp __asm("@ 0x20008008");

但是编译后我得到以下错误:

C:\Users\Pc\AppData\Local\Temp\ccyuCWQT.s: Assembler messages:
C:\Users\Pc\AppData\Local\Temp\ccyuCWQT.s:971: Error: expected symbol name
C:\Users\Pc\AppData\Local\Temp\ccyuCWQT.s:972: Error: expected symbol name

有人知道这是什么意思吗?

我相信 gcc 代码应该是这样的

uint8_t __attribute__ ((section(".my_section"))) u8ramPhysStart_startUp;

其中 .my_section 是您添加到链接描述文件的内容。

话虽这么说,只有可以使绝对地址分配可移植的方法是坚持使用纯 ISO C:

#define u8ramPhysStart_startUp (*(volatile uint8_t*)0x20000000u)

或者如果你想要一个指向地址的指针:

#define u8ramPhysStart_startUp ((volatile uint8_t*)0x20000000u)

这样做的缺点是它实际上并不分配任何内存,而是依赖于链接描述文件来处理该部分。在大多数情况下,这更可取。

另一个缺点是您将无法在调试器中查看这些“变量”名称,因为它们实际上根本不是变量。这就是为什么一些工具链提出非标准 @ 语法之类的东西的主要原因。