IAR vs. GCC

Gast #441048
Lesenswert?

Hallo,

ich versuche gerade auf einem ATtiny45 mithilfe dem USI eine serielle 
Schnittstelle ans laufen zu bekommen. Beschrieben ist das in der Appnote 
AVR307 von Atmel.
Die Software ist allerdings für einen ATtiny26 und den IAR Compiler 
geschrieben.

Jetzt habe ich die Software soweit umgeschrieben, nur laufen tut sie 
noch nicht so recht. Ich habe noch mit Timingproblemen zu kämpfen.

Nachdem 5 Bits über das USI Schieberegister ausgegeben wurden, muss 
dieses nachgeladen werden. Genau an dieser Stelle benötigt das Programm, 
je nach Optimierungseinstellungen, unterschiedlich lange.

In der Software für den IAR Compiler ist eine Zeile die da heisst:

__no_init __regvar static unsigned char USI_UART_TxData @ 15;   // Tells 
the compiler to store the byte to be transmitted in registry.

Gibt es für den GCC auch einen Befehl, der ihn veranlasst die Variable 
in einem Register zu halten? Wenn ja wie heisst dieser?

Falls sonst evtl. schon jemand ähnlich Probleme mit dieser Appnote hatte 
sind Vorschläge natürlich immer Willkommen.

Den Quellcode habe ich auch mal noch angehängt.

Danke, Christof
Gast #441122
Lesenswert?

Danke für den Hinweis. So wie es aussieht steht dass noch nicht im 
Tutorial.
Mein code tut zwar immer noch nicht, aber zumindest weiss ich nun wie 
man Variablen in Registern hält.

Grüße,
Christof
Gast #441150
Lesenswert?

>Nachdem 5 Bits über das USI Schieberegister ausgegeben wurden, muss
>dieses nachgeladen werden. Genau an dieser Stelle benötigt das Programm,
>je nach Optimierungseinstellungen, unterschiedlich lange.

welche Ausgabegeschwindigkeit willst du den realisieren, daß Dir dies 
auf die Füße fällt?.
Gast #441166
Lesenswert?

9600 Baud.
Sollte laut Appnote auch gut machbar sein. Das Problem ist auch nicht, 
dass er da ein oder zwei µs länger braucht sondern zwischen etwa 100 und 
300µs.
Irgendwo scheint ihm da ein Interrupt verloren zu gehen.
Gast #441279
Lesenswert?

ich hatte mal gelesen daß man z.B. mit

register int a

veranlassen kann, daß die Variable a in einem Register gehalten wird - 
aber ich glaube der gcc interpretiert das nur als einen "Vorschlag" - 
mit geringerer Priorität als seine eigenen "Ideen".

Erinnere ich mich recht, so wurde mein "Vorschlag" vom gcc übergangen 
:-)
Gast #441358
Lesenswert?

Habs rausbekommen.
Da die Pinchange interrupts nicht nur auf RxD sondern auch auf TxD 
freigegeben waren, hat er sich beim Senden selber unterbrochen. Seltsam 
ist nur, dass die im Originalcode auch freigegeben sind. Muss mir das 
morgen nochmal genauer anschauen was Atmel sich dabei gedacht hat. Ich 
poste dann auch noch den funktionsfähigen code.

Danke für die Anregungen,
Christof

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