<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>