www.mikrocontroller.net

Forum: Compiler & IDEs von avr-gcc nach WinAVR andere Bibo?


Autor: Jörg H. (joh)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,
2 Jahre habe ich mit avr-gcc (GCC) 3.4.4 unter Linux kompiliert und
UART-Kommunikationsroutinen aus/ähnlich avr-glibc (siehe Anhang)
verwendet.Bislang ohne Probleme.
Nun soll das ganze wegen Wechsel auf AVRStudio4 das Ganze
mit WinAVR-20060421 kompiliert werden. Sollte doch das gleiche Ergebnis
produzieren? Tut es aber nicht, die routine q_pressed() (siehe Anhang) ,
die ein über RS232 gesendetes 'q' erkennt liefert jetzt !=0 wenn es kein 
'q'
ist.

Gruß
joh

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Schalt doch mal die Compiler-Warnungen an (oder guck auf diese, wenn
sie schon eingeschaltet sind).  Der sollte dir irgendwas sagen, dass
diese Funktion ggf. einen undefinierten Wert zurückgibt -- immer
dann, wenn uart1RxDataLength_grn gleich 0 ist.

Btw.:

> if (uc_rt==0x71)

besser:

if (uc_rt == 'q')

Autor: SiO2 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ist es auch die gleibe (selbe?) libc unter win?

Autor: chrisg (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Kein Wunder, wenn uart1RxDataLength_grn==0, dann wird kein Returnwert 
festgelegt. Es ist also dem Zufall überlassen, was das entsprechende 
Register zu diesem Zeitpunkt enthielt.

Ich würde das so ändern:

u08 q_pressed(void) {
  u08 uc_rt;

  if (uart1RxDataLength_grn!=0) {  //(nur) wenn etwas von UART kam...
    uc_rt=uart1Get();      //dann Zeichen holen
    if (uc_rt==0x71) {      //wenn 'q' dann...
      uart1FlushRxBuffer();    //
      return 1;        //true liefern
    }
  }
  return 0;        //sonst false
}

So wird in beiden False-Fällen 0 zurückgeliefert.

Autor: Jörg H. (joh)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Jörg: die einzigen Warnungen die ich bekommen (wenn man nicht gerade
den C99 compat. Mode einschaltet) beziehen sich auf
...
fdevopen(uart1Put, uart_getchar_JW);
...

warning: passing arg 1 of `fdevopen' from incompatible pointer type
warning: passing arg 2 of `fdevopen' from incompatible pointer type

if(var == 'ASCIIzeichen') ist viel informativer, ok :)




@SiO2 ((ist das nicht Sand?  :))
auf der WinAVR Seite ist es avr-libc 1.4.4 auf der liux-Seite sicher 
älter




@chrisg
da hast Du wohl recht, heute abend folgt der Targettest

if(daranhatsgelegen==TRUE) {
  Asche_auf_mein_Haupt();
}
else ...

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Jörg Haas wrote:

> @Jörg: die einzigen Warnungen die ich bekommen (wenn man nicht
> gerade den C99 compat. Mode einschaltet) beziehen sich auf

> warning: passing arg 1 of `fdevopen' from incompatible pointer type
> warning: passing arg 2 of `fdevopen' from incompatible pointer type

OK, du solltest die Argumente für die backend-Funktionen mal anpassen,
das hat sich mit avr-libc 1.4 geändert (die bekommen jetzt noch ein
FILE * mit übergeben).  Die Interrupthandler kannst du bei der
Gelegenheit gleich noch von SIGNAL() auf ISR() und auf die neuen
Vektornamen umbauen.

Wäre übrigens schön, wenn du solche Beispiele einigermaßen
compilierfähig anbieten würdest, so musste ich mir selbst die Arbeit
machen (include-Dateien, privater u08-Typ, rausfinden, welcher
Prozessor gemeint ist, ...).

Das sind wirklich deine einzigen Warnungen?  Ich bekomme:
Anhang.c: In function 'uart_putstr':
Anhang.c:213: warning: pointer targets in initialization differ in signedness
Anhang.c: In function 'main':
Anhang.c:342: warning: passing argument 1 of 'fdevopen' from incompatible pointer type
Anhang.c:342: warning: passing argument 2 of 'fdevopen' from incompatible pointer type
Anhang.c:351: warning: control reaches end of non-void function
Anhang.c: In function 'q_pressed':
Anhang.c:333: warning: control reaches end of non-void function

Das erste ist ein char * vs. uint8_t *.  Diese Warnung hat der GCC 3.x
möglicherweise wirklich noch nicht gebracht.

Das zweite kennst du schon.  Das "reaches end of non-void function"
ist dein verkürztes main(), OK.

Die dritte Warnung ist genau die, die ich meinte.  Du fällst in
q_pressed() ,,unten durch'', und das ist dem Compiler sehr wohl eine
Warnung wert (meiner Meinung nach auch bereits dem GCC 3.x, aber ich
kann hier nur noch 4.x testen).

Autor: Jörg H. (joh)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
....ja, das war's wohl. Zukünftig sind mir
Kompilerwarnungen einen Blick mehr wert.

Sieht der Idealfall also nun so aus, daß ich ein unter
Linux compilierbares Projekt 1:1 unter WinAVR(AVRStudio)
übersetzen kann?

Gruß
joh

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Jörg Haas wrote:

> ....ja, das war's wohl. Zukünftig sind mir
> Kompilerwarnungen einen Blick mehr wert.

Das ist immer ein guter Vorsatz. ;-)

> Sieht der Idealfall also nun so aus, daß ich ein unter
> Linux compilierbares Projekt 1:1 unter WinAVR(AVRStudio)
> übersetzen kann?

Ja, allerdings sollte zumindest die minor version der
Bibliothek sinnvollerweise zwischen beiden gleich sein,
also avr-libc 1.4.x auf beiden.  Wenn du auf Kompatibilität
zwischen 1.2.x achten musst, wird's aufwändiger.

Autor: Jörg H. (joh)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Mal noch eine Greengornfrage dazu:
Wie bekomme ich denn die Versionsnummer
auf beiden Sytemen heraus?

Gruß
joh

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Jörg Haas wrote:

> Wie bekomme ich denn die Versionsnummer
> auf beiden Sytemen heraus?

Auf avr-libc >= 1.4.0 gibt's ein <avr/version.h>.  Die Versionen bis
1.2.x hatten sowas noch nicht.

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.