XC8 Optimalizace 2, proc nefunguje spravne v preruseni.

Ondřej Janovský ondrej.janovsky na alarex.cz
Středa Listopad 3 15:37:49 CET 2021


Kde jinde se BT_conrequest nastavuje na 0? Je v tu dobu zakázáno 
přerušení od komunikační periferie? Protože se mi už parkrát stalo, že 
to bylo moc rychlé a nuloval jsem si to v hlavní smyčce v době, kdy 
přicházelo další přerušení.

Oja

Dne 03. 11. 21 v 15:03 Libor Konečný napsal(a):
> Dekuji volatile funguje jak ma, ale...
>
> Kompilator to skousal spravne. Vysledny asm pro interput funkci je 
> shodny, ale promenna s BT_conrequest se nenastavi na 1.
>
> Kdyz si vypisu text ktery je  v poli xBTCON1 tak je shodny s prichozim 
> testovanym.
>
> Zvlastni je ze se pole FIFORX naplni tim spravnym odchytnutym retezcem.
>
> Tak me napadlo ty texty nedat do RAM ,ale dat je jako const tedy ROM 
> cpu a BINGO, funguje.
>
> Chapal bych , kdyby to optimalizace nejak vyhodila z poli.
>
> Ale pole v RAMce  BYTE xBTCON1 obsahuje korektni testovaci terezec 
> (BTCONNECT) a  tento retezec je pak i v RXFIFO nic se tedy nemeni, 
> neprepisuje.
>
> Podminka se ale neprovede.
>
> Pokud dam retezec xBTCON1 jako const v  ROM  tak to funguje.
>
> Ja jsem prave chtel retezce mit v RAM kvuli rychlosti toho testovani v 
> preruseni.
>
> V interuptu mam test na 10 retezcu a hapruje jen tento az od urcite 
> velikosti kodu.
>
> Je mozny problem pri pouziti retezcu v poli  v RAM misto ROM ?
>
> Cim to muze byt ?
>
> LK
>
> Dne 03.11.2021 v 13:54 Ondřej Janovský napsal(a):
>> A ještě pěkné předvedení:
>>
>> https://stackoverflow.com/a/21297642
>>
>> Oja
>>
>> Dne 03. 11. 21 v 13:51 Ondřej Janovský napsal(a):
>>> Mě pomohlo magické volatile .
>>>
>>> https://stackoverflow.com/a/31996980
>>>
>>> Oja
>>>
>>> Dne 03. 11. 21 v 13:29 Libor Konečný napsal(a):
>>>> Zdravim odborniky na kompilator XC8 a prosim o posledni radu.
>>>>
>>>> Presel jsem na nej kratce z pocatecnim nadsenim, ale nyni me 
>>>> zarazila optimalizace.
>>>>
>>>>
>>>> Pokud ji mam nastaveno na  1 (tzn vyhodi z kodu jen nepouzivane 
>>>> funkce)  tak kod (nize funguje)  ale s optimalizaci 2 , ktera kod 
>>>> upravuje mi to nefunguje.
>>>>
>>>> Mam v interruptu mimojine tuto funkci:
>>>>
>>>> if (intrbyte==xBTCON1[bt1_pos]) {bt1_pos++; } else bt1_pos=0;
>>>>      if (bt1_pos==14) {
>>>>                      bt1_pos=0;
>>>>                       BT_conrequest=1;
>>>>                       }
>>>>
>>>>    fillRXFIFO[idx++]=intrbyte;
>>>>
>>>> v xBTcon1 je RAm retezec, intrbyte je byte zachyceny z preruseni 
>>>> UARTU.
>>>>
>>>> FillRSFIFO je  pole do ktereho se uklada vsehcno a jedou za cas se 
>>>> precte.
>>>>
>>>> Tedy snazim se odcyhtit  se  dany retezec a pokud se vyskytne 
>>>> nastavi promennou   BT_conrequest=1
>>>>
>>>> Pri mensim kodu (cca 90KB) to fungovalo, nyni pri 124KB (z 
>>>> celkovych 131KB)  se to chova tragicky.
>>>>
>>>> A to tak, ze retezec prijde  (na 100%)  ale BT_connreqest se 
>>>> nenastavi.
>>>>
>>>> Je zahadou ze kdyz prectu pole fillRXFIFO, tak v nem sew retezec 
>>>> nachaci.
>>>>
>>>> Pri optimalicaci 1 to funguje, pri optimalizaci 2 to funguje jen 
>>>> pri mensim kodu.
>>>>
>>>> Uvadim asm list s optimalizaci 1
>>>>
>>>> if (intrbyte==xBTCON1[bt1_pos]) {bt1_pos+
>>>>       +                          +; } else bt1_pos=0;
>>>>  95991  01AEE4  0E78                   movlw    low _xBTCON1
>>>>  95992  01AEE6  2528                   addwf _bt1_pos& (0+255),w,b
>>>>  95993  01AEE8  6ED9                   movwf    fsr2l,c
>>>>  95994  01AEEA  6ADA                   clrf    fsr2h,c
>>>>  95995  01AEEC  0E06                   movlw    high _xBTCON1
>>>>  95996  01AEEE  22DA                   addwfc    fsr2h,f,c
>>>>  95997  01AEF0  5192                   movf _intrbyte& (0+255),w,b
>>>>  95998  01AEF2  18DE                   xorwf    postinc2,w,c
>>>>  95999  01AEF4  A4D8                   btfss    status,2,c
>>>>  96000  01AEF6  D002                   goto    i2l41145
>>>>  96001
>>>>  96002                           ; BSR set to: 2
>>>>  96003  01AEF8  2B28                   incf    _bt1_pos& (0+255),f,b
>>>>  96004  01AEFA  D002                   goto    i2l41147
>>>>  96005  01AEFC                     i2l41145:
>>>>  96006
>>>>  96007                           ; BSR set to: 2
>>>>  96008  01AEFC  0E00                   movlw    0
>>>>  96009  01AEFE  6F28                   movwf _bt1_pos& (0+255),b
>>>>  96010  01AF00                     i2l41147:
>>>>  96011
>>>>  96012                           ; BSR set to: 2
>>>>  96013                           ;main.c: 3051: if (bt1_pos==14) 
>>>> {bt1_pos=0;
>>>>  96014  01AF00  0E0E                   movlw    14
>>>>  96015  01AF02  1928                   xorwf _bt1_pos& (0+255),w,b
>>>>  96016  01AF04  A4D8                   btfss    status,2,c
>>>>  96017  01AF06  D004                   goto    i2l41151
>>>>
>>>>
>>>> A s optimalizaci 2
>>>>
>>>> if (intrbyte==xBTCON1[bt1_pos]) {bt1_pos++; } else bt1_pos=0;
>>>>  95092  01A8E2  0E8C                   movlw    low _xBTCON1
>>>>  95093  01A8E4  0102                   movlb    2    ; () banked
>>>>  95094  01A8E6  252A                   addwf _bt1_pos& (0+255),w,b
>>>>  95095  01A8E8  6ED9                   movwf    fsr2l,c
>>>>  95096  01A8EA  6ADA                   clrf    fsr2h,c
>>>>  95097  01A8EC  0E06                   movlw    high _xBTCON1
>>>>  95098  01A8EE  22DA                   addwfc    fsr2h,f,c
>>>>  95099  01A8F0  0101                   movlb    1    ; () banked
>>>>  95100  01A8F2  51F4                   movf _intrbyte& (0+255),w,b
>>>>  95101  01A8F4  18DE                   xorwf    postinc2,w,c
>>>>  95102  01A8F6  A4D8                   btfss    status,2,c
>>>>  95103  01A8F8  D003                   goto    i2l59157
>>>>  95104
>>>>  95105                           ; BSR set to: 1
>>>>  95106  01A8FA  0102                   movlb    2    ; () banked
>>>>  95107  01A8FC  2B2A                   incf    _bt1_pos& (0+255),f,b
>>>>  95108  01A8FE  D003                   goto    i2l59159
>>>>  95109  01A900                     i2l59157:
>>>>  95110
>>>>  95111                           ; BSR set to: 1
>>>>  95112  01A900  0E00                   movlw    0
>>>>  95113  01A902  0102                   movlb    2    ; () banked
>>>>  95114  01A904  6F2A                   movwf _bt1_pos& (0+255),b
>>>>  95115  01A906                     i2l59159:
>>>>  95116
>>>>  95117                           ; BSR set to: 2
>>>>  95118                           ;main.c: 2992: if (bt1_pos==14) 
>>>> {bt1_pos=0;
>>>>  95119  01A906  0E0E                   movlw    14
>>>>  95120  01A908  192A                   xorwf _bt1_pos& (0+255),w,b
>>>>  95121  01A90A  A4D8                   btfss    status,2,c
>>>>  95122  01A90C  D004                   goto    i2l59163
>>>>  95123
>>>>
>>>>
>>>>
>>>> Rozdil je v pridani movlb 2  (asi pouzivani RAM banky 2)
>>>>
>>>> Otazka je proc to nechce spilnit tu podminku if 
>>>> (intrbyte==xBTCON1[bt1_pos]
>>>>
>>>>
>>>> Delam neco spatne, nebo se mam smirit s kodem bez optimalizace ?
>>>>
>>>> Diky moc
>>>>
>>>> LK
>>>>
>>>>
>>>>
>>>>
>>>>
>>>>
>>>>
>>>>
>>>>
>>>> _______________________________________________
>>>> HW-list mailing list  -  sponsored by www.HW.cz
>>>> Hw-list na list.hw.cz
>>>> http://list.hw.cz/mailman/listinfo/hw-list
>>>
>>>
>>> _______________________________________________
>>> HW-list mailing list  -  sponsored by www.HW.cz
>>> Hw-list na list.hw.cz
>>> http://list.hw.cz/mailman/listinfo/hw-list
>>
>>
>> _______________________________________________
>> HW-list mailing list  -  sponsored by www.HW.cz
>> Hw-list na list.hw.cz
>> http://list.hw.cz/mailman/listinfo/hw-list
> _______________________________________________
> HW-list mailing list  -  sponsored by www.HW.cz
> Hw-list na list.hw.cz
> http://list.hw.cz/mailman/listinfo/hw-list




Další informace o konferenci Hw-list