<html><body>Jo jo to je asi jako kdyz si clovek veme signed promenou, ulozi ji do unsigned,<div>a pak ji pri vypisu opet pretypuje na signed. Vsechno chodi dokud clovek neudela</div><div>nejakou operaci, ktera to dozene do zapornych cisel to se pak dejou veci, hlavne</div><div>++ a -- na hrane rozsahu, tak jsem to ladil asi pul dne nez mi to doslo, tohle vypada</div><div>dost podobne :-D</div><div><br></div><div>Zdenek Aster<br><p>---------- PĹŻvodnĂ zpráva ----------<br>Od: Jan Waclawek <konfera@efton.sk><br>Datum: 27. 2. 2013<br>PĹ™edmÄ›t: Re: C podozrenie na bug compilera</p><br><blockquote>V tom disassembleri nevidim ziadny zasadnejsi problem; samozrejme zalezi na<br>hodnote stack pointra (co zrejme ukazuje na zaciatok predtym vytvoreneho<br>stack frame) a registra r4 (ktory zase zrejme ukazuje na pole buf[]); ale<br>silne pochybujem, ze by tam bol nejaky problem.<br><br>Skor verim tomu, ze kecia nastroj, ktorym to pozerate, ci je to uz<br>simulator alebo nejaky iny debugger. Skuste nejaku nezavislu metodu -<br>poslat hodnotu premennej cez seriak do PC, vypisat ho na nejaky pripojeny<br>displej, alebo take nieco.<br><br>wek<br><br><br>----- Original Message ---------------<br><br>>Keil MDK470a<br>> uint16_t radress, rquantity;<br>><br>> buf[0] = 0x87;<br>> buf[1] = 0x65;<br>> buf[2] = 0x43;<br>> buf[3] = 0x21;<br>> radress = (uint16_t)buf[0] << 8;<br>> radress |= buf[1];<br>> rquantity = (uint16_t)buf[2] << 8;<br>> rquantity |= buf[3];<br>><br>>prelozil ako:<br>> 382: buf[0] = 0x87;<br>>0x08000B82 2087 MOVS r0,#0x87<br>>0x08000B84 7020 STRB r0,[r4,#0x00]<br>> 383: buf[1] = 0x65;<br>>0x08000B86 2065 MOVS r0,#0x65<br>>0x08000B88 7060 STRB r0,[r4,#0x01]<br>> 384: buf[2] = 0x43;<br>>0x08000B8A 2043 MOVS r0,#0x43<br>>0x08000B8C 70A0 STRB r0,[r4,#0x02]<br>> 385: buf[3] = 0x21;<br>>0x08000B8E 2021 MOVS r0,#0x21<br>>0x08000B90 70E0 STRB r0,[r4,#0x03]<br>> 386: radress = (uint16_t)buf[0] << 8;<br>>0x08000B92 7820 LDRB r0,[r4,#0x00]<br>>0x08000B94 0200 LSLS r0,r0,#8<br>>0x08000B96 9003 STR r0,[sp,#0x0C]<br>> 387: radress |= buf[1];<br>>0x08000B98 7860 LDRB r0,[r4,#0x01]<br>>0x08000B9A 9903 LDR r1,[sp,#0x0C]<br>>0x08000B9C 4308 ORRS r0,r0,r1<br>>0x08000B9E 9003 STR r0,[sp,#0x0C]<br>> 388: rquantity = (uint16_t)buf[2] << 8;<br>>0x08000BA0 78A0 LDRB r0,[r4,#0x02]<br>>0x08000BA2 0205 LSLS r5,r0,#8<br>> 389: rquantity |= buf[3];<br>>0x08000BA4 78E0 LDRB r0,[r4,#0x03]<br>>0x08000BA6 4305 ORRS r5,r5,r0<br>><br>>rquantity je OK, radress hodnota 0x0001<br>>MCU core cortex M0<br>><br>>Jan Waclawek wrote / napĂsal(a):<br>>> Aky kompilator, aka verzia, ake su command-line options, ako vyzera<br>>> disassembly funkcie?<br>>><br>>> wek<br>>><br>>><br>>><br>>> ----- Original Message ---------------<br>>><br>>><br>>><br>>> <br>>>> Zdravim konferenci, mam nasledovny problem:<br>>>><br>>>> void funkcia (uint8_t *buf, uint8_t len, uint32_t *coils){<br>>>> uint16_t radr;<br>>>> radr = buf[0];<br>>>> ...<br>>>> }<br>>>><br>>>> A v debuggeri do radr priradi 0x0102, cize 16bit cislo. Optimalizacie su <br>>>> vypnute a priznam sa, nechapem.<br>>>> Ako je nieco take vobec mozne?<br>>>> <br>>><br><br>_______________________________________________<br>HW-list mailing list - sponsored by www.HW.cz<br>Hw-list@list.hw.cz<br>http://list.hw.cz/mailman/listinfo/hw-list</blockquote></div></body></html>