如何将ICCARM的部分代码转换为GNUC?

问题描述

我在IAR中有一段代码

#if defined (__ICCARM__)
#define __vectors   __root const uVectorEntry __vector_table[] @ ".intvec"
#define __stack     { .ui32Ptr = (uint32_t)Stack + sizeof(Stack) }
typedef union
{
  void (*Handler)(void);
  uint32_t ui32Ptr;

} uVectorEntry;
#endif

需要重做GCC。

沿途定义后的所有内容也与编译器无关。 也许只有1行#define __vectors __root const uVectorEntry __vector_table[] @ ".intvec"需要反应。

这是stm32f103c8t6(Cortex-M3)的启动文件。 更确切地说是一小部分。 因此__vector_table[]必须有59个元素,它是中断向量表。

解决方法

__vectors可能以__vectors = { /* vector table elements */ };的形式在向量表定义中使用。宏定义如下:

  • const uVectorEntry __vector_table[]是const表的标准C声明。
  • __root是一个属性,用于指定即使看起来似乎未使用,该对象也不能由编译器或链接器删除。
  • @ ".intvec"指定链接器应将__vector_table放在.intvec部分。

__stack可能在向量表中使用了堆栈的结束地址,以便在启动时初始化堆栈指针。

简而言之,所有非标准零件都在那儿,以确保向量表位于正确的位置且不会被删除。