Forum: Compiler & IDEs asm undeclared - GCC-AVR Compiler Meldung - DAU-Frage!!


von Reiner L. (Gast)


Lesenswert?

Hallo Ihr

Ich versuche mich mal wieder im AVR (ATmega32) Programmieren.
Nach einigen Erfolgserlebnissen komm ich nun nicht mehr weiter.
Ich versuche das Nokia demoprogramme für das 3310-Display 
(http://www.deramon.de/nokia3310lcd.php) bei mir zum laufen zu bekommen.

Ich verwende AVR-Studio 4.13 und WinAVR-20070525. sbi error konnte ich 
genauso lösen wie c99-Meldung (suchfunktion hier im forum :) ).
Aber jetzt meldet der Compiler
"../Nokia/drm3310.c:107: error: 'asm' undeclared (first use in this 
function)"
für die Codezeile:
asm volatile ("nop"); (im original Code stand   asm ("nop"); )

Ich weiss zwar was das soll aber nicht wie es ich dem gcc beibringe.

Bitte lasst mich nicht dumm Sterben ...
Gruss Reiner

von Andreas K. (a-k)


Lesenswert?

Irgendwas wie -std=ansi unter den Parametern? Dann _asm_, oder 
-std=gnu99.

von Reiner L. (Gast)


Lesenswert?

Hallo Andreas

Ich hatte schon "-std=c99" in den Compiler-Optionen eingefügt, weil der 
Compiler über ein for()-Statment gemekert hat.
Habe dann alle Möglichkeiten die mir einfielen (-std=c99 asm 
/-std=c99asm usw) versucht, aber der Compiler hat mich immer 
missverstanden.
Bräuchte es etwas genauer (.. Hand reiss ..).
Etwas unspezifisch _asm_ hatte ich mit der Suche gefunden,aber ich 
bekomm es nicht zu laufen.

Aber danke trotzdem

Gruss Reiner

von Andreas K. (a-k)


Lesenswert?

Reiner L. wrote:

> Ich hatte schon "-std=c99" in den Compiler-Optionen eingefügt, weil der
> Compiler über ein for()-Statment gemekert hat.

c99=ANSI, gnu99=ANSI+GNU-Erweiterungen.

> Habe dann alle Möglichkeiten die mir einfielen (-std=c99 _asm_
> /-std=c99asm usw) versucht, aber der Compiler hat mich immer
> missverstanden.

Statt alle 36^6 Kombinationen durchzuprobieren: Doku lesen.

von Andreas K. (a-k)


Lesenswert?

Langfassung:

Entweder du verwendest -std=gnu99 und erlaubst ihm damit, asm zu 
erkennen.

Oder du verwendest im Quelltext statt asm die Variante _asm_.

von Reiner L. (Gast)


Lesenswert?

Hallo Andreas

Danke für deine Hilfe!!

Doko lesen - natürlich nur welche Doku? Ich wusste dann schon nicht mehr 
wo ich noch suchen sollte ... Wald vor lauter Doku/FAQ ...

Ich zieh mir den Schuh an "..den sie wissen nicht was sie tun ..", aber 
die Mikrocontroller programmiererie ist nur Spass/Hobby da hoffe ich ist 
etwas "Mut zur Wissens-Lücke"  hoffendlich verzeihlich.

Ich denke die Langfassung verstanden zu haben - werd ich heute Abend 
testen.
Nochmals Danke für deine Hilfe!!

Gruss Reiner

von Joachim Müller (Gast)


Lesenswert?

Ja, genau das Problem mit dem Inline Assembler hatte ich vor einem 
halben Jahr auch. Hatte da auch tagelang rumgesucht, bis ich das mit dem 
asm rausgefunden hatte.

Für einen C-Anfänger ist es leider oftmals unverständlich, warum es 
solche Unterschiede geben muss.
Ist das reine Willkür der "Macher" oder geht's hier um irgendwelche 
Egos?
Wozu braucht es verschiedene Versionen ein und derselben Funktion? 
Hätten sich die denn nicht vorher einigen können, ob man für sowas 
Unterstriche braucht, oder nicht, oder ob man z.B. "packed" vor oder 
hinter dem "struct" schreibt?
Hauptsache inkompatibel und möglichst die Arbeit erschweren!

Das hat meiner Meinung nach nichts mit einer "Wissenslücke" des 
Benutzers zu tun, sondern mit einer unnötigen Zeitverschwendung und 
Verkomplizierung.
Ist aber bei allen "Standards" so:
Irgendwelche Halbgötter, die unendlich viel Zeit für solchen Blödsinn 
haben, müssen sich da wichtig machen und sich ein Denkmal setzen.

Da verstehe ich die Leute gut, die bei Bascom bleiben und sich den 
bescheuerten C-Dschungel ersparen.

Joachim

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Joachim Müller wrote:

> Für einen C-Anfänger ist es leider oftmals unverständlich, warum es
> solche Unterschiede geben muss.

Weil der C-Standard einfach ziemlich genau vorschreibt, welche
Bezeichner eine ,,Implementierung'' (das ist die Kombination aus
Compiler und Systembibliothek(en)) für sich benutzen darf und
welche nicht.  Eine standardkonforme Applikation darf also den
Namen "asm" für eine Funktion, eine Variable oder einen Makro
ganz nach Belieben für sich selbst benutzen.  Logischerweise
kollidiert das mit dem Bedürfnis der Compilerhersteller, bequem
zu benutzende Erweiterungen anzubieten.  Der Ausweg daraus ist
es eben, dass der Compilerhersteller zwei Benutzungsmöglichkeiten
für den inline-Assembler geschaffen hat:

. _asm_ ist streng konform zum Standard und immer verfügbar
. asm ist nicht konform zum Standard und daher nur verfügbar,
  wenn die GCC-Erweiterungen explizit (oder implizit, der default
  von -std ist ja "gnu89") zugelassen sind.  Das hat zur Folge,
  dass eine an sich C-konforme Applikation, die den Bezeichner
  asm für sich selbst benutzt, damit nicht mehr fehlerfrei
  compiliert werden kann.

> Hätten sich die denn nicht vorher einigen können, ob man für sowas
> Unterstriche braucht, oder nicht, oder ob man z.B. "packed" vor oder
> hinter dem "struct" schreibt?

Wer soll sich bitte hier ,,einigen''?  Die Compilerhersteller
untereinander, jenseits des Standards?  Das klappt nur bedingt.

> Da verstehe ich die Leute gut, die bei Bascom bleiben und sich den
> bescheuerten C-Dschungel ersparen.

Genau.  Wo kein Standard da ist sondern nur eine proprietäre Lösung,
braucht man sich auch an keinen Standard zu halten. ;-)

von Andreas K. (a-k)


Lesenswert?

Joachim Müller wrote:

> Für einen C-Anfänger ist es leider oftmals unverständlich, warum es
> solche Unterschiede geben muss.

Namen wie "asm" sind Erweiterungen gegenüber dem Sprachstandard. Wer 
solche Erweiterungen verwendet, und trotzdem dem Compiler beispielsweise 
mit -std=ansi oder -std=c99 mehr oder weniger bewusst(?) mitteilt, dass 
er sich ausschliesslich an den jeweiligen ANSI-Standard halten soll, der 
sollte sich dann eher an die eigene Nase fassen.

Und genau deshalb existiert die Alternative in Form von _asm_, denn 
solcherart benannte Erweiterungen sind von ANSI gedeckt.

Übrigens sind für Anfänger viele Dinge unverständlich. Das ist das Wesen 
von Anfängern.

> Ist das reine Willkür der "Macher" oder geht's hier um irgendwelche
> Egos?

Weder noch.

> Da verstehe ich die Leute gut, die bei Bascom bleiben und sich den
> bescheuerten C-Dschungel ersparen.

Bascom hat nur einen Autor und keinerlei Standard. C existiert seit 30 
Jahren und mittlerweise im dritten Standard. Nicht wirklich direkt 
vergleichbar. Aber wenn dich sowas nervt, bleib lieber bei Bascom.

Übrigens fällt mir im Kontext von Microcontrollern grad kein Compiler 
ein, der sich stärker dem Standard verpflichtet fühlt als GCC.

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Andreas Kaiser wrote:

> Übrigens fällt mir im Kontext von Microcontrollern grad kein Compiler
> ein, der sich stärker dem Standard verpflichtet fühlt als GCC.

IAR, ganz eindeutig.  Das ist die bislang vollständigste C99-
Implementierung, die ich erlebt habe (wenngleich zumindest vor einem
Jahr deren _Pragma() noch buggy war).  Die Standardbibliothek bietet
alles bis zum kompletten wide character Handling.  Ist auch kein
Wunder, sie stammt von P. J. Plauger, der seit Jahren selbst bei der
Implementierung und Standardisierung von C dabei ist. ;-)

Aber du hast natürlich Recht.  Nach IAR kommt hinsichtlich der
Vollständigkeit und Korrektheit der C99-Implementierung wohl der
GCC sofort danach.

von Reiner L. (Gast)


Lesenswert?

Bitte Jungens

Keinen Glaubenskrieg!!

Ich wusste nicht das ich mit std=c99 mir selber ein Bein gestellt habe! 
- eben Anfänger - DAU - gelegenheits/Wochenendprogrammierer
Habe halt versucht eine andere Fehlermeldung beim Compilieren weg zu 
bekommen.
Na ja mit dem dargestellten Erfolg :(

Es beruhigt mich allerdings etwas das mir glaub ich diese Unwissenheit 
als Dau zugestanden wird.


Nochmals Danke und vertragt euch wieder - bitte :)

Gruss Reiner

von Reiner L. (Gast)


Lesenswert?

Hallo Ihr da draussen

So mit std=gnu99 hat das Kompilieren geklappt.

Und beim verbliebenen Fehler (PGM_??? - makro zum zugriff auf 
Programmspeicher) weiss ich auch schon wohl der Hase im Pfeffer liegt.

Ist aber erstaunlich mühsam C-Code zu über setzten hätte ich nicht 
erwartet.

Gruss Reiner

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.