Zahada C atmel studio

Jaroslav Buchta jaroslav.buchta na hascomp.cz
Sobota Květen 3 17:14:37 CEST 2014


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



Další informace o konferenci Hw-list