У меня была проблема с ARM Cortex M3 с некоторой функциональностью, которая требует умножения и деления натуральных чисел. Дело в том, можно ли делать вычисления между 128 битами чисел? Мне нужно знать, сколько сборочных операций требуется, чтобы программное обеспечение эмулировало несколько двух 32 чисел и разделило два 32 битовых номера, а затем я вычислил время потребления моих вычислений. Я застрял с некоторыми расчетами, и мне нужна помощь, потому что, может быть, мне нужно изменить свой UC на кору 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
Изменить: вы можете установить счетчик на максимум и принудительно повторно загрузить его значение счетчика, как только оно достигнет 0.
//Настройка Systick
* STRVR = 0xFFFFFF; //max count * STCVR = 0; //принудительно перезагрузить регистр значения счетчика * STCSR = 5; // включить подсчет FCLK без прерывания
Вы можете прочитать регистр STCVR, который является нижним регистром до и после функции, а затем удалить служебные циклы (чтобы прочитать регистр STCVR).