0

我在 ARM Cortex M3 上遇到了一些需要乘除自然数的功能的问题。关键是:是否可以在 128 位数字之间进行计算?我需要知道有多少组装操作需要软件模拟多个两个 32 数字并除以两个 32 位数字,然后我将计算我的计算的时间消耗。我坚持了一些计算,我需要帮助,因为也许我必须用硬件 ALU 将我的 uC 更改为 cortex 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+?+?)。

4

2 回答 2

1

ARM 指令

此页面包含 ARM M 系列处理器每条指令的所有周期计数。如果您有汇编代码(听起来像您这样做?),那么将所有周期相加,乘以 1/clock_freq 并得到您在不同场景中花费的总时间应该很容易。

于 2014-08-26T21:29:32.367 回答
-1

另一种解决方案是使用 systick 来测量循环计数。

请参阅ARM 的此链接

编辑:您可以将计数器设置为最大值,并在达到 0 后强制重新加载其计数器值。

// 配置 Systick
*STRVR = 0xFFFFFF; // 最大计数 *STCVR = 0; // 强制重新加载计数器值寄存器 *STCSR = 5; // 启用无中断的 FCLK 计数

您可以在函数之前和之后读取作为向下寄存器的 STCVR reg,然后删除开销周期(以读取 STCVR 寄存器)。

于 2014-08-29T09:52:28.253 回答