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

Решаем проблемы новичков. Не знаете где задать вопрос?
Задавайте здесь! .. и другие разные вопросы
KOT
Posts: 328
Joined: 10 May 2013, 14:23
Your CAR: I go on foot
SECU version: DIY SECU-3
Location: Запорожье
Has thanked: 6 times
Been thanked: 89 times

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

Post by KOT »

Code: Select all

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
Posts: 279
Joined: 10 Jul 2013, 09:41
Your CAR: ВАЗ2106
SECU version: DIY SECU-3T
Location: Шебекино
Has thanked: 1 time
Been thanked: 123 times

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

Post by Yurii »

напишите явное преобразование в 32 бита.

Code: Select all

uint32_t result = (uint32_t)(a+(b>>1))/b;
ВАЗ 2106 -1.6, 60-2, SECU3-T rev6 mega644 + УВЗ, МЗ 2112-3705010, Солекс-21053-20.
KOT
Posts: 328
Joined: 10 May 2013, 14:23
Your CAR: I go on foot
SECU version: DIY SECU-3
Location: Запорожье
Has thanked: 6 times
Been thanked: 89 times

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

Post by KOT »

Yurii wrote:напишите явное преобразование в 32 бита.

Code: Select all

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

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

Code: Select all

uint32_t result = a / b;
uint32_t rem = a % b;
if (rem > (b>>1)) result++;
Машина ЗАЗ 1103i, ГБО4. Управление ДВС: аналог Secu-3 и MegasquirtAVR модифицированное железо и своя прошивка.
Samtorr
Posts: 342
Joined: 16 Jun 2015, 21:45
Your CAR: Golf II 1.3i
SECU version: DIY SECU-3T
Has thanked: 11 times
Been thanked: 114 times

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

Post by Samtorr »

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

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