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

 
 
> Глюки оптимизации IAR V4.11A
antoxa1
сообщение Nov 24 2006, 14:54
Сообщение #1


Участник
*

Группа: Новичок
Сообщений: 15
Регистрация: 6-04-06
Пользователь №: 15 889



Кто нибудь сталкивался со следующей проблемой: компилирую проект, прошиваю контроллер(ATMega8515L), если компиляция происходит без оптимизации- все работает нормально, если выставляю высокий уровень оптимизации, программа работает неверно. В отладчике AVRStudio вроде все работает.
Подробности: проявляется это на функции, которая при одиночном вызове или при нескольких вызовах подряд (но не в цикле) отрабатывает нормально. При вписывании этой функции в тело цикла while , do while, начинаются чудеса, причем только на железе!!!!

Сообщение отредактировал antoxa1 - Nov 24 2006, 15:41
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов (1 - 14)
prottoss
сообщение Nov 24 2006, 16:11
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 2 720
Регистрация: 24-03-05
Пользователь №: 3 659



Цитата(antoxa1 @ Nov 24 2006, 18:54) *
Кто нибудь сталкивался со следующей проблемой: компилирую проект, прошиваю контроллер(ATMega8515L), если компиляция происходит без оптимизации- все работает нормально, если выставляю высокий уровень оптимизации, программа работает неверно. В отладчике AVRStudio вроде все работает.
Подробности: проявляется это на функции, которая при одиночном вызове или при нескольких вызовах подряд (но не в цикле) отрабатывает нормально. При вписывании этой функции в тело цикла while , do while, начинаются чудеса, причем только на железе!!!!
Для начала надо хотя бы на исходники взглянуть, если это, конечно, не сверхсекретный заказ Пентагона...


--------------------
Go to the top of the page
 
+Quote Post
antoxa1
сообщение Nov 24 2006, 17:24
Сообщение #3


Участник
*

Группа: Новичок
Сообщений: 15
Регистрация: 6-04-06
Пользователь №: 15 889



Вроде напал на путь истины!!! Объясните новичкам, что означает опция "Clustering of variables"
Go to the top of the page
 
+Quote Post
_Bill
сообщение Nov 24 2006, 17:46
Сообщение #4


Местный
***

Группа: Участник
Сообщений: 416
Регистрация: 18-04-06
Из: Челябинск
Пользователь №: 16 219



Цитата(antoxa1 @ Nov 24 2006, 17:24) *
Вроде напал на путь истины!!! Объясните новичкам, что означает опция "Clustering of variables"

Это когда переменные объединяются в так называемые кластеры (группы), к которым можно получить доступ используя один указатель. Пример (достаточно надуманный, но...):
Код
char x, y, z;
.....
;     x = z;
;     y = 5;
       ldi    zl, low (x)
       ldi    zh, high (x)
       ld     r16, z         ; x = z;
       std   z+2, r16         ;
       ldi    r16, 5         ; y = 5;
       std   z+1, r16         ;
Go to the top of the page
 
+Quote Post
IgorKossak
сообщение Nov 24 2006, 19:03
Сообщение #5


Шаман
******

Группа: Модераторы
Сообщений: 3 064
Регистрация: 30-06-04
Из: Киев, Украина
Пользователь №: 221



Сталкивался с подобным глюком, но когда обновился до версии 4.20а, глюки пропали.
Go to the top of the page
 
+Quote Post
slog
сообщение Nov 24 2006, 19:35
Сообщение #6


Знающий
****

Группа: Свой
Сообщений: 961
Регистрация: 28-11-05
Пользователь №: 11 489



А ты volatile везде где надо поставил? Просто ну очень маловероятно что это глюк компилятора.


--------------------
В действительности всё не так, как на самом деле.
Go to the top of the page
 
+Quote Post
SasaVitebsk
сообщение Nov 25 2006, 19:02
Сообщение #7


Гуру
******

Группа: Свой
Сообщений: 2 712
Регистрация: 28-11-05
Из: Беларусь, Витебск, Строителей 18-4-220
Пользователь №: 11 521



Не отмахивайся сразу а подумай над моим топиком.

Может причина не в том что появилась новая ошибка в оптимизированном коде, а ПРОЯВИЛАСЬ старая. То есть в неоптимизированном она просто не проявлялась.

Приведу примеры с которыми я сталкивался.
1) Изменилась глубина вложенности стека и он стал "задевать" за живое при определённых ситуациях.
2) Более сложный вариант. В Вашем цикле сравнивается переменная(многобайтовая), которая модифицируется в прерывании. В неоптимизированном коде прерывание попадало на определённые куски проги, а в оптимизированной на другие. И в оптимизированной попадает между двумя сравнениями.
Go to the top of the page
 
+Quote Post
SergeyBorshch
сообщение Nov 27 2006, 13:38
Сообщение #8


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

Группа: Участник
Сообщений: 100
Регистрация: 28-09-05
Из: Чернигов, Украина
Пользователь №: 9 053



Смотря какой уровень оптимизации кода поставить. Я лично всегда ставлю Low - и все работает нормально. Пробывал ставить Medium - начинают проявлятся глюки, но терпимо. Ну а про High - вообще сплошные глюки.
Я думаю, что лучше пусть больше памяти проект занимает, нежели будет работать с глюками.
Go to the top of the page
 
+Quote Post
antoxa1
сообщение Nov 27 2006, 15:37
Сообщение #9


Участник
*

Группа: Новичок
Сообщений: 15
Регистрация: 6-04-06
Пользователь №: 15 889



Цитата(SergeyBorshch @ Nov 27 2006, 13:38) *
Смотря какой уровень оптимизации кода поставить. Я лично всегда ставлю Low - и все работает нормально. Пробывал ставить Medium - начинают проявлятся глюки, но терпимо. Ну а про High - вообще сплошные глюки.
Я думаю, что лучше пусть больше памяти проект занимает, нежели будет работать с глюками.

Во-первых, мой проект критичен к размеру памяти программ; во-вторых, правильно написанная программа должна правильно работать независимо от уровня выставляемой оптимизации

еще одно дополнение: параметры, передаваемые в вышеупомянутую функцию, не модифицируются в прерываниях. Вот код функции:
void PrintCharA ( int x, int y,char cod,int CS)
{
char dx , bitx, cod_dx, cod_dx1, byte_dx_pred, byte_dx, byte_dx1, byte_dx1_pred;
int cod_dxt,i,temp ;
bitx=0; dx=0;

bitx=x%8;//áèòû
dx=x/8;//êîîðäèíàòà x äëÿ çàïèñè â ðåãèñòð èíäèêàòîðà
for(i=0;i<=7;i++)
{
byte_dx_pred=byte_dx1_pred=0;
SetPos(dx,y+i,CS);
DataRD(CS);
byte_dx_pred=DataRD(CS);
SetPos(dx+1,y+i,CS);
DataRD(CS);
byte_dx1_pred=DataRD(CS);

if ((cod<0xE0)&(cod>0x29))
{
temp=Digit[cod%0x30][i];
}
else
{
temp=Pic[cod%0xE0][i];
};
if(cod==' ') temp=Pic[32][i];

cod_dxt=temp<<bitx-1; //ôîðìèðóåì äâà áàéòà äëÿ çàïèñè â ñîñåäíèå êîîðäèíàòû
cod_dx1=(cod_dxt&0xFF00)>>8;// âûäåëÿåì ïåðâûé áàéò
cod_dx=(cod_dxt&0xFF);//âûäåëÿåì âòîðîé áàéò
byte_dx=byte_dx_pred|cod_dx;//
SetPos(dx,y+i,CS);
DataWR(byte_dx,CS);
byte_dx1=byte_dx1_pred|cod_dx1;//
SetPos(dx+1,y+i,CS);
DataWR(byte_dx1,CS);

вот цикл:
void PrintString(int x,int y,char str[10],int CS)
{
int i;
i=0;
while (str[i]!='\0')
{
PrintCharA(x+6*i+1,y,str[i],CS);
i++;
};

}
Go to the top of the page
 
+Quote Post
IgorKossak
сообщение Nov 27 2006, 15:48
Сообщение #10


Шаман
******

Группа: Модераторы
Сообщений: 3 064
Регистрация: 30-06-04
Из: Киев, Украина
Пользователь №: 221



Если в симуляторе работает, а в железе - нет, то попробуйте увеличить размер стека данных.
Второе. Вы передаёте массив в функцию, попробуйте сделать статический массив и передавать указатель на него.
Что касается требования к правильности работы программы при любом уровне оптимизации, то полностью Вас поддерживаю. В своих проектах ставлю максимальный уровень оптимизации по скорости (автоматически получается и по обьёму), проблем нет (версия 4.20А!).
Go to the top of the page
 
+Quote Post
_Bill
сообщение Nov 27 2006, 16:21
Сообщение #11


Местный
***

Группа: Участник
Сообщений: 416
Регистрация: 18-04-06
Из: Челябинск
Пользователь №: 16 219



Цитата(antoxa1 @ Nov 27 2006, 15:37) *
вот цикл:
void PrintString(int x,int y,char str[10],int CS)
{
int i;
i=0;
while (str[i]!='\0')
{
PrintCharA(x+6*i+1,y,str[i],CS);
i++;
};

}

Насколько необходимо использовать в параметрах и самой функции тип int? И потом, доступ к массиву через указатель гораздо эффективнее нежели через индекс. Тем более, что размер кода для Вас наиболее важен.
Go to the top of the page
 
+Quote Post
prottoss
сообщение Nov 27 2006, 16:47
Сообщение #12


Гуру
******

Группа: Свой
Сообщений: 2 720
Регистрация: 24-03-05
Пользователь №: 3 659



Цитата(antoxa1 @ Nov 27 2006, 19:37) *
Цитата(SergeyBorshch @ Nov 27 2006, 13:38) *

Смотря какой уровень оптимизации кода поставить. Я лично всегда ставлю Low - и все работает нормально. Пробывал ставить Medium - начинают проявлятся глюки, но терпимо. Ну а про High - вообще сплошные глюки.
Я думаю, что лучше пусть больше памяти проект занимает, нежели будет работать с глюками.

Во-первых, мой проект критичен к размеру памяти программ; во-вторых, правильно написанная программа должна правильно работать независимо от уровня выставляемой оптимизации
Всеми руками за!!! ВСЕГДА релиз выпускаю с максимальной оптимизацией по скорости. Все работает без всяких глюков...Пользуюсь ИАР вер.4.10А.

По поводу кластеризации переменных. Стараюсь в каждом Си модуле сам объединять глобальные переменные в структуры, а в начале функций, работа в которой определена с той или иной структурой в начале функции создаю указатель на структуру и работаю с переменными через него. Пример - мой USART driver в теме с исходниками


--------------------
Go to the top of the page
 
+Quote Post
ARIM
сообщение Nov 27 2006, 17:41
Сообщение #13


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

Группа: Свой
Сообщений: 94
Регистрация: 14-04-05
Из: Россия
Пользователь №: 4 130



Цитата(antoxa1 @ Nov 24 2006, 14:54) *
Кто нибудь сталкивался со следующей проблемой: компилирую проект, прошиваю контроллер(ATMega8515L), если компиляция происходит без оптимизации- все работает нормально, если выставляю высокий уровень оптимизации, программа работает неверно. В отладчике AVRStudio вроде все работает.
Подробности: проявляется это на функции, которая при одиночном вызове или при нескольких вызовах подряд (но не в цикле) отрабатывает нормально. При вписывании этой функции в тело цикла while , do while, начинаются чудеса, причем только на железе!!!!

если включена опция "Allow IAR extensions" то рекомендуется выключить "Type-based alias analysis"

это из даташита на компилятор:
Type-based alias analysis is performed at optimization level High. For ISO/ANSI
standard-conforming C or C++ application code, this optimization can reduce code size
and execution time. However, non-standard-conforming C or C++ code might result in
the compiler producing code that leads to unexpected behavior. Therefore, it is possible
to turn this optimization off.
Go to the top of the page
 
+Quote Post
antoxa1
сообщение Dec 8 2006, 16:19
Сообщение #14


Участник
*

Группа: Новичок
Сообщений: 15
Регистрация: 6-04-06
Пользователь №: 15 889



Всем спасибо!!!! Проблема решилась!!! Ошибка алгоритмы работы программы, компилятор не виновент.
Go to the top of the page
 
+Quote Post
defunct
сообщение Dec 9 2006, 19:29
Сообщение #15


кекс
******

Группа: Свой
Сообщений: 3 825
Регистрация: 17-12-05
Из: Киев
Пользователь №: 12 326



Цитата(SergeyBorshch @ Nov 27 2006, 13:38) *
Я лично всегда ставлю Low - и все работает нормально. Пробывал ставить Medium - начинают проявлятся глюки, но терпимо. Ну а про High - вообще сплошные глюки.

Хотелось бы следовать вашим убеждениям, однако бывают проекты, которые с низким уровнем оптимизщации просто не влазят в память МК...

Работать программа должна независимо от уровня оптимизации.
Go to the top of the page
 
+Quote Post

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

 


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


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