这个问题的根本原因是AVR-GCC编译器默认会将中断向量表(Interrupt Vector Table)和主程序(Main)放在同一个地址空间,这就导致了中断向量表被覆盖。为了解决这个问题,可以将中断向量表和主程序放在不同的地址空间,一种有效的方法是使用关键字“attribute((section(".vectors")))”指定中断向量表放在名为“.vectors”的段中,如下所示:
__attribute__((section(".vectors")))
void (* const vector_table[])(void) =
{
/* Interrupt vector table */
};
接下来,可以使用关键字“attribute((section(".text")))”指定主程序放在名为“.text”的段中,如下所示:
__attribute__((section(".text")))
int main(void)
{
/* Main program */
}
这将确保中断向量表和主程序被放置在不同的地址空间中,从而避免被覆盖。