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

IAR C/C和x2B之间的兼容性+;编译器与GCC,c,embedded,iar,C,Embedded,Iar,我有一个代码块,它是用C为IARC/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; #defi

我有一个代码块,它是用C为IARC/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_部分是您添加到链接器脚本中的内容

也就是说,使绝对地址分配可移植的唯一方法是坚持纯ISO C:

#define u8ramPhysStart_startUp (*(volatile uint8_t*)0x20000000u)
或者,如果需要指向地址的指针:

#define u8ramPhysStart_startUp ((volatile uint8_t*)0x20000000u)
这样做的缺点是它实际上不分配任何内存,而是依赖链接器脚本来处理该部分。在大多数情况下,这是最好的


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

语法不正确,不能像这样在同一行中混合使用ASM和C。要强制地址:您可以使用属性节+链接器脚本(NOLOAD使节初始化),或者如果您想要GCC和IAR兼容,请看这里:谢谢您的回答。现在使用
int*start\u startUp=(int*)0x20000000而非无符号字符启动asm(@0x20000000)它编译。符号做什么?它们只是启动代码中要使用的部分的开始和结束的地址吗?我认为他只是在寻找地址,而不是实际的变量。顺便说一句,调试器中的定义与“普通”变量相同。您只需要具有足够高的调试级别。@PeterJ_01取决于调试器和调试器文件格式。true-但是查看地址很容易推断uC OP使用的是什么,并且提到的两个编译器都能够生成正确的调试数据。流行的调试器也可以使用这些数据