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

 
 
> Попробовал ИАР-МСП в3.20, впечатления
VAI
сообщение Jul 5 2004, 05:11
Сообщение #1


Профессионал
*****

Группа: Модераторы
Сообщений: 1 120
Регистрация: 17-06-04
Пользователь №: 37



Ошибка при работе с volatile (http://www.telesys.ru/wwwboards/mcontrol/703/messages/67032.shtml
), что была в v3.10a, исправлена, как минимум, в моем случае.
Есть глюк с оптимизацией, я использую полную по скорости - надо отключать "Code motion" - ошибочно выносит из цикла переменную (опять же в моем случае).
При других оптимизациях не проверял.


--------------------
Если зайца бить, его можно и спички научить зажигать
Сколько дурака не бей - умнее не будет. Зато опытнее
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
VAI
сообщение Jul 5 2004, 14:39
Сообщение #2


Профессионал
*****

Группа: Модераторы
Сообщений: 1 120
Регистрация: 17-06-04
Пользователь №: 37



Пример, в котором проявляется ошибка оптимизатора

Код
typedef struct
{ unsigned char *home;                  // указатель на начало буфера
 unsigned char *head;                  // указатель на голову буфера
 unsigned char *tail;                  // указатель на хвост буфера
 unsigned char *end;                   // указатель на конец буфера
 volatile int change;                    //
} CIRCULAR_BUFFER;

int put_circle( unsigned char dat, CIRCULAR_BUFFER *buf )
{
CIRCULAR_BUFFER b;
istate_t i;
int c;
unsigned char *p;

 for ( b.home = buf->home, b.end = buf->end;; )
 { b.head = buf->head;
   b.tail = buf->tail;
   b.change = buf->change;

   c = 0;// это присваивание при "Code motion" выносится из цикла, хотя ниже с может стать -1, а при повторном прохождении цикла с должно опять стать нулем.

   if ( b.tail == NULL )
   { b.tail = b.head;                  // буфер полон,
     if ( ++b.head == b.end )           // сдвинем голову
       b.head = b.home;
   }
   p = b.tail;                         // Сюда надо положить dat
   if ( ++b.tail == b.end )
     b.tail = b.home;
   if ( b.tail == b.head )              // буфер заполнен ?
   { b.tail = NULL;                    // да
     c = -1;
   }
   if ( b.change == buf->change )     // фоновый процесс поработал с буфером в это-же время, придется все делать заново
     break;
 }

 i = __get_interrupt_state();          // сохраним статус прерываний
 __disable_interrupt();                // Запретим прерывания
 buf->change++;                        // мы поработали с буфером!
 buf->head = b.head;                   // обновим значения в буфере
 buf->tail = b.tail;
 *p = dat;
 __set_interrupt_state( i );           // востановим статус прерываний
 return( c );
}


--------------------
Если зайца бить, его можно и спички научить зажигать
Сколько дурака не бей - умнее не будет. Зато опытнее
Go to the top of the page
 
+Quote Post



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

 


RSS Текстовая версия Сейчас: 22nd July 2025 - 17:23
Рейтинг@Mail.ru


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