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

 
 
 
Reply to this topicStart new topic
> Оптимизатор IAR, Как локально отключить оптимизатор IAR
Sergio66
сообщение Feb 14 2006, 12:28
Сообщение #1


Местный
***

Группа: Свой
Сообщений: 235
Регистрация: 9-02-05
Пользователь №: 2 526



Проблема такая - IAR овский компиллер выкидывает строки из программы (на листинге они просто закомментированы) по своему усмотрению. Как можно заставить его не делать это. Отключение оптимизации для определенной функции не устраивает. Т.к. тот код, который выкидывается - опрос готовности клавиатуры используется во многих функциях программы и если для каждой из них отключить оптимизацию, то код вылезет из памяти.
Это и есть злополучная строка.
while(!(system_events.events_by_flags.Key_pressed)) {RETURN_IF_ING_OFF;};
system_events.events_by_flags.Key_pressed - это итовое поле, выставляемое в обработчике прерывания клавиатуры,
RETURN_IF_ING_OFF - макрос выхода из функции при снятиии сигнала с определенной ноги процесстра.
Go to the top of the page
 
+Quote Post
Виктория
сообщение Feb 14 2006, 12:46
Сообщение #2


инженер
****

Группа: Свой
Сообщений: 520
Регистрация: 19-09-05
Из: Самара
Пользователь №: 8 701



system_events.events_by_flags.Key_pressed - должен быть с описанием volatile (или может другой синоним в IARe)!!!
Go to the top of the page
 
+Quote Post
Sergio66
сообщение Feb 14 2006, 12:55
Сообщение #3


Местный
***

Группа: Свой
Сообщений: 235
Регистрация: 9-02-05
Пользователь №: 2 526



Именно так и есть!!! Именно volatile тип он и имеет!
Go to the top of the page
 
+Quote Post
Виктория
сообщение Feb 14 2006, 13:11
Сообщение #4


инженер
****

Группа: Свой
Сообщений: 520
Регистрация: 19-09-05
Из: Самара
Пользователь №: 8 701



Ну еще бы я явно проверку выполняла
while(flag==0){ }

В общем я за то, чтобы разобраться почему, а не локально оптимизатор отключать. Хотя опции оптимизации тоже нужно посмотреть. У Вас какие установлены при этом? (По памяти/быстродействию/глобальная/...). Может быть для выбранной опции тип volatile игнорируется.

Сообщение отредактировал Vic1 - Feb 14 2006, 13:27
Go to the top of the page
 
+Quote Post
dxp
сообщение Feb 14 2006, 13:23
Сообщение #5


Adept
******

Группа: Свой
Сообщений: 3 469
Регистрация: 6-12-04
Из: Novosibirsk
Пользователь №: 1 343



Цитата(Sergio66 @ Feb 14 2006, 18:55) *
Именно так и есть!!! Именно volatile тип он и имеет!

Дайте полный текст функции (в контексте обсуждаемого) и определение этой структуры. Чтобы можно было просто у себя попробовать.


--------------------
«Отыщи всему начало, и ты многое поймёшь» К. Прутков
Go to the top of the page
 
+Quote Post
IgorKossak
сообщение Feb 16 2006, 09:06
Сообщение #6


Шаман
******

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



Цитата(dxp @ Feb 14 2006, 15:23) *
Дайте полный текст функции (в контексте обсуждаемого) и определение этой структуры. Чтобы можно было просто у себя попробовать.

И разверните макрос RETURN_IF_ING_OFF.
Go to the top of the page
 
+Quote Post
Sergio66
сообщение Feb 16 2006, 10:02
Сообщение #7


Местный
***

Группа: Свой
Сообщений: 235
Регистрация: 9-02-05
Пользователь №: 2 526



Спасибо, я уже разобрался. Дело просто как апельсин! Переменная system_events у меня действительно объявлена, как volatile, однако, в том файле, где она используется, при объявлении ее как extern, я не указал тип volatile.
Go to the top of the page
 
+Quote Post
Igor26
сообщение Feb 16 2006, 10:30
Сообщение #8


Знающий
****

Группа: Свой
Сообщений: 521
Регистрация: 10-02-05
Пользователь №: 2 544



Цитата(Sergio66 @ Feb 16 2006, 13:02) *
Спасибо, я уже разобрался. Дело просто как апельсин! Переменная system_events у меня действительно объявлена, как volatile, однако, в том файле, где она используется, при объявлении ее как extern, я не указал тип volatile.

И компилятор не ругнулся?
Go to the top of the page
 
+Quote Post
vipvap
сообщение Feb 17 2006, 07:09
Сообщение #9





Группа: Новичок
Сообщений: 2
Регистрация: 16-02-06
Пользователь №: 14 396



Цитата(Igor26 @ Feb 16 2006, 13:30) *
Цитата(Sergio66 @ Feb 16 2006, 13:02) *

Спасибо, я уже разобрался. Дело просто как апельсин! Переменная system_events у меня действительно объявлена, как volatile, однако, в том файле, где она используется, при объявлении ее как extern, я не указал тип volatile.

И компилятор не ругнулся?


К сожалению, компилятор IAR не отслеживает ошибки с extern.
Кроме переменных, "можно" по-разному объявить внешние функции в разных файлах и опять же компилятор это пропустит, например, существующая функция
Код
void delay(unsigned [b]char[/b] ms);

в другом файле объявляется как:
Код
extern void delay(unsigned [b]short [/b]ms);

молчит...

Проверялось на IAR3.10c
Go to the top of the page
 
+Quote Post
dxp
сообщение Feb 17 2006, 08:01
Сообщение #10


Adept
******

Группа: Свой
Сообщений: 3 469
Регистрация: 6-12-04
Из: Novosibirsk
Пользователь №: 1 343



Цитата(vipvap @ Feb 17 2006, 13:09) *
К сожалению, компилятор IAR не отслеживает ошибки с extern.
Кроме переменных, "можно" по-разному объявить внешние функции в разных файлах и опять же компилятор это пропустит, например, существующая функция
Код
void delay(unsigned [b]char[/b] ms);

в другом файле объявляется как:
Код
extern void delay(unsigned [b]short [/b]ms);

молчит...

Проверялось на IAR3.10c

smile.gif Вы уверены, что это ошибка? А С++ включен? smile.gif

Например, вот этот код тоже не вызывает у него возражений:
Код
void delay(byte x) { while(x) x--; }  
void delay(word x) { while(x) x--; }

А потом пишем:
Код
byte aaa = 5;
word bbb = 5000;
...
delay(aaa);
delay(bbb);

И смотрим результат:
Код
delay(aaa);
??Exec_3:
   delay(aaa);
....               LDI     R30, LOW(bbb)
....               LDI     R31, (bbb) >> 8
8102               LDD     R16, Z+2
2300               TST     R16
F011               BREQ    ??main_0
       ??main_1:
950A               DEC     R16
F7F1               BRNE    ??main_1
   delay(bbb);
       ??main_0:
8180               LD      R24, Z
8191               LDD     R25, Z+1
2F08               MOV     R16, R24
2B09               OR      R16, R25
F011               BREQ    ??main_2
       ??main_3:
9701               SBIW    R25:R24, 1
F7F1               BRNE    ??main_3

И видим, что все верно - каждый раз компилятор вызвал (точнее, тут он встроил, что есть хорошо и правильно) правильную функцию.

Эта С++ фича, когда можно использовать одно и то же имя для разных функций, различающихся типами аргументов (не типом возврата), называется перегрузкой функций.

А вот если мы захотим на С такое сделать, то получим:

void delay(word x) { while(x) x--; }
^
"D:\slon\IAR\AVR\!V4\03_Overload\slon.cpp",7 Error[Pe247]: function "delay"
has already been defined


--------------------
«Отыщи всему начало, и ты многое поймёшь» К. Прутков
Go to the top of the page
 
+Quote Post
IgorKossak
сообщение Feb 17 2006, 08:17
Сообщение #11


Шаман
******

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



Если компилятор не ругнулся, то вполне возможно отключена выдача ремарок (менее строгие предупреждения, чем warnings).
Отсутствие volatile в extern по большому счёту строгой ошибкой не является.
Go to the top of the page
 
+Quote Post
vipvap
сообщение Feb 20 2006, 07:08
Сообщение #12





Группа: Новичок
Сообщений: 2
Регистрация: 16-02-06
Пользователь №: 14 396



Цитата(dxp @ Feb 17 2006, 11:01) *
Цитата(vipvap @ Feb 17 2006, 13:09) *

К сожалению, компилятор IAR не отслеживает ошибки с extern.
Кроме переменных, "можно" по-разному объявить внешние функции в разных файлах и опять же компилятор это пропустит, например, существующая функция
Код
void delay(unsigned char ms);

в другом файле объявляется как:
Код
extern void delay(unsigned short ms);

молчит...

Проверялось на IAR3.10c

smile.gif Вы уверены, что это ошибка? А С++ включен? smile.gif



C++ вЫключен, про перегрузку я в курсе. Самое интересное -- это ассемблерный код вызова функции с несколькими аргументами.
Если память мне не изменяет, такая ошибка была только при применении extern, если функцию описать без него, то компилятор ругнется.

Сообщение отредактировал vipvap - Feb 20 2006, 07:09
Go to the top of the page
 
+Quote Post
ZiB
сообщение Feb 20 2006, 12:03
Сообщение #13


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

Группа: Свой
Сообщений: 122
Регистрация: 26-07-05
Из: Россия, Томск
Пользователь №: 7 109



можно отключить вот так
#pragma optimize=s 6

.....
#pragma optimize
#pragma optimize=token_1 token_2 token_3
where token_n is one of the following:
s Optimizes for speed
z Optimizes for size

Specifies the level of optimization
2|none|3|low|6|medium|9|high
Go to the top of the page
 
+Quote Post

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

 


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


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