|
Не отрабатывает #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
|
|
|
|
Сообщений в этой теме
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         Непомнящий Евгений Цитата(Николай Z @ Jan 10 2008, 12:05) А ... Jan 10 2008, 09:35          Николай Z Цитата(Непомнящий Евгений @ Jan 10 2008, 12... Jan 10 2008, 09:47           Baser Цитата(Николай Z @ Jan 10 2008, 11:47) По... Jan 10 2008, 11:42            Николай Z Цитата(Baser @ Jan 10 2008, 14:42) Чесно ... Jan 11 2008, 21:40             Baser Цитата(Николай Z @ Jan 11 2008, 23:40) То... Jan 11 2008, 23:01              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
|
|
|