www.mikrocontroller.net

Forum: Compiler & IDEs avr-gcc 4.3.0 ohne no_inline buggy, mit no_inline korrekt


Autor: Mehmet Kendi (mkmk)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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:
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
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

Autor: yalu (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Mehmet Kendi (mkmk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Servus Yalu

".... Usart_0_Send_Paket schon längst beendet ..."
while(USART_0.TxD_BytesToSend) ;

buffer[] bleibt also bis zum Schluss existent.

Autor: Andreas Watterott (andreasw) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Deklariere mal die komplette Struct als volatile:
volatile struct stru_usart
{
  BYTE *TxD_ptr; 
  WORD TxD_BytesToSend;
  BYTE TxD_TimeOut;         

  WORD RxD_BytesReceived; 
  BYTE RxD_TimeOut;         
  BYTE Buffer[BUFFER_0_SIZE];
} USART_0;

PS: Ist aber ganz schön durch einander der Code ;-)

Autor: Mehmet Kendi (mkmk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Servus Andreas

Yessss, das war's.
[Kopfkratzen] Wo ist aber der Unterschied zwischen
volatile struct stru_usart
{
  BYTE *TxD_ptr; 
};

und
struct stru_usart
{
  volatile BYTE *TxD_ptr; 
};

?

Autor: A. K. (prx)
Datum:

Bewertung
0 lesenswert
nicht 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
struct stru_usart
{
  BYTE *volatile TxD_ptr; 
};
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.

Autor: Mehmet Kendi (mkmk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke für die Belehrung. Man lernt nie aus.

Autor: Manuel Stahl (thymythos) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Habs mal ins Tutorial aufgenommen.

Autor: yalu (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.