Autor |
Ausführungszeit von Befehlen in BASCOM |
|
|
|
|
BID = 585722
E-P-S Neu hier

Beiträge: 32 Wohnort: Neuruppin
|
|
Hallo zusammen. Um mein Problem zu beschreiben, zunächst was ich hier habe.
Mein ATMEGA8 steuert eine Reihe von Schieberegistern (CMOS 4094) an. Er ist mit 7,3728MHz getaktet.
Das Schieben der Bits nehme ich von Hand vor, d.h. nicht mit SPI o.ä. sondern durch selbstständiges schalten der Ports.
Das ganze ist als Ring aufgebaut, d.h. wenn ich Daten in die Schieberegister hineinschiebe, lese ich gleichzeitig an deren Ende die Daten wieder in den AVR ein.
Alles funktioniert auch wie es soll und bei einem CMOS komme ich auf ~11000 Zyklen pro Sekunde.
Komisch ist nun folgendes. Habe ich 2 CMOS dran, sind es nur noch ~ 5300 Zyklen und bei 3 noch ~4000 Zyklen.
Das ist eindeutig zu wenig und ich wollte nun gerne bestimmen wo mir hier Zeit verloren geht.
Ich programmiere in BASCOM und meine Frage ist: "Wie kann ich die Ausführungszeiten von Befehlen, bzw. Programmzeilen, messen. ODER: Bei was in BASCOM geht viel zeit verloren (Arrays, Funktionen etc.)?"
Die angebotenen Timer (z.B. SysSec) beziehen sich nur auf Sekunden - was etwas zu langsam ist.
hier noch der entsprechende Codeausschnitt:
Code : |
Set Mb_strob 'Strobe auf LOW
Reset Mb_clock 'Clock auf LOW
Reset Mb_d_out 'Daten auf LOW
For I = 7 To 0 Step -1
If Nbyte.i = 1 Then
Set Mb_d_out 'Datenausgang auf HIGH
Else
Reset Mb_d_out 'Datenausgang auf LOW
End If
Set Mb_clock 'Clock AUF HIGH
Retbyte.i = Mb_d_inp 'Dateneingang auslesen
Reset Mb_clock 'Clock auf LOW
Next |
|
Der Code schiebt immer 1 Byte raus, während er 1 Byte einliest. Das ganze ist in einer Funktion an die das zu sendende Byte übergeben wird und die mir das empfangene zurück gibt. Lasst euch durch das LOW/HIGH nicht täuschen, die nachgeschaltete Elektronik invertiert mir einige Signale.
Ich bedanke mich schon einmal ganz herzlich.
|
|
BID = 585735
perl Ehrenmitglied
       
Beiträge: 11110,1 Wohnort: Rheinbach
|
|
Zitat :
| Alles funktioniert auch wie es soll und bei einem CMOS komme ich auf ~11000 Zyklen pro Sekunde. | Ich denke, wenn du Assembler schreibst, kannst du auch 4 Register mit der 10-fachen Geschwindigkeit versorgen.
Es ist nicht ungewöhnlich, dass bei solchen Hochsprachen ein paar hundert Befehle abgearbeitet werden, wofür der Assemblerprogrammierer vielleicht 1..5 Instruktionen braucht.
_________________
Haftungsausschluß:
Bei obigem Beitrag handelt es sich um meine private Meinung.
Rechtsansprüche dürfen aus deren Anwendung nicht abgeleitet werden.
Besonders VDE0100; VDE0550/0551; VDE0700; VDE0711; VDE0860 beachten ! |
|
BID = 585777
E-P-S Neu hier

Beiträge: 32 Wohnort: Neuruppin
|
Tja, da ist was dran, nur ist der gesamte Quellcode des Programms schon recht groß und meine Assembler Kenntnisse sind nicht die besten....
|
BID = 585801
BjörnB Stammposter
    Beiträge: 242 Wohnort: Dortmund
|
Hallo,
wenn Du mehr als ein Schieberegister verwendest dann reicht für die zu schreibenden Daten nicht mehr ein Byte, sondern Du brauchst einen größeren Datentyp, z.B. Int32. Intern wird Int32 aber z.B. als 4 einzelne Bytes verarbeitet, eine Addition dauert nun z.B. nicht mehr einen sondern vier Takte.
Liefert BASCOM kein Assembler-Listing wie etwa WinAVR es macht? So könnte man sich mal anschauen, was intern wirklich passiert, wobei das bei großen Programmen nicht ganz einfach ist, wenn man nicht fit in Assembler ist.
Schöne Grüße,
Björn
|
BID = 585802
perl Ehrenmitglied
       
Beiträge: 11110,1 Wohnort: Rheinbach
|
Dann schau doch mal mit dem Simulator dem Maschinenprogramm bei der Arbeit zu.
Dann wirst du schon sehen, wo der Prozessor soich die meiste Zeit rumtreibt.
So schöne Tools gabs früher nicht, da musste man sich vorher Gedanken machen wie man ein Programm schreibt.
Ich habe aber einen Verdacht:
Vertausch doch mal die beiden Befehle
Retbyte.i = Mb_d_inp 'Dateneingang auslesen
Reset Mb_clock 'Clock auf LOW
Die Daten sind ja auch noch nach der fallenden Taktflanke am Ausgang vorhanden.
Evtl. baut das Programm wegen des zwischen Set/Reset eingeschobenen Ladebefehls die ganze Adressierung für den Port wieder neu auf.
Besonders aber die veränderliche Bitadressierung in der Schleife dürfte ziemlich rechenintensiv sein, weil da vermutlich jedesmal eine neue Testmaske aufgebaut wird.
Es geht bestimmt schneller, wenn du das betreffende Byte einfach rotierst oder schiebst und jedesmal nur das Bit 0 oder Carry ausgibst.
Ausserdem ist die IF/Else Konstruktion bestimmt zeitraubend.
Kannst du nicht einfach das Bit in den Port kopieren, ohne erst festzustellen, ob es eine 1 oder 0 ist ?
_________________
Haftungsausschluß:
Bei obigem Beitrag handelt es sich um meine private Meinung.
Rechtsansprüche dürfen aus deren Anwendung nicht abgeleitet werden.
Besonders VDE0100; VDE0550/0551; VDE0700; VDE0711; VDE0860 beachten !
|
BID = 585857
ElektroNicki Inventar
     
Beiträge: 6429 Wohnort: Ugobangowangohousen
|
Offtopic :
|
Zitat :
E-P-S hat am 4 Feb 2009 17:59 geschrieben :
|
7,3728MHz
|
Warum zum Geier so ne krumme Zahl? |
_________________
|
BID = 585858
DonComi Inventar
     
Beiträge: 8605 Wohnort: Amerika
|
Offtopic :
| Wen interessierts? |
Schau dir mal die Instruktionen bld und bst an, damit kannst du, wie perl angedeutet hat, die Bits einfach an die Bestimmungsposition kopieren, ohne sie testen zu müssen. Dazu braucht es dann nicht mal mehr eine Maskierung. Nur eine weitere Schiebeinstruktion.
_________________
|
BID = 585859
perl Ehrenmitglied
       
Beiträge: 11110,1 Wohnort: Rheinbach
|
Das dürfte mit dem Takt für die seriellen Übertragungen zusammenhängen.
Prüf mal ob das ein Vielfaches von 1200, ..., 9600, ..., 115,2 kBaud ist.
_________________
Haftungsausschluß:
Bei obigem Beitrag handelt es sich um meine private Meinung.
Rechtsansprüche dürfen aus deren Anwendung nicht abgeleitet werden.
Besonders VDE0100; VDE0550/0551; VDE0700; VDE0711; VDE0860 beachten !
|
BID = 585861
ElektroNicki Inventar
     
Beiträge: 6429 Wohnort: Ugobangowangohousen
|
Hmm, bremst Koffein jetzt auf einmal das Gehirn?
Offtopic :
| Hatte Ohrenweh und die Wirkung vom Ibuprofen mit etwas Schokakola erhöht |
Hast Recht, 7,3728/64=0,1152
_________________
|
BID = 585880
E-P-S Neu hier

Beiträge: 32 Wohnort: Neuruppin
|
Die krumme Taktzahl kommt daher das ich den AVR am PC habe und so eine Fehlerfreie Kommunikation hinbekomme - richtig erkannt.
Ich werde mir die Ratschläge zu herzen nehmen - ich danke euch erstmal für die vielen Tipps.
|