|
|
  |
Оптимизатор IAR, Как локально отключить оптимизатор IAR |
|
|
|
Feb 17 2006, 07:09
|
Группа: Новичок
Сообщений: 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
|
|
|
|
|
Feb 17 2006, 08:01
|

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  Вы уверены, что это ошибка? А С++ включен?  Например, вот этот код тоже не вызывает у него возражений: Код 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
--------------------
«Отыщи всему начало, и ты многое поймёшь» К. Прутков
|
|
|
|
|
Feb 20 2006, 07:08
|
Группа: Новичок
Сообщений: 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  Вы уверены, что это ошибка? А С++ включен?  C++ вЫключен, про перегрузку я в курсе. Самое интересное -- это ассемблерный код вызова функции с несколькими аргументами. Если память мне не изменяет, такая ошибка была только при применении extern, если функцию описать без него, то компилятор ругнется.
Сообщение отредактировал vipvap - Feb 20 2006, 07:09
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|