|
Глюки оптимизации IAR V4.11A |
|
|
|
Nov 24 2006, 14:54
|
Участник

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

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

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

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

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

|
Вроде напал на путь истины!!! Объясните новичкам, что означает опция "Clustering of variables"
|
|
|
|
|
Nov 24 2006, 17:46
|
Местный
  
Группа: Участник
Сообщений: 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 ;
|
|
|
|
|
Nov 27 2006, 15:37
|
Участник

Группа: Новичок
Сообщений: 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++; }; }
|
|
|
|
|
Nov 27 2006, 16:21
|
Местный
  
Группа: Участник
Сообщений: 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? И потом, доступ к массиву через указатель гораздо эффективнее нежели через индекс. Тем более, что размер кода для Вас наиболее важен.
|
|
|
|
|
Nov 27 2006, 16:47
|

Гуру
     
Группа: Свой
Сообщений: 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 в теме с исходниками
--------------------
|
|
|
|
|
Nov 27 2006, 17:41
|
Частый гость
 
Группа: Свой
Сообщений: 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.
|
|
|
|
|
Dec 8 2006, 16:19
|
Участник

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

|
Всем спасибо!!!! Проблема решилась!!! Ошибка алгоритмы работы программы, компилятор не виновент.
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|