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

 
 
3 страниц V  < 1 2 3 >  
Reply to this topicStart new topic
> Не отрабатывает #define, глюки работы директивы define
Сергей Борщ
сообщение Jan 8 2008, 14:05
Сообщение #16


Гуру
******

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



Цитата(aspID @ Jan 8 2008, 15:33) *
понЯл, отстал. Спасибо rolleyes.gif
Если это обида - то совершенно напрасно. Я полагаю, что через поисковик вы найдете гораздо более обширную информацию по этому вопросу (в разных местах освещенную с разных сторон). И это будет гораздо полезнее, чем если кто-то попытается кратко (и возможно с ошибками) пересказать ее здесь.


--------------------
На любой вопрос даю любой ответ
"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
aspID
сообщение Jan 8 2008, 15:05
Сообщение #17


Местный
***

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



Цитата
Если это обида

Сергей, Вовсе даже нет! Просто этого оказалось достаточно. И спасибо было вполне отдушевное.
Go to the top of the page
 
+Quote Post
Николай Z
сообщение Jan 8 2008, 15:07
Сообщение #18


Местный
***

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



Цитата(Dog Pawlowa @ Jan 8 2008, 13:14) *
А я прочел и понял суть так, что очень хочется подловить на противоречии biggrin.gif
Будь у Вас изначально позитивный подход, Вы бы поняли, что это возражение, а дополнение.

Неправильно поняли - я никого ловить не собирался. И противоречия в ответах я не наблюдаю.
Я только пытаюсь понять - а зачем это уточнение.
Я видите ли в том случае, если что-то не понял имею обыкновение переспросить.

Я конечно успел понять, что здесь (на этом форуме) большая часть участников как-то ревностно и неприязненно относятся к дополнительным вопросам, но не до такой же степени нужно их бояться... В данном случае - я просто решил, что возможно я чего-то не понял - вот отсюда и вопрос. И никаких наездов или попыток подловить...

Или задавать вопросы - это большой грех? biggrin.gif

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


Гуру
******

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



Цитата(aspID @ Jan 8 2008, 15:33) *
Я сдаюсь sad.gif разъясните, пожалуйста, почему надо сначала делить, а потом умножать.

Нужно делать то, что нужно. А что нужно - либо точность, либо скорость - думайте. Еще придется думать о переполнении.


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
aspID
сообщение Jan 9 2008, 04:13
Сообщение #20


Местный
***

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



Цитата
Еще придется думать о переполнении

Макрос. Срабатывает при компиляции. На "большом" компутере. Переполнение... Нет, представляю, как оно может случиться, но по-моему, если не формировать секундные задержки наносекундным макросом то переполниться сложно blush.gif

Про точность понима, а вот про скорость не понима... Что будет работать быстрее и почему?
Go to the top of the page
 
+Quote Post
Baser
сообщение Jan 9 2008, 08:03
Сообщение #21


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

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



Цитата(aspID @ Jan 9 2008, 06:13) *
Макрос. Срабатывает при компиляции. На "большом" компутере. Переполнение... Нет, представляю, как оно может случиться

У вас в макросах все константы - целые числа. Поэтому и все промежуточные результаты будут целыми. Все дробные части отбрасываются. Для точности нужно сначала УМНОЖИТЬ, а потом ПОДЕЛИТЬ.

А вот насчет переполнения сам не уверен: компилятор при константе UL будет считать в 32-разрядных целых или в 64-разрядных?
Если в 32-разрядных, то при больших частоте кварца и задержке будет и переполнение smile.gif
Go to the top of the page
 
+Quote Post
Николай Z
сообщение Jan 9 2008, 08:16
Сообщение #22


Местный
***

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



Цитата(aspID @ Jan 9 2008, 07:13) *
Макрос. Срабатывает при компиляции. На "большом" компутере. Переполнение... Нет, представляю, как оно может случиться, но по-моему, если не формировать секундные задержки наносекундным макросом то переполниться сложно blush.gif

Про точность понима, а вот про скорость не понима... Что будет работать быстрее и почему?

Отнюдь... У Вас там параметр x присутствует... Потому полностью при компиляции не сработает.
Если деление сначала - то это должно сработать при компиляции, а вот умножение при исполнении...
Если наоборот - первым умножение - то все будет работать только при исполнении - отсюда и разница в быстродействии... А переполнение возможно в зависимости от реализации целочисленной арифметики при умножении - я не знаю деталей вашего проца.

Сообщение отредактировал Николай Z - Jan 9 2008, 08:17
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Jan 9 2008, 11:05
Сообщение #23


Гуру
******

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



Цитата(Baser @ Jan 9 2008, 10:03) *
А вот насчет переполнения сам не уверен: компилятор при константе UL будет считать в 32-разрядных целых или в 64-разрядных?
UL - 32 разрядные. ULL - 64 разряда
Цитата(Николай Z @ Jan 9 2008, 10:16) *
Отнюдь... У Вас там параметр x присутствует... Потому полностью при компиляции не сработает.
Отнюдь. Если параметр x в точке использования макроса - константа, то IAR все выражение вычислит на этапе компиляции (а в приведенном в посте №1 коде там именно константа). Если переменная - то да, на этапе исполнения.


--------------------
На любой вопрос даю любой ответ
"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
aspID
сообщение Jan 9 2008, 11:57
Сообщение #24


Местный
***

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



Цитата(Сергей Борщ @ Jan 9 2008, 17:05) *
Отнюдь. Если параметр x в точке использования макроса - константа, то IAR все выражение вычислит на этапе компиляции (а в приведенном в посте №1 коде там именно константа). Если переменная - то да, на этапе исполнения.

Спасибо! Самый понравившийся ответ smile.gif
Видимо, именно потому, что не подумал о возможности подстановки вместо x "неконстанты" я и не мог понять, почему так. На всяческий случай подправил "универсально" в своих макросах - чтобы сначала выполнялось деление.
Go to the top of the page
 
+Quote Post
Baser
сообщение Jan 9 2008, 12:05
Сообщение #25


Просто 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
Сообщение #26


Гуру
******

Группа: Свой
Сообщений: 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
Сообщение #27


Гуру
******

Группа: Модераторы
Сообщений: 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
Сообщение #28


Гуру
******

Группа: Свой
Сообщений: 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
Сообщение #29


Местный
***

Группа: Участник*
Сообщений: 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
Сообщение #30


Гуру
******

Группа: Свой
Сообщений: 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

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

 


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


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