Sergio66 0 14 февраля, 2006 Опубликовано 14 февраля, 2006 · Жалоба Проблема такая - IAR овский компиллер выкидывает строки из программы (на листинге они просто закомментированы) по своему усмотрению. Как можно заставить его не делать это. Отключение оптимизации для определенной функции не устраивает. Т.к. тот код, который выкидывается - опрос готовности клавиатуры используется во многих функциях программы и если для каждой из них отключить оптимизацию, то код вылезет из памяти. Это и есть злополучная строка. while(!(system_events.events_by_flags.Key_pressed)) {RETURN_IF_ING_OFF;}; system_events.events_by_flags.Key_pressed - это итовое поле, выставляемое в обработчике прерывания клавиатуры, RETURN_IF_ING_OFF - макрос выхода из функции при снятиии сигнала с определенной ноги процесстра. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Виктория 0 14 февраля, 2006 Опубликовано 14 февраля, 2006 · Жалоба system_events.events_by_flags.Key_pressed - должен быть с описанием volatile (или может другой синоним в IARe)!!! Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Sergio66 0 14 февраля, 2006 Опубликовано 14 февраля, 2006 · Жалоба Именно так и есть!!! Именно volatile тип он и имеет! Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Виктория 0 14 февраля, 2006 Опубликовано 14 февраля, 2006 (изменено) · Жалоба Ну еще бы я явно проверку выполняла while(flag==0){ } В общем я за то, чтобы разобраться почему, а не локально оптимизатор отключать. Хотя опции оптимизации тоже нужно посмотреть. У Вас какие установлены при этом? (По памяти/быстродействию/глобальная/...). Может быть для выбранной опции тип volatile игнорируется. Изменено 14 февраля, 2006 пользователем Vic1 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
dxp 41 14 февраля, 2006 Опубликовано 14 февраля, 2006 · Жалоба Именно так и есть!!! Именно volatile тип он и имеет! Дайте полный текст функции (в контексте обсуждаемого) и определение этой структуры. Чтобы можно было просто у себя попробовать. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
IgorKossak 0 16 февраля, 2006 Опубликовано 16 февраля, 2006 · Жалоба Дайте полный текст функции (в контексте обсуждаемого) и определение этой структуры. Чтобы можно было просто у себя попробовать. И разверните макрос RETURN_IF_ING_OFF. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Sergio66 0 16 февраля, 2006 Опубликовано 16 февраля, 2006 · Жалоба Спасибо, я уже разобрался. Дело просто как апельсин! Переменная system_events у меня действительно объявлена, как volatile, однако, в том файле, где она используется, при объявлении ее как extern, я не указал тип volatile. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Igor26 0 16 февраля, 2006 Опубликовано 16 февраля, 2006 · Жалоба Спасибо, я уже разобрался. Дело просто как апельсин! Переменная system_events у меня действительно объявлена, как volatile, однако, в том файле, где она используется, при объявлении ее как extern, я не указал тип volatile. И компилятор не ругнулся? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
vipvap 0 17 февраля, 2006 Опубликовано 17 февраля, 2006 · Жалоба Спасибо, я уже разобрался. Дело просто как апельсин! Переменная system_events у меня действительно объявлена, как volatile, однако, в том файле, где она используется, при объявлении ее как extern, я не указал тип volatile. И компилятор не ругнулся? К сожалению, компилятор IAR не отслеживает ошибки с extern. Кроме переменных, "можно" по-разному объявить внешние функции в разных файлах и опять же компилятор это пропустит, например, существующая функция void delay(unsigned [b]char[/b] ms); в другом файле объявляется как: extern void delay(unsigned [b]short [/b]ms); молчит... Проверялось на IAR3.10c Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
dxp 41 17 февраля, 2006 Опубликовано 17 февраля, 2006 · Жалоба К сожалению, компилятор IAR не отслеживает ошибки с extern. Кроме переменных, "можно" по-разному объявить внешние функции в разных файлах и опять же компилятор это пропустит, например, существующая функция void delay(unsigned [b]char[/b] ms); в другом файле объявляется как: extern void delay(unsigned [b]short [/b]ms); молчит... Проверялось на IAR3.10c :) Вы уверены, что это ошибка? А С++ включен? :) Например, вот этот код тоже не вызывает у него возражений: 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 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
IgorKossak 0 17 февраля, 2006 Опубликовано 17 февраля, 2006 · Жалоба Если компилятор не ругнулся, то вполне возможно отключена выдача ремарок (менее строгие предупреждения, чем warnings). Отсутствие volatile в extern по большому счёту строгой ошибкой не является. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
vipvap 0 20 февраля, 2006 Опубликовано 20 февраля, 2006 (изменено) · Жалоба К сожалению, компилятор IAR не отслеживает ошибки с extern. Кроме переменных, "можно" по-разному объявить внешние функции в разных файлах и опять же компилятор это пропустит, например, существующая функция void delay(unsigned char ms); в другом файле объявляется как: extern void delay(unsigned short ms); молчит... Проверялось на IAR3.10c :) Вы уверены, что это ошибка? А С++ включен? :) C++ вЫключен, про перегрузку я в курсе. Самое интересное -- это ассемблерный код вызова функции с несколькими аргументами. Если память мне не изменяет, такая ошибка была только при применении extern, если функцию описать без него, то компилятор ругнется. Изменено 20 февраля, 2006 пользователем vipvap Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ZiB 0 20 февраля, 2006 Опубликовано 20 февраля, 2006 · Жалоба можно отключить вот так #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 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться