avr-gcc 4.3.0 ohne no_inline buggy, mit no_inline korrekt

OP #1041790
Lesenswert?

Servus allerseits

[gcc vers. 4.3.0 (WinAvr 20080610)]

In all den Jahren in denen ich dieses Forum verfolge, habe ich die 
Erfahrung gemacht, dass der Ausruf "Compiler-Fehler!!" meist mit einem 
betretenen Schweigen des Ausrufers beendet wurde.
Vermutlich werde auch ich mich unter diese "schweigende Mehrheit" 
einordnen müssen, aber was soll's: ich stecke fest und komme nicht 
weiter.

In der Beilage habe ich ein kleines Beispiel zusammengestellt.


main() Zeile 27:
1
Usart_0_Send_Paket( 0x01, (BYTE *)"Hallo", 5L );
Diese sendet zuerst einen Header bestehen aus 4 Bytes und dann die 
eigentlichen Daten; in diesem Fall "Hallo".

Wenn ich der Funktion Usart_0_send in Zeile 28 das Attribut 
no_inline verpasse, funktioniert es so, wie es soll: Die Funktion 
Usart_0_Send_Paket in Zeile 39 sendet zuerst den Header bestehen aus
1
0x02 0x01 0x05 0x00
und dann die eigentlichen Daten.

Ohne das Attribut no_inline wird irgendein Header(*) gesendet und dann 
die (korrekten) Daten.

(*) Der Header aendert sich, wenn ich im Code was aendere und neu 
compiliere. Solange ich nicht neu compiliere, wird stets der gleiche 
(falsche) Header gesendet.

MfG aus Istanbul
Angehängte Dateien:
Gast #1041815
Lesenswert?

> Vermutlich werde auch ich mich unter diese "schweigende Mehrheit"
> einordnen müssen

Könnte sein :)

Zumindest hat auch dein Programm einen Fehler, der das Verhalten
erklären könnte:

Der Header wird in Usart_0_Send_Paket in der automatischen Variable
buffer aufgebaut und diese über Umwege an den Interrupthandler
übergeben. Wenn dieser in Aktion tritt, ist aber i.Allg.
Usart_0_Send_Paket schon längst beendet und damit buffer nicht mehr
existent.

Deklarierst du buffer als static, sollte die Sache funktionieren.
#1041848
Lesenswert?

In der zweiten Variante ist das Ziel von TxD_ptr volatile, in der ersten 
Variante die Variable TxD_ptr selbst. Die erste Variante entspricht also
1
struct stru_usart
2
{
3
  BYTE *volatile TxD_ptr; 
4
};
Gräm dich nicht - die Deklarationstechnik von C ist von vorneweg 
gründlich vermurkst worden. Basiert auf einer anfangs nett wirkenden 
Idee, nämlich die Deklaration wie die Nutzung aussehen zu lassen, 
stiftet sie jedoch weit eher Verwirrung.
Gast #1041995
Lesenswert?

> while(USART_0.TxD_BytesToSend) ;
>
> buffer[] bleibt also bis zum Schluss existent.

Tschuldigung, das hatte ich übersehen. Aber zum Glück (für dich und den
Compiler ;-)) ist das Problem ja jetzt trotzdem gelöst.

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