www.mikrocontroller.net

Forum: Compiler & IDEs Assembler in AVR-GCC


Autor: Fabian Braun (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo!

habe ein problem mit dem einbinden von assemblerdateien.
z.b. beim yampp7 (www.yampp.com für diejenigen dies nicht
kennen) sind einige dateien mit der endung .asm. jedoch
müssten in avr-gcc eingebundene dateien die extension
.s besitzen und die zugehörigen header datein die funktionen
mit extern am anfang deklarieren. wieso ist das nicht so?
hat jemand von euch mit dieser sache erfahrung?

entschuldigung dass ich nicht gleich im yampp forum frage
aber eine antwort in deutsch bzw. eine frage in deutsch
zu stellen fällt mir 1000mal leichter!

merci beaucoup!

fabian

Autor: Joerg Wunsch (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Nein, die Dateien müssen nicht auf .S enden (großes S bitte!),
aber wenn sie das nicht tun, dann muß man dem Compiler das mit
-x assembler-with-cpp halt sagen.  Meiner Erinnerung nach ist
yampp (aus was auch immer für Gründen) diesen Weg gegangen.

Autor: Fabian Braun (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hallo

aha! schon mal ein problem gelöst, danke!
aber jetzt stellt sich die frage immer noch,
wieso sind in den header dateien die funktionen
nicht mit extern an anfang also zum beispiel
extern void funktion1(void) definiert?!??!??
hatt hier jemand ne idee? oder wird das mit
dem "-x assembler-with-cpp" schon "gesagt"?!?

merci!

gruss fabian

Autor: Joerg Wunsch (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Eine Funktionsdeklaration ohne `static' ist implizit `extern'.

Bei Variablendeklarationen war dies ganz früher auch so, allerdings
kann man dort die Deklaration nicht wirklich von der Definition
unterscheiden, so daß aus heutiger Sicht

int foo;

eine Definition darstellt (für eine globale Variable).  Damit ist dies
so in einer Headerdatei (die in mehreren C-Dateien verarbeitet werden
soll) formal nicht mehr zulässig (es gäbe dann ja am Ende mehrere
Variablen `foo'), so daß dort das `extern' stehen muß.

GCC ist in seiner Voreinstellung jedoch mit der historischen
Schlampigkeit kompatibel, d. h. dort würde selbst das funktionieren.
Wenn man das vermeiden will, muß man mit -fno-common übersetzen.

Bei Funktionen ist der Fall jedoch nach wie vor eindeutig:

int foo(void); /* eine Deklaration */
int foo(void)
{
  /* Eine Definition, die ggf. auch Deklarations-
   * charakter haben kann, wenn es das erste Auftreten
   * des Bezeichners foo im aktuellen Scope ist. */
}

Autor: Fabian Braun (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hallo zusammen,

hmm...tönt grad noch ein bisschen schwierig aber
langsam dämmerts :-) sorry bin erst im dritten
lehrjahr (elektroniker) und hab mir C-programmieren
mit AVRs eigentlich selbst beigebracht drum bin ich
hoffentlich entschuldigt dass ich dies jetzt nicht
aufs erste mal ganz verstehen!
also im grunde genommen könte ich jetzt so ein programm machen:

main.c
======

void asmfunktion(void);

void main(void)
{
   asmfunktion();
}

assemblercode.asm
=================

asmfunktion:
   nop
   nop
   ret

müsste noch das oben genannte textchen im makefile
zu den compiler parameter hinzufügen und die
sache sollte laufen?!? ist dies korrekt?

merci für eure hilfe!

gruss fabian

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.