问题描述
我在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
可能在向量表中使用了堆栈的结束地址,以便在启动时初始化堆栈指针。
简而言之,所有非标准零件都在那儿,以确保向量表位于正确的位置且不会被删除。