ASM und C-Code kombinieren

Gast #2418715
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
Gast #2418766
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?
#2419314
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_
#2419491
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
Persönliche Seite #2420178
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.
Moderator Persönliche Seite #2420577
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.
Persönliche Seite #2421747
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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren