реклама на сайте
подробности

 
 
> [avr-gcc]Как побороть лишнюю оптимизацию?
UniBomb
сообщение Feb 4 2009, 13:38
Сообщение #1


Частый гость
**

Группа: Свой
Сообщений: 148
Регистрация: 26-05-05
Пользователь №: 5 416



Добрый день. Столкнулся вот с какой незадачей - компиляция программы происходит так, что часть одной функции как бы выбрасывается из программы. Ошибок в функции нет, но что там говорить, вот эта функция:

(функция "как есть", в целях понимания ничего не убирал, надеюсь поймёте)

Код
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" (меньше ставить нельзя, больше смысла нет).
Go to the top of the page
 
+Quote Post



Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 20th July 2025 - 18:55
Рейтинг@Mail.ru


Страница сгенерированна за 0.01356 секунд с 7
ELECTRONIX ©2004-2016