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

 
 
> Не отрабатывает #define, глюки работы директивы define
aspID
сообщение Jan 6 2008, 10:27
Сообщение #1


Местный
***

Группа: Свой
Сообщений: 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 очень похоже, что не отрабатывает.
help.gif
Заранее спасибо и всех с наступающим Рождеством! santa2.gif


ЗЫ: до сих пор не могу победить проблему, если пишу с использованием классов и НЕ использую конструктор по умолчанию - кричит "дай!" sad.gif
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
Baser
сообщение Jan 9 2008, 12:05
Сообщение #2


Просто Che
*****

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



Цитата(zltigo @ Jan 8 2008, 22:20) *
А что нужно - либо точность, либо скорость - думайте.

Цитата(aspID @ Jan 9 2008, 06:13) *
Про точность понима, а вот про скорость не понима... Что будет работать быстрее и почему?

А вот действительно, наконец-то задумался smile.gif и тоже не понял, что значит в данном примере СКОРОСТЬ.
Макрос то использует встроенную функцию ИАРа:
Цитата
__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.

И если он будет генерить для одной и той-же или для близких по величине констант код, работающий сильно различное время, то это будет явный ляп ИАРа. А его не наблюдается smile.gif
Так что может коллега zltigo имел в виду не скорость, а размер кода?
Go to the top of the page
 
+Quote Post
zltigo
сообщение Jan 9 2008, 13:32
Сообщение #3


Гуру
******

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



Цитата(Baser @ Jan 9 2008, 14:05) *
Так что может коллега zltigo имел в виду не скорость, а размер кода?

В общем случае, при использовании в макросе переменной, время вычисления подстановки для AVR будет и рядом не лежать с микросекундами и отличаться в двух вариантах.



Цитата(aspID @ Jan 9 2008, 13:57) *
Видимо, именно потому, что не подумал о возможности подстановки вместо x "неконстанты"...

Ну теперь знаете smile.gif а то, что называется "сюрприз!" может случиться с задержкой.


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Jan 9 2008, 13:42
Сообщение #4


Гуру
******

Группа: Модераторы
Сообщений: 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)
Go to the top of the page
 
+Quote Post
zltigo
сообщение Jan 9 2008, 16:10
Сообщение #5


Гуру
******

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



Цитата(Сергей Борщ @ Jan 9 2008, 15:42) *
...аргументом __delay_cycles() может быть только константа

Ну тогда в этом наиконкретнейшем случае наилучший вариант найден. Главное теперь известно, что возможны варианты smile.gif


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
Николай Z
сообщение Jan 9 2008, 20:42
Сообщение #6


Местный
***

Группа: Участник*
Сообщений: 418
Регистрация: 20-08-07
Пользователь №: 29 930



__delay_cycles() - это тяжелое наследие 8-ми разрядной архитектуры? Или что?

Я что-то перерыл все библиотеки в своем IAR-е 4.3 и вообще ее не обнаружил...

Что-то смутно помню подобное из архитектуры 8051... подобное... хотя всего год как бросил этот обломок совместимости... biggrin.gif

Сообщение отредактировал Николай Z - Jan 9 2008, 20:44
Go to the top of the page
 
+Quote Post
zltigo
сообщение Jan 9 2008, 20:54
Сообщение #7


Гуру
******

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



Цитата(Николай Z @ Jan 9 2008, 22:42) *
__delay_cycles() - это тяжелое наследие 8-ми разрядной архитектуры?

Естественно smile.gif


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
dxp
сообщение Jan 10 2008, 03:49
Сообщение #8


Adept
******

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



Цитата(zltigo @ Jan 10 2008, 02:54) *
Естественно smile.gif

Еще это является с некоторых пор и "тяжелым наследием 16-разрядной архитектуры" - в том же EW430, например, с некоторых пор тоже существует такой интринсик. smile.gif

Вообще, имхо, к архитектуре это отношения не имеет, местами вполне полезная фишка.


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


Гуру
******

Группа: Модераторы
Сообщений: 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)
Go to the top of the page
 
+Quote Post
Николай Z
сообщение Jan 10 2008, 09:05
Сообщение #10


Местный
***

Группа: Участник*
Сообщений: 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, оптимизатор безжалостно выкидывает smile.gif

Одно плохо: функция не стандартная.

Угу... А когда забудешь и влепишь выражение в параметр подобной функции - это лучше?
Я предпочитаю явное указание оптимизатору давать : "а не лезь сюда со своим интеллектом" - volatile это...
А насчет рассчитать величину задержки - а что тут такого суперсложного?

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

Цитата(IgorKossak @ Jan 10 2008, 00:41) *
Это intrinsic function, описанная в EWAVR_CompilerReference.pdf и обьявленная в intrinsics.h

А у меня не EWAVR_CompilerReference.pdf , у меня EWARM_CompilerReference.pdf

Сообщение отредактировал Николай Z - Jan 10 2008, 08:54
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- 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


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

 


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


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