|
Не отрабатывает #define, глюки работы директивы define |
|
|
|
Jan 6 2008, 10:27
|

Местный
  
Группа: Свой
Сообщений: 343
Регистрация: 24-01-07
Из: Новосибирск
Пользователь №: 24 714

|
Столкнулся с тем, что не отрабатывает. Приходится ставить все в опциях компилятора. Не понимаю, почему. Поиску либо разучился задавать вопросы, либо на самом деле ни у кого такой проблемы не возникало и здесь ее не обсуждали (наверное, вряд ли, но прошу сильно не сердиться и по возможности не просто отослать в поиск, а дать ссылку) Код #ifdef DEBUG //Генерация импульса синхронизации DDRD |= 1 << PD1; PORTD |= 1 << PD1; _delay_ms( 1 ); PORTD &= ~(1 << PD1); #endif //DEBUG Пока явно в опциях не поставишь DEBUG, в любом из файлов хоть заставься. Точно также не отрабатывает Код #ifndef F_CPU #define F_CPU 3686400UL #endif В используемом далее контексте ругается, что не определено F_CPU Код #ifndef F_CPU # warning "F_CPU not defined for <aspID/delay.h> using 1MHz" # warning "To define F_CPU go Proj->Opt->C/C++->Defined symbols" # define F_CPU 1000000UL #endif Но и этот # define очень похоже, что не отрабатывает. Заранее спасибо и всех с наступающим Рождеством! ЗЫ: до сих пор не могу победить проблему, если пишу с использованием классов и НЕ использую конструктор по умолчанию - кричит "дай!"
|
|
|
|
|
 |
Ответов
|
Jan 9 2008, 12:05
|

Просто Che
    
Группа: Свой
Сообщений: 1 567
Регистрация: 22-05-07
Из: ExUSSR
Пользователь №: 27 881

|
Цитата(zltigo @ Jan 8 2008, 22:20)  А что нужно - либо точность, либо скорость - думайте. Цитата(aspID @ Jan 9 2008, 06:13)  Про точность понима, а вот про скорость не понима... Что будет работать быстрее и почему? А вот действительно, наконец-то задумался  и тоже не понял, что значит в данном примере СКОРОСТЬ. Макрос то использует встроенную функцию ИАРа: Цитата __delay_cycles(unsigned long int); Makes the compiler generate code that takes the given amount of cycles to perform, that is it inserts a time delay that lasts the specified number of cycles. Note: The specified value must be a constant integer expression and not an expression that is evaluated at runtime. И если он будет генерить для одной и той-же или для близких по величине констант код, работающий сильно различное время, то это будет явный ляп ИАРа. А его не наблюдается Так что может коллега zltigo имел в виду не скорость, а размер кода?
|
|
|
|
|
Jan 9 2008, 13:32
|

Гуру
     
Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244

|
Цитата(Baser @ Jan 9 2008, 14:05)  Так что может коллега zltigo имел в виду не скорость, а размер кода? В общем случае, при использовании в макросе переменной, время вычисления подстановки для AVR будет и рядом не лежать с микросекундами и отличаться в двух вариантах. Цитата(aspID @ Jan 9 2008, 13:57)  Видимо, именно потому, что не подумал о возможности подстановки вместо x "неконстанты"... Ну теперь знаете  а то, что называется "сюрприз!" может случиться с задержкой.
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
|
Jan 9 2008, 13:42
|

Гуру
     
Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095

|
Цитата(zltigo @ Jan 9 2008, 15:32)  а то, что называется "сюрприз!" может случиться с задержкой. На этапе компиляции. Baser правильно заметил - аргументом __delay_cycles() может быть только константа, ибо компилятор для каждой конкретной задержки генерит подогнанный по тактам код. Для задержек в 2-4 такта вообще без цикла. Если использовать в качестве аргумента переменную - выдает ошибку на этапе компиляции. Исходя из этого можно посоветовать aspIDу поменять макросы назад - чтобы сначала выполнялось умножение и при прочих равных иметь бОльшую точность. А F_CPU объявить с индексом ULL - чтобы вычисления выполнялись в 64 битах и (при разумных задержках) не происходило переполнения.
--------------------
На любой вопрос даю любой ответ"Write code that is guaranteed to work, not code that doesn’t seem to break" ( C++ FAQ)
|
|
|
|
|
Jan 9 2008, 20:42
|
Местный
  
Группа: Участник*
Сообщений: 418
Регистрация: 20-08-07
Пользователь №: 29 930

|
__delay_cycles() - это тяжелое наследие 8-ми разрядной архитектуры? Или что? Я что-то перерыл все библиотеки в своем IAR-е 4.3 и вообще ее не обнаружил... Что-то смутно помню подобное из архитектуры 8051... подобное... хотя всего год как бросил этот обломок совместимости...
Сообщение отредактировал Николай Z - Jan 9 2008, 20:44
|
|
|
|
|
Jan 10 2008, 08:16
|

Гуру
     
Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095

|
Цитата(dxp @ Jan 10 2008, 05:49)  Вообще, имхо, к архитектуре это отношения не имеет, местами вполне полезная фишка. Есть предложение считать правильной такую версию: эта функция реализована в компиляторах ИАРа для процессоров, у которых детерминировано время выполнения команд. Вот, например, у ARM7 время выполнения зависит от места исполнения (ОЗУ/флеш), от настроек ускорителя, у более старших (скорее всего) - от настроек кеша. Поэтому в EWARM такой функции нет. Цитата(Baser @ Jan 10 2008, 00:11)  Причем тут "тяжелое наследие"!? Это у Николая стиль общения такой - "тяжелое наследие", "обломок совместимости". Не обращай внимания.
--------------------
На любой вопрос даю любой ответ"Write code that is guaranteed to work, not code that doesn’t seem to break" ( C++ FAQ)
|
|
|
|
|
Jan 10 2008, 09:05
|
Местный
  
Группа: Участник*
Сообщений: 418
Регистрация: 20-08-07
Пользователь №: 29 930

|
Цитата(Сергей Борщ @ Jan 10 2008, 11:16)  Есть предложение считать правильной такую версию: эта функция реализована в компиляторах ИАРа для процессоров, у которых детерминировано время выполнения команд. Вот, например, у ARM7 время выполнения зависит от места исполнения (ОЗУ/флеш), от настроек ускорителя, у более старших (скорее всего) - от настроек кеша. Поэтому в EWARM такой функции нет. Понятно... А то я озадачился отсутствием этой функции в моих библиотеках... специально искал ее и не нашел... Насчет удобства и полезности таких функций - как тут кто-то сказал - у меня всегда были большие сомнения...Как раз потому - что они легко ведут к непониманию сути происходящего, если человек слабо представляет себе архитектуру процессора и цель определения таких фукнций. Даже на 8051-м процессоре(поискал и нашел-таки в старых залежах) я постарался аналогичную функцию исключить из употребления и необходимые задержки предпочитал вставлять сам в виде 2-3 asm(" nop"); или соответствующих циклов. Зачем? А вот как раз затем - что аналогичная функция в моем случае позволяла задать пераметром не только константное выражение. В результате - один из наших "сильно умных" практикантов написал кусок кода с операцией деления при рассчете этой задержки. Ну а деление в свою очередь - не имело аппаратной поддержки... Как результат - вот именно то о чем говорил zltigo - вместо задержки на фиксированное количество тактов - получалось черт знает что. Если точнее - функция-то задержку делала правильную, но ей предшествовало вычисление величины этой задержки, которое занимало в несколько раз большее время и это время сильно зависело от заданных значений. Цитата(Baser @ Jan 10 2008, 01:11)  Все свои программные задержки, где забываешь счетчик цикла объявить volatile, оптимизатор безжалостно выкидывает Одно плохо: функция не стандартная. Угу... А когда забудешь и влепишь выражение в параметр подобной функции - это лучше? Я предпочитаю явное указание оптимизатору давать : "а не лезь сюда со своим интеллектом" - volatile это... А насчет рассчитать величину задержки - а что тут такого суперсложного? Насчет стандартности - такая функция(и другие ей подобные) стандартной быть не может и не должна. Ибо она платформенно-зависимая в очень большой степени. Цитата(IgorKossak @ Jan 10 2008, 00:41)  Это intrinsic function, описанная в EWAVR_CompilerReference.pdf и обьявленная в intrinsics.h А у меня не EW AVR_CompilerReference.pdf , у меня EW ARM_CompilerReference.pdf
Сообщение отредактировал Николай Z - Jan 10 2008, 08:54
|
|
|
|
|
Jan 10 2008, 09:35
|
Знающий
   
Группа: Свой
Сообщений: 771
Регистрация: 16-07-07
Из: Волгодонск
Пользователь №: 29 153

|
Цитата(Николай Z @ Jan 10 2008, 12:05)  А насчет рассчитать величину задержки - а что тут такого суперсложного? Да ничего, но ее надо рассчитать. Для чего надо знать про оптимизацию. Или вставлять код на асме. А __delay_cycles(X) делает это автоматом, наиболее корректно и затем при чтении кода не возникает вопросов о том, что это такое. Так что в ситуациях, когда нужны небольшие задержки - по моему, самое оно. Насчет переносимости - она обычно используется где-то глубоко внизу, а при переносе на другую платформу "низ" обычно приходится так или иначе переписывать... Цитата(Николай Z @ Jan 10 2008, 12:05)  Угу... А когда забудешь и влепишь выражение в параметр подобной функции - это лучше? В данном случае компилятор не позволит использовать неконстантное выражение.
|
|
|
|
|
Jan 10 2008, 09:47
|
Местный
  
Группа: Участник*
Сообщений: 418
Регистрация: 20-08-07
Пользователь №: 29 930

|
Цитата(Непомнящий Евгений @ Jan 10 2008, 12:35)  В данном случае компилятор не позволит использовать неконстантное выражение. В данном - возможно... А в моем - который я выше описал - очень даже позволил. Потому я бы все-таки предпочел самое, что ни на есть явное задание нужных мне задержек. Чтобы не надо было искать особенности этой функции нигде - прозрачность кода вещь архиполезнейшая... Ну а было бы - допустим - прозрачным, самоочевидным и ясным определение это функции - то и не было бы тут этого обсуждения. Кстати...  Вот по такому определению функции мне совершенно неясно - что параметр должен быть константным выражением (eго Baser привел и видимо оно в *.h и забито): Цитата Макрос то использует встроенную функцию ИАРа:
__delay_cycles(unsigned long int); ... Значит это ограничение забито где-то еще... Ну а часто ли мы по каждому поводу лазаем по мануалам? Вот и делайте выводы.
Сообщение отредактировал Николай Z - Jan 10 2008, 09:56
|
|
|
|
|
Jan 10 2008, 11:42
|

Просто Che
    
Группа: Свой
Сообщений: 1 567
Регистрация: 22-05-07
Из: ExUSSR
Пользователь №: 27 881

|
Цитата(Николай Z @ Jan 10 2008, 11:47)  Потому я бы все-таки предпочел самое, что ни на есть явное задание нужных мне задержек. Чтобы не надо было искать особенности этой функции нигде - прозрачность кода вещь архиполезнейшая...
Ну а было бы - допустим - прозрачным, самоочевидным и ясным определение это функции - то и не было бы тут этого обсуждения
Вот по такому определению функции мне совершенно неясно - что параметр должен быть константным выражением ... Значит это ограничение забито где-то еще... Ну а часто ли мы по каждому поводу лазаем по мануалам? Вот и делайте выводы. Чесно говоря я не могу придумать более самоочевидного и ясного определения: __delay_cycles(k); - подождать k циклов (вставить k виртуальных NOPов). А если параметр будет некорректным - компилятор ругнется. ПосмОтрите в хелп ( один раз) и далее будете применять правильно. А посколько функция нестандартная, скорее перед ее применением посмотрите в хелп ( также один раз). А приведенный вами пример с задержкой для 8051 только подтверждает мои слова, там у вас компилятор не ругался, а что получилось? Вот и делайте выводы.
|
|
|
|
|
Jan 11 2008, 21:40
|
Местный
  
Группа: Участник*
Сообщений: 418
Регистрация: 20-08-07
Пользователь №: 29 930

|
Цитата(Baser @ Jan 10 2008, 14:42)  Чесно говоря я не могу придумать более самоочевидного и ясного определения: __delay_cycles(k); - подождать k циклов (вставить k виртуальных NOPов). А если параметр будет некорректным - компилятор ругнется. ПосмОтрите в хелп ( один раз) и далее будете применять правильно. А посколько функция нестандартная, скорее перед ее применением посмотрите в хелп ( также один раз). А приведенный вами пример с задержкой для 8051 только подтверждает мои слова, там у вас компилятор не ругался, а что получилось? Вот и делайте выводы.  Да ради бога - нравится используйте... Только на мой вкус - лучше явное написанный код + комент к нему. Не так много мест где такие аппаратно-зависимые фокусы нужны, а в качестве плюса - самоочевидность этого куска без каких-либо хелпов и доков.
|
|
|
|
|
Jan 11 2008, 23:01
|

Просто Che
    
Группа: Свой
Сообщений: 1 567
Регистрация: 22-05-07
Из: ExUSSR
Пользователь №: 27 881

|
Цитата(Николай Z @ Jan 11 2008, 23:40)  Только на мой вкус - лучше явное написанный код + комент к нему. Не так много мест где такие аппаратно-зависимые фокусы нужны, а в качестве плюса - самоочевидность этого куска без каких-либо хелпов и доков. В результате этой дискуссии, где я с пеной у рта расписывал преимущества применения функции __delay_cycles, я и себя самого убедил, что это хорошо На самом деле я эту функцию ни разу не применял, а задержки реализую в виде функций на ассме. Но сейчас убедился, что и __delay_cycles тоже реализована правильно. Вот вам еще один довод против вашего метода: Даже если ваша функция задержки обложена volatile, __root и т.д., в ней напрочь отключена оптимизация, то где гарантия, что новая версия компилятора не станет по другому генерить код и все задержки поплывут!?
|
|
|
|
Сообщений в этой теме
aspID Не отрабатывает #define Jan 6 2008, 10:27 Baser А как вы определяете, что не отрабатывает?
Примеры... Jan 6 2008, 11:02 zltigo Цитата(aspID @ Jan 6 2008, 12:27) Столкну... Jan 6 2008, 12:08 aspID ЦитатаА как вы определяете, что не отрабатывает?
Н... Jan 6 2008, 12:38 zltigo Цитата(aspID @ Jan 6 2008, 14:38) Или по ... Jan 6 2008, 13:01  aspID Цитата(zltigo @ Jan 6 2008, 19:01) Макрос... Jan 8 2008, 13:33   Сергей Борщ Цитата(aspID @ Jan 8 2008, 15:33) понЯл, ... Jan 8 2008, 14:05   zltigo Цитата(aspID @ Jan 8 2008, 15:33) Я сдаюс... Jan 8 2008, 20:20 Baser Цитата(aspID @ Jan 6 2008, 14:38) Ну, хот... Jan 6 2008, 15:14 aspID называется "почувствуй себя..." завтра(с... Jan 7 2008, 20:51 zltigo Цитата(aspID @ Jan 7 2008, 22:51) Правда,... Jan 7 2008, 21:22 aspID ЦитатаКанает, но исключительно для одного файла ma... Jan 8 2008, 03:57 zltigo Цитата(aspID @ Jan 8 2008, 05:57) Я почем... Jan 8 2008, 07:12  Baser Практическая рекомендация к теоретическим объяснен... Jan 8 2008, 08:34  Сергей Борщ Цитата(zltigo @ Jan 8 2008, 09:12) в пред... Jan 8 2008, 08:38  Николай Z zltigo сказал:
Цитата(zltigo @ Jan 8 2008, 10... Jan 8 2008, 08:59   Dog Pawlowa Цитата(Николай Z @ Jan 8 2008, 12:59) А я... Jan 8 2008, 10:14    Николай Z Цитата(Dog Pawlowa @ Jan 8 2008, 13:14) А... Jan 8 2008, 15:07 aspID ЦитатаЕсли это обида
Сергей, Вовсе даже нет! П... Jan 8 2008, 15:05 aspID ЦитатаЕще придется думать о переполнении
Макрос. С... Jan 9 2008, 04:13 Baser Цитата(aspID @ Jan 9 2008, 06:13) Макрос.... Jan 9 2008, 08:03 Николай Z Цитата(aspID @ Jan 9 2008, 07:13) Макрос.... Jan 9 2008, 08:16  Сергей Борщ Цитата(Baser @ Jan 9 2008, 10:03) А вот н... Jan 9 2008, 11:05   aspID Цитата(Сергей Борщ @ Jan 9 2008, 17:05) О... Jan 9 2008, 11:57              zltigo Цитата(Baser @ Jan 12 2008, 01:01) ...где... Jan 11 2008, 23:13               Baser Цитата(zltigo @ Jan 12 2008, 01:13) Гаран... Jan 12 2008, 11:34                Николай Z Цитата(Baser @ Jan 12 2008, 14:34) Интере... Jan 12 2008, 11:54                 Baser Цитата(Николай Z @ Jan 12 2008, 13:54) ..... Jan 12 2008, 11:58                  Николай Z Цитата(Baser @ Jan 12 2008, 14:58) Соглас... Jan 12 2008, 12:08     IgorKossak Цитата(Николай Z @ Jan 9 2008, 22:42) __d... Jan 9 2008, 21:41     Baser Цитата(Николай Z @ Jan 9 2008, 22:42) __d... Jan 9 2008, 22:11
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|