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