Сб окт 23, 2021 22:55:48
__attribute__ ((optimize("-Os"))) char* u32_char (uint32_t value, char* tail_txt) /// 40 байт
{
*tail_txt = 0;
uint32_t tmp, exx;
do{
tmp = ((uint64_t) value * 429496730UL >> 32);
exx = value - tmp * 10;
exx += '0';
*(--tail_txt) = exx;
value = tmp;
}while (value != 0);
return tail_txt;
};
Сб окт 23, 2021 23:03:28
COKPOWEHEU писал(а):А в 2.7 раза это сколько в тактах? Может, там как и в AVR десять тысяч тактов и оба варианта годятся только отладочную информацию раз в вечность передавать. То есть не "данные для любознательных" закопаны под спойлер, а просто какие-то сырые данные без пояснений.
static int remu10(uint32_t n)
{
const static int8_t table[16] = { 0, 1, 2, 2, 3, 3, 4, 5, 5, 6, 7, 7, 8, 8, 9, 0 };
n = (0x19999999 * n + (n >> 1) + (n >> 3)) >> 28;
return table[n];
}
static uint32_t divu10(uint32_t n)
{
return ((n - remu10(n)) >> 1) * 0xCCCCCCCD;
}
Сб окт 23, 2021 23:32:59
Сб окт 23, 2021 23:52:10
uint32_t divu10(uint32_t val) { return (uint64_t)val * 429496730UL >> 32; }
for(uint64_t i = 0; i <= 0xFFFF'FFFF; i++)
{
if(divu10(i) != i / 10)
{
printf("Error: %u, %u, %u\n", i, divu10(i), i / 10);
return 0;
}
}
printf("OK!\n");
Сб окт 23, 2021 23:56:15
Вс окт 24, 2021 00:03:45
Вс окт 24, 2021 00:34:49
Вс окт 24, 2021 08:08:00
Вс окт 24, 2021 09:48:29
Нет, тест появился не из-за EddyEm, тест появился, поскольку я подобными функциями пользуюсь, и было интересно узнать насколько они лучше или хуже альтернатив.Изначально Eddy_Em просил потестить на F0(M0), у тебя таких нет, потому появился тест [только] для L151(M3)
Так для вас это всего лишь спор? Соревнование на самый быстрый код? Меня-то вопрос интересует в практическом смысле: стоит ли использовать и для каких задач.Спор был про скорость
Вс окт 24, 2021 11:09:39
COKPOWEHEU писал(а):Так для вас это всего лишь спор? Соревнование на самый быстрый код? Меня-то вопрос интересует в практическом смысле: стоит ли использовать и для каких задач.
Вс окт 24, 2021 13:02:37
int32_t getMCUtemp(){ // return MCU temperature (degrees of celsius * 10)
int32_t ADval = getADCval(2);
int32_t temperature = (int32_t) *TEMP30_CAL_ADDR - ADval;
temperature *= (int32_t)(1100 - 300);
temperature /= (int32_t)(*TEMP30_CAL_ADDR - *TEMP110_CAL_ADDR);
temperature += 300;
return(temperature);
}
uint32_t getVdd(){ // return Vdd * 100 (V)
uint32_t vdd = ((uint32_t) *VREFINT_CAL_ADDR) * (uint32_t)330; // 3.3V
vdd /= getADCval(3);
return vdd;
}
Вс окт 24, 2021 13:27:30
Вс окт 24, 2021 13:34:43
Вс окт 24, 2021 13:48:11
Вс окт 24, 2021 14:01:34
Вс окт 24, 2021 14:23:33
Вс окт 24, 2021 14:33:23
Вс окт 24, 2021 15:33:19
Да понял я , что вам результат не интересен, раз вы ни экспериментальных данных толком не привели, ни выводов, ни ввопросе разобраться не попытались - откуда такая разница. Ну не хотите и ладно, свой вывод я озвучил: разница в десяток процентов на чловеко-читаемом выводе несущественна.а когда если спойлер и открыл, то сразу его и закрыл, то можно говорить что угодно, но степень заинтересованности налицо
Вс окт 24, 2021 15:45:10
uint64_t umul_32_64(uint32_t u, uint32_t v) // u32 * u32 -> u64
{
uint32_t a, b, c;
__asm volatile("uxth %[a], %[u]\n"
"lsrs %[u], %[u], #16\n"
"lsrs %[b], %[v], #16\n"
"uxth %[v], %[v]\n"
"movs %[c], %[v]\n"
"muls %[v], %[a]\n"
"muls %[c], %[u]\n"
"muls %[u], %[b]\n"
"muls %[b], %[a]\n"
"lsls %[a], %[c], #16\n"
"lsrs %[c], %[c], #16\n"
"adds %[v], %[a]\n"
"adcs %[u], %[c]\n"
"lsls %[a], %[b], #16\n"
"lsrs %[b], %[b], #16\n"
"adds %[v], %[a]\n"
"adcs %[u], %[b]\n"
: [u] "+l" (u), [v] "+l" (v), [a] "=l" (a), [b] "=l" (b), [c] "=l" (c) :: "cc"
);
return uint64_t(u) << 32 | v;
}
uint32_t divu10(uint32_t val) { return umul_32_64(val, ((1ULL << 35) + 5) / 10) >> 35; }
Вс окт 24, 2021 16:11:06
PUBLIC umull
umull: MOV R12, R4
LSRS R2, R0, #16
LSRS R3, R1, #16
UXTH R0, R0
UXTH R1, R1
MOV R4, R2
MULS R4, R4, R3
MULS R2, R2, R1
MULS R3, R3, R0
MULS R0, R0, R1
LSRS R0, R0, #16
MOVS R1, #0
ADDS R2, R2, R3
MOV R3, R1
ADCS R3, R3, R1
ADDS R2, R2, R0
ADCS R3, R3, R1
LSRS R2, R2, #16
ADDS R4, R4, R2
LSLS R3, R3, #16
ADDS R0, R3, R4
MOV R4, R12
BX LR
umull(0x1234567u, 0x23456789u);