【问题标题】:Compatibility between IAR C/C++ Compiler and GCCIAR C/C++ 编译器和 GCC 之间的兼容性
【发布时间】:2018-04-16 07:35:37
【问题描述】:

我有一个代码块,它是用 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

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

【问题讨论】:

  • 语法不正确,不能像这样在同一行混用 ASM 和 C。强制地址:您可以使用属性部分 + 链接器脚本(NOLOAD 使部分初始化),或者如果您想要 GCC 和 IAR 兼容,请查看此处:stackoverflow.com/questions/4067811/…
  • 感谢您的回答。现在使用 int *u8ramPhysStart_startUp = (int*)0x20000000; 代替 unsigned char u8ramPhysStart_startUp __asm("@ 0x20000000"); 它可以编译。
  • 符号有什么作用?它们只是要在启动代码中使用的部分的开始和结束地址吗?

标签: c embedded iar


【解决方案1】:

我相信 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)

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

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

【讨论】:

  • 我认为他只是在寻找地址而不是实际变量。 BTW 定义在调试器中与“普通”变量一样可见。你只需要有足够高的调试级别。
  • @PeterJ_01 取决于调试器和调试器文件格式。
  • true - 但是查看地址很容易推断出 uC OP 使用什么,并且提到的两个编译器都能够生成正确的调试数据。流行的调试器也可以使用这些数据
猜你喜欢
  • 1970-01-01
  • 2015-09-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-11-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多