C podozrenie na bug compilera
milger
milger na pobox.sk
Pátek Březen 1 09:22:22 CET 2013
Zazil som, spravidla treba vypnut optimalizacie a obcas nestaci ani to
pokial premmene su priamo v registroch.
100% sa mi osvetcilo "volatile", prip. pozret obsah premennej ako obsah
RAM...
Milan
On 28. 2. 2013 15:43, Stano wrote:
> Ano zda sa ze naozaj keca debugger, funkcia sa sprava korektne a aj
> debug vypis cez usart je spravny.
> Dakujem za nakopnutie spravnym smerom.
>
> Jan Waclawek wrote / napísal(a):
>> V tom disassembleri nevidim ziadny zasadnejsi problem; samozrejme
>> zalezi na
>> hodnote stack pointra (co zrejme ukazuje na zaciatok predtym vytvoreneho
>> stack frame) a registra r4 (ktory zase zrejme ukazuje na pole buf[]);
>> ale
>> silne pochybujem, ze by tam bol nejaky problem.
>>
>> Skor verim tomu, ze kecia nastroj, ktorym to pozerate, ci je to uz
>> simulator alebo nejaky iny debugger. Skuste nejaku nezavislu metodu -
>> poslat hodnotu premennej cez seriak do PC, vypisat ho na nejaky
>> pripojeny
>> displej, alebo take nieco.
>>
>> wek
>>
>>
>> ----- Original Message ---------------
>>
>>> Keil MDK470a
>>> uint16_t radress, rquantity;
>>>
>>> buf[0] = 0x87;
>>> buf[1] = 0x65;
>>> buf[2] = 0x43;
>>> buf[3] = 0x21;
>>> radress = (uint16_t)buf[0] << 8;
>>> radress |= buf[1];
>>> rquantity = (uint16_t)buf[2] << 8;
>>> rquantity |= buf[3];
>>>
>>> prelozil ako:
>>> 382: buf[0] = 0x87;
>>> 0x08000B82 2087 MOVS r0,#0x87
>>> 0x08000B84 7020 STRB r0,[r4,#0x00]
>>> 383: buf[1] = 0x65;
>>> 0x08000B86 2065 MOVS r0,#0x65
>>> 0x08000B88 7060 STRB r0,[r4,#0x01]
>>> 384: buf[2] = 0x43;
>>> 0x08000B8A 2043 MOVS r0,#0x43
>>> 0x08000B8C 70A0 STRB r0,[r4,#0x02]
>>> 385: buf[3] = 0x21;
>>> 0x08000B8E 2021 MOVS r0,#0x21
>>> 0x08000B90 70E0 STRB r0,[r4,#0x03]
>>> 386: radress = (uint16_t)buf[0] << 8;
>>> 0x08000B92 7820 LDRB r0,[r4,#0x00]
>>> 0x08000B94 0200 LSLS r0,r0,#8
>>> 0x08000B96 9003 STR r0,[sp,#0x0C]
>>> 387: radress |= buf[1];
>>> 0x08000B98 7860 LDRB r0,[r4,#0x01]
>>> 0x08000B9A 9903 LDR r1,[sp,#0x0C]
>>> 0x08000B9C 4308 ORRS r0,r0,r1
>>> 0x08000B9E 9003 STR r0,[sp,#0x0C]
>>> 388: rquantity = (uint16_t)buf[2] << 8;
>>> 0x08000BA0 78A0 LDRB r0,[r4,#0x02]
>>> 0x08000BA2 0205 LSLS r5,r0,#8
>>> 389: rquantity |= buf[3];
>>> 0x08000BA4 78E0 LDRB r0,[r4,#0x03]
>>> 0x08000BA6 4305 ORRS r5,r5,r0
>>>
>>> rquantity je OK, radress hodnota 0x0001
>>> MCU core cortex M0
>>>
>>> Jan Waclawek wrote / napísal(a):
>>>> Aky kompilator, aka verzia, ake su command-line options, ako vyzera
>>>> disassembly funkcie?
>>>>
>>>> wek
>>>>
>>>>
>>>>
>>>> ----- Original Message ---------------
>>>>
>>>>
>>>>
>>>>> Zdravim konferenci, mam nasledovny problem:
>>>>>
>>>>> void funkcia (uint8_t *buf, uint8_t len, uint32_t *coils){
>>>>> uint16_t radr;
>>>>> radr = buf[0];
>>>>> ...
>>>>> }
>>>>>
>>>>> A v debuggeri do radr priradi 0x0102, cize 16bit cislo.
>>>>> Optimalizacie su vypnute a priznam sa, nechapem.
>>>>> Ako je nieco take vobec mozne?
>>
>> _______________________________________________
>> 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