Strana 1 z 1
While loop podmienka inorovana
Napísané: 02 Okt 2022, 02:07
od používateľa romiadam
Ahojte,
MPLAB X IDE v5.50
zase "som na pokraji psychyckeho zrutenia sa"
, lebo uz od 21:00 do 0:30 sa snazim zistit preco while loop podmienka je ignorovana aj v simulatore a aj v online debugu k pripojenemu MCU. Po dlhom hladani na internete ze co robim zle som nic nezistil. Teraz cca o 0:00 som sposobom pokus omyl zistil, ze ak je v podmienke while loop 8bit cislo, tak to funguje. Ak tam ale dam 16, 24 alebo 32 bitove cislo tak je cela podmienka ignorovana a preskoci sa cely while loop akoby podmienka vo while loop bola fail a pritom je true, nakolko hodnota registra je 2 a to je vacsie ako 0.
Kód: Vybrať všetko
//temp1 = 2; // temp1 8-bit while podmienka OK
//temp2 = 2; // temp2 16bit while podmienka ignorovana
//temp3 = 2; // temp3 24bit while podmienka ignorovana
temp4 = 2; // temp4 32bit while podmienka ignorovana
//while (temp1 > 0)
//while (temp2> 0)
//while (temp3> 0)
while (temp4> 0)
{
dalsie instrukcie
}
Skusal som aj to ze cislo 2 som nahradil cislom 512, nech LSB byte je 0000 0000 ale ziadna zmena. Stale ignorovana podmienka.
Tiez som vyskusal, ze 16bit temp2, co nefungovalo som predeklaroval na 8bit cislo a uz to fungovalo.
Tiez som vyskusal, ze while som prepisal na if a v podmienke bolo 16bit cislo temp2 a s if to funguje aj pri 16bit.
Kód: Vybrať všetko
temp2 = 2; // temp2 16bit if podmienka OK.
if (temp2> 0)
{
dalsie instrukcie
}
Este som skusil namiesto uint16_t deklarovat len ako int (16bit), ale to iste, podmienka ignorovana.
Co tu robim zle? Preco mi to berie len podmienku s 8bit cislom? While nedokaze spracovat podmienku s registrom vacsim ako 8 bitov? To sa mi zda ako blbost.
Diki vopred za rady.
Re: While loop podmienka inorovana
Napísané: 02 Okt 2022, 08:52
od používateľa Mek
Zahadny problem.
Skus to obist takto:
Re: While loop podmienka inorovana
Napísané: 02 Okt 2022, 10:09
od používateľa peterple
Zase nás húpeš. Čo máš zle netuším ale toto fungovať musí a aj to samozrejme funguje.
Re: While loop podmienka inorovana
Napísané: 02 Okt 2022, 12:26
od používateľa romiadam
Mek,
diki za typ, neberie to, aj s tym to preskoci
peterple.
keby som vas hupal, bol by som rad, lebo by to aspon islo, ale to by som si nedovolil.
Vsak sa pozri tu:
https://youtu.be/QOa261-GJmQ
Re: While loop podmienka inorovana
Napísané: 02 Okt 2022, 13:12
od používateľa peterple
Nuž takto z vonka to naozaj tak vyzerá. V takomto prípade je tam okno dissasemmbly a prekrokujem si to tam a potom zistím kde je pes zakopaný. Zatiaľ som si všimol jediného rozdielu a to je adresa premennej. Ako som písal dávnejšie nepoznám moc PIC ale viem že sa tam používa stránkovanie tak môže byť problém v tom že si myslí že adresuje nejakú stránku a v skutočnosti adresuje nejakú inú. A to napríklad preto že si použil nejaký špeciálny register na niečo s čím kompilátor nerátal.
Skús si urobiť čistý while v main ako som to urobil ja. Neverím že to nepôjde.
Re: While loop podmienka inorovana
Napísané: 02 Okt 2022, 14:06
od používateľa romiadam
Na to okno disassembly som uplne zabudol. Pozriem to tam ked budem doma a dam vediet.
A vyskusam to aj v main loope.
Zatiaľ som si všimol jediného rozdielu a to je adresa premennej.
Dobra poznamka. Vyskusam tomu registru napevno priradit inu adresu.
Kto z vas tu pouziva MPLAB X IDE? Mozete to vyskusat u vas? Dajte tam do podmienky register co ma viac ako 8 bitov ci to vam pojde.
Diki za typy.
Ja len v kutiku duse dufam ze to nebude zase bug v MPLAB X IDE, lebo ma uz nacisto trafi slak. Na forume pre MPLAB X IDE je tolko problemov nahlasenych ze ten MPLAB X IDE bude jeden cely velky fail.
Clovek co sa uci C programovanie ma riesit problemy prohramovacieho softweru. Ja si myslim ze tobude zase problem MPLAB X IDE. Ale nechcem predbiehat.
Re: While loop podmienka inorovana
Napísané: 02 Okt 2022, 14:43
od používateľa Andy99
Vyzera to podivuhodne, nakolko 16-bit premenne normalnym sposobom funguju aj pre 8-bit MCU. Ale skusme is ujasnit niekolko pojmov:
- 1. MPLAB IDE X s tym nema absolutne nic, nakolko to je len IDE.
- 2. Vsetko je to otazka nastavenia kompilatora (predpokladam XC8) resp. debuggera
- 2a. Ako mas nastaveny kompilator? Skus sem nakopirovat flagy.
- 2b. Sprava sa to rovnako aj v simulatore?
Re: While loop podmienka inorovana
Napísané: 02 Okt 2022, 15:56
od používateľa romiadam
Info: Mam kompilator XC8 v2.32
. Ako mas nastaveny kompilator? Skus sem nakopirovat flagy.
Toto neviem ako sa robi a o akych flagoch hovoris. Mozes mi to popisat ako to sem nakopirovat?
Re: While loop podmienka inorovana
Napísané: 02 Okt 2022, 16:44
od používateľa Andy99
romiadam napísal: ↑02 Okt 2022, 15:56
Info: Mam kompilator XC8 v2.32
. Ako mas nastaveny kompilator? Skus sem nakopirovat flagy.
Toto neviem ako sa robi a o akych flagoch hovoris. Mozes mi to popisat ako to sem nakopirovat?
Najjednoduchsi sp. je to skopirovat priamo z vysledku kompilacie, napr. pre subor main.c:
"/Applications/microchip/xc8/v2.36/bin/xc8-cc" -mcpu=18F25J11 -c -D__DEBUG=1 -mdebugger=icd3 -mdfp="/Applications/microchip/mplabx/v6.00/packs/Microchip/PIC18F-J_DFP/1.5.44/xc8" -fno-short-double -fno-short-float -memi=wordwrite -O0 -Og -maddrqual=ignore -D__DEBUG -xassembler-with-cpp -mwarn=-3 -Wa,-a -DXPRJ_DEBUG=DEBUG -msummary=-psect,-class,+mem,-hex,-file -ginhx32 -Wl,--data-init -mno-keep-startup -mno-download -mdefault-config-bits -std=c99 -gdwarf-3 -mstack=compiled:auto:auto:auto -o build/DEBUG/debug/main.p1 main.c
Re: While loop podmienka inorovana
Napísané: 02 Okt 2022, 16:52
od používateľa peterple
romiadam napísal: ↑02 Okt 2022, 14:06
Dobra poznamka. Vyskusam tomu registru napevno priradit inu adresu.
Len to nie. Už som dávnejšie písal že do toho sa nemáš čo montovať. To je vec kompilátora. Mňa by silne zaujímalo ako sa bude chovať while v main a s lokálnou 16 bitovou premennou. Ako si mohol vidieť z môjho postu mne to normálne funguje a tak isto to bude fungovať aj ostatným. Ako už písal Andy IDE s tým nič nemá. Je to vec kompilátora.
Ohľadom nastavenia kompilátora. Najjednoduchšie asi je skopírovať to čo vidíš v okne Output.
Napr moje nastavenie je takéto a absolútne nič so na ňom nemenil. Ale od toho si ja nič nesľubujem. Toto jednoducho musí fungovať. Pokiaľ sa programátor nestrelil nejako do nohy. Čo sa tebe podarilo. Už ten prvý problémčo si tu popisoval v minulosti zaváňal prúserom. A tiež to že si sa nedopracoval k žiadnemu výsledku.
Kód: Vybrať všetko
"C:\Program Files\Microchip\xc8\v2.40\bin\xc8-cc.exe" -mcpu=18F46K40 -c -mdfp="C:/Program Files/Microchip/MPLABX/v5.50/packs/Microchip/PIC18F-K_DFP/1.4.87/xc8" -fno-short-double -fno-short-float -memi=wordwrite -O0 -fasmfile -maddrqual=ignore -xassembler-with-cpp -mwarn=-3 -Wa,-a -DXPRJ_default=default -msummary=-psect,-class,+mem,-hex,-file -ginhx32 -Wl,--data-init -mno-keep-startup -mno-download -mdefault-config-bits -std=c99 -gdwarf-3 -mstack=compiled:auto:auto:auto -o build/default/production/newmain.p1 newmain.c
"C:\Program Files\Microchip\xc8\v2.40\bin\xc8-cc.exe" -mcpu=18F46K40 -Wl,-Map=dist/default/production/test.X.production.map -DXPRJ_default=default -Wl,--defsym=__MPLAB_BUILD=1 -mdfp="C:/Program Files/Microchip/MPLABX/v5.50/packs/Microchip/PIC18F-K_DFP/1.4.87/xc8" -fno-short-double -fno-short-float -memi=wordwrite -O0 -fasmfile -maddrqual=ignore -xassembler-with-cpp -mwarn=-3 -Wa,-a -msummary=-psect,-class,+mem,-hex,-file -ginhx32 -Wl,--data-init -mno-keep-startup -mno-download -mdefault-config-bits -std=c99 -gdwarf-3 -mstack=compiled:auto:auto:auto -Wl,--memorysummary,dist/default/production/memoryfile.xml -o dist/default/production/test.X.production.elf build/default/production/newmain.p1
Potom si ešte môžeš pozrieť záložku
Files a tam adresár dist. je tam kopu zaujímavých súborov ktoré pomáhajú v takýchto prípadoch. ako map, sym, lst apod.
Napr z lst
Kód: Vybrať všetko
110 ;newmain.c: 13: uint16_t temp4 = 2;
111 00FFD8 0E00 movlw 0
112 00FFDA 6E02 movwf (main@temp4+1)^0,c
113 00FFDC 0E02 movlw 2
114 00FFDE 6E01 movwf main@temp4^0,c
115
116 ;newmain.c: 14: while (temp4> 0)
117 00FFE0 EFF5 F07F goto l688
118 00FFE4 l686:
119
120 ;newmain.c: 15: {;newmain.c: 16: temp4--;
121 00FFE4 0601 decf main@temp4^0,f,c
122 00FFE6 A0D8 btfss status,0,c
123 00FFE8 0602 decf (main@temp4+1)^0,f,c
124 00FFEA l688:
125
126 ;newmain.c: 14: while (temp4> 0)
127 00FFEA 5001 movf main@temp4^0,w,c
128 00FFEC 1002 iorwf (main@temp4+1)^0,w,c
129 00FFEE A4D8 btfss status,2,c
130 00FFF0 EFFC F07F goto u11
131 00FFF4 EFFE F07F goto u10
132 00FFF8 u11:
133 00FFF8 EFF2 F07F goto l686
134 00FFFC u10:
135 00FFFC EF00 F000 goto start
136 010000 __end_of_main:
137 callstack 0
Je pekne vidieť že to počíta so 16 bitovou premennou, aj keď ako tak rozumiem len čo je mov a dec.
Re: While loop podmienka inorovana
Napísané: 02 Okt 2022, 17:13
od používateľa romiadam
Zacinam byt z tohoto "Jelen". Ja tu riesim problem, ktory asi ani nie je problem.
Ono to cele funguje, len trosku inak pre 8bitovu podmienku a inak pre 16,24 a 32bitovu podmienku. A s tymto ma nepriatel (kompilator) uplne pomylil.
Zistil som ze:
Ak je v podmienke 8it cislo, tak PC vyhodnoti podmienku a skoci rovno do while bloku. Vidiet to na predoslom videu.
Ak je v podmienke 16,24 a 32 bitove cislo, tak PC preskoci cely while blok (vidiet to tu
https://youtu.be/OClzfneBkug)
a ja som tu zastal a zacal hned riesit problem, ze PC preskocil cely while blok.. No ak krokovanie pustim dalej, tak pri dalsom kroku PC vyhodnoti podmienku while a bud skoci do bloku while alebo pokracuje na konci bloku while, podla vysledku podmienky.
Ma toto pre vas nejaku logiku?
EDIT:
Este som sa to doho viac vsprtal v Assembly a zistil som ze ak ma register v podmienke 8bitov, tak sa podmienka hned vyhodnoti a skoci sa do while alebo cely while preskoci, podla vysledku podmienky.
Ak ma register v podmienke viac ako 8 bitov, tak on skoci na koniec while bloku, tam vyhodnoti dolny, stredny a horny bajt (24bitov). Potom je tam BTFSS a tam sa rozhodne podla vysledku podmienky ze ci sa skoci naspat do while bloku alebo ostane na konci bloku.
Cize cele co som mal urobit po preskoceni celeho while pre 16, 24 alebo 32 bi bloku je, ze som mal spustit dalsi krok
a nie hned riesit problem. Ale koho by to napadlo, ze to kompilator takto zkompiloval. Mna to nenapadlo. Ocakaval som ze to vyhodnocovanie vopcha pred while ako to bolo doteraz s 8/bit cislami v podmienke. Toto bola prva situacia od kedy sa ucim programovat v C, co som pouzil cislo vacsie ako 8vitov v podmienke. Zaujimave.....
petrple,
V takomto prípade je tam okno dissasemmbly a prekrokujem si to tam a potom zistím kde je pes zakopaný.
Tak podla tvojej rady som toho zakopaneho psa vykopal. Je to vidno ze ty uz si v proramovavi tzv. "stary skuseny vlk". Presne to disassembly mi ten problem vysvetlil.
Diki vsetkym za rady a snad toto niekomu tiez pomoze. Teraz ked si uvedomim, ze som stratil xy hodin kvoli nicomu..... ale aspon si to zapamatam, snad navzdy.
Re: While loop podmienka inorovana
Napísané: 02 Okt 2022, 17:48
od používateľa peterple
Hneď som písal že nás húpeš.
By si sa čudoval ale logiku to má. Možno nie na takýchto prdítkach, ale pre CPU čo majú pipelining, predikujú výsledok podmieneného skoku a majú cache tak je to rýchlejšie (pentium a vyššie). Keď si pozrieš ten asm kód čo som tam prilepil je to presne takto. Možno aj tu to má o nejaký strojový cyklus menej ako keby si to mal opačne.
Re: While loop podmienka inorovana
Napísané: 02 Okt 2022, 18:20
od používateľa romiadam
Hneď som písal že nás húpeš.
Tak ano, mozme to tak nazvat, ale musim podotknut, ze nevedomky. Hlavne ze sme sa dopracovali k vysvetleniu.
Diki moc vsetkym.
Re: While loop podmienka inorovana
Napísané: 02 Okt 2022, 18:29
od používateľa mac26
nemas ty zapnutu nejaku optimalizaciu? Vtedy to vie niekedy takto zvlasne skaka pri krokovani.
pre debugovani ti odporucam zapnut optimalizaciu na uroven debug
Re: While loop podmienka inorovana
Napísané: 02 Okt 2022, 19:01
od používateľa Andy99
mac26 napísal: ↑02 Okt 2022, 18:29
nemas ty zapnutu nejaku optimalizaciu? Vtedy to vie niekedy takto zvlasne skaka pri krokovani.
pre debugovani ti odporucam zapnut optimalizaciu na uroven debug
Preto som sa pytal na tie flagy
.
Re: While loop podmienka inorovana
Napísané: 02 Okt 2022, 19:10
od používateľa Atlan
Nena, implicitne 8bit uP pocita s 8bit premenimi. Ze tam natrepe do podmienky 16bit premenu je jeho priblem. Hold 8bit uP to bude musiet riesit komplikovanejsie ako porovnanim dvoch 8bitovych hodnot. Co je pochopitelne.
Re: While loop podmienka inorovana
Napísané: 02 Okt 2022, 22:29
od používateľa romiadam
nemas ty zapnutu nejaku optimalizaciu? Vtedy to vie niekedy takto zvlasne skaka pri krokovani.
Myslis vizualizacia debugu, ze ta sipka skoci na koniec a potom do while bloku? Ak to myslis, tak neviem, nesprtal som sa v tom.
Ale ak mas typy co skontrolovat, tak rad privitam, lebo toto ma moze opat pomylit ak si na tento jav nahodou nespomeniem. Ale snad mi to teraz uz ostane v pamati ze sa to takto chova, aj ked by som to najradsej nastavil tak ze nech to radsej caka par cyklov v podmienke ako skocit na koniec.
Ze tam natrepe do podmienky 16bit premenu je jeho priblem.
Zaujimave je ze pre if (16bit. cislo v podmienke) to neskoci na koniec. Len u while.
Ako sa robi profesionalne, aby som do podmienky netrepal 16, 24, 32bitove cislo? Mat to rozlozit ako v ASM na tri bajty na kalkulacke pocitat hodnoty kazdeho bajtu pre danu hodnotu a potom to porovnavat?
Re: While loop podmienka inorovana
Napísané: 03 Okt 2022, 05:19
od používateľa Atlan
Nie len sa necudovat, ze viac ako 8bitove cisla budu na 8bit procesore spracovavane komplikovanejsie.
Hlavne nezabudni ze viac ako 8bit cislo ta moze vypiect pri preruseni ze sa nespracuje cele, abyvsi nas zase neobstastnoval. Ale verim ze prekladac to ma osetrene. Pripasne praca s viac bajtovym cislom v case prerusenia.