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)
这样做的缺点是它实际上并不分配任何内存,而是依赖于链接描述文件来处理该部分。在大多数情况下,这更可取。
另一个缺点是您将无法在调试器中查看这些“变量”名称,因为它们实际上根本不是变量。这就是为什么一些工具链提出非标准 @
语法之类的东西的主要原因。
我有一个代码块,它是用 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)
这样做的缺点是它实际上并不分配任何内存,而是依赖于链接描述文件来处理该部分。在大多数情况下,这更可取。
另一个缺点是您将无法在调试器中查看这些“变量”名称,因为它们实际上根本不是变量。这就是为什么一些工具链提出非标准 @
语法之类的东西的主要原因。