Код
void HardTest_Run()
{
int counter = 0;
while( counter < 100 )
{
while( !ready );
ready = false;
if( !isV15Valid( CalcValue(sums_saved.V15) ) )
{
lcd_manualSet(26,16,12);
// lcd_setState(LCD_STATE_EHA);
counter = 0;
}
else
{
counter++;
int dig = 9 - (counter / 10) % 10;
lcd_manualSet(dig, dig , dig);
}
}
}
{
int counter = 0;
while( counter < 100 )
{
while( !ready );
ready = false;
if( !isV15Valid( CalcValue(sums_saved.V15) ) )
{
lcd_manualSet(26,16,12);
// lcd_setState(LCD_STATE_EHA);
counter = 0;
}
else
{
counter++;
int dig = 9 - (counter / 10) % 10;
lcd_manualSet(dig, dig , dig);
}
}
}
переменная ready (volatile bool) периодически меняется функцией этого же модуля, которая вызывается из другого модуля обработчиком прерывания. При закоментированной строчке lcd_setState(LCD_STATE_EHA); срабатывает if(!isV15Valid(...)) - хотя не должен. Если же закоментировать lcd_manualSet и раскомментировать lcd_setState, то if не срабатывает (как и должно быть). Самое смешное, что обе эти функции(lcd_xxx) по сути делают одно и тоже:
Код
void lcd_manualSet(uint_fast8_t d0, uint_fast8_t d1, uint_fast8_t d2)
{
point1_on = false;
point2_on = false;
dig0 = d0;
dig1 = d1;
dig2 = d2;
}
void lcd_setState(uint_fast8_t state)
{
point1_on = false;
point2_on = false;
dig2 = some_states[state][0];
dig1 = some_states[state][1];
dig0 = some_states[state][2];
}
{
point1_on = false;
point2_on = false;
dig0 = d0;
dig1 = d1;
dig2 = d2;
}
void lcd_setState(uint_fast8_t state)
{
point1_on = false;
point2_on = false;
dig2 = some_states[state][0];
dig1 = some_states[state][1];
dig0 = some_states[state][2];
}
где массив some_states константный.
В итоге этот код работает без проблем, если не ставить галочку "Use Link-Time code generation" , иначе только с плясками типа замены одной функции на другую(lcd_xxx). Чувствую что проблема где-то в коде, но не знаю какому типу ошибок характерны такие глюки.
ps: Стэк и кучу увеличивал, да и судя по статистике компилятора там с лихвой числа.