Hallo zusammen,
ich bin gerade dabei mir eine 32-Kanal Soft-PWM in C zusammen zu bauen.
Insgesamt funktioniert der Code auch schon, aber ich hab mir dann mal
das Assembler-Listing angeguckt und gesehen, daß da noch
Verbesserungspotenzial ist, nur weiß ich leider nicht, wie ich das
umsetzen kann.
Insgesamt läuft es ungefähr so, wie in dem Artikel hier zur Soft-PWM:
in der ISR einen Zähler hochzählen, und dann von jedem Kanal den
PWM-Wert mit dem Zähler vergleichen und ein Bit setzen/löschen.
Das sieht in C (am Beispiel von nur zwei Kanälen) so aus:
1 | if(IRQ_Counter < Brightness[1]) Shift_Register[0] |= 0x02;
|
2 | if(IRQ_Counter < Brightness[2]) Shift_Register[0] |= 0x04;
|
3 | ...
|
und in Assembler:
1 | lds r24,IRQ_Counter
|
2 | lds r25,Brightness+1
|
3 | cp r24,r25
|
4 | brsh .L49
|
5 | ori r19,lo8(2)
|
6 | sts Shift_Register,r19
|
7 | .L49:
|
8 |
|
9 | lds r24,IRQ_Counter
|
10 | lds r25,Brightness+2
|
11 | cp r24,r25
|
12 | brsh .L50
|
13 | ori r19,lo8(4)
|
14 | sts Shift_Register,r19
|
15 | ...
|
Insgesamt "relativ" klar. Aber man sieht ja z.B., daß jedes mal der
ISR-Zähler in r24 kopiert wird. Es würde doch reichen, das ein einziges
Mal zu machen.
Auch könnte man den Wert in r19 doch stehen lassen, und erst ganz zum
Schluß ein einziges mal nach "Shift_Register" kopieren.
Aber ich frag mich, wie ich diese Dinge in mein Programm gebastelt
kriege o_O . Oder kann man den C-Sourcecode so umstellen, daß der
Compiler das besser hinkriegt?
Danke schonmal,
Grüße!