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