|
|
  |
Оптимизация, IAR 4.30A for AVR |
|
|
|
Apr 18 2008, 19:14
|

Беспросветный оптимист
     
Группа: Свой
Сообщений: 4 640
Регистрация: 26-12-07
Из: Н.Новгород
Пользователь №: 33 646

|
Цитата(Visor @ Apr 18 2008, 21:19)  Странная ситуация. Программа откомпилированная с оптимизацией "Speed Medium" работает замечательно. Если откомпилировать с "Speed High" работает не правильно. Такое чувство что переменные портятся из-за прерываний. Гледел ассемблерный код, вроде нет криминала. Что это может быть, может сталкивался кто? Я сталкивался с таким явлением. Поначалу забил, установил средний или низкий уровень и не стал напрягаться. А потом пришёл к выводу, что при высокой оптимизации ИАР активно использует анроллинг, то есть выкидывает ненужные (с его точки зрения) циклы. Таким образом, например, вылетают все паузы на нопах, может ещё что-нибудь. Надо в руководстве на компилятор почитать про все грани оптимизации. IAR Compiler Reference называется, там много интересных вещей написано, как надо делать и как не надо PS: это я всё про иар для МСП, но суть думаю не меняется
Сообщение отредактировал MrYuran - Apr 18 2008, 19:15
--------------------
Программирование делится на системное и бессистемное. ©Моё :) — а для кого-то БГ — это Bill Gilbert =)
|
|
|
|
|
Apr 18 2008, 20:09
|

Гуру
     
Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095

|
Цитата(Visor @ Apr 18 2008, 22:33)  Но в той функции из-за которой проблемы нет ничего подобного, всё гладко, одна арифметика. Посмотрите вчерашнюю ветку. Возможно и у вас что-то подобное.
--------------------
На любой вопрос даю любой ответ"Write code that is guaranteed to work, not code that doesn’t seem to break" ( C++ FAQ)
|
|
|
|
|
Apr 18 2008, 21:40
|

Местный
  
Группа: Свой
Сообщений: 240
Регистрация: 23-03-07
Пользователь №: 26 428

|
Цитата(Сергей Борщ @ Apr 19 2008, 04:09)  Посмотрите вчерашнюю ветку. Возможно и у вас что-то подобное. Да кстати, пробывал запрещать прерывания на всё время выполнения функции, глюки пропадали, с чего и сделал вывод о влиянии прерываний. НО! В данной функции не используются переменные модифицируемые в прерываниях.
|
|
|
|
|
Apr 19 2008, 12:47
|

Местный
  
Группа: Свой
Сообщений: 240
Регистрация: 23-03-07
Пользователь №: 26 428

|
Цитата(Сергей Борщ @ 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]; ... } ... } Внутри производятся операции с элементами массивов.
|
|
|
|
|
Apr 19 2008, 16:49
|
дятел
    
Группа: Свой
Сообщений: 1 681
Регистрация: 13-05-06
Из: Питер
Пользователь №: 17 065

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

Местный
  
Группа: Участник
Сообщений: 355
Регистрация: 27-03-07
Из: Україна, Чуднів
Пользователь №: 26 530

|
Цитата(Visor @ Apr 19 2008, 00:40)  Да кстати, пробывал запрещать прерывания на всё время выполнения функции, глюки пропадали, с чего и сделал вывод о влиянии прерываний. НО! В данной функции не используются переменные модифицируемые в прерываниях. Может глупость но как у Вас написан мэйн? Код _C_task main ?
--------------------
нельзя недооценивать предсказуемость глупости
|
|
|
|
|
Apr 21 2008, 17:51
|

Местный
  
Группа: Свой
Сообщений: 240
Регистрация: 23-03-07
Пользователь №: 26 428

|
Цитата(sKWO @ Apr 20 2008, 17:39)  Может глупость но как у Вас написан мэйн? Код _C_task main ? Нет не так, но это ничего не меняет. И ещё, в симуляции всё работает замечательно. Но без аппаратных прерываний.
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|