Pytanie do znawców C. Czy zapis taki:
volatile unsigned int DEL_STEP;
void DELAY(unsigned int Czas) { DEL_STEP = Czas; while(DEL_STEP); }
może różnić się wykonaniem od zapisu takiego?
void DELAY(unsigned int Czas) { unsigned char DEL_MSB,DEL_LSB; DEL_STEP = Czas; while(1) { DEL_LSB = DEL_STEP/0x100; DEL_MSB = DEL_STEP^0x100; if(DEL_MSB == 0 & DEL_LSB == 0) return; } }
Znalazłem błąd w starym kodzie. Ze zdziwieniem odkryłem, że w komendzie while(DEL_STEP); kompilator sprawdza tylko LSB zmiennej. Oczywiście generuje to kłopoty, gdy DEL_STEP przekracza wartość 255. Przepisanie jak niżej rozwiązuje problem, ale nie kumam powodu jego wystąpienia. Sprawdziłem optymalizacje, to nie to, po prostu kod jest generowany źle. Ktoś ma pomysł dlaczego kompilator uprościł, a może ja czegoś nie zauważam?
Miłego. Irek.N. ps. DEL_STEP jest modyfikowana w przerwaniu, inaczej procedura nie miała by sensu.