Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Оптимизация
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > Cредства разработки для МК > IAR
Visor
Странная ситуация. Программа откомпилированная с оптимизацией "Speed Medium" работает замечательно. Если откомпилировать с "Speed High" работает не правильно. Такое чувство что переменные портятся из-за прерываний. Гледел ассемблерный код, вроде нет криминала.
Что это может быть, может сталкивался кто?
MrYuran
Цитата(Visor @ Apr 18 2008, 21:19) *
Странная ситуация. Программа откомпилированная с оптимизацией "Speed Medium" работает замечательно. Если откомпилировать с "Speed High" работает не правильно. Такое чувство что переменные портятся из-за прерываний. Гледел ассемблерный код, вроде нет криминала.
Что это может быть, может сталкивался кто?

Я сталкивался с таким явлением. Поначалу забил, установил средний или низкий уровень и не стал напрягаться.

А потом пришёл к выводу, что при высокой оптимизации ИАР активно использует анроллинг, то есть выкидывает ненужные (с его точки зрения) циклы.

Таким образом, например, вылетают все паузы на нопах, может ещё что-нибудь.

Надо в руководстве на компилятор почитать про все грани оптимизации.

IAR Compiler Reference называется, там много интересных вещей написано, как надо делать и как не надо

PS: это я всё про иар для МСП, но суть думаю не меняется
Visor
Цитата(MrYuran @ Apr 19 2008, 03:14) *
А потом пришёл к выводу, что при высокой оптимизации ИАР активно использует анроллинг, то есть выкидывает ненужные (с его точки зрения) циклы.
Таким образом, например, вылетают все паузы на нопах, может ещё что-нибудь.

Пустые циклы он действительно выкидывает в этом режиме. Но в той функции из-за которой проблемы нет ничего подобного, всё гладко, одна арифметика.
Сергей Борщ
Цитата(Visor @ Apr 18 2008, 22:33) *
Но в той функции из-за которой проблемы нет ничего подобного, всё гладко, одна арифметика.
Посмотрите вчерашнюю ветку. Возможно и у вас что-то подобное.
Visor
Цитата(Сергей Борщ @ Apr 19 2008, 04:09) *
Посмотрите вчерашнюю ветку. Возможно и у вас что-то подобное.

Да кстати, пробывал запрещать прерывания на всё время выполнения функции, глюки пропадали, с чего и сделал вывод о влиянии прерываний. НО! В данной функции не используются переменные модифицируемые в прерываниях.
Сергей Борщ
Цитата(Visor @ Apr 19 2008, 00:40) *
В данной функции не используются переменные модифицируемые в прерываниях.
Наверное, у вас где-то ошибка в программе. Пожалуй, телепатически трудно диагностировать что-то более конкретное wink.gif. Это программа управления новой зенитной ракеты или есть какие-то другие основания держать ее в строгом секрете? Всю показывать не обязательно, можно выкинуть все лишнее. Часто уже на этапе отсекания лишнего ошибка находится. Функция получает какие-то параметры? Попробуйте передавать ей константы - возможно виновата не функция, а просто передаваемые ей значения портятся еще до вызова функции.
Visor
Цитата(Сергей Борщ @ Apr 19 2008, 15:27) *
Наверное, у вас где-то ошибка в программе. ...

Может и ошибка ..., но странно то, что зависит от оптимизации.
Функции передаются указатели на два массива:
Код
Function(&m[0], &n[0]);

Сама функция:
Код
void Function(unsigned char *x, unsigned char *y)
{
  register unsigned char i;
  for(i=0;i<16;i++)
  {
    x[i] ^= y[i];
    ...
  }
  ...
}

Внутри производятся операции с элементами массивов.
vet
Нельзя исключать и вариант ошибки компилятора. Поизучайте ассемблерные листинги, особо рекомендовал бы обратить внимание на циклы и работу с массивами.
singlskv
Цитата(Visor @ Apr 19 2008, 16:47) *
Может и ошибка ..., но странно то, что зависит от оптимизации.
................
Внутри производятся операции с элементами массивов.
По такому количеству кода делать какие-то выводы невозможно,
если автор действительно хочет разобраться с проблемой, нужно удалять части кода
до тех пор пока проблема будет присутствовать...
ВЕСЬ ОСТАВШИЙСЯ МИНИМАЛЬНЫЙ КОД С ОШИБКОЙ нужно опубликовать, тогда Ваша
ошибка или ошибка компилятора будет найдена очень быстро.
Ну или Вы ее найдете быстрее в процессе удаления "лишнего кода".
sKWO
Цитата(Visor @ Apr 19 2008, 00:40) *
Да кстати, пробывал запрещать прерывания на всё время выполнения функции, глюки пропадали, с чего и сделал вывод о влиянии прерываний. НО! В данной функции не используются переменные модифицируемые в прерываниях.

Может глупость но как у Вас написан мэйн?
Код
_C_task main ?
Visor
Цитата(sKWO @ Apr 20 2008, 17:39) *
Может глупость но как у Вас написан мэйн?
Код
_C_task main ?

Нет не так, но это ничего не меняет.
И ещё, в симуляции всё работает замечательно. Но без аппаратных прерываний.
singlskv
Цитата(Visor @ Apr 21 2008, 21:51) *
И ещё, в симуляции всё работает замечательно. Но без аппаратных прерываний.
Вот и славненько, все работает ? А в чем тогда вопрос ?
Visor
Цитата(singlskv @ Apr 22 2008, 04:04) *
Вот и славненько, все работает ? А в чем тогда вопрос ?

В симуляции работало, в железе нет.
Но уже разобрался, увеличил CSTACK и всё. И как сразу не догадался ... 01.gif
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.