Cecko pro PICe
Lukas Grepl
L.Grepl@sh.cvut.cz
Středa Říjen 26 11:02:31 CEST 2005
>>Skusim. Taky jsem to skousel pres ty posuny ale vysledny kod je silene
>>dlouhy....
> A mate zapnute (vsechny) optimalizace? Nezkousel jsem uvedene priklady,
> ale obecne ma tohle PICC docela zvladnute, takze kod jako
>
> if ((a >> 6) & 1)
> ...;
>
> preklada jako "btfsX a, 64" apod. Zkusim to ve volne chvilce nacpat do
> prekladace, jak se s tim popere.
No, tak mi to nedalo a zkusil jsem prelozit ty ruzne varianty. Musim
priznat, ze me kompilator zklamal, kdyz nepochopil (rozumnejte:
nezoptimalizoval) ty tvary jako RB1 = data >> 4; a RB1 = u.bits.b4;.
Zbytek prelozil zhruba tak jak se dalo ocekavat:
------------------------------------------
void zapis1(char data)
{
RB1 = RB2 = RB4 = RB5 = 0;
if (data & (1 << 4))
RB1 = 1;
...
testbits.c: 5: RB1 = RB2 = RB4 = RB5 = 0;
bcf 6,5
bcf 6,4
bcf 6,2
bcf 6,1
;testbits.c: 6: if (data & (1 << 4))
btfsc ?a_zapis1,4
;testbits.c: 7: RB1 = 1;
bsf 6,1
------------------------------------------
void zapis2(char data)
{
RB1 = data & 16 ? 1 : 0;
...
;testbits.c: 18: RB1 = data & 16 ? 1 : 0;
btfss ?a_zapis2,4
goto u50
bsf 6,1
goto u64
u50
bcf 6,1
u64
Identicky kod generuje i pro zapisy ve stylu:
RB1 = (data & 16) > 0;
RB1 = (data & 16) != 0;
RB1 = !!(data & 16);
RB1 = (data & 16) == 16;
------------------------------------------
void zapis3(char data)
{
RB1 = data >> 4;
RB2 = data >> 5;
...
testbits.c: 26: RB1 = data >> 4;
swapf ?a_zapis3,w
andlw 15
movwf btemp
rrf btemp,w
btfss 3,0
goto u130
bsf 6,1
goto u144
u130
bcf 6,1
u144
;testbits.c: 27: RB2 = data >> 5;
bcf 3,5
movf ?a_zapis3,w
movwf btemp
movlw 5
movwf btemp+1
u155
bcf 3,0
rrf btemp
decfsz btemp+1
goto u155
movf btemp,w
movwf btemp
rrf btemp,w
btfss 3,0
goto u160
bsf 6,2
goto u174
u160
bcf 6,2
u174
Ten prvni radek jeste tak-nejak zoptimalizoval, ten druhy je uz je uplna
tragedie... Variantu s unionem prelozil dost podobne, akorat nikde nedal
cykly, takze je ten kod "o neco efektivnejsi" - napr.:
;testbits.c: 40: RB4 = u.bits.b6;
bcf 3,5
swapf ?a_zapis4+1,w
movwf btemp
rrf btemp
rrf btemp,w
andlw 1
movwf btemp
rrf btemp,w
btfss 3,0
goto u280
bsf 6,4
goto u294
u280
bcf 6,4
u294
------------------------------------------
No a na zaver fce p.Hanzala v mem prekladu do C, po drobnych korekcich,
v puvodnim zneni s titulky:
;testbits.c: 52: void zapis6(char data)
;testbits.c: 53: {
_zapis6
; _data assigned to ?a_zapis6+0
_zapis6$data set ?a_zapis6
;_data stored from w
bcf 3,5
movwf ?a_zapis6
;testbits.c: 54: data = (data >> 4) + (data << 4);
swapf ?a_zapis6
;testbits.c: 55: data <<= 1;
bcf 3,0
rlf ?a_zapis6
;testbits.c: 56: PORTB ^= (PORTB ^ (data + (data & 0x18))) & 0x36;
movf ?a_zapis6,w
andlw 24
addwf ?a_zapis6,w
xorwf 6,w ;volatile
andlw 54
xorwf 6 ;volatile
;testbits.c: 57: }
return
S tou s poradil slusne - az na drobne detaily se temer nelisi od originalu:
> swapf data,f
> rlf data,w
> movwf temp
> andlw 0x18
> addwf temp,w
> xorwf portb,w
> andlw 0x36
> xorwf portb,f
Vse kompilovano s -Zg9 -O -S -16F84 (maximalni globalni optimalizace,
assembler opt., vystup v asm, PIC16F84).
V priloze je kod toho testovaciho programku - zkuste to nekdo pro
srovnani ve svem oblibenem kompilatoru...
Lukas Grepl
------------- další část ---------------
An embedded and charset-unspecified text was scrubbed...
Name: testbits.c
Url: http://list.hw.cz/pipermail/hw-list/attachments/20051026/f8476b1b/attachment.txt
Další informace o konferenci Hw-list