Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Глюки оптимизации IAR V4.11A
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > AVR
antoxa1
Кто нибудь сталкивался со следующей проблемой: компилирую проект, прошиваю контроллер(ATMega8515L), если компиляция происходит без оптимизации- все работает нормально, если выставляю высокий уровень оптимизации, программа работает неверно. В отладчике AVRStudio вроде все работает.
Подробности: проявляется это на функции, которая при одиночном вызове или при нескольких вызовах подряд (но не в цикле) отрабатывает нормально. При вписывании этой функции в тело цикла while , do while, начинаются чудеса, причем только на железе!!!!
prottoss
Цитата(antoxa1 @ Nov 24 2006, 18:54) *
Кто нибудь сталкивался со следующей проблемой: компилирую проект, прошиваю контроллер(ATMega8515L), если компиляция происходит без оптимизации- все работает нормально, если выставляю высокий уровень оптимизации, программа работает неверно. В отладчике AVRStudio вроде все работает.
Подробности: проявляется это на функции, которая при одиночном вызове или при нескольких вызовах подряд (но не в цикле) отрабатывает нормально. При вписывании этой функции в тело цикла while , do while, начинаются чудеса, причем только на железе!!!!
Для начала надо хотя бы на исходники взглянуть, если это, конечно, не сверхсекретный заказ Пентагона...
antoxa1
Вроде напал на путь истины!!! Объясните новичкам, что означает опция "Clustering of variables"
_Bill
Цитата(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         ;
IgorKossak
Сталкивался с подобным глюком, но когда обновился до версии 4.20а, глюки пропали.
slog
А ты volatile везде где надо поставил? Просто ну очень маловероятно что это глюк компилятора.
SasaVitebsk
Не отмахивайся сразу а подумай над моим топиком.

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

Приведу примеры с которыми я сталкивался.
1) Изменилась глубина вложенности стека и он стал "задевать" за живое при определённых ситуациях.
2) Более сложный вариант. В Вашем цикле сравнивается переменная(многобайтовая), которая модифицируется в прерывании. В неоптимизированном коде прерывание попадало на определённые куски проги, а в оптимизированной на другие. И в оптимизированной попадает между двумя сравнениями.
SergeyBorshch
Смотря какой уровень оптимизации кода поставить. Я лично всегда ставлю Low - и все работает нормально. Пробывал ставить Medium - начинают проявлятся глюки, но терпимо. Ну а про High - вообще сплошные глюки.
Я думаю, что лучше пусть больше памяти проект занимает, нежели будет работать с глюками.
antoxa1
Цитата(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++;
};

}
IgorKossak
Если в симуляторе работает, а в железе - нет, то попробуйте увеличить размер стека данных.
Второе. Вы передаёте массив в функцию, попробуйте сделать статический массив и передавать указатель на него.
Что касается требования к правильности работы программы при любом уровне оптимизации, то полностью Вас поддерживаю. В своих проектах ставлю максимальный уровень оптимизации по скорости (автоматически получается и по обьёму), проблем нет (версия 4.20А!).
_Bill
Цитата(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? И потом, доступ к массиву через указатель гораздо эффективнее нежели через индекс. Тем более, что размер кода для Вас наиболее важен.
prottoss
Цитата(antoxa1 @ Nov 27 2006, 19:37) *
Цитата(SergeyBorshch @ Nov 27 2006, 13:38) *

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

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

По поводу кластеризации переменных. Стараюсь в каждом Си модуле сам объединять глобальные переменные в структуры, а в начале функций, работа в которой определена с той или иной структурой в начале функции создаю указатель на структуру и работаю с переменными через него. Пример - мой USART driver в теме с исходниками
ARIM
Цитата(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.
antoxa1
Всем спасибо!!!! Проблема решилась!!! Ошибка алгоритмы работы программы, компилятор не виновент.
defunct
Цитата(SergeyBorshch @ Nov 27 2006, 13:38) *
Я лично всегда ставлю Low - и все работает нормально. Пробывал ставить Medium - начинают проявлятся глюки, но терпимо. Ну а про High - вообще сплошные глюки.

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

Работать программа должна независимо от уровня оптимизации.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.