Forum: Compiler & IDEs ATxmega Hello World Compiler generiert nonsense?


von Malte _. (malte) Benutzerseite


Angehängte Dateien:

Lesenswert?

Hallo,
ich bin dabei ein Minimalbeispiel für den ATxmega zum laufen zu 
bekommen. Der generierte Code hat eine Größe von 612 Byte.
Wenn ich mir das Assembly listing ansehe, ist da aber der Code jeweils 
doppelt drinn. Außerdem wird -mno-interrupts ebenfalls ignoriert.
Installiert habe ich den gcc und avr-libc vom aktuellen Debian.
Was läuft da falsch? Eventuell liegt das an den Aufrufen im Makefile?
1
/*
2
 * blinky.c
3
 *
4
 */
5
6
#define F_CPU 2000000
7
8
#include <avr/io.h>
9
#include <util/delay_basic.h>
10
11
12
void waitms(uint16_t ms) {
13
  while (ms) {
14
    _delay_loop_2(500); //4 cycle per loop 2MHz -> 1ms: 500 loops
15
    ms--;
16
  }
17
}
18
19
int main(void)
20
{
21
  //toggle PE2 and PE3
22
  PORTE.DIR = 0x0C;
23
  PORTE.OUT = 0x04;
24
  while(1) {
25
    PORTE.OUT = 0x0C;
26
    waitms(500);
27
    PORTE.OUT = 0x04;
28
    waitms(500);
29
    PORTE.OUT = 0x08;
30
    waitms(500);
31
  }
32
}

von martin (Gast)


Lesenswert?

Abend,
alles mögliche an Hilfe und Beispielen zum ATXmega findest du hier:
http://www.jtronics.de/avr-projekte/xmega-tutorial.html
Unter jedem Thema gibt es auch ein fertiges Programm mit Projektdatei 
zum Download.

von Johann L. (gjlayde) Benutzerseite


Lesenswert?

Malte __ schrieb:
> Außerdem wird -mno-interrupts ebenfalls ignoriert.

Der Code sieht nicht so aus, als hätte er irgendwas, worauf dieser 
Schalter einen Effekt haben würde, z.B. Ändern von SP beim Anlegen / 
Abbauen eines Frames.

von Malte _. (malte) Benutzerseite


Lesenswert?

Ich habe mir das Listing noch mal angeschaut. Der Assembler sieht doch 
korrekt aus. Nur die Kommentare sind doppelt, weil der Compiler die 
einzelnen Aufrufe neu verteilt. Das Ignorieren von -mno-interrupts
(siehe http://gcc.gnu.org/onlinedocs/gcc/AVR-Options.html) bleibt aber 
bestehen.

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


Lesenswert?

Malte __ schrieb:
> Ich habe mir das Listing noch mal angeschaut. Der Assembler sieht doch
> korrekt aus.

Dann sieh dir doch in Zukunft lieber den generierten Assemblercode
statt eines Disassembler-Listings mit irgendwie mehr oder minder
unpassend drin verteiltem Quellcode an.

> Das Ignorieren von -mno-interrupts
> (siehe http://gcc.gnu.org/onlinedocs/gcc/AVR-Options.html) bleibt aber
> bestehen.

Dazu hat Johann dir ja bereits geschrieben, dass da gar nichts ist,
was zu ignorieren (oder zu honorieren) wäre.

von Malte _. (malte) Benutzerseite


Lesenswert?

Hmm dann hab ich die Option wohl falsch verstanden. Ich hätte erwartet, 
dass dann die Interrupt Sprungtabelle am Anfang des Flash weg optimiert 
wird und dort stattdessen direkt der Code von __ctors_end steht.

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


Lesenswert?

Malte __ schrieb:
> Ich hätte erwartet, dass dann die Interrupt Sprungtabelle am Anfang des
> Flash weg optimiert wird

Die kommt gar nicht vom Compiler, sondern aus dem runtime startup
file der Bibliothek.

Wenn du diese partout loswerden möchtest, dann müsstest du dein
eigenes startup file schreiben und linken lassen und mit
-nostartfiles verhindern, dass die entsprechenden Teile der Bibliothek
genutzt werden.  Solange man aber nicht gerade völlig "auf Kante"
arbeitet und auch noch die letzten paar Dutzend Bytes Flash nutzen
muss, die sonst von der Vektortabelle belegt werden, würde ich diese
Variante persönlich meiden.

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.