American English British English Български Čeština Français Deutsch (Du) Magyar Italiano 日本語 Lietuvių Polski Српски Slovenčina Español (Tú) Türkçe Українська
Select language:

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

<<

KOT

User avatar

Posts: 328

Joined: 10 May 2013, 14:23

Location: Запорожье


Has thanked: 6 times
Been thanked: 85 times

Post 18 Sep 2015, 11:57

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

  Code:
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

User avatar

Posts: 224

Joined: 10 Jul 2013, 09:41

Location: Шебекино

Your CAR: ВАЗ2106

SECU version: DIY SECU-3T


Has thanked: 1 time
Been thanked: 91 times

Post 18 Sep 2015, 14:46

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

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

KOT

User avatar

Posts: 328

Joined: 10 May 2013, 14:23

Location: Запорожье


Has thanked: 6 times
Been thanked: 85 times

Post 18 Sep 2015, 19:32

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

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

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

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

Samtorr

User avatar

Posts: 154

Joined: 16 Jun 2015, 21:45

Your CAR: Golf II 1.3i

SECU version: DIY SECU-3T


Has thanked: 6 times
Been thanked: 77 times

Post 21 Sep 2015, 09:22

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

KOT wrote:т.е этот код возможно будет быстрей

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

Return to Решение проблем. Новичкам сюда!

Who is online

Users browsing this forum: SachokQ and 7 guests

Powered by phpBB® Forum Software © phpBB Group.