我在ARM Cortex M3上遇到了一个问题,它的一些功能要求对自然数进行乘法和除法。关键是:如果可以在128位数之间进行计算?我需要知道有多少装配操作需要软件模拟多个两个32位数字和除以两个32位数,然后我将计算我计算的时间消耗。我一直在计算,我需要帮助,因为也许我必须用硬件ALU将我的uC转换为皮质M4。
你能帮我做这个吗?
给定简单的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条指令)。
因为将格式化为(x^5+x)的两个128位变量乘以x是32位变量,所以给我(a+b)(c+d) ab+ad+bc+bd 4乘法(或3通过算法)。因此,如果我应该计算4*(3+3+6)或4*(6+?+?)。
发布于 2014-08-26 13:29:32
此页面包含ARM M系列处理器的每条指令的所有循环计数.如果您有程序集代码(听起来是这样的吗?)然后,可以很容易地将所有的周期加起来,乘以1/clock_freq,得到用于不同场景的总时间。
发布于 2014-08-29 01:52:28
另一种解决方案是使用cycle来测量周期计数。
参见此臂链
编辑:,您可以将计数器设置为最大值,并在计数器值达到0时强制重新加载其计数器值。
//配置系统
\*STRVR = 0xFFFFFF; // max count \*STCVR = 0; // force a re-load of the counter value register \*STCSR = 5; // enable FCLK count without interrupt
您可以在函数前后读取STCVR,这是一个下行寄存器,然后删除开销周期(读取STCVR寄存器)。
https://stackoverflow.com/questions/25515325
复制