While loop podmienka inorovana

C,C++,C#

Moderátori: psichac, Moderátori

romiadam
Ultimate člen
Ultimate člen
Príspevky: 4415
Dátum registrácie: 09 Apr 2008, 00:00
Bydlisko: Wicklow, Irsko
Vek: 47

While loop podmienka inorovana

Príspevok od používateľa romiadam » 02 Okt 2022, 02:07

Ahojte,
MPLAB X IDE v5.50
zase "som na pokraji psychyckeho zrutenia sa" :mrgreen: , 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.
0
Prepáčte mi za diakritiku a preklepy - väčšinou píšem z mobilu a ENG klavesnice.
(výroky nemenovaného člena fóra:) ...základy elektrotechniky ovládam dokonale, tak napr. taký tyristor neviem ako presne funguje

Používateľov profilový obrázok
Mek
Zaslúžilý člen
Zaslúžilý člen
Príspevky: 1271
Dátum registrácie: 15 Okt 2015, 20:49
Bydlisko: Žilina
Vek: 37
Kontaktovať používateľa:

Re: While loop podmienka inorovana

Príspevok od používateľa Mek » 02 Okt 2022, 08:52

Zahadny problem.
Skus to obist takto:

Kód: Vybrať všetko

while ((uint16_t)temp2> (uint16_t)0)
0
... byvaly spravca Hospudky u amplionu, Martinekk-ov brat. Nemam vystudovane elektro, je to len moje hobby. Povolanim som SW inzinier.
Moja databaza suciastok: ELPARTS
Moj velky elektro projekt: MEGA TRANSISTOR CLOCK

peterple
Ultimate člen
Ultimate člen
Príspevky: 2328
Dátum registrácie: 25 Jún 2013, 21:06
Bydlisko: Krajné
Vek: 57
Kontaktovať používateľa:

Re: While loop podmienka inorovana

Príspevok od používateľa peterple » 02 Okt 2022, 10:09

Zase nás húpeš. Čo máš zle netuším ale toto fungovať musí a aj to samozrejme funguje.
image.png
0
Ukáž múdremu chybu a on sa ti poďakuje. Ukáž chybu hlupákovi a on sa urazí.

romiadam
Ultimate člen
Ultimate člen
Príspevky: 4415
Dátum registrácie: 09 Apr 2008, 00:00
Bydlisko: Wicklow, Irsko
Vek: 47

Re: While loop podmienka inorovana

Príspevok od používateľa romiadam » 02 Okt 2022, 12:26

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
0
Prepáčte mi za diakritiku a preklepy - väčšinou píšem z mobilu a ENG klavesnice.
(výroky nemenovaného člena fóra:) ...základy elektrotechniky ovládam dokonale, tak napr. taký tyristor neviem ako presne funguje

peterple
Ultimate člen
Ultimate člen
Príspevky: 2328
Dátum registrácie: 25 Jún 2013, 21:06
Bydlisko: Krajné
Vek: 57
Kontaktovať používateľa:

Re: While loop podmienka inorovana

Príspevok od používateľa peterple » 02 Okt 2022, 13:12

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.
0
Ukáž múdremu chybu a on sa ti poďakuje. Ukáž chybu hlupákovi a on sa urazí.

romiadam
Ultimate člen
Ultimate člen
Príspevky: 4415
Dátum registrácie: 09 Apr 2008, 00:00
Bydlisko: Wicklow, Irsko
Vek: 47

Re: While loop podmienka inorovana

Príspevok od používateľa romiadam » 02 Okt 2022, 14:06

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.
0
Prepáčte mi za diakritiku a preklepy - väčšinou píšem z mobilu a ENG klavesnice.
(výroky nemenovaného člena fóra:) ...základy elektrotechniky ovládam dokonale, tak napr. taký tyristor neviem ako presne funguje

Používateľov profilový obrázok
Andy99
Stály člen
Stály člen
Príspevky: 339
Dátum registrácie: 05 Mar 2008, 00:00
Bydlisko: BA
Vek: 35

Re: While loop podmienka inorovana

Príspevok od používateľa Andy99 » 02 Okt 2022, 14:43

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?
0

romiadam
Ultimate člen
Ultimate člen
Príspevky: 4415
Dátum registrácie: 09 Apr 2008, 00:00
Bydlisko: Wicklow, Irsko
Vek: 47

Re: While loop podmienka inorovana

Príspevok od používateľa romiadam » 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?
0
Prepáčte mi za diakritiku a preklepy - väčšinou píšem z mobilu a ENG klavesnice.
(výroky nemenovaného člena fóra:) ...základy elektrotechniky ovládam dokonale, tak napr. taký tyristor neviem ako presne funguje

Používateľov profilový obrázok
Andy99
Stály člen
Stály člen
Príspevky: 339
Dátum registrácie: 05 Mar 2008, 00:00
Bydlisko: BA
Vek: 35

Re: While loop podmienka inorovana

Príspevok od používateľa Andy99 » 02 Okt 2022, 16:44

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
0

peterple
Ultimate člen
Ultimate člen
Príspevky: 2328
Dátum registrácie: 25 Jún 2013, 21:06
Bydlisko: Krajné
Vek: 57
Kontaktovať používateľa:

Re: While loop podmienka inorovana

Príspevok od používateľa peterple » 02 Okt 2022, 16:52

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.
0
Ukáž múdremu chybu a on sa ti poďakuje. Ukáž chybu hlupákovi a on sa urazí.

romiadam
Ultimate člen
Ultimate člen
Príspevky: 4415
Dátum registrácie: 09 Apr 2008, 00:00
Bydlisko: Wicklow, Irsko
Vek: 47

Re: While loop podmienka inorovana

Príspevok od používateľa romiadam » 02 Okt 2022, 17:13

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.
0
Prepáčte mi za diakritiku a preklepy - väčšinou píšem z mobilu a ENG klavesnice.
(výroky nemenovaného člena fóra:) ...základy elektrotechniky ovládam dokonale, tak napr. taký tyristor neviem ako presne funguje

peterple
Ultimate člen
Ultimate člen
Príspevky: 2328
Dátum registrácie: 25 Jún 2013, 21:06
Bydlisko: Krajné
Vek: 57
Kontaktovať používateľa:

Re: While loop podmienka inorovana

Príspevok od používateľa peterple » 02 Okt 2022, 17:48

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.
0
Ukáž múdremu chybu a on sa ti poďakuje. Ukáž chybu hlupákovi a on sa urazí.

romiadam
Ultimate člen
Ultimate člen
Príspevky: 4415
Dátum registrácie: 09 Apr 2008, 00:00
Bydlisko: Wicklow, Irsko
Vek: 47

Re: While loop podmienka inorovana

Príspevok od používateľa romiadam » 02 Okt 2022, 18:20

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. :thumbup:
0
Prepáčte mi za diakritiku a preklepy - väčšinou píšem z mobilu a ENG klavesnice.
(výroky nemenovaného člena fóra:) ...základy elektrotechniky ovládam dokonale, tak napr. taký tyristor neviem ako presne funguje

Používateľov profilový obrázok
mac26
Zaslúžilý člen
Zaslúžilý člen
Príspevky: 1298
Dátum registrácie: 01 Feb 2010, 00:00
Bydlisko: Martin

Re: While loop podmienka inorovana

Príspevok od používateľa mac26 » 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
0

Používateľov profilový obrázok
Andy99
Stály člen
Stály člen
Príspevky: 339
Dátum registrácie: 05 Mar 2008, 00:00
Bydlisko: BA
Vek: 35

Re: While loop podmienka inorovana

Príspevok od používateľa Andy99 » 02 Okt 2022, 19:01

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 ;).
0

Atlan
Zaslúžilý člen
Zaslúžilý člen
Príspevky: 1146
Dátum registrácie: 01 Feb 2008, 00:00
Bydlisko: Kosice okolie

Re: While loop podmienka inorovana

Príspevok od používateľa Atlan » 02 Okt 2022, 19:10

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.
0

romiadam
Ultimate člen
Ultimate člen
Príspevky: 4415
Dátum registrácie: 09 Apr 2008, 00:00
Bydlisko: Wicklow, Irsko
Vek: 47

Re: While loop podmienka inorovana

Príspevok od používateľa romiadam » 02 Okt 2022, 22:29

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?
0
Prepáčte mi za diakritiku a preklepy - väčšinou píšem z mobilu a ENG klavesnice.
(výroky nemenovaného člena fóra:) ...základy elektrotechniky ovládam dokonale, tak napr. taký tyristor neviem ako presne funguje

Atlan
Zaslúžilý člen
Zaslúžilý člen
Príspevky: 1146
Dátum registrácie: 01 Feb 2008, 00:00
Bydlisko: Kosice okolie

Re: While loop podmienka inorovana

Príspevok od používateľa Atlan » 03 Okt 2022, 05:19

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.
0

Napísať odpoveď