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

 
 
 
Reply to this topicStart new topic
> Кто разъяснит прикол IAR C
SasaVitebsk
сообщение Jul 12 2006, 16:48
Сообщение #1


Гуру
******

Группа: Свой
Сообщений: 2 712
Регистрация: 28-11-05
Из: Беларусь, Витебск, Строителей 18-4-220
Пользователь №: 11 521



Объявлено следующее:

#define FCLK 14745600 // ×àñòîòà êîíòðîëëåðà
#define TCLK 68 // ×àñòîòà êîíòðîëëåðà â íñ
....
#define FREGENER 75 // ×àñòîòà ðåãåíåðàöèè ïàííî
#define FSHOWACT 40 // ×àñòîòà èñïîëíåíèÿ êîìàíä
....
OCR1A = FCLK/(1024*FSHOWACT); // FCLK/1024/16.7 Ãö = 862
....

Компилятор генерит следующее

168 // Инициализация таймера 1 (Исполнение активных комманд)
169 // TCCR1A = 0; // Запустить таймер 1 в режиме сравнения
170 OCR1A = FCLK/(1024*FSHOWACT); // FCLK/1024/16.7 Гц = 862
\ 00000100 EA08 LDI R16, 168
\ 00000102 EF1D LDI R17, 253
\ 00000104 93100089 STS 137, R17
\ 00000108 93000088 STS 136, R16


Если вместо 40 для константы FSHOWACT поставить 31 и меньше, то всё класс. Точно также всё правильно если поставить 40.0!
Что я не учёл?
Go to the top of the page
 
+Quote Post
sz36
сообщение Jul 12 2006, 17:41
Сообщение #2


Частый гость
**

Группа: Свой
Сообщений: 91
Регистрация: 26-01-06
Пользователь №: 13 668



Цитата
#define FSHOWACT 40 // ×àñòîòà èñïîëíåíèÿ êîìàíä
OCR1A = FCLK/(1024*FSHOWACT); // FCLK/1024/16.7 Ãö = 862


Не учел, что 40*1024 превышает максимальное значение для int (32767), и, соответственно, результат умножения получается отрицательным
Go to the top of the page
 
+Quote Post
Romario
сообщение Jul 12 2006, 17:51
Сообщение #3


Частый гость
**

Группа: Участник
Сообщений: 92
Регистрация: 26-06-04
Пользователь №: 192



Цитата(sz36 @ Jul 12 2006, 21:41) *
Цитата
#define FSHOWACT 40 // ×àñòîòà èñïîëíåíèÿ êîìàíä
OCR1A = FCLK/(1024*FSHOWACT); // FCLK/1024/16.7 Ãö = 862


Не учел, что 40*1024 превышает максимальное значение для int (32767), и, соответственно, результат умножения получается отрицательным


угу, везде после констант желательно ставить два символа "ul"

типа #define FSHOWACT 40ul ну и 1024 нужно написать как 1024ul
wink.gif
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Jul 12 2006, 17:53
Сообщение #4


Гуру
******

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



Цитата(sz36 @ Jul 12 2006, 20:41) *
Не учел, что 40*1024 превышает максимальное значение для int (32767), и, соответственно, результат умножения получается отрицательным
Имеено так. Препроцессор по умолчанию считает все данные как int. Во избежание подобных недоразумений следует писать #define FCLK 14745600ULL, т.е объявлять константу типа unsigned long long или 14745600UL, т.е. unsigned long


--------------------
На любой вопрос даю любой ответ
"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
GetSmart
сообщение Jul 12 2006, 19:46
Сообщение #5


.
******

Группа: Участник
Сообщений: 4 005
Регистрация: 3-05-06
Из: Россия
Пользователь №: 16 753



Вроде бы профи, но не знаю чем отличается long от long long ?


--------------------
Заблуждаться - Ваше законное право :-)
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Jul 12 2006, 20:55
Сообщение #6


Гуру
******

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



Цитата(GetSmart @ Jul 12 2006, 22:46) *
Вроде бы профи, но не знаю чем отличается long от long long ?
Тем что в некоторых компиляторах long long состоит из вдвое большего количества бит чем long?


--------------------
На любой вопрос даю любой ответ
"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
GetSmart
сообщение Jul 12 2006, 21:07
Сообщение #7


.
******

Группа: Участник
Сообщений: 4 005
Регистрация: 3-05-06
Из: Россия
Пользователь №: 16 753



Целое на 8 байт?


--------------------
Заблуждаться - Ваше законное право :-)
Go to the top of the page
 
+Quote Post
IgorKossak
сообщение Jul 13 2006, 06:48
Сообщение #8


Шаман
******

Группа: Модераторы
Сообщений: 3 064
Регистрация: 30-06-04
Из: Киев, Украина
Пользователь №: 221



Цитата(GetSmart @ Jul 13 2006, 00:07) *
Целое на 8 байт?

Именно.
Если используете С++ (вдруг захочется), то константы удобнее делать типизированными:
const unsigned long LONG_CONST = 4000000;
и т. д.
В этом случае компилятор будет предупреждать о потере значимости.
Go to the top of the page
 
+Quote Post
_Bill
сообщение Jul 13 2006, 07:03
Сообщение #9


Местный
***

Группа: Участник
Сообщений: 416
Регистрация: 18-04-06
Из: Челябинск
Пользователь №: 16 219



Цитата(Сергей Борщ @ Jul 12 2006, 20:53) *
Цитата(sz36 @ Jul 12 2006, 20:41) *

Не учел, что 40*1024 превышает максимальное значение для int (32767), и, соответственно, результат умножения получается отрицательным
Имеено так. Препроцессор по умолчанию считает все данные как int. Во избежание подобных недоразумений следует писать #define FCLK 14745600ULL, т.е объявлять константу типа unsigned long long или 14745600UL, т.е. unsigned long

Все правильно, только препроцессор здесь ни при чем. Препроцессор тупо заменяет один текст другим, а все остальное делает компилятор.
Go to the top of the page
 
+Quote Post
IgorKossak
сообщение Jul 13 2006, 07:21
Сообщение #10


Шаман
******

Группа: Модераторы
Сообщений: 3 064
Регистрация: 30-06-04
Из: Киев, Украина
Пользователь №: 221



Цитата(_Bill @ Jul 13 2006, 10:03) *
Цитата(Сергей Борщ @ Jul 12 2006, 20:53) *

Цитата(sz36 @ Jul 12 2006, 20:41) *

Не учел, что 40*1024 превышает максимальное значение для int (32767), и, соответственно, результат умножения получается отрицательным
Имеено так. Препроцессор по умолчанию считает все данные как int. Во избежание подобных недоразумений следует писать #define FCLK 14745600ULL, т.е объявлять константу типа unsigned long long или 14745600UL, т.е. unsigned long

Все правильно, только препроцессор здесь ни при чем. Препроцессор тупо заменяет один текст другим, а все остальное делает компилятор.

Кто бы это ни делал, любые литералы, влезающие в диапазон целых , воспринимаются компилятором как целые если они не снабжены специальными суффиксами и не содержат десятичной точки.
Надо сказать, что на разных платформах целые имеют разную длину.
Поэтому для большей предсказуемости поведения компилятора надёжнее использовать типизированные константы. Ошибки могут быть выявлены ещё на этапе компиляции.
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Jul 13 2006, 07:42
Сообщение #11


Гуру
******

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



Цитата(_Bill @ Jul 13 2006, 10:03) *
Цитата(Сергей Борщ @ Jul 12 2006, 20:53) *

Препроцессор по умолчанию считает все данные как int.

Все правильно, только препроцессор здесь ни при чем. Препроцессор тупо заменяет один текст другим, а все остальное делает компилятор.
Да, правильно. А меня чего-то заклинило что это делает препроцессор. И очень меня это смущало. Спасибо, теперь "отпустило" :-) Действительно, при таком раскладе все становится гармоничным. Возможно я где-то более подробно читал какая из частей компилятора занимается вычислением констант и в голове ошибочно отложился препроцессор.


--------------------
На любой вопрос даю любой ответ
"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
SasaVitebsk
сообщение Jul 13 2006, 19:05
Сообщение #12


Гуру
******

Группа: Свой
Сообщений: 2 712
Регистрация: 28-11-05
Из: Беларусь, Витебск, Строителей 18-4-220
Пользователь №: 11 521



Спасибо теперь понял.
Go to the top of the page
 
+Quote Post

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

 


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


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