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?
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?).
>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.
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)
>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.
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
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ß?
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?
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
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.
> (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?
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.
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.
@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...
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