Forum: Compiler & IDEs avr-gcc: Fehler? Reihenfolge der Funktionen ist wichtig


von Mareau (Gast)


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!

von Stefan E. (sternst)


Lesenswert?

Mareau schrieb:
> dann linken usw.

Zeigen, insbesondere wenn ...

> allerdings habe ich Probleme mit der Ausführung von Interrupts

von Mareau (Gast)


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üß

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Mareau schrieb:
> Fehlt da etwa was beim Linken?

Ja.  -mmcu=attiny48.  So linkst du für einen AT90S8515 (wenn ich mich
recht erinnere).

von Mareau (Gast)


Lesenswert?

Ach so, klingt nicht gerade verkehrt. Vielen Dank!

tschüß

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Im übrigen solltest du dir noch angewöhnen, grundsätzlich
1
-Os -Wall -Wextra

zu setzen.

von Mareau (Gast)


Lesenswert?

Danke für den Hinweis, aber mache ich schon. Das ist nur gerade 
herausgefallen, um die Optimierung als Fehlerursache auszuschließen.

tschüß

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.