Chyba kompilatoru MPLAB XC8 - zmena usporiadania inštrukcií

Cawte, som tu novy, ale venujem sa programovaniu microchip procesorov niekolko rokov. Doteraz stale iba vyvojove prostredie MPLAB a jazyk assembler, ale ked moje projekty zacali naberat na riadkoch (2500), stal sa kod menej prehladnym a je problem kod udrziavat a menit funkcionalitu. Rozhodol som sa pre vyvojove prostredie MPLABX (1.85) s kompilatorom XC8 (1.20) a teda jazyk C. Po niekolkych problemoch zo zaciatku som sa rozbehol, ale nasledne som sa hned zastavil. Akonahle som napisal trosku viac riadkov, nastal problem. Pekne ho vidno pri plneni pola udajmi, ktore chcem zobrazit na displayi. Predpokladam, ze kompilator nejako “zblbol”, alebo je zle nastaveny, ale nehadze mi validne riadky a ich adresy. Pre nazornost prikladam cast prelozeneho kodu:

23: data[6] = 0x65;
07CC 3065 MOVLW 0x65
07CE 00AC MOVWF 0x2C
07D0 01AD CLRF 0x2D
24: data[7] = 0x01;
07D1 01AE CLRF 0x2E
07D2 0AAE INCF 0x2E, F
07D3 01AF CLRF 0x2F
25: data[8] = 0xFFF;
07CF 30FF MOVLW 0xFF
07D4 00B0 MOVWF 0x30
07D5 300F MOVLW 0xF
07D6 00B1 MOVWF 0x31

Vyznacene miesta su adresy, ktore niesu vobec usporiadane, ale skacu “hore dole”. Pri debugacii sa stava, ze z instrukcie “data[6] = 0x65;” to skoci na instrukciu “data[8] = 0xFFF;”, potom spet na prvu a nasledne na instrukciu medzi nimi. Koresponduje to s PCLATH:PCL, kontroloval som to a prepocitaval. Ako je mozne, ze mi kompilator kompiluje taketo bludy? Dakujem pekne za pomoc.

:arrow_right: administrator: přejmenováno z "Chyba kompilatoru xc8?"

To bude kvůli optimalizaci - při debuggování si optimalizaci vypni. Kompilátor se při optimalizaci rozhoduje sám o pořadí operací a pokud to nenarušuje funkčnost kódu, může se lišit od zdrojáku, takže pak skáče. Např. si inicializuje nějakou proměnnou během ukládání jiné proměnné. Při optimalizaci nelze obvykle jednoznačně přiřadit řádek zdrojáku k adrese programu, debugger pak může zdánlivě nesmyslně skákat (neví který řádek zobrazit) a listing neodpovídá řádku.

Tvůj výpis vypadá docela v pořádku, jenom nastavil (kvůli optimalizaci) W na 0xff hned po naplnění data[6] a ne po data[7], což je funkčně v pořádku.

Diky moc za odpoved, mohlo by to byt tak, ako pises. Akoze kod v procesore ide pravdepodobne v poriadku (odzaciatku ma zmiatlo opakovanie “main” metody, bol som zvyknuty po ukonceni vykonavania ze sa procesor “zastavi”), skusal som nejake vypisy na displayi a bolo to OK. Ale debugacia je pre mna dolezity nastroj pri vyvoji aplikacii, co mi uz usetrilo vela casu a nervov. Mozes mi ale poradit, kde by som toto konkretne nastavenie nasiel? Hladal som to, ale nejako mi to uslo. Dakujem este raz.

Tenhle překladač neznám (ani nedělám s PICy), tak s vypnutím optimalizace bohužel neporadím. Ale možná pomůže tohle:

you should use “–OPT=none” param in build options, to add this param from MPlab Project->Build options->Global

Vidim v nastaveniach, ze je tam “–opt=default”, ale nikde nevidim vypnutie tejto funkcie. Mam tam iba nastavenia tejto optimalizacie, nie moznost jej vypnutia.

EDIT: Ak som vsetky policka pri optimalizacii odskrtol, mam tam sice prepinac --opt=default, ale debugger funguje normalne. Vedlajsi efekt => trosku viac miesta zabera projekt v pameti procesora, ale to je predpokladam normalne. Dakujem za pomoc, pri preklade do procesora optimalizaciu zapnem s dovodu setrenia pamete.