Forum: Mikrocontroller und Digitale Elektronik C soll Asm-Funktion aufrufen


von Joachim .. (joachim_01)


Lesenswert?

Freunde des schnellen Codes,
ich möchte von C aus eine Asm Funktion die in einer eigenen Datei 
aufrufen. Ich verwende AVR-Studio6 in der Standardeinstellung. Die 
Asm-Datei Test1.asm ist im Solution-Explorer eingetragen.
1
AVR-Assembler-Code
2
.text
3
.global asmfunction  ; The assembly function must be declared as global 
4
 .include "m32def.inc"  
5
 ;
6
 ;
7
8
asmfunction: 
9
 cpi r24, 0x03 ; Parameter passed by caller in r24  
10
 brne ahead   
11
 sbi PORTD, 7 ; Turn motors ON 
12
 sbi PORTB, 3 
13
  
14
ahead: 
15
 ldi r24, 0x04; ; Return value to caller in r24 
16
 ret


In Start LCDTouch_1.c in vor main() steht:
extern void asmfunction(void); // Assembler function is external

Das führt zu:
Error  1  undefined reference to `asmfunction' 
C:\AVR\ASM\Test_A\Test1\Release\Start LCDTouch_1.c  1  1  Start LCD_1

Was mach ich falsch?

von Johann L. (gjlayde) Benutzerseite


Lesenswert?

Assembler-Modul muss zugelinkt werden, analog zu einem C-Modul.

von Floh (Gast)


Lesenswert?

Bist du dir sicher, dass du ASM-Funktionen verwenden willst?

Der resultierende Masschinencode wäre in C etwa der gleiche:
1
  if(var != 0x03)
2
  {
3
    PORTD |= (1<<PD7);
4
    PORTB |= (1<<PD3);
5
  }
Compilerbauer sind ja nicht blöd.

Daher sehe ich keinen Vorteil in der Nutzung einer ASM-Funktion, nur 
immer die Problematik mit compilerspezifischen Paramterübergaben, 
sichern von Registern und den Statusflags (was bei dir ja noch 
vollkommen fehlt?).

von Floh (Gast)


Lesenswert?

Sorry, muss natürlich "if(var == 0x03)" heißen.

von Joachim .. (joachim_01)


Lesenswert?

>Assembler-Modul muss zugelinkt werden, analog zu einem C-Modul.
Hm. Das heißt, ich muß dem Linker in den Einstellungen "irgendwie" sagen 
daß er es dazulinken soll... ächz.

von Johann L. (gjlayde) Benutzerseite


Lesenswert?

Joachim ... schrieb:
>>Assembler-Modul muss zugelinkt werden, analog zu einem C-Modul.
> Hm. Das heißt, ich muß dem Linker in den Einstellungen "irgendwie" sagen
> daß er es dazulinken soll... ächz.

C-Modul:
   gcc -c foo.c   (macht ein foo.o)

Assembler-Modul:
   gcc -c bar.sx  (macht ein bar.o)

Ist ja nun keine Wissenschaft...

Linken dann:
   gcc bar.o foo.o -o main.elf

Woher ein .o kommt ist Wurscht: Assembler, C, C++, Objective-C oder 
wenn's dir Spaß macht Maschinencode per Lochkarte :o)

von Joachim .. (joachim_01)


Lesenswert?

>Woher ein .o kommt ist Wurscht:
Ja, ich versteh.

Prob für mich ist, dass das Makefile immer wieder(?) neu erzeugt wird, 
In der default-Einstellung von AVR-Studio ist es nicht vorgesehen, an 
dem Makefile rumzuschrauben. Aber... hm. Mal kucken. Ich glaub ich bin 
jetzt aufm richtigen weg.

von Joachim .. (joachim_01)


Lesenswert?

Oha. So wie's aussieht gibt noch nicht mal ein Objektfile zur Datei 
Test1.asm. Na dann.

von Axel S. (a-za-z0-9)


Lesenswert?

Johann L. schrieb:
> Assembler-Modul muss zugelinkt werden, analog zu einem C-Modul.

Ack. Allerdings stimmt auch der Prototyp nicht. Den Kommentaren nach 
erwartet die Funktion ein (u)int8 und liefert auch eins zurück. Dann 
kann es schon mal nicht
1
extern void asmfunction(void);
sein.


XL

von Joachim .. (joachim_01)


Lesenswert?

Noch jemand wach?
Im Makefile steht:



######################################################################## 
########
# Automatically-generated file. Do not edit!
######################################################################## 
########

SHELL := cmd.exe
RM := rm -rf

USER_OBJS :=

LIBS :=
PROJ :=

O_SRCS :=
C_SRCS :=
S_SRCS :=
S_UPPER_SRCS :=
OBJ_SRCS :=
ASM_SRCS :=
PREPROCESSING_SRCS :=
OBJS :=
OBJS_AS_ARGS :=
C_DEPS :=
C_DEPS_AS_ARGS :=
EXECUTABLES :=
OUTPUT_FILE_PATH :=
OUTPUT_FILE_PATH_AS_ARGS :=
AVR_APP_PATH :=$$$AVR_APP_PATH$$$
QUOTE := "
ADDITIONAL_DEPENDENCIES:=
OUTPUT_FILE_DEP:=

# Every subdirectory with source files must be described here
SUBDIRS :=


# Add inputs and outputs from these tool invocations to the build 
variables
C_SRCS +=  \
../eDIP-Touch.c \
../ext6522.c \
../keypad.c \
../resolver.c \
../Start\ LCD_1.c \
../twimaster.c


PREPROCESSING_SRCS +=


ASM_SRCS +=


OBJS +=  \
eDIP-Touch.o \
ext6522.o \
keypad.o \
resolver.o \
Start\ LCD_1.o \
twimaster.o





Unter dem Punkt:
ASM_SRCS +=
ist nix eingetragen.
Ich könnt ja jetzt schlau sein, das Makefile kopieren, dem Linker sagen 
er soll das externe makefile mit einer zusätzlichen Resource 
verwenden... Aber das ist ja eigentlich nicht der Sinn. Jemand ne Idee 
welchen Schalter ich umlegen muß?

von Joachim .. (joachim_01)


Lesenswert?

Grrr!

Auf den Verdacht hin daß die Leute mich für einen des nächtens mit sich 
selbst sprechenden Irren halten... und für den Nächsten der bei 
AVR-Studio 6 drüberstolpert:

Die von AVR-Studio automatisch vergebene Namensendung .asm für eine in 
einem C-Projekt hinzugefügte Assembler-Datei ist:

1. nicht im Solution-Explorer änderbar
2. falsch

Sie muß auf .s lauten.

Warum machtn Atmel sowas?

von exe (Gast)


Lesenswert?

Weil Erweiterungen dem GCC, sowie jedem Programm respektiert werden 
will, egal sind.

von Oliver S. (oliverso)


Lesenswert?

Joachim ... schrieb:
> Sie muß auf .s lauten.

Genaugenommen muß sie auf .S lauten.

Joachim ... schrieb:
> Warum machtn Atmel sowas

Atmel macht da gar nichts, der ist gcc-Standard.

Oliver

von Johann L. (gjlayde) Benutzerseite


Lesenswert?

Die Endungen sind Wurscht. Mit

 gcc -x assembler-with-cpp -c wurscht.salat -o salat.mit.wurscht

assembliert salat.mit.wurscht aus wurscht.salat

von Joachim .. (joachim_01)


Lesenswert?

Ich vermute das Prob darin, daß es zwei Assembler gibt - den gcc der asm 
kann und der Atmel Assembler.
zB:
GCC assembly language
#include <avr/io.h>
message:
  .asciz "hello"


Atmel AVR  assembly language
.include “m32def.inc”
message:
 .db “hello”, 0





Ist in der Wirkung vermutlich beides das gleiche.

Wie gesagt, ich will eigentlich an dem Makefile nix rumfingern, dazu ist 
mir meine Lebenszeit einfach zu kurz (wobei dieses Linkerelend bei 
Microchip bereits bei einem RAM-Bedarf von mehr als 256 Byte beginnt... 
). Wäre schön gewesen, AVR-Studio hätte das von Anfang an gekonnt. Aber 
wat willze machen.

Hab ne AN gefunden die alles geklärt hat.

von Edson (Gast)


Lesenswert?

> (wobei dieses Linkerelend bei Microchip bereits bei einem RAM-Bedarf von
> mehr als 256 Byte beginnt...)

Was willst du denn damit sagen, kannst du dich da mal genauer 
ausdrücken?

von Karl H. (kbuchegg)


Lesenswert?

Joachim ... schrieb:

> dazu ist
> mir meine Lebenszeit einfach zu kurz

Dann frag ich mich, warum du dir diesen ASM_Teil überhaupt antust.
Wenn ich nach deinen Kommentaren gehe

> asmfunction:
>  cpi r24, 0x03 ; Parameter passed by caller in r24
>  brne ahead
>  sbi PORTD, 7 ; Turn motors ON
>  sbi PORTB, 3


Dann sticht mir da ein 'Turn motors ON' ins Auge. Also Motoren. Womit 
jegliche Frage nach Geschwindigkeit sowieso Makulatur ist. Wenn da 
gestanden wäre: Schalte die Flanke im PAL-Video Signal, dann wäre ich 
mit Assembler bei dir gewesen. Aber Motoren? So zeitkritisch können 
Motoren gar nicht sein, dass ein C-Programm das nicht mit links 
handhabt.

von amateur (Gast)


Lesenswert?

Bei der Beschreibung der Bibliotheken gab es, zumindest zu Zeiten von 
Studio 4, ein paar Beispieldateien zu diesem Thema. Nichts umwerfendes 
aber Klarheit schaffend.
Siehe: Help->avr-lib Reference Manual->Example Projects
In den dortigen FAQ's steht auch einiges zum Thema: Registerbelegung und 
Rückgabewerte.

von Thomas H. (Firma: CIA) (apostel13)


Lesenswert?

@Joachim, hast Du das Problem mittlerweile lösen können? Ich stehe vor 
dem selben und finde keine Brauchbaren hinweise zumindest nicht welche 
die in AVR Studio funktionieren...

von Wolfgang B. (Firma: privat) (umsteiger)


Lesenswert?

Hallo Joachim,

was genau du falsch machst kann ich auch nicht sagen, aber, genau dieses 
Thema interessiert mich auch und ich erinnere mich darann, als ich mir 
vor Jahren (2003?) das erste SDK500 Modul zugelegt hatte und das 
AVR-Studio installierte und die ersten Assembler-Befehle eingab um ein 
lauffähiges Programm zu genenrieren, fiel mir auf, dass ein in Assembler 
geschriebenens Programm auch als xxx.h - File kompilliert werden kann..
So wurde mir bewusst, dass auf diese Weise  Assembler-Code in ein 
C-Programm integriert werden kann . Wie die Parameterübergabe und 
Deklarationen zwischen den beiden
Programmierebenen genau funktioniert mus ich auch noch herausfinden.
-Von ATMEL gibt es dazu eine Beschreibung...

Wolfgang

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.