Zahada C atmel studio

Tomáš Mazouch mazouch na ica.cz
Sobota Květen 3 20:19:30 CEST 2014


Vypada to, ze blbec je prekladac, protoze pouzije BRGE na unsigned. To, 
ze se skok provede, je OK, protoze podle Atmeliho popisu instrukcni sady 
ma BRGE skocit, pokud je N XOR V == 0 (coz je).

   TomM


Dne 3.5.2014 17:14, Jaroslav Buchta napsal(a):
> Tak vzhledem k pocasi se nimram s krokovanim v assembleru a 
> posloupnost je takovato (c je v R11):
>
>             DrawChar(c, x, y, FontTahoma_12);
> 00001354  MOV R24,R11        Copy register
> 00001355  MOVW R22,R16        Copy register pair
> 00001356  MOVW R20,R14        Copy register pair
> 00001357  MOVW R18,R8        Copy register pair
> 00001358  CALL 0x000011D1        Call subroutine
>             x += w + 2;
> 0000135A  ADIW R28,0x02        Add immediate to word
> 0000135B  ADD R16,R28        Add without carry
> 0000135C  ADC R17,R29        Add with carry
>             c++;
> 0000135D  INC R11        Increment
>             if (c >= 0x80) c = 0x20;
> 0000135E  BRGE PC+0x04        Branch if greater or equal, signed
> 0000135F  CLR R11        Clear Register
> 00001360  SET         Set T in SREG
> 00001361  BLD R11,5        Bit load from T to register
>         while (y < 320)
> 00001362  LDI R24,0x40        Load immediate
>
> posloupnost instrukci je tedy spravna, ale:
>
> INC R11 nastavi
> pro 0x20-0x7E priznaky N=0, V=0, S=0 - skok se provede
> pro 0x7F priznaky N=1, V=1, S=0 - skok se PROVEDE COZ JE SPATNE!!!
> pro 0x80 v dalsi iteraci pak N=1, V=0, S=1 a skok se konecne 
> neprovede, c se nastavi na 0x20 ale ten znak 0x80 to predtim vytiskne 
> a protoze neni v tabulce, mam na displeji kousek rozsypaneho caje...
>
> Je to zavada prekladace, nebo je to nekde v errata zavada procesoru 
> ATMEGA16 ??? (docela stary kousek) Podminka je snad napsana spravne. 
> Prekladac je normalne nainstalovan jako soucast atmel studia a verze + 
> parametry:
>
> Building file: .././Test1.c
>         Invoking: AVR/GNU C Compiler : 
> (AVR_8_bit_GNU_Toolchain_3.4.1_830) 4.6.2
>         "C:\Program Files (x86)\Atmel\Atmel Studio 
> 6.0\extensions\Atmel\AVRGCC\3.4.1.95\AVRToolchain\bin\avr-gcc.exe" 
> -funsigned-char -funsigned-bitfields -O1 -fpack-struct -fshort-enums 
> -g2 -Wall -c -std=gnu99 -MD -MP -MF "Test1.d" -MT"Test1.d" 
> -MT"Test1.o"  -mmcu=atmega16   -o"Test1.o" ".././Test1.c"
>         .././Test1.c: In function 'TestSquare':
>
> Kdyz se c definuje jako volatile, prelozi se to takto:
>
>             c++;
> 00001362  LDD R24,Y+1        Load indirect with displacement
> 00001363  SUBI R24,0xFF        Subtract immediate
> 00001364  STD Y+1,R24        Store indirect with displacement
>             if (c >= 0x80) c = 0x20;
> 00001365  LDD R24,Y+1        Load indirect with displacement
> 00001366  TST R24        Test for Zero or Minus
> 00001367  BRGE PC+0x03        Branch if greater or equal, signed
>
> coz uz funguje samozrejme OK.
>
> Dne 3. 5. 2014 16:45, Lukas Burda napsal(a):
>> A kdyz to w deklarujete na zacatku? Takhle mi to kdysi dalalo s gcc
>> nejaky problem, ale uz prd vim o co vlastne slo. Jen jsem si odnesl
>> zvyk to tak nedelat.
>>
>> L.
>>
>>
>>
>> Saturday, May 3, 2014, 1:56:21 PM, you wrote:
>>
>>> Muze mi nekdo vysvetli, proc v Atmel studiu se mi pri nasledujicim kodu
>>>           int16_t x = 0;
>>>           int16_t y = CharHeight(FontTahoma_12)+2;
>>>           uint8_t c = 0x20;
>>>           DrawChar(0x7f, x, y, FontTahoma_12);
>>>           while (y < 320)
>>>           {
>>>               uint8_t w = CharWidth(c, FontTahoma_12);
>>> <-----------------------------------------
>>>               if (x + w > 240)
>>>               {
>>>                   x = 0;
>>>                   y += CharHeight(FontTahoma_12) + 2;
>>>                   continue;
>>>               }
>>>               DrawChar(c, x, y, FontTahoma_12);
>>>               x += w + 2;
>>>               c++;
>>>               if (c >= 0x80) c = 0x20;
>>>           }
>>> dostane do oznacene funkce hodnota c =0x80??? Evidentne je to
>>> optimalizaci (O1), pokud ji vypnu, funguje to OK, asi by pomohly i jine
>>> finty na promenne (volatile atp.) ale co je sakra spatne? Pri krokovani
>>> to ruzne poskakuje po radcich a nezjistim nic.
>>> Mozna jsem jen pri sobote slepej nebo si na necem sedim, pujdu se 
>>> projet
>>> na kole radsi ;-)
>>> ---
>>> This email is free from viruses and malware because avast! Antivirus 
>>> protection is active.
>>> http://www.avast.com
>>> _______________________________________________
>>> 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
>
>
> ---
> This email is free from viruses and malware because avast! Antivirus 
> protection is active.
> http://www.avast.com
>
> _______________________________________________
> 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