<html><head><title>Re: AVR a C premenna definovana v bloku</title>
<META http-equiv=Content-Type content="text/html; charset=iso-8859-2">
</head>
<body>
<span style=" font-family:'Courier New'; font-size: 9pt;">Překladač to přeložil správně.<br>
tmp_counter je lokální automatická proměnná (na stacku) a jako taková je inicializovaná při každém průchodu smyčkou.<br>
Při optimalizaci se zjistí, že jeden dekrement to nikdy nedostane na nulovou hodnotu a příslušný kód vyhodí.<br>
<br>
Udělejte ho static uint16_t ..., pak je to ekvivalent globální proměnné, ale s lokální viditelností.<br>
Paměť samozřejmě neušetříte.<br>
<br>
Tomáš<br>
<br>
<br>
</span><table>
<tr>
<td width=3 bgcolor= #0000ff><br>
</td>
<td width=808><span style=" font-family:'arial'; font-size: 10pt;">Zdravim, mam takuto cast kodu:<br>
Tu premennu tmp_counter som chcel definovat vnutri toho bloku s tim ze bude platna len v tom bloku a <br>
na zaciatku sa inicializuje, kvoli setreniu miesta v pamati. Lenze to nefunguje prelozi sa to viz. nizsie, ako keby sa ta hodnota nemenila cize to vsetko potom kompilator ignoruje<br>
Ked tu definiciu dam pred to while tak to funguje. chcel som len aby zbytocne nezaberala miesto. Dalo by sa to aj s cyklom for v tomto pripade, ale ma zaujima ked by tam malo byt while<br>
Da sa to nejak inak urobit? <br>
<br>
dik.<br>
michal<br>
<br>
uint32_t tmp32 = 0;<br>
uint16_t tmp16;<br>
<br>
while(1){<br>
uint16_t tmp_counter = 2048;<br>
if (bit_is_clear(ADCSRA,ADSC)) {<br>
tmp16 = ADCL; <br>
tmp16 |= ((uint16_t)ADCH << 8);<br>
tmp32 += tmp16;<br>
tmp_counter--;<br>
AD_START;<br>
if (tmp_counter == 0) {<br>
tmp32 >>= 5;<br>
offset_I = tmp32;<br>
<br>
utoa((unsigned int)tmp32,s_out,10);<br>
lcd_gotoxy(0,0);<br>
lcd_puts(s_out);<br>
_delay_ms(3000);<br>
lcd_clrscr();<br>
break; <br>
}<br>
}<br>
<br>
<br>
<br>
<br>
245: if (bit_is_clear(ADCSRA,ADSC)) {<br>
0000015E SBIC 0x06,6 Skip if bit in I/O register cleared <br>
0000015F RJMP PC-0x0001 Relative jump <br>
246: tmp16 = ADCL; <br>
00000160 IN R24,0x04 In from I/O location <br>
247: tmp16 |= ((uint16_t)ADCH << 8);<br>
00000161 IN R24,0x05 In from I/O location <br>
250: AD_START;<br>
00000162 SBI 0x06,6 Set bit in I/O register <br>
00000163 RJMP PC-0x0005 Relative jump </td>
</tr>
</table>
</body></html>