Сб окт 23, 2021 09:12:25
Сб окт 23, 2021 09:18:09
При том, что именно эта ветка дискуссии была про AVR, естественно.Не понял - а при чём тут AVR если тема про ARM?
for(;;);
Сб окт 23, 2021 09:33:18
Сб окт 23, 2021 10:12:55
Сб окт 23, 2021 10:19:40
COKPOWEHEU, а как насчет на F0 проверить?
Сб окт 23, 2021 10:33:27
Сб окт 23, 2021 11:15:47
Пруфы где? Пока я вижу, что разница незначительная, причем иногда даже в пользу моего варианта.потому твой вариант с делением и взятием остатка - это один из самых медленных подходов.
Сб окт 23, 2021 11:27:18
Сб окт 23, 2021 12:03:43
Сб окт 23, 2021 12:27:25
void printuhex(uint32_t val){
addtobuf("0x");
uint8_t *ptr = (uint8_t*)&val + 3;
int i, j, z = 1;
for(i = 0; i < 4; ++i, --ptr){
if(*ptr == 0){ // omit leading zeros
if(i == 3) z = 0;
if(z) continue;
}
else z = 0;
for(j = 1; j > -1; --j){
uint8_t half = (*ptr >> (4*j)) & 0x0f;
if(half < 10) bufputchar(half + '0');
else bufputchar(half - 10 + 'a');
}
}
}
Сб окт 23, 2021 12:34:30
Сб окт 23, 2021 12:42:15
Напомню что язык Си совершенно бесплатно даёт возможность отстрелить себе все конечности. У нас именно такой случай.
В идеале нужно обвесить функцию проверками размера стека,
Да, именно это мне и нужно, что ж вы изворачиваетесь-то постоянно от прямого вопроса! Где тесты? Опять от вас одни "логические соображения".Берем STM32G0(M0+) и тестим(-O2)
Сб окт 23, 2021 13:10:07
buf[0] = val % 10;
val /= 10;
Сб окт 23, 2021 13:55:40
Три разных функции это хорошо, жаль вы не выложили по ним результаты.я написал три разных функции, протестил их и результаты
Деление выполняется единажды, о чем я уже писал. Получение частного и остатка это одна функция.т.е. деление выполняется дважды
Сб окт 23, 2021 14:26:40
COKPOWEHEU писал(а):Деление выполняется единажды, о чем я уже писал. Получение частного и остатка это одна функция.
buf[0] = val % 10;
0x20001ec4 movs r1, #10
0x20001ec6 movs r0, r5
0x20001ec8 bl 0x20001824 <__aeabi_uidivmod>
val /= 10;
0x20001ecc movs r0, r5
0x20001ece uxtb r4, r1
0x20001ed0 movs r1, #10
0x20001ed2 bl 0x20001718 <__udivsi3> ; раз udiv
__aeabi_uidivmod:
0x20001824 cmp r1, #0
0x20001826 beq.n 0x20001818 <__udivsi3+256>
0x20001828 b.n 0x20001718 <__udivsi3> ; два udiv
0x2000182a bx lr
Сб окт 23, 2021 15:33:13
Да? И где там исходный вариант jcxz - который с переворотом строки?Под спойлером есть все, что нужно
Даже не знаю что еще считать, если я уже даже название этой функции выложил. Ну ладно. Вот для AVR, с которого мы начали обсуждение:Ну давай считать:
Сб окт 23, 2021 16:06:48
Сб окт 23, 2021 17:31:11
При чем здесь M0? На AVR, где нет не только аппаратного умножения и деления, но хоть какой-то работы с числами больше 8 бит, разница незначительная.Какое отношение к медленной работе функции на M0
Посмотрите вот на это сообщение, вот на это. И потом на свое. И сравните где результаты измерений, а где куски кода.И после этого ты попросил пруфы, которые с первого раза вообще не заметил
Сб окт 23, 2021 18:49:11
Сб окт 23, 2021 21:46:44
Если говоря про M0, при этом цитируя пост про L151
А в 2.7 раза это сколько в тактах? Может, там как и в AVR десять тысяч тактов и оба варианта годятся только отладочную информацию раз в вечность передавать. То есть не "данные для любознательных" закопаны под спойлер, а просто какие-то сырые данные без пояснений.было написано, что последняя функция, у которой убрано вычисление остатка от деления и заменено само деление выполняется в 2.7 раза быстрее