Select language:

Программирование на СИ. Помощь в написании кода.

<<

KOT

Аватара пользователя

Сообщения: 328

Зарегистрирован: 10 май 2013, 14:23

Откуда: Запорожье


Благодарил (а): 6 раз.
Поблагодарили: 85 раз.

Сообщение 18 сен 2015, 11:57

Re: Программирование на СИ. Помощь в написании кода.

  Код:
uint32_t a;
uint8_t b;
uint32_t result = (a+(b>>1))/b;

работает правильно, но если "a" меньше (65535-b) иначе деление должно бть 64 разрядным, что не удобно.

У меня вот сейчас стоит выбор оставь деление с округлением на асме либо делать вместо 16 битного деление 32-х, но тогда проще сделать 2 деления по 16 бит.
Машина ЗАЗ 1103i, ГБО4. Управление ДВС: аналог Secu-3 и MegasquirtAVR модифицированное железо и своя прошивка.
<<

Yurii

Сообщения: 187

Зарегистрирован: 10 июл 2013, 09:41

Откуда: Шебекино


Благодарил (а): 0 раз.
Поблагодарили: 85 раз.

Сообщение 18 сен 2015, 14:46

Re: Программирование на СИ. Помощь в написании кода.

напишите явное преобразование в 32 бита.
  Код:
uint32_t result = (uint32_t)(a+(b>>1))/b;
ВАЗ 2106 -1.6, 60-2, SECU3-T rev6 mega644 + УВЗ, МЗ 2112-3705010, Солекс-21083.
<<

KOT

Аватара пользователя

Сообщения: 328

Зарегистрирован: 10 май 2013, 14:23

Откуда: Запорожье


Благодарил (а): 6 раз.
Поблагодарили: 85 раз.

Сообщение 18 сен 2015, 19:32

Re: Программирование на СИ. Помощь в написании кода.

Yurii писал(а):напишите явное преобразование в 32 бита.
  Код:
uint32_t result = (uint32_t)(a+(b>>1))/b;

Либо я плохо спросил, либо я не понимаю разницы.
Ведь значение а может быть 0xFFFFFFFF и если к нему прибавить b/2 = 7F то будет переполнение. В СИ вроде как нет гарантий того что оно создат промежуточную 64 битную переменную, ну даже если и создать то деление будет 64 битное, а оно вроде будет выполнятся дольше чем два 32 битных.

т.е этот код возможно будет быстрей
  Код:
uint32_t result = a / b;
uint32_t rem = a % b;
if (rem > (b>>1)) result++;
Машина ЗАЗ 1103i, ГБО4. Управление ДВС: аналог Secu-3 и MegasquirtAVR модифицированное железо и своя прошивка.
<<

Samtorr

Аватара пользователя

Сообщения: 136

Зарегистрирован: 16 июн 2015, 21:45

Машина: Golf II 1.3i

Версия SECU: самодельная SECU-3T


Благодарил (а): 6 раз.
Поблагодарили: 74 раз.

Сообщение 21 сен 2015, 09:22

Re: Программирование на СИ. Помощь в написании кода.

KOT писал(а):т.е этот код возможно будет быстрей

Это легко проверить - Если Протеус у Вас установлен, то делаете два варианта, ставите брэйкпоинты и увидите время при отладке кода по шагам. Если оптимизатор не позволит их поставить, измеряемый код обрамите volatile командами, типа ногодрыга портов и смотрите время между ними. Также можно измерять время между фронтами виртуальным осциллографом, но менее точно.
Пред.

Вернуться в Решение проблем. Новичкам сюда!

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 1

Powered by phpBB® Forum Software © phpBB Group.