![]() ![]() INFO - FAQ - CC2-Forum - CCPro-Forum |
|
' =========================================================================== ' Demoprogramm: Open-Maxi abbremsen auf Original-C-Control-Niveau ' In OCBASIC 1.11a für Open-Maxi von Dietmar Harlos am 12. September 2020 ' =========================================================================== ' Die Open-Maxi wird bekanntlich mit einem Bustakt von 20 MHz betrieben und ' ist deshalb über 100-mal schneller als die Original-C-Control Version 1.1. ' Doch nicht immer ist diese hohe Geschwindigkeit erwünscht. Die Geschwin- ' digkeit der Open-Maxi kann sehr elegant mittels SLOWMODE ON auf ein ' Sechszehntel des normalen Takts reduziert werden. Dann arbeitet sie mit ' 1,25 MHz Bustakt. Doch auch damit ist die Open-Maxi immer noch über 6-mal ' schneller als die Original-C-Control. In diesem Programm befindet sich ' eine Assemblerroutine, die in den Interpreter des Betriebssystems einge- ' bunden wird und die Befehlsausführung abbremst. Damit ist die Open-Maxi ' fast genauso schnell wie die Original-C-Control, wie der in diesem ' Programm enthaltene Benchmark-Test von DIE HARD zeigt. ' Dieses Programm basiert auf dem folgenden Programm von DIE HARD: ' m20samples_jun05\UNIT_M2.0_M1.2\TOOLS_M2.0_M1.2\BENCHMARK\BENCHMARK_M20.bas ' Bekanntlich wird die Original-C-Control mit 2 MHz Bustakt betrieben. Da ' viele Assemblerbefehle auf der CPU der Open-Maxi weniger Zyklen be- ' nötigen, entspricht das ungefähr 1,25 MHz OM-Takt. Assemblerprogramme ' für die C-Control sollten also bei SLOWMODE ON mit in etwa gleicher ' Geschwindigkeit ablaufen. Sie können also weiterverwendet werden. Aller- ' dings sollten die Assemblerprogramme im Sourcecode vorliegen, damit sie ' angepaßt werden können. Ein Assemblerprogramm der Original-C-Control als ' S19-File dürfte auf der Open-Maxi nicht laufen, weil sich zuviel geändert ' hat: Das Speicherlayout der Ports ist anders, die MCU-Module sind anders, ' der Rechenstack ist anders und an anderer Adresse, der SYSCODE-Bereich ' beginnt an Adresse $0900 statt $0101 (wird evtl. durch SYS hingebogen), ' Assembler-Interruptroutinen werden anders vereinbart, USER-RAM liegt an ' anderer Adresse ($aa statt $a1), Einsprünge ins OS sind notgedrungen nicht ' an gleicher Adresse und I²C ist anders. Aber die CPUs der OM-Controller ' sind abwärtskompatibel zur 6805-CPU. Das heißt, es werden alle Assembler- ' befehle der 6805 unterstützt. Wenn der Sourcecode eines Assemblerprogramms ' verloren gegangen ist, kann versucht werden, es mittels IDI05, DI05 und ' DI08 zu disassemblieren. ' An dieser Stelle möchte ich mich bei Norbert Klein und bei Dirk von "das ' |_ Team" für ihre Unterstützung bedanken. ' --- Definitionen ---------------------------------------------------------- INCLUDE "omax.def" ' Definitionen für die Open-Maxi '-------------------------- '------ I/O PORTS --------- '-------------------------- define LED port[8] define INSTRUC word[1] define ST byte[3] define COUNTER byte[5] '-------------------------- ' --- Unsere eigene Assembler-Routine im Interpreter ------------------------ ' Die OM-Controller unterstützen das Einbinden einer Assemblerroutine in ' den Interpreter des Systems. Die Routine wird jedesmal gestartet, nachdem ' ein neuer Tokenbefehl aus dem Speicher geholt wurde. Das ist unmittelbar ' bevor der Tokenbefehl vom Interpreter ausgeführt wird. Auf FREERAM1 ' hinterlegt das Betriebssystem den auszuführenden Token-Code. ' Die folgende Subroutine muß am Anfang des Programms stehen und sollte ' sinnvollerweise in einer INCLUDE-Datei untergebracht werden. ' Der OCBASIC-Compiler setzt automatisch ein "GOTO main" vor diese Routine. PROC URTok_iiar INLASM ! cbeqa #iTOK,urtok_is ' Unterscheidung der Interruptquellen ! jmp URTok_iiar_next+2 ' zur nächsten IIAR in der Kette springen #urtok_is ! ldhx #71 ' 16-Bit-Indexregister H:X auf Wert setzen #urtok_ws ! aix #-1 ' Von H:X eins abziehen ! cmphx #0 ' Vergleiche H:X mit dem Wert Null. ! bne urtok_ws ' Springe, wenn nicht gleich. ! lda FREERAM1 ' Tokencode (in A) ausführen ! clc ! rts END PROC #URTok_iiar_next ' hier hinter folgt die nächste IIAR ' (sofern vorhanden) ' --- Hauptprogramm --------------------------------------------------------- #main 'durch die IIAR am Programmbeginn wird ein "GOTO main" erzeugt PRINT "Benchmark auf der Open-Maxi" PrintSpc=ON 'Bei PRINT dezimale Zahlen mit führendem Leerzeichen ausgeben End2Host=ON 'Bei Programmende (siehe END) gleich in den Host-Modus wechseln URTok=ON 'Assemblerroutine in den Interpreter einbinden SLOWMODE ON 'von 20 MHz auf 1.25 MHz Bustakt umschalten SCI2BDH=0 '9600 Baud bei 1.25 MHz Bustakt SCI2BDL=8 'Baudrate = 1.25e6/16/(SCI2BDH*256+SCI2BDL) WHILE TRUE GOSUB BMX PRINT"BM=";INSTRUC;" I/s" PAUSE 25 WEND END 'Zurück in den Hostmodus. Neustart mit RETURN-Taste. ' --- Subroutinen und Funktionen -------------------------------------------- ' TOOL: BENCHMARK FÜR DIE UNIT M 2.0 oder M 1.2 (by DIE HARD) '-------------------------------------------------- ' MICRO OS V 2.00 BENCHMARK at 3.2 MHZ 10000 I/s ' MICRO OS V 2.01 BENCHMARK at 3.2 MHZ 11500 I/s '-------------------------------------------------- '-------------------------------------------------- ' UNIT M 1.1 (alt) BENCHMARK at 2 MHZ 640 I/s '-------------------------------------------------- ' UNIT M 1.2 BENCHMARK at 2.0 MHz 4088 I/s ' UNIT M 1.2(SLOW1) BENCHMARK at 2.0 MHz 618 I/s ' UNIT M 1.2(SLOW2) BENCHMARK at 2.0 MHz 704 I/s ' M 1.2(SLOW2 SERVO) BENCHMARK at 2.0 MHz 42 I/s '--------------------------------------------------- ' M 2.0 OS VERSION V 2.01 ' UNIT M 2.0 BENCHMARK at 8.0 MHz 16846 I/s ' UNIT M 2.0 SERVOMODE BENCHMARK at 8.0 MHz 17034 I/s ' UNIT M 2.0(SLOW1) BENCHMARK at 8.0 MHz 2548 I/s ' UNIT M 2.0(SLOW2) BENCHMARK at 8.0 MHz 734 I/s ' M 2.0(SLOW2 SERVO) BENCHMARK at 8.0 MHz 42 I/s '-------------------------------------------------- ' M 2.0 OS VERSION V 2.02 ' UNIT M 2.0 BENCHMARK at 8.0 MHz 18070 I/s ' UNIT M 2.0 SERVOMODE BENCHMARK at 8.0 MHz 17272 I/s '-------------------------------------------------- ' M 2.0 OS VERSION V 2.03 ' UNIT M 2.0 BENCHMARK at 8.0 MHz 23860 I/s ' UNIT M 2.0 SERVOMODE BENCHMARK at 8.0 MHz 24134 I/s '-------------------------------------------------- ' Open-Control ' Open-Maxi SLOWMODE BENCHMARK at 1.25 MHz 4174 I/s ' Open-Maxi (gebremst) BENCHMARK at 1.25 MHz 646 I/s '-------------------------------------------------- #BMX INSTRUC=0:SECOND=0 #BMXRUN for COUNTER=1 to 5 'INSTRUCTION 1 INSTRUC=INSTRUC+14 'INSTRUCTION 2 ST=ST+1 'INSTRUCTION 3 ST=ST shl 2 'INSTRUCTION 4 goto JUMP 'INSTRUCTION 5 #JUMP looktab tab,0,ST 'INSTRUCTION 6 wait ST=0 'INSTRUCTION 7 gosub JSR 'INSTRUCTION 8+9+10+11 ST=ST*10 'INSTRUCTION 12 if SECOND>0 then return 'INSTRUCTION 13 next 'INSTRUCTION 14 INSTRUC=INSTRUC+2 'INSTRUCTION a goto BMXRUN 'INSTRUCTION b #JSR LED=on:led=off:return '---------------------------------------------- table tab 0 tabend ' --- Programmende --------------------------------------------------------- Passender Link: Infosite zu den OM-Mikrocontrollern Meine Homepage: http://ccintern.dharlos.de |
Antwort schreiben |