Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Где ошибка?
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > Cредства разработки для МК > IAR
Dog Pawlowa
IAR MSP
вот это работает неправильно(где-то внутри происходит переполнение при delivery.water_volume_ul>(approx) 10 000 000):

Код
delivery.request_conc_volume_ul=    
    (unsigned long)    ((unsigned long long)         
        (delivery.water_volume_ul+delivery.semi_water_volume_ul) *    
            (unsigned long)delivery.request_perc)/  
                (10000-delivery.request_perc);


вот это работает правильно:
Код
   unsigned long long aaa;
   unsigned long long ccc;
   delivery.divider=10000-delivery.request_perc;

  aaa=delivery.water_volume_ul+delivery.semi_water_volume_ul;
  ccc= aaa*delivery.request_perc;
  delivery.request_conc_volume_ul=(unsigned long)(ccc/delivery.divider);


Сейчас нет возможности в ассемблере смотреть, если можно, ткните в K&R, где именно я ошибся?
Приведение delivery.request_perc к unsigned long непонятно зачем, но это вроде не криминал.

Типы:
typedef struct
{ unsigned int request_perc;
unsigned int divider;
unsigned long request_conc_volume_ul; //ul
unsigned long conc_volume_ul;
unsigned long semi_water_volume_ul;
unsigned long water_volume_ul;
} delivery_type;
Спасибо
AHTOXA
Цитата(Dog Pawlowa @ Aug 20 2009, 14:16) *
Код
(unsigned long long)(delivery.water_volume_ul+delivery.semi_water_volume_ul)

- сначала суммируется, потом приводится к unsigned long long. Надо:

Код
((unsigned long long)delivery.water_volume_ul+delivery.semi_water_volume_ul)
Dog Pawlowa
Цитата(AHTOXA @ Aug 20 2009, 11:36) *
- сначала суммируется, потом приводится к unsigned long long. Надо:

Второе слагаемое при проверке всегда ноль и на результат влиять не должно.
AHTOXA
Цитата(Dog Pawlowa @ Aug 20 2009, 16:23) *
Второе слагаемое при проверке всегда ноль и на результат влиять не должно.


Тогда может быть не хватает одного слова "long" в следующей строке:
Код
(unsigned long)delivery.request_perc)/


? smile.gif
rezident
Цитата(AHTOXA @ Aug 20 2009, 16:50) *
Тогда может быть не хватает одного слова "long" в следующей строке:
И суффикса U или скорее даже ULL у константы 10000.
Dog Pawlowa
Цитата(AHTOXA @ Aug 20 2009, 13:50) *
Тогда может быть не хватает одного слова "long" в следующей строке:
Код
(unsigned long)delivery.request_perc)/


? smile.gif

Допустим. Но в примере, который работает
Код
ccc= aaa*delivery.request_perc;
,
то есть тип delivery.request_perc остается вообще unsigned int.
Получается, что привели к unsigned long - стало хуже, чем если оставить unsigned int ?

Цитата(rezident @ Aug 20 2009, 14:45) *
И суффикса U или скорее даже ULL у константы 10000.

10000 - это 100% в сотых долях. Соответственно, при проверке из этого значения вычитается 500 - 5% в сотых долях.
Проценты в процессе работы не изменяются. То есть приводить до вычитания не имеет смысла. Приводить после - тоже, это делитель.


Но, как оказывается, все это фигня. Ну нашел я, как правильно записать. Использовать не могу - не хватает времени на работу с long long в риалтайме.
Чеховское "В Москву, в Москву!" теперь звучит так -> скорее на ARM!
Только уже поздно, нужно как-то выкручиваться.
MrYuran
Цитата(Dog Pawlowa @ Aug 20 2009, 16:22) *
Только уже поздно, нужно как-то выкручиваться.

а LL зачем? неужто такая точность нужна? (8 байт)
Если какая-то часть выражения не меняется, её можно сосчитать заранее в отдельную переменную, и подставлять в критическом месте готовое значение
AHTOXA
Цитата(Dog Pawlowa @ Aug 20 2009, 18:22) *
Допустим. Но в примере, который работает
Код
ccc= aaa*delivery.request_perc;
,
то есть тип delivery.request_perc остается вообще unsigned int.


Ненене, не остаётсяsmile.gif Тут aaa - long long, поэтому перед умножением delivery.request_perc приводится тоже к long long.
(Я после паскаля тоже долго привыкал к сишным правилам приведения типовsmile.gif )

Цитата
Но, как оказывается, все это фигня. Ну нашел я, как правильно записать. Использовать не могу - не хватает времени на работу с long long в риалтайме.


Табличку? И уж совсем дурацкое предложение - а в float не быстрее будет?

Цитата
Чеховское "В Москву, в Москву!" теперь звучит так -> скорее на ARM!
Только уже поздно, нужно как-то выкручиваться.


Оверклокинг? Ассемблер? smile.gif
Dog Pawlowa
Цитата(MrYuran @ Aug 20 2009, 15:32) *
а LL зачем? неужто такая точность нужна? (8 байт)
Если какая-то часть выражения не меняется, её можно сосчитать заранее в отдельную переменную, и подставлять в критическом месте готовое значение

Дозатор растворов. Для точности дозирования нужно считать микролитры и концентрата и воды. А по объему нужно нужно использовать за раз 10 литров концентрата, при 0.5% это 2000 литров. C long недобор диапазона в 200 раз.


Цитата(AHTOXA @ Aug 20 2009, 15:44) *
Табличку? И уж совсем дурацкое предложение - а в float не быстрее будет?

Ага, была такая мысль. Возьму на ночь осциллограф smile.gif , буду исследовать вопрос.

Цитата(AHTOXA @ Aug 20 2009, 15:44) *
Оверклокинг? Ассемблер? smile.gif

В первую очередь алгоритм. Считать "мгновенную" концентрацию.
Ассемблер не потяну уже. Хотя реально нужно не 4 байта добавить, а только один.
Почему на С нет long char = 5 байтов ? smile.gif
Сергей Борщ
Цитата(Dog Pawlowa @ Aug 20 2009, 15:52) *
Ага, была такая мысль. Возьму на ночь осциллограф smile.gif , буду исследовать вопрос.
А чем вам поможет 4-байтный float с его точностью в 7 десятичных знаков (24 бита мантиссы), если вам не хватет 4 байтов long?
Dog Pawlowa
Цитата(Сергей Борщ @ Aug 20 2009, 21:50) *
А чем вам поможет 4-байтный float ...

Да, пожалуй...
Фактически мой алгоритм построен подобно известной задаче - "насколько нужно удлинить нить, опоясывающую земной шар, чтобы под ней прошла кошка". Из-за неточности расчетов помпа будет работать с рывками и паузами.
rezident
Цитата(Dog Pawlowa @ Aug 21 2009, 01:25) *
Фактически мой алгоритм построен подобно известной задаче - "насколько нужно удлинить нить, опоясывающую земной шар, чтобы под ней прошла кошка". Из-за неточности расчетов помпа будет работать с рывками и паузами.
Разделите управление на постоянную и дифференциальную компоненты воздействия. И обсчитывайте их отдельно. При этом постоянная величина и величина изменения могут различаться на порядки.
_Pasha
Цитата(Dog Pawlowa @ Aug 20 2009, 22:25) *
Фактически мой алгоритм построен подобно известной задаче

Если из операций только +-*/, то не страшно новый целый тип ввести.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.