Я пытаюсь удалить таблицу векторов прерываний в своей программе, чтобы уменьшить использование флеш-памяти.Код сборки в GCC не компилируется в Atmel Studio для среды AVR
Я успешно использовал флаг -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
Составитель? Я пропустил какой-то флаг компилятора? Пробовали много вещей. Также рассмотрели загрузчики с тем же кодом, которые делают то же самое, но почему-то мои не компилируются правильно.
'.set' является директивой, он не будет производить никакого кода. – Jester
Большое спасибо! Не знал, что это было. Думал, что он должен сделать что-то еще. –