Gast
#365162
Hallo Leute! Ich mache erste Gehversuche in C, arbeite das Tutorial durch und dachte zuerst, ich hätte Pkt. 18.2 "Assembler-Dateien" verstanden. Zur Prüfung meines "neuen Wissens" habe ich mir eine fertige Assembler-Datei aus den Code-Beispielen geladen (DCF77 AVR-Assemblerbaustein, Autor: Pit, Datum: 09.01.2006 19:57, Dateianhang dcf77dec.asm). Hierzu ergeben sich 2 Fragen. 1. Frage: Das Tutorial Beispiel zur Funktion superFunc ... // setze alle Pins von PortD auf Ausgang .global superFunc .func superFunc superFunc: push workreg 1ec: 0f 93 push r16 ldi workreg, ALLOUT 1ee: 0f ef ldi r16, 0xFF ; 255 out _SFR_IO_ADDR(DDRD), workreg 1f0: 01 bb out 0x11, r16 ; 17 pop workreg 1f2: 0f 91 pop r16 ret 1f4: 08 95 ret ... beginnt mit "push workreg" und endet mit "pop workreg". Das fand ich auch logisch, da die Registerwerte nach Funktionsende erhalten werden sollen. Im Programm dcf77dec.asm werden 6 Register benutzt. Trotzdem wird nichts gepusht und gepopt. Geht der Autor davon aus, daß das jeder Benutzer "barfuß" hinzufügt, macht das der Compiler automatich oder ist das "retten" der Registerinhalte nicht erforderlich? 2. Frage: Unabgängig von (1.) habe ich versucht dcf77dec.asm in ein C-Programm einzubinden. Also: dcf77dec.asm umbenannt in DCF77.S ins Makefile ASRC = DCF77.S folgendes Miniprogramm Test.c geschrieben #include <avr/io.h> extern void dcf77_init(uint8_t DCF77CT[]); //Deklarieren der init-Funktion innerhalb von dcf77.S extern void dcf77_start(uint8_t DCF77CT[]); //Deklarieren der start-Funktion innerhalb von dcf77.S int main(void) { static uint8_t DCF77CT[20]; //20 Byte im RAM anlegen, weil das DCF77.S 20 Byte benötigt dcf77_init(DCF77CT); //Aufruf der Assemblerfunktion mit Übergabe der Adresse dcf77_start(DCF77CT); } Leider wirft der Compiler massenweise Fehlermeldungen aus die sich alle auf DCF77 beziehen. Compiling: Test.c avr-gcc -c -mmcu=atmega16 -I. -gdwarf-2 -DF_CPU=8000000UL -Os -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -Wall -Wstrict-prototypes -Wa,-adhlns=Test.lst -std=gnu99 -MD -MP -MF .dep/Test.o.d Test.c -o Test.o Assembling: DCF77.S avr-gcc -c -mmcu=atmega16 -I. -x assembler-with-cpp -Wa,-adhlns=DCF77.lst,-gstabs,--listing-cont-lines=100 DCF77.S -o DCF77.o DCF77.S: Assembler messages: DCF77.S:26: Error: constant value required DCF77.S:30: Error: junk at end of line, first unrecognized character is `8' DCF77.S:40: Error: constant value required DCF77.S:41: Error: constant value required DCF77.S:53: Error: junk at end of line, first unrecognized character is `1' DCF77.S:66: Error: junk at end of line, first unrecognized character is `1' DCF77.S:68: Error: junk at end of line, first unrecognized character is `2' DCF77.S:76: Error: junk at end of line, first unrecognized character is `1' DCF77.S:79: Error: junk at end of line, first unrecognized character is `2' DCF77.S:82: Error: junk at end of line, first unrecognized character is `2' DCF77.S:85: Error: junk at end of line, first unrecognized character is `2' DCF77.S:88: Error: junk at end of line, first unrecognized character is `3' DCF77.S:91: Error: constant value required DCF77.S:91: Error: register r24, r26, r28 or r30 required DCF77.S:91: Error: `,' required DCF77.S:91: Error: garbage at end of line DCF77.S:93: Error: constant value required DCF77.S:94: Error: constant value required DCF77.S:105: Error: junk at end of line, first unrecognized character is `3' DCF77.S:107: Error: junk at end of line, first unrecognized character is `8' DCF77.S:119: Error: constant value required DCF77.S:119: Error: register number above 15 required DCF77.S:119: Error: garbage at end of line DCF77.S:120: Error: constant value required DCF77.S:120: Error: register number above 15 required DCF77.S:120: Error: garbage at end of line DCF77.S:121: Error: garbage at end of line DCF77.S:122: Error: garbage at end of line DCF77.S:123: Error: junk at end of line, first unrecognized character is `0' make.exe: *** [DCF77.o] Error 1 > Process Exit Code: 2 > Time Taken: 00:00 Ich glaube aber nicht, daß Pit ein fehlerhaftes Programm ins Netz gestellt hat (zur Erinnerung nochmals anbei). Offensichtlich habe ich irgendwas noch nicht gerafft. Kann mir jemand sagen, was ich falsch gemacht habe? Vielen Dank schon jetzt und Bitte um Entschuldigung für mein Halbwissen! Martin