Forum: Compiler & IDEs ASM und C-Code kombinieren


von Locutus (Gast)


Lesenswert?

Hallo zusammen,
ich habe ein C-Projekt in AVR Studio 5 angelegt und es mit Leben 
gefüllt. Dieses läuft auch korrekt. Ich möchte nun den Flash Speicher 
des Controllers testen, dazu habe ich bei Atmel ein Application Note 
gefunden, mit den Quellcode besorgt, diesen auch den µC angepasst und 
kompiliert!

Jetzt zum Problem:
-CRC-Quellcode ist eine .asm Datei, diese lässt sich mit in AVR Studio 
als Projekttyp "avrasmproj" bauen.
-Das andere Programm ist vom Typ avrgccproj!

Wie kann ich das diese beiden vereeinen!

Vielen Dank für eure Hilfe!
Beste Grüße
Locutus

von Stefan E. (sternst)


Lesenswert?

Locutus schrieb:
> Wie kann ich das diese beiden vereeinen!

Gar nicht.
Du müsstest den Assembler-Code nach gas portieren, den Assembler, der 
auch vom gcc benutzt wird. Oder das Ganze in C reprogrammieren.

von Locutus (Gast)


Lesenswert?

Hi,
danke für die schnelle Antwort. Es besteht also nicht die Möglichkeit, 
den erzeugten obj-code irgendwie zu linken oder so?

Beste Grüße
Locutus

Ps.: Hat jemand vielleicht schon die Application Note 236 in C 
umgesetzt?

von Stefan E. (sternst)


Lesenswert?

Locutus schrieb:
> danke für die schnelle Antwort. Es besteht also nicht die Möglichkeit,
> den erzeugten obj-code irgendwie zu linken oder so?

Nur, wenn er mit gas erzeugt wurde.

von Johann L. (gjlayde) Benutzerseite


Lesenswert?

Erzeugt der Atmel-Assembler überhaupt einen Object-Code? Oder klatscht 
der direkt alles in ein IHEX?

von Stefan E. (sternst)


Lesenswert?

Johann L. schrieb:
> Erzeugt der Atmel-Assembler überhaupt einen Object-Code?

Nein.

> Oder klatscht der direkt alles in ein IHEX?

Ja. Eine Source-Datei geht rein, brennfertiges Binary kommt raus.

von Peter D. (peda)


Lesenswert?

Einfach die Asm-Datei in *.S umbenennen und zum C-Projekt hinzufügen.


Peter

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


Lesenswert?

Peter Dannegger schrieb:
> Einfach die Asm-Datei in *.S umbenennen und zum C-Projekt hinzufügen.

Wird in der Regel nicht direkt funktionieren, weil die Pseudo-Ops
eben andere sind und ein paar andere Kleinigkeiten nicht passen.

von Stefan E. (sternst)


Lesenswert?

Jörg Wunsch schrieb:
> Peter Dannegger schrieb:
>> Einfach die Asm-Datei in *.S umbenennen und zum C-Projekt hinzufügen.
>
> Wird in der Regel nicht direkt funktionieren, weil die Pseudo-Ops
> eben andere sind und ein paar andere Kleinigkeiten nicht passen.

Ganz zu schweigen davon, dass ein Code-Beispiel für den Atmel-Assembler 
sich wohl kaum an die GCC-ABI hält.

von Ralf G. (ralg)


Lesenswert?

Jörg Wunsch schrieb:
> Peter Dannegger schrieb:
>> Einfach die Asm-Datei in *.S umbenennen und zum C-Projekt hinzufügen.
>
> Wird in der Regel nicht direkt funktionieren, weil die Pseudo-Ops
> eben andere sind und ein paar andere Kleinigkeiten nicht passen.

Dafür habe ich mir so eine Header-Datei gebastelt:
1
#ifndef _GAS_REGPORT_H_
2
#define _GAS_REGPORT_H_
3
4
5
r0    = 0
6
r16    = 16
7
r17    = 17
8
r18    = 18
9
r19    = 19
10
r20    = 20
11
r21    = 21
12
r22    = 22
13
r23    = 23
14
r24    = 24
15
r25    = 25
16
r30    = 30
17
r31    = 31
18
sreg  = _SFR_IO_ADDR(SREG)
19
20
porta  = _SFR_IO_ADDR(PORTA)
21
portb  = _SFR_IO_ADDR(PORTB)
22
portc  = _SFR_IO_ADDR(PORTC)
23
portd  = _SFR_IO_ADDR(PORTD)
24
25
ucsra  = _SFR_IO_ADDR(UCSRA)
26
ucsrb  = _SFR_IO_ADDR(UCSRB)
27
ucsrc  = _SFR_IO_ADDR(UCSRC)
28
29
udr    = _SFR_IO_ADDR(UDR)
30
#endif  // _GAS_REGPORT_H_

von Peter D. (peda)


Lesenswert?

Also die Register kennt er schon (WINAVR).
Und die IO-Ports holt man sich mit #include <avr/io.h> rein.
Alle .equ und .def kann man als #define umschreiben.

Ich hatte kürzlich mal 64Bit in Assembler geschrieben. Und ich fand ein 
schönes Assembler-Beispiel im Web für die Syntax, finds aber nicht mehr.

Das Beispiel im WINAVR ist leider wenig hilfreich, da fehlen die Aufrufe 
und Parameterübergaben zwischen C und Assembler.


Peter

von Chuck Norris (Gast)


Lesenswert?


von Johann L. (gjlayde) Benutzerseite


Lesenswert?

Peter Dannegger schrieb:

> Das Beispiel im WINAVR ist leider wenig hilfreich, da fehlen die Aufrufe
> und Parameterübergaben zwischen C und Assembler.

Da ist ja auch nix zu machen... Einfach ein
1
extern int foo_bar_blubb (int, char);
die Funktion in Assembler implementieren und verwenden wie gehabt.

Die Registerverwendung ist zB erklärt in
   http://www.rn-wissen.de/index.php/Avr-gcc/Interna#Registerverwendung

Das reicht für 99.9% aller Feld-, Wald- und Wiesenprogramme. Das 
verbleibende 1/oo sind Funktionen, die Parameter/Ergebnis via Stack 
übergeben.

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


Lesenswert?

Peter Dannegger schrieb:
> Das Beispiel im WINAVR ist leider wenig hilfreich, da fehlen die Aufrufe
> und Parameterübergaben zwischen C und Assembler.

Dann schreib' mal bitte eins, was hilfreicher ist.  Ich habe damals
lange gesucht, ein Beispiel zu finden, das nicht an den Haaren
herbei gezogen ist.  (Das existierende Beispiel stammt aus einer
realen Anforderung hier im Forum.)  Wie du selbst ja schon
festgestellt hast: in aller Regel braucht man keinen zusätzlichen
Assemblercode.

von Sam .. (sam1994)


Lesenswert?

Johann L. schrieb:
> Peter Dannegger schrieb:
>
>> Das Beispiel im WINAVR ist leider wenig hilfreich, da fehlen die Aufrufe
>> und Parameterübergaben zwischen C und Assembler.
>
> Da ist ja auch nix zu machen... Einfach ein

Und in die andere Richtung?

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


Lesenswert?

Samuel K. schrieb:

> Und in die andere Richtung?

ABI-Doku gelesen?

Übergabe in r[24:25], ggf. mehr, wenn größerer Datentyp.

von Johann L. (gjlayde) Benutzerseite


Lesenswert?

Samuel K. schrieb:
> Johann L. schrieb:
>> Peter Dannegger schrieb:
>>
>>> Das Beispiel im WINAVR ist leider wenig hilfreich, da fehlen die Aufrufe
>>> und Parameterübergaben zwischen C und Assembler.
>>
>> Da ist ja auch nix zu machen... Einfach ein
>
> Und in die andere Richtung?

Ditto. Mit dem Unterschied, daß Parameter nicht in den von der ABI 
geforterten Registern empfangen werden, sondern dort übergeben werden.

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.