|
Вычисляемая константа в PCW, как? |
|
|
|
Feb 25 2009, 11:21
|

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

|
Возникло желание "попросить" компилятор (PCW) при компиляции рассчитать значение константы (на этапе отладки устройства приходится часто подбирать значение). Пытаюсь вставить такое: Код const unsigned int16 VoltageMax = 2.5/(4.18/1024); Ругается. Приходится вручную подставлять 612. Если не указываю, что это константа, компилятор напихивает библиотек и прошивка "раздувается". Что я не так делаю?
--------------------
«Чтобы что-то изобрести, вам потребуется хорошее воображение и куча мусора» /Томас Эдисон/
|
|
|
|
|
 |
Ответов
|
Feb 25 2009, 13:07
|

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

|
Цитата(MrYuran @ Feb 25 2009, 14:58)  Вообще константа отличается от дефайна тем, что она располагается в памяти (ОЗУ или во флеши) и программа по мере надобности к ней обращается. Дефайн подставляется по месту на этапе компиляции препроцессором. Сейчас пытался дефайном вставить - ругается, зараза.. Сам дефайн "съедает". А вот потом присвоить переменным не выходит. ОЗУ тратить не хочется..
--------------------
«Чтобы что-то изобрести, вам потребуется хорошее воображение и куча мусора» /Томас Эдисон/
|
|
|
|
|
Feb 25 2009, 13:28
|

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

|
Цитата(Eddy71 @ Feb 25 2009, 16:07)  Сейчас пытался дефайном вставить - ругается, зараза.. А ругается-то как? Error - это ругается. А Warning - это просто предупреждает, что, мол, имеете право, но возможны проблемы... Лучше выкладывайте, как ругается и на что, показательней будет
--------------------
Программирование делится на системное и бессистемное. ©Моё :) — а для кого-то БГ — это Bill Gilbert =)
|
|
|
|
|
Feb 25 2009, 14:22
|

Местный
  
Группа: Свой
Сообщений: 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% Непонятно..
--------------------
«Чтобы что-то изобрести, вам потребуется хорошее воображение и куча мусора» /Томас Эдисон/
|
|
|
|
|
Feb 25 2009, 15:33
|
    
Группа: Свой
Сообщений: 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;
|
|
|
|
Сообщений в этой теме
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
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|