mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Bug in WinARM (LPC2103TDMI)


Autor: Bernd (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich habe in meinem Programmcode die Zeile

int value = 0xAE+a[6];

stehen, was dem Compiler aber nicht gefällt. Er meckert immer:
"ledswitch.c:88:15: error: invalid suffix "+a" on integer
constant"

Tasche ich 0xAE und a[6], dann ist alles OK.

int value = a[6]+0xAE;

Das kann doch irgendwie nicht richtig sein. Die Demoversion von Keils
µVision macht da keine Schwirigkeiten.

Auch fällt auf, dass jeder Compiler die MCU SFRs anders bennent.
Mal heißen die Register GPIO_IOSET, mal nur IOSET oder FIO0SET und
FIOSET. Gibt's da nicht sowas wie einen Standard? Das ist doch der
Sinn von C, dass man seinen Code leichter portieren können soll.

Autor: Bernd (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Habe garade noch herausgefunden, dass wenn man ein Leerzeichen anhängt

 int value = 0xAE +a[6];

sich der Code compilieren lässt. Enthält die erst Hexzahl nicht nur
Buchstaben, also z.B. 0x5+a[6], geht es auch ohne Leerzeichen.

Irgendwie komisch?

Autor: A.K. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Für C gibt es einen Standard. Aber für maschinenspzifische Dinge nicht.
Mancher hält sich an Herstellernamen, andere nicht.

Das Zahlenproblem hängt wohl irgendwie mit Fliesskommakonstanten
zusammen, 15e+1. Muss mal sehen ob GCC da eigene Brötchen backt, denn
im C Standard stellt das kein Problem dar.

Autor: A.K. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Yep, C99 kennt Fliesskommakonstanten zur Basis 16. GCC erlaubt das auch
bei C89. Die sehen zwar hinten anders aus, aber offenbar ist der
betreffende Code im GCC nicht ganz wasserdicht.

Autor: manu (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich darf noch anmerken, dass
      FIO*  = Fast General Purpose Input/Output
      GPIO* = General Purpose Input/Output
bedeutet und nicht dasselbe ist (siehe LPC Handbuch)

Autor: A.K. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
GCC hat wie üblich recht: "0xAE+a" ein einziges Token, wenngleich ein
ungültiges.

Siehe
http://www.math.uni-wuppertal.de/~axel/skripte/oop...
Stichwort "pp-number".

Autor: Martin Thomas (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>Auch fällt auf, dass jeder Compiler die MCU SFRs anders bennent.
>Mal heißen die Register GPIO_IOSET, mal nur IOSET oder FIO0SET und
>FIOSET. Gibt's da nicht sowas wie einen Standard? Das ist doch der
>Sinn von C, dass man seinen Code leichter portieren können soll.

Nicht der Compiler benennt, es werden lediglich von den
Compilerherstellern oder bei GNU den "Toolchain-Zusammenpackern" (im
Fall von WinARM bin das ich) Definitionsdateien mitgeliefert, in denen
die SFR-Addressen manchmal etwas "individuell" bezeichnet werden. Das
hat nichts mit der Programmiersprache zu tun. Ansich ist es Sache der
Hersteller, entsprechende Definitionsdateien auf Grundlage der
Bezeichnungen des Datenblatts herauszugeben und damit einen de-facto
Standard zu schaffen, es ist ja nicht wirklich im Interesse der
"Kommerziellen". Dies wird auch von vielen Herstellern so gemacht
(z.B. f. STR7, AT91, ADuC7000), aber es haellt sich dennoch nicht jeder
daran (wie bereits von A.K. angemerkt). Bei Philips ist in diesem
Bereich noch ein wenig Nachholbedarf. Im Moment gibt es meines Wissens
nur "offizielle" Definitionen fuer LPC214x im "Sample Code Bundle"
(Addressen sind aber bei andere LPC2000 meist identisch so die Funktion
im Controller vorhanden). Oft werden fuer Philips ARM die Definitionen
von Keil genutzt (www.keil.com->Device-Database->Header Files). Es gibt
allerdings wie erkannt auch andere (newlib-lpc, GNUARM...). Man kann
aber beim Portieren allermeistens die Definitionsdatei fuer den
urspruenglichen Code nutzen und erspart sich damit Anpassungsarbeit.

Martin Thomas

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.