Добрый день. Столкнулся вот с какой незадачей - компиляция программы происходит так, что часть одной функции как бы выбрасывается из программы. Ошибок в функции нет, но что там говорить, вот эта функция:
(функция "как есть", в целях понимания ничего не убирал, надеюсь поймёте)
Код
void processing_data(void)
{
if(mdns.mdfl[U] <= mdns.mdfl[PGSU1])
{ mdns.mdfl[Conc] = mdns.mdfl[A1]*mdns.mdfl[U] + mdns.mdfl[B1]; }
else
{ mdns.mdfl[Conc] = mdns.mdfl[A2]*mdns.mdfl[U] + mdns.mdfl[B2]; }
char _s_disrec = 0;
if(mdns.mdfl[Conc] < 0) { mdns.mdfl[Conc] = 0; }
if(mdns.mdfl[Conc] >= mdns.mdfl[Pr])
{ pereg(); }
else if(mdns.mdfl[Conc] >= /*mdns.mdfl[P2]*/0.88)
{
_s_disrec = 1;
if((flags&0x03 == 0) || (flags&0x03 == 1)) //если нет порогов или только первый
{
mdns.mdui[P1Count]++;
mdns.mdui[P2Count]++;
WriteByteIntoExtEEPROM(0X3E, mdns.mdWorkSpace[0X46]);
WriteByteIntoExtEEPROM(0X3F, mdns.mdWorkSpace[0X47]);
WriteByteIntoExtEEPROM(0X40, mdns.mdWorkSpace[0X48]);
WriteByteIntoExtEEPROM(0X41, mdns.mdWorkSpace[0X49]);
modbus_buf[9] = mdns.mdWorkSpace[0x48];//p2
modbus_buf[8] = mdns.mdWorkSpace[0x49];//p2
modbus_buf[7] = mdns.mdWorkSpace[0x46];//p1
modbus_buf[6] = mdns.mdWorkSpace[0x47];//p1
}
flags |= (1 << 1);
flags &= ~(1 << 0);
modbus_buf[2] = flags;
}
else if(mdns.mdfl[Conc] >= mdns.mdfl[P1])
{
if(flags&0x03 == 0) //если небыло до этого порога
{
mdns.mdui[P1Count]++;
WriteByteIntoExtEEPROM(0X3E, mdns.mdWorkSpace[0X46]);
WriteByteIntoExtEEPROM(0X3F, mdns.mdWorkSpace[0X47]);
modbus_buf[9] = mdns.mdWorkSpace[0x48];//p2
modbus_buf[8] = mdns.mdWorkSpace[0x49];//p2
}
flags |= (1 << 0);
flags &= ~(1 << 1);
modbus_buf[2] = flags;
}
else
{
flags &= ~(1 << 0);
flags &= ~(1 << 1);
modbus_buf[2] = flags;
}
if(_s_disrec == 0)
stop_disrec |= 0x0F;
}
если упрощённо, то функция делает следующее:
Код
void processing_data(void)
{
расчитываем некое значение mdns.mdfl[Conc]
if(проверяем - невышло ли значение сверх всяких норм)
если да, то орём всем, чем можем и записываем сей факт в журнале
else if(проверяем - не слишком ли близко подошло значение к "сверх всяких норм")
{
верещим пищалкой, зажигаем два светодиода и делаем запись в журнале
}
else if(проверяем - не превысило ли значение из ряда "нормальных значений")
{
верещим пищалкой, зажигаем один светодиод и делаем запись в журнале
}
else
{
всё хорошо, продолжаем как ни в чём небыло
}
}
Так вот - вне зависимости от значения во второй и тетий
if программа незаходит. Т.е. зачение расчитывается, я его спрашиваю по модбасу, оно соответсвует действительности, но ни один светодиод не загорается и звуковой извещатель всё время молчит. Поэтому я даже не знаю - толи эти
if'ы не вошли в готовую программу, либо всё время заходит в последний
иф. В живую получить значения выше
mdns.mdfl[Pr] у меня нет возможности, поэтому этот if мне не проверить.
В процессе отладки я закомментировал расчёты
mdns.mdfl[Conc] просто присваивал этой переменной различные значения. Результат тотже (это в принципе неудивительно, тут ещё можно поверить оптимизатору), но если я этой переменной присваивал значение выше чем
mdns.mdfl[Pr], то в первый
if программа заходит. Из этого я могу сделать вывод, что оптимизации поддались все остальные
if'ы. Можно ли это как-нибудь побороть?
прочие исходные данные : avr-gcc (WinAVR 20080512) 4.3.0; уровень оптимизации "s" (меньше ставить нельзя, больше смысла нет).