У меня была проблема на ARM Cortex M3
с некоторыми функциями, которые требуют умножения и деления натуральных чисел.
Дело в том, можно ли производить вычисления между 128-битными числами?
Мне нужно знать, сколько сборочных операций требуется программному обеспечению, эмулировать несколько двух 32-разрядных чисел и делить два 32-разрядных числа, а затем я буду вычислять затраты времени на мои вычисления.
Я придерживался некоторых расчетов, и мне нужна помощь, потому что, возможно, мне нужно сменить ОК на Cortex M4 с аппаратным ALU.
Ты можешь помочь мне с этим?
Учитывая простой C-код:
uint32_t var1 = 12304;
uint32_t var2 = 1892637198;
uint64_t result = var1*var2;
И objdump ассемблер:
0: b480 push {r7}
2: b085 sub sp, #20
4: af00 add r7, sp, #0
uint32_t var1 = 12304;
6: f243 0310 movw r3, #12304 ; 0x3010
a: 60fb str r3, [r7, #12]
uint32_t var2 = 1892637198;
c: f645 230e movw r3, #23054 ; 0x5a0e
10: f2c7 03cf movt r3, #28879 ; 0x70cf
14: 60bb str r3, [r7, #8]
uint64_t result = var1*var2;
16: 68fb ldr r3, [r7, #12]
18: 68ba ldr r2, [r7, #8]
1a: fb02 f103 mul.w r1, r2, r3
1e: 460a mov r2, r1
20: f04f 0300 mov.w r3, #0
24: e9c7 2300 strd r2, r3, [r7]
Так, если я вычислю, например, многократное умножение, могу ли я получить целую инструкцию (потому что загрузка значений в регистры, плюс 3 инструкции для каждой нагрузки) или только умножение (в данном случае 6 инструкций)
Поскольку умножение двух 128-битных переменных в формате (x ^ 5 + x), где x — 32-битная переменная, дает мне (a + b) (c + d) ab + ad + bc + bd 4 умножение (или 3 с использованием алгоритмов).
Так что, если я должен рассчитать 4 * (3 + 3 + 6) или 4 * (6 +? +?).
Эта страница содержит все количество циклов на одну инструкцию для процессора ARM M-Series. Если у вас есть ассемблерный код (который звучит так же, как у вас?), Тогда достаточно просто сложить все свои циклы, умножить на 1 / clock_freq и получить общее время, потраченное на разные сценарии.
Другое решение заключается в использовании systick для измерения количества циклов.
Видеть это ссылка от ARM
Редактировать: Вы можете установить Counter на максимум и заставить его заново загрузить значение счетчика, как только оно достигнет 0.
// Настройка Systick
* STRVR = 0xFFFFFF; // максимальное количество
* STCVR = 0; // принудительно перезагружаем регистр значений счетчика
* STCSR = 5; // включить подсчет FCLK без прерывания
Вы можете прочитать STCVR reg, который является регистром сбоя до и после функции, а затем удалить циклы служебных данных (чтобы прочитать регистр STCVR).