avr-gcc: Fehler? Reihenfolge der Funktionen ist wichtig

Gast #3010252
Lesenswert?

Hallo allerseits,

Ich steige gerade in die Programmierung eines ATtiny ein (ist zwar nicht 
der erste avr-Kontakt, aber der letzte liegt schon eine ganze Weile 
zurück). Dabei stoße ich auf diesen möglichen Fehler, zu dem ich im Netz 
noch gar nichts gefunden habe:

Kurzform: Ist main() nicht die erste Funktion im Sourcecode, geht es 
nicht.

Beispiel (am Port hängen LEDs):

----- Start -----

#include <avr/io.h>
#include <avr/interrupt.h>

void init();

int main() {

  init();
  PORTD = 0x32;

  while(1);
  return 0;
}

void init() {
  DDRD = 0xff;
}

----- Ende -----

Mit diesem Programm funktioniert es und die LEDs werden korrekt 
eingeschaltet.

----- Start -----

#include <avr/io.h>
#include <avr/interrupt.h>

void init() {
  DDRD = 0xff;
}

int main() {

  init();
  PORTD = 0x32;

  while(1);
  return 0;
}

----- Ende -----

Mit diesem Programm funktioniert es nicht, die LEDs bleiben dunkel.

Soll das so sein (nach den Beispielen natürlich nicht), oder hat jemand 
irgendeine Idee, was das sein könnte?

Prozessor ist ein ATtiny48, die avr-Tools habe ich unter einem ziemlich 
aktuellen Ubuntu installiert (gcc 4.5.3), kompilieren tu ich mit

avr-gcc -mmcu=attiny48 -c source.c

dann linken usw.

Im Prinzip ist mir die Anordnung der Funktionen ja egal, allerdings habe 
ich Probleme mit der Ausführung von Interrupts, und da wollte ich erst 
mal sichergehen, daß das nicht an dieser Stelle hängt..

tschüß und danke schon mal!
Gast #3010461
Lesenswert?

> Zeigen,

Oha, nicht schlecht, in die Richtung geht's:

avr-gcc  -mmcu=attiny48 -c start.c
avr-gcc -o start.elf start.o
avr-objcopy -j .text -j .data -O ihex start.elf start.hex
sudo avrdude -c avrispmkII -p t48 -P usb -e -U flash:w:start.hex

Zur Sicherheit habe ich den Umweg übers separate Linken mal weggelassen, 
also:

avr-gcc  -mmcu=attiny48 -o start.elf start.c
avr-objcopy -j .text -j .data -O ihex start.elf start.hex
sudo avrdude -c avrispmkII -p t48 -P usb -e -U flash:w:start.hex

... und damit funktioniert es. Fehlt da etwa was beim Linken?

tschüß

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren