Hallo zusammen,
ein kleines Update der beschriebenen Problematik
"Multiplikation verhindern"
Ich wollte eben einen kleines PIC Progrämmchen schreiben
und bin unter anderem wieder über die Multiplikation mit 3 gestoßen.
Der ursprünglich "erfolgreiche" Code mit
count = (count << 1) + count;
war ja am kürzesten,
doch plötzlich weigert sich der Compiler einen entsprechenden Code zu erzeugen.
er benutzt generell ein Unterprogramm mit einer Multiplikation...
Nach einigem herumprobieren habe ich nun festgestellt, dass ich eine neue Version vom XC8 auf dem Rechner habe
und genau da liegt das Problem.
V2.00 erzeugt "guten" kompakten Code
V2.10 ungünstig, Berechnung generell über Unterprammaufruf Multiplikation
V2.20 ungünstig, Berechnung generell über Unterprammaufruf Multiplikation
Ich habe es auch mit verschiedenen Optimierungseinstellungen probiert,
leider bisher ohne Erfolg.
Anbei:
hat sich auch mein Ausschiebecode für meine RGB LEDs verändert und funktioniert auch nicht mehr.
Hier treten plötzlich erheblich längere Zeiten auf, weil der erzeugt Code anders und langsamer ist.
Das stellt natürlich generell ein riesen Problem dar:
Wenn man solch zeitkritischen Code in C (oder generell in einer Hochsprache) implementiert
weiss man nicht was der Compiler daraus macht.
Durch ein Compilerupdate hat dies unter Umständen katastrophale Folgen.
Im Prinzip holt mich ein "ehemaliges" Problem wieder ein. Siehe Thread:
https://www.roboternetz.de/community...line-Assembler
Da hatte ich meinen Assembler Code in C umgesetzt....
Code:
Compiler ist der XC8 Version V2.00
! // damit keine Multiplikation verwendet wird:
! count = (count << 1) + count; // 3 Bytes pro Led RGB
0x463: LSLF count, W
0x464: ADDWF count, W
0x465: MOVWF __pcstackCOMMON
0x466: MOVF __pcstackCOMMON, W
0x467: MOVWF count
-------------------
Compiler ist der XC8 Version V2.10
79: // damit keine Multiplikation verwendet wird:
80: count = (count << 1) + count; // 3 Bytes pro Led RGB !! er nimmt einen Multiplikations
001F 3003 MOVLW 0x3
0020 00C6 MOVWF 0x46
0021 0846 MOVF 0x46, W
0022 00C2 MOVWF multiplicand
0023 084B MOVF count, W
0024 20A4 CALL 0xA4
0025 00C7 MOVWF 0x47
0026 0847 MOVF 0x47, W
0027 00CB MOVWF count
------------------------------
Compiler ist der XC8 Version V2.20
305: // damit keine Multiplikation verwendet wird:
306: count = (count << 1) + count; // 3 Bytes pro Led RGB
03A9 3003 MOVLW 0x3
03AA 00F4 MOVWF i
03AB 0874 MOVF i, W
03AC 00F0 MOVWF __pcstackCOMMON
03AD 087A MOVF count, W
03AE 3185 MOVLP 0x5
03AF 25D0 CALL 0x5D0
03B0 3183 MOVLP 0x3
03B1 00F5 MOVWF counter
03B2 0875 MOVF counter, W
03B3 00FA MOVWF count
Siro
Lesezeichen