Gast
#1671775
Hallo,
ich mache eine Projektarbeit mit dem AT89C51AC3 ATMEL Mikrokontroller.
Dafür muss ich ein neues Projekt aus alten Dateien erstellen. Darunter
sind Startup.A51, Init.A51 und viele H-/C-Dateien. Diese Dateien wurden
unter Windows 3.11 mit dem C51 Compiler („und A51 Assembler“)
kompiliert.
Meine aktuelle Entwicklungsumgebung besteht aus „Code::Blocks“ und
„SDCC“ Compiler.
Problembeschreibung:
1. Im Keil C51 Assemblercode wird eine C-Funktion aus anderem Modul
Aufgerufen. Vor dem Aufruf wird mit der „EXTRN“ Anweisung die Funktion
bekanntgegeben.
--> Gesucht: Wie kann man die „EXTRN“ Anweisung im SDCC ersetzen oder
umgehen???
2. Eine vollständige Assembler Datei (also nicht _asm ……….. _endasm;
gemeint) in einer Kombination mit C- und H-Dateien kompilieren und
linken mit SDCC und Code::Blocks.
--> Gesucht: INIT.A51 (oder INIT.ASM) und STARTUP.A51 (oder STARTUP.ASM)
Falls etwas unklar ist, oder Fragen einfach melden.
***
***
*********
*****
*
Nähere Informationen zu der Fragestellung:
Bei kompilieren kommt es zu folgenden Fehlern (SDCC Compiler):
************************************************************************
1. Fehler: in der Datei ZEIT_ASS.C
?ASxxxx-Error-<o> in line 608 of obj\Release\ZEIT_ASS.asm
removing obj\Release\ZEIT_ASS.rel
<o> .org in REL area or directive / mnemonic error
In der Zeile 608 (ZEIT_ASS.asm) steht folgendes: EXTRN CODE
(ZEITGEBER_DEK)
Der SDCC Compiler kennt nicht den EXTRN Befehl.
Gibt es eine Möglichkeit diesen durch einen anderen Befehl zu ersetzen?
Die Funktion zeitgeber_dek() ist in der ZEITGEB.C deklariert, die Datei
ZEITGEB.H ist in der Datei ZEIT_ASS.C eingebunden und besteht aus C
Funktionen.
Diese Datei besteht aus includes und zwei Funktionen:
Alte Version (C51 Compiler)
timer0 {
#pragma ASM
...
// Assemblercode
...
#pragma ENDASM
}
Neue Version (SDCC Compiler)
timer0 {
_asm
// Assemblercode
…
_endasm;
}
Alte Version (C51 Compiler)
timer0 () interrupt{
#pragma ASM
EXTRN CODE (ZEITGEBER_DEK)
// Assemblercode
…
PUSH B
…
LCALL ZEITGEBER_DEK
…
POP B
…
#pragma ENDASM
}
Neue Version (SDCC Compiler)
timer0 () interrupt{
_asm
EXTRN CODE (ZEITGEBER_DEK)
// Assemblercode
…
PUSH B
…
LCALL ZEITGEBER_DEK
…
POP B
…
_endasm;
}
Zusätzlich ein Ausschnitt aus dem altem make-file:
// MACRO-Deklaration
LAT37 = d:\LAT37\PROG
C51OPTA = SRC SYMBOLS DEBUG OE OT(0,SIZE) RB(0) LARGE
A51OPT = ERRORPRINT NOPRINT DEBUG SYMBOLS
C51 = C51E
...
$(LAT37)\zeit_ass.obj : $(LAT37)\zeit_ass.c
$(C51) zeit_ass.c $(C51OPTA) >zeit_ass.err
a51 zeit_ass.src $(A51OPT)
...
Habe ich das richtig verstanden?
Aus der ZEIT_ASS.C mit a51 wird eine Assembler-Source Datei
(zeit_ass.src) erstellt, dann wieder dieselbe Datei mit dem C51 Compiler
kompiliert und zusammen mit der zeit_ass.src eine Objektdatei
ZEIT_ASS.obj erstellt.
=> 1. Frage: Wie kann ich das selbe mit Code::Blocks und SDCC
realisieren? < =
Mein Realisierungsversuch (Eigenschaften der zeit_ass.c Datei in
Code::Blocks IDE)
Siehe Bild ZEIT.ASS Einstellung
********************************************************************
Zu 2. Fehler: in der Datei INIT.ASM
Diese Datei besteht aus folgenden Assembler Befehlen:
NAME ?C_INIT
EXTRN CODE (MAIN)
PUBLIC ?C_START
?C_C51STARTUP SEGMENT CODE
;?C_INITSEG SEGMENT CODE ; Segment with Initializing
Data
; RSEG ?C_INITSEG
; DB 0 ; Segment ist definiert, aber
leer
RSEG ?C_C51STARTUP
?C_START:
LJMP MAIN
END
Sobald diese einzelne Datei kompiliert wird, kommt folgende Warnung und
Kompiliervorgang bricht ab. (das gleiche passiert bei INIT.ASM)
at 1: warning 119: don't know what to do with file 'INIT.A51'. file
extension unsupported
SDCC : mcs51/gbz80/z80/avr/ds390/pic16/pic14/TININative/xa51/ds400/hc08
2.9.0 #5416 (Mar 22 2009) (MINGW32)
Usage : sdcc [options] filename
Options :-
Mein Realisierungsversuch (Eigenschaften der zeit_ass.c Datei in
Code::Blocks IDE)
Siehe Bild INIT.ASS Einstellung
Ausschnitt haus altem make-file:
// MACRO-Deklaration
LAT37 = d:\LAT37\PROG
A51OPT = ERRORPRINT NOPRINT DEBUG SYMBOLS
…
$(LAT37)\init.obj : $(LAT37)\init.a51
a51 init.a51 $(A51OPT)
…
= > 2. Frage: Wie kann ich das selbe mit Code::Blocks und SDCC
realisieren? < =
Vielen Dank im Voraus
Denis

