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

 
 
> Вычисляемая константа в PCW, как?
Eddy71
сообщение Feb 25 2009, 11:21
Сообщение #1


Местный
***

Группа: Свой
Сообщений: 224
Регистрация: 23-11-08
Из: Украина, Луганск
Пользователь №: 41 879



Возникло желание "попросить" компилятор (PCW) при компиляции рассчитать значение константы (на этапе отладки устройства приходится часто подбирать значение). Пытаюсь вставить такое:
Код
const unsigned int16 VoltageMax = 2.5/(4.18/1024);

Ругается. Приходится вручную подставлять 612.
Если не указываю, что это константа, компилятор напихивает библиотек и прошивка "раздувается".
Что я не так делаю?


--------------------
«Чтобы что-то изобрести, вам потребуется хорошее воображение и куча мусора» /Томас Эдисон/
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
MrYuran
сообщение Feb 25 2009, 11:58
Сообщение #2


Беспросветный оптимист
******

Группа: Свой
Сообщений: 4 640
Регистрация: 26-12-07
Из: Н.Новгород
Пользователь №: 33 646



Вообще константа отличается от дефайна тем, что она располагается в памяти (ОЗУ или во флеши) и программа по мере надобности к ней обращается.
Дефайн подставляется по месту на этапе компиляции препроцессором.


--------------------
Программирование делится на системное и бессистемное. ©Моё :)
— а для кого-то БГ — это Bill Gilbert =)
Go to the top of the page
 
+Quote Post
Eddy71
сообщение Feb 25 2009, 13:07
Сообщение #3


Местный
***

Группа: Свой
Сообщений: 224
Регистрация: 23-11-08
Из: Украина, Луганск
Пользователь №: 41 879



Цитата(MrYuran @ Feb 25 2009, 14:58) *
Вообще константа отличается от дефайна тем, что она располагается в памяти (ОЗУ или во флеши) и программа по мере надобности к ней обращается.
Дефайн подставляется по месту на этапе компиляции препроцессором.

Сейчас пытался дефайном вставить - ругается, зараза..
Сам дефайн "съедает". А вот потом присвоить переменным не выходит.
ОЗУ тратить не хочется..


--------------------
«Чтобы что-то изобрести, вам потребуется хорошее воображение и куча мусора» /Томас Эдисон/
Go to the top of the page
 
+Quote Post
MrYuran
сообщение Feb 25 2009, 13:28
Сообщение #4


Беспросветный оптимист
******

Группа: Свой
Сообщений: 4 640
Регистрация: 26-12-07
Из: Н.Новгород
Пользователь №: 33 646



Цитата(Eddy71 @ Feb 25 2009, 16:07) *
Сейчас пытался дефайном вставить - ругается, зараза..

А ругается-то как?

Error - это ругается.
А Warning - это просто предупреждает, что, мол, имеете право, но возможны проблемы...

Лучше выкладывайте, как ругается и на что, показательней будет


--------------------
Программирование делится на системное и бессистемное. ©Моё :)
— а для кого-то БГ — это Bill Gilbert =)
Go to the top of the page
 
+Quote Post
Eddy71
сообщение Feb 25 2009, 14:22
Сообщение #5


Местный
***

Группа: Свой
Сообщений: 224
Регистрация: 23-11-08
Из: Украина, Луганск
Пользователь №: 41 879



Цитата(MrYuran @ Feb 25 2009, 16:28) *
А ругается-то как?
Лучше выкладывайте, как ругается и на что, показательней будет


Вротмненоги!... Хотел показать - откомпилировалось без ошибок. Правда аномалия:
Код
const unsigned int16 ChargeMax = (unsigned int16)(1024 * 2.5/4.18);
const unsigned int16 ChargeMin = (unsigned int16)(1024 * 2.5/4.10);

после такого пишет Memory Usage: ROM38% RAM30%

А после такого варианта:
Код
#define VoltageMax  (2.5/(4.18/1024))
#define VoltageMin  (2.5/(4.10/1024))
volatile unsigned int16 ChargeMax = VoltageMax;
volatile unsigned int16 ChargeMin = VoltageMin;


Memory Usage: ROM39% RAM36%

Непонятно..


--------------------
«Чтобы что-то изобрести, вам потребуется хорошее воображение и куча мусора» /Томас Эдисон/
Go to the top of the page
 
+Quote Post
xemul
сообщение Feb 25 2009, 15:33
Сообщение #6



*****

Группа: Свой
Сообщений: 1 928
Регистрация: 11-07-06
Пользователь №: 18 731



Цитата(Eddy71 @ Feb 25 2009, 17:22) *
...
Непонятно..

Вы volatile пишете осмысленно, или просто потому, что слово красивое? Уберите volatile перед ChargeMax, и (value>ChargeMax) будет нормальным образом оптимизировано. volatile - указание компилятору не оптимизировать операции с такими переменными, т.к. они могут изменяться непредсказуемым образом (н-р, в прерываниях).
На
Код
#define VoltageMax  (2.5/(4.18/1024))
#define VoltageMin  (2.5/(4.10/1024))
volatile unsigned int16 ChargeMax = VoltageMax;
volatile unsigned int16 ChargeMin = VoltageMin;

препроцессор должен выдать два предупреждения вроде "implicit conversion float to integer" (неявное преобразование плавучки в целое, которое может сопровождаться потерей точности).
На
Код
const unsigned int16 ChargeMax = (unsigned int16)(1024 * 2.5/4.18);

он так не говорит, т.к. (unsigned int16) - оператор явного преобразования типа. Компилятор понимает, что и Вы понимаете суть происходящего.
Понаблюдайте за реакцией компилятора (естесно, по очереди) на эти #define:
Код
#define VoltageMax  (unsigned int16)(2.5/(4.18/1024))   // будет 612 без предупреждения; промежуточные вычисления во float
//#define VoltageMax  (250/(418/1024))   // будет ошибка "divide by zero"; (418/1024) = 0
//#define VoltageMax  (1024*250/418)     // будет 63 вместо 612, но без предупреждения; переполнение int, 1024*250 > 32767
//#define VoltageMax  (1024L*250/418)    // будет 612 без предупреждения; промежуточные вычисления препроцессор проведет в long
unsigned int16 ChargeMax = VoltageMax;
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- Eddy71   Вычисляемая константа в PCW, как?   Feb 25 2009, 11:21
- - _Pasha   Цитата(Eddy71 @ Feb 25 2009, 15:21) Что я...   Feb 25 2009, 11:27
|- - _Pasha   Цитата(_Pasha @ Feb 25 2009, 15:27) #defi...   Feb 25 2009, 11:37
- - MrYuran   Цитата(Eddy71 @ Feb 25 2009, 14:21) Кодco...   Feb 25 2009, 11:31
|- - Eddy71   Цитата(MrYuran @ Feb 25 2009, 15:31) Логи...   Feb 25 2009, 11:53
|- - _Pasha   Цитата(Eddy71 @ Feb 25 2009, 18:22) Непон...   Feb 25 2009, 14:30
||- - Eddy71   Цитата(_Pasha @ Feb 25 2009, 17:30) Эконо...   Feb 25 2009, 15:00
|- - demiurg_spb   Привыкайте писать грамотно. Используйте препроцесс...   Feb 25 2009, 22:37
- - Eddy71   Исчерпывающий совет. Одно не совсем понятно. Почем...   Feb 26 2009, 08:33
|- - demiurg_spb   Если константа объявлена как статик, то компилятор...   Feb 26 2009, 09:53
|- - MrYuran   Цитата(demiurg_spb @ Feb 26 2009, 12:53) ...   Feb 26 2009, 10:01
|- - Сергей Борщ   Цитата(MrYuran @ Feb 26 2009, 12:01) А ес...   Feb 26 2009, 10:05
|- - MrYuran   Цитата(Сергей Борщ @ Feb 26 2009, 13:05) ...   Feb 26 2009, 10:13
|- - Сергей Борщ   Цитата(MrYuran @ Feb 26 2009, 12:13) Он ж...   Feb 26 2009, 12:18
|- - demiurg_spb   Сергей прав. Я просто забыл ещё упомянуть о возмож...   Feb 26 2009, 13:05
- - Eddy71   Попробовал разные варианты компиляции, похоже PCW ...   Feb 26 2009, 14:11
- - Eddy71   По ходу обучения писанию на Си возник глупейший во...   Feb 26 2009, 15:34


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

 


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


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