Gast
#1271297
Hallo zusammen
Ich wollte einmal analysieren, wie GCC ein Programm aufbaut,
bei dem in Abhängigkeit von einer Variablen eine bestimmte
Funktion aufgerufen wird.
Zuerst habe ich ein Programm geschrieben, dass ein Array von Funktions-
zeigern nutzt. Hat im Simulator prima geklappt. (Optimierung auf -Os)
Dann habe ich den Arrayaufruf durch eine switch case Anweisung
ersetzt (siehe unten). Mich interessiert, wie sich jetzt der
Maschinencode
verändert.
Nun das Problem:
Das Programm arbeitet im Simulator nicht unter –Os ! Die Zählschleife
wird sauber durchgezählt (0,1,2,3) aber es wird nur die Funktion F_2
ausgeführt.
Stelle ich die Optimierung auf –O0 läuft es. Das nützt mir aber nichts,
da ich auch den Speicherbedarf und die Laufzeit beider Versionen
vergleichen möchte.
Wie bekomme ich das Programm in –Os im Simulator zum laufen?
Woran erkennt der Compiler, dass es eigentlich ein sinnloses Programm
ist?
Die NOP-Funktion benutze ich als Orientierung in der LSS-Datei.
#include <avr/io.h>
#define nop asm volatile ("nop")
void F_0(char);
void F_1(char);
void F_2(char);
void F_3(char);
int main(void)
{
char i;
while(1)
{
for(i=0; i<4; i++)
{
nop;
switch(i)
{
case 0 : F_0(i); break;
case 1 : F_1(i); break;
case 2 : F_2(i); break;
case 3 : F_3(i); break;
}
}
}
}
void F_0 (char x0)
{
nop;
x0++;
x0 = x0>>2;
PORTA = x0;
}
void F_1 (char x1)
{
nop;
x1 += 5;
PORTB = x1;
}
void F_2 (char x2)
{
nop;
x2++;
x2 += x2 | 0b00001111;
PORTC = x2;
}
void F_3 (char x3)
{
nop;
x3++;
x3 &= 0xF0;
PORTD = x3;
}