Forum: Mikrocontroller und Digitale Elektronik Bascom-Tuning


von Norbert S. (norberts)


Lesenswert?

Moin,

ich möchte mal einen Tipp teilen.
Oft muß man ja skalieren und wenn man sich max. auf Long beschränken 
möchte (was fast immer reicht), multipliziert und teilt man dann.
Bei Long kostet das richtig Zeit, vor allem das Teilen, also ist es 
clever durch eine Zweierpotenz zu teilen und vorher entsprechend zu 
muliplizieren.
Durch eine Zweierpotenz zu teilen macht man bekanntlich mit Shift 
erheblich schneller nur leider ist Bascom da etwas doof. Bei /2 wird 
gnadenlos geteilt, was bei einer Long 839 Takte dauert.
Shift behandelt die ganze Variable, daher funktioniert das nicht so ohne 
weiteres wenn die Werte negativ werden können denn das Bit 31 bei einer 
Long (oder 15 bei Integer) ist das Vorzeichen, 1 ist Minus.
Man kann aber trotzdem extrem Zeit sparen, wenn man das Vorzeichen 
manuell mitschleppt.

Beispiel:

Dim L as Long
Dim Vorzeichen as Byte
L=-irgendwas

L=L/2
Das dauert 839 Takte

Vorzeichen = L.31
Shift L , Right
If Vorzeichen = 1 Then L = L + &H80000000
Das dauert 92 Takte, fast 10x schneller.
Bei positiven Werten sind es nur 58 Takte.

Es geht aber noch etwas flotter:
Vorzeichen = L.31
Shift L , Right
L.31 = Vorzeichen
64 Takte

Vielleicht kann ja jemand was damit anfangen.

Gruß,
Norbert

: Gesperrt durch User
von Penda (Gast)


Lesenswert?

Norbert S. schrieb:
> nur leider ist Bascom da etwas doof. Bei /2 wird
> gnadenlos geteilt, was bei einer Long 839 Takte dauert.

Versuch doch mal '\' (Backslash) als Divisionszeichen und nicht '/'.

von Norbert S. (norberts)


Lesenswert?

Hi,

@Penda: Macht keinen Unterschied.

Gruß,
Norbert

von mue_c (Gast)


Lesenswert?

Es gibt auch noch die Option signed beim Shiften.
Shift L , Right , 1 , Signed           '47 Takte

von Norbert S. (norberts)


Lesenswert?

mue_c schrieb:
> Es gibt auch noch die Option signed beim Shiften.
> Shift L , Right , 1 , Signed           '47 Takte

Cool, ich war kurz davor Marc vorzuschlagen, das mal einzubauen ;-)

Gruß,
Norbert

von H.Joachim S. (crazyhorse)


Lesenswert?

mue_c schrieb:
> Es gibt auch noch die Option signed beim Shiften.
> Shift L , Right , 1 , Signed           '47 Takte

Hm, ist aber immer noch sportlich viel, oder?

8 Takte, um aus dem RAM in Register zu laden
3 Takte call _shift
4 Takte _shift
4 Takte return
8 Takte zurück ins RAM

Interessehalber - was passiert in den restlichen 20 Takten?

von Norbert S. (norberts)


Lesenswert?

Hi,

der Overhead an Schrott ist hier manchmal echt gruselig.
Aber solange sowas wie der Tipp von @mue_c bei rumkommt - immerhin.

Gruß,
Norbert

von Norbert S. (norberts)


Lesenswert?

H.Joachim Seifert schrieb:
> mue_c schrieb:
>> Es gibt auch noch die Option signed beim Shiften.
>> Shift L , Right , 1 , Signed           '47 Takte
>
> Hm, ist aber immer noch sportlich viel, oder?
>
> 8 Takte, um aus dem RAM in Register zu laden
> 3 Takte call _shift
> 4 Takte _shift
> 4 Takte return
> 8 Takte zurück ins RAM
>
> Interessehalber - was passiert in den restlichen 20 Takten?

Hallo Jochen,

tja, keine Ahnung. Wenn ich mal zuviel Zeit habe kann ich mir das mal im 
AVR-Studio ansehen bzw. veröffentlichen.

Ist mir aber auch relativ egal. Wenn ich mit Long rechne, muß ich eben 
Zeit mitbringen. Die Zeit hat man fast immer bzw. kann sie sich nehmen.
In einer aktuellen Anwendung nutze ich z.B. Atan2, das ist Atangens über 
4 Quadranten. 8000 Takte. Das wäre in diesem Fall locker mit einer 
Tabelle zu machen, besser als 6bit Auflösung ist das Ergebnis sowieso 
nicht. Aber wozu? Der µC rennt mit 11MHz und die Hauptschleife klappert 
gemütlich mit 5ms und zählt ein Timingyte hoch. Die Rechnerei brauche 
ich nur ein paar Mal pro Sekunde, also mache ich die nur, wenn das 
Timingbyte mod 10 = 0 ist.
Ne andere umfängliche Rechnung bei timingbyte mod 10 = 1 usw...

Niemand behauptet, daß Bascom das Optimum ist aber es hat auch seine 
Vorteile.
In erster Linie ist der Ruf wegen eines Vorteils so schlecht:
Weil es so einfach ist, kommt jeder Neuling damit klar und daher tauchen 
teilweise haarsträubende Fragen auf.

Daß man mit Bascom durchaus ernsthafte Dinge anstellen kann, dürftest Du 
ja wissen ;-)
Kannst ja mal auf unsere Homepage schauen, was wir inzwischen machen. 
Alles Bascom.

Gruß,
Norbert

von Timm T. (Gast)


Lesenswert?

Norbert S. schrieb:
> Shift behandelt die ganze Variable, daher funktioniert das nicht so ohne
> weiteres wenn die Werte negativ werden können denn das Bit 31 bei einer
> Long (oder 15 bei Integer) ist das Vorzeichen, 1 ist Minus.
> Man kann aber trotzdem extrem Zeit sparen, wenn man das Vorzeichen
> manuell mitschleppt.

Häh? Genau dafür gibt es ASR

asr TEMP4
ror TEMP3
ror TEMP2
ror TEMP1

4 Takte, um verzeichenbehaftet ein Long durch 2 zu teilen. Um das noch 
zu optimieren, müsste man dann wohl einen 32-Bitter nehmen...

von Hannes L. (hannes)


Lesenswert?

Timm Thaler schrieb:
> 4 Takte, um verzeichenbehaftet ein Long durch 2 zu teilen.

Richtig.

Aber Hochsprachen halten trotz der 32 verfügbaren Register ihre 
Variablen im SRAM. Also müssen noch Register freigemacht (push/pop) 
werden, RAM in Register und wieder zurück kopiert werden.

Muss durch 256 oder 65536 geteilt werden, dann geht das auch mal ganz 
ohne Rechnen im AVR, auch in Bascom. Da castet man mittels Dim-Overlay 
einfach ein Word oder Integer byteversetzt auf ein Long:

Dim Summe As Long                  'Summe für Mittelwert Referenz
Dim Referenz As Word At Summe + 1 Overlay       'Referenz=Summe/256

Das geht auch gut zum Skalieren, indem man den Skalierfaktor zum 
gemeinen Bruch mit 256 oder 65536 im Nenner erweitert. Den Zähler (des 
Bruches) nimmt man dann als Anzahl der Aufsummierungen (bei der 
Messung), die Division erledigt dann das Casting.

...

von Guenter S. (guenter1s)


Lesenswert?

Hallo Norbert,

ich würde gerne auf Eure Homepage schauen. Wie lautet denn die URL?

Gruss

Guenter

von Läubi .. (laeubi) Benutzerseite


Lesenswert?

Bitte sachlich und beim Thema bleiben "Bascom vs X" bitte als separatem 
Thread im OT diskutieren, persönliche Anfeindungen per PN...

von Charly B. (charly)


Lesenswert?

Läubi .. schrieb:
> Bitte sachlich und beim Thema bleiben "Bascom vs X" bitte als separatem
> Thread im OT diskutieren, persönliche Anfeindungen per PN...

GLUECKWUNSCH Moderator !!!  zum TH ruinierer des Jahres


der Beitrag sieht jetzt wie von Motten zerfressen aus.........
da hat doch keiner gegen irgendwelche 'Sitten' vestossen,
wieso loescht du mehr als die Haelfte davon?, wieso zwingst du
uns deine Meinung/Einstellung auf?, meine Meinung dazu: scheisse!
(so begann es auch in den 30er Jahren)

erstellt 04082013/23:15 , mal sehen die lang der Beitrag ueberlebt...

von Karl H. (kbuchegg)


Lesenswert?

Charly B. schrieb:
> Läubi .. schrieb:
>> Bitte sachlich und beim Thema bleiben "Bascom vs X" bitte als separatem
>> Thread im OT diskutieren, persönliche Anfeindungen per PN...
>
> GLUECKWUNSCH Moderator !!!  zum TH ruinierer des Jahres
>
>
> der Beitrag sieht jetzt wie von Motten zerfressen aus.........
> da hat doch keiner gegen irgendwelche 'Sitten' vestossen,


Doch.

> wieso loescht du mehr als die Haelfte davon?

Weil er es für richtig erachtet hat. Und ich teile seine Meinung.

>, wieso zwingst du
> uns deine Meinung/Einstellung auf?

Weil wir Moderatoren vom Forumsbetreiber dazu ernannt wurden, auf 
Threads ein Auge zu werfen. Genau solche Zwischenmeldungen, wie sie in 
diesem Thread aufgetaucht sind, wollen wir hier nicht haben. Das muss 
dir nicht gefallen - auch gut. Keiner zwingt dich hier zu posten oder zu 
lesen.

>, meine Meinung dazu: scheisse!
> (so begann es auch in den 30er Jahren)

Lern erst mal Geschichte.


> erstellt 04082013/23:15 , mal sehen die lang der Beitrag ueberlebt...

Überleben wird er. Immerhin bietet er ja so wie er ist nützliche 
Information. Lediglich das "Meine Sprache ist besser als deine und deine 
Sprache ist Scheisse"-Bashing wurde rausgelöscht.

Dieser Beitrag ist gesperrt und kann nicht beantwortet werden.