我试图在我的程序中删除中断向量表以减少闪存的使用。
我已经成功使用了这个-nostartfiles
标志,它在输出中删除了很多汇编代码。
要使用该程序,我必须设置堆栈指针。我发现这段代码可以这样做:
asm volatile ( ".set __stack, %0" :: "i" (RAMEND) );
但是在编译时,它什么也不做,而其他汇编代码就像
asm volatile ( "clr __zero_reg__" );
asm volatile ( "rjmp main");
行得通。
这是我当前的 C 代码:
void __init(void) __attribute__ ((naked)) __attribute__ ((section (".init9")));
void __init(void)
{
asm volatile(".set __stack, %0" :: "i" (RAMEND) );
asm volatile ( "clr __zero_reg__" );
asm volatile ( "rjmp main");
}
编译为程序集(7892 和 7894 行):
void __jMain(void) __attribute__ ((naked)) __attribute__ ((section (".init9")));
void __jMain(void)
{
asm volatile(".set __stack, %0" :: "i" (RAMEND) );
asm volatile ( "clr __zero_reg__" );
7892: 11 24 eor r1, r1
asm volatile ( "rjmp main");
7894: 02 c0 rjmp .+4 ; 0x789a <main>
}
为什么不.set __stack
编译?我错过了一些编译器标志吗?尝试了很多东西.. 还审查了具有相同代码的引导加载程序,他们正在做同样的事情,但不知何故,我的编译不正确。