2015-07-31 3 views
2

Я пытаюсь удалить таблицу векторов прерываний в своей программе, чтобы уменьшить использование флеш-памяти.Код сборки в 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 Составитель? Я пропустил какой-то флаг компилятора? Пробовали много вещей. Также рассмотрели загрузчики с тем же кодом, которые делают то же самое, но почему-то мои не компилируются правильно.

+2

'.set' является директивой, он не будет производить никакого кода. – Jester

+0

Большое спасибо! Не знал, что это было. Думал, что он должен сделать что-то еще. –

ответ

0

я нашел, что правильный "с" способ сделать это:

void __init(void) __attribute__ ((naked)) __attribute__ ((section (".init9"))); 
void __init(void) 
{ 
    asm volatile ("clr __zero_reg__"); 
    SP = RAMEND; 
    asm volatile ("rjmp main");    
} 

Где в конце концов, он переходит к вашей основной функции. Это дает следующую сборку, предложенную yumbrad:

// asm volatile ("clr __zero_reg__"); 
7800: 11 24   eor r1, r1 

// SP = RAMEND; 
7802: 8f ef   ldi r24, 0xFF ; 255 
7804: 98 e0   ldi r25, 0x08 ; 8 
7806: 9e bf   out 0x3e, r25 ; 62 
7808: 8d bf   out 0x3d, r24 ; 61 

// asm volatile ("rjmp main");    
780a: 00 c0   rjmp .+0   ; 0x780c <main>