|
|
  |
Не отрабатывает #define, глюки работы директивы define |
|
|
|
Jan 8 2008, 15:05
|

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

|
Цитата Если это обида Сергей, Вовсе даже нет! Просто этого оказалось достаточно. И спасибо было вполне отдушевное.
|
|
|
|
|
Jan 8 2008, 15:07
|
Местный
  
Группа: Участник*
Сообщений: 418
Регистрация: 20-08-07
Пользователь №: 29 930

|
Цитата(Dog Pawlowa @ Jan 8 2008, 13:14)  А я прочел и понял суть так, что очень хочется подловить на противоречии Будь у Вас изначально позитивный подход, Вы бы поняли, что это возражение, а дополнение. Неправильно поняли - я никого ловить не собирался. И противоречия в ответах я не наблюдаю. Я только пытаюсь понять - а зачем это уточнение. Я видите ли в том случае, если что-то не понял имею обыкновение переспросить. Я конечно успел понять, что здесь (на этом форуме) большая часть участников как-то ревностно и неприязненно относятся к дополнительным вопросам, но не до такой же степени нужно их бояться... В данном случае - я просто решил, что возможно я чего-то не понял - вот отсюда и вопрос. И никаких наездов или попыток подловить... Или задавать вопросы - это большой грех?
Сообщение отредактировал Николай Z - Jan 8 2008, 15:13
|
|
|
|
|
Jan 8 2008, 20:20
|

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

|
Цитата(aspID @ Jan 8 2008, 15:33)  Я сдаюсь  разъясните, пожалуйста, почему надо сначала делить, а потом умножать. Нужно делать то, что нужно. А что нужно - либо точность, либо скорость - думайте. Еще придется думать о переполнении.
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
|
Jan 9 2008, 04:13
|

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

|
Цитата Еще придется думать о переполнении Макрос. Срабатывает при компиляции. На "большом" компутере. Переполнение... Нет, представляю, как оно может случиться, но по-моему, если не формировать секундные задержки наносекундным макросом то переполниться сложно Про точность понима, а вот про скорость не понима... Что будет работать быстрее и почему?
|
|
|
|
|
Jan 9 2008, 08:16
|
Местный
  
Группа: Участник*
Сообщений: 418
Регистрация: 20-08-07
Пользователь №: 29 930

|
Цитата(aspID @ Jan 9 2008, 07:13)  Макрос. Срабатывает при компиляции. На "большом" компутере. Переполнение... Нет, представляю, как оно может случиться, но по-моему, если не формировать секундные задержки наносекундным макросом то переполниться сложно Про точность понима, а вот про скорость не понима... Что будет работать быстрее и почему? Отнюдь... У Вас там параметр x присутствует... Потому полностью при компиляции не сработает. Если деление сначала - то это должно сработать при компиляции, а вот умножение при исполнении... Если наоборот - первым умножение - то все будет работать только при исполнении - отсюда и разница в быстродействии... А переполнение возможно в зависимости от реализации целочисленной арифметики при умножении - я не знаю деталей вашего проца.
Сообщение отредактировал Николай Z - Jan 9 2008, 08:17
|
|
|
|
|
Jan 9 2008, 11:05
|

Гуру
     
Группа: Модераторы
Сообщений: 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)
|
|
|
|
|
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
|
|
|
|
|
  |
2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0)
Пользователей: 0
|
|
|