【问题标题】:Using registers and inline assembly (ARM)使用寄存器和内联汇编 (ARM)
【发布时间】:2013-11-01 01:29:58
【问题描述】:

我有一个小程序,我试图用它来以编程方式识别 CPU 频率。

我的程序结构如下:

  • 设置闹钟
  • while(1) 循环中增加寄存器
  • SIGALRM 的计算速度

最初,我使用的是

register unsigned int cycles asm("r6");  
...  
while(1)
    cycles++;

在使用 objdump 时,我注意到这实际上转换为以下内容:

9aa0:       e1a03006        mov     r3, r6  
9aa4:       e2833001        add     r3, r3, #1  
9aa8:       e1a06003        mov     r6, r3  
9aac:       eafffffb        b       9aa0 <estimate_from_cycles+0x1cc>  

由于我不确定为什么将其转换为 3 条指令,因此我尝试使用内联汇编:

register unsigned int cycles asm("r6");  
...  
while(1)
    asm("add r6, r6, #1);

翻译成:

9aa0:       e2866001        add     r6, r6, #1  
9aa4:       eafffffd        b       9aa0 <estimate_from_cycles+0x1cc>  
  • 为什么之前的实现转换为 3 条指令?
  • 在 ARM 平台上,b &lt;label&gt; 指令需要 3 个周期。但是,ARM 上的减法运算仅使用 1 个周期。
    • 有什么方法可以从 PC 寄存器中减去?
    • PC 上是否允许减法?
    • 还有其他方法可以减少实现相同逻辑所需的周期数吗?

编辑:我正在使用 CodeSourcery 的 arm-none-linux-gnueabi- 工具链,没有进行任何优化

【问题讨论】:

  • 这是一个非常糟糕的方法。您的进程将多次与 CPU 进行上下文交换以处理中断/允许其他进程运行。
  • 如果我的操作系统原则不正确,请见谅,但是在上下文切换到我的进程时,我的寄存器状态不会被保存和恢复吗?
  • 他是说你不会得到准确的测量结果。回到主题,您使用了哪些优化标志?

标签: c arm inline-assembly


【解决方案1】:

由于您没有启用任何优化,因此很可能将实现转换为 3 条指令。

但是,通过快速测试,您似乎无论如何都必须编写内联汇编,因为当我使用 -O3 -fomit-frame-pointer 编译以下内容时

void test(void) {
        register unsigned int cycles asm("r6");
        while(1) cycles++;
}

例程简单地优化到

00000000 <test>:
   0:   eafffffe    b   0 <test>

即使添加 volatile 也是没有用的,因为编译器肯定知道写入 CPU 寄存器肯定不会有任何副作用(与内存不同),因此对其进行优化是公平的。

回答您的其他问题,

  • 有什么方法可以从 PC 寄存器中减去?
  • PC 上是否允许减法?

是的,当然。但我不确定这是否仍然需要一个周期。

  • 还有其他方法可以减少实现相同逻辑所需的周期数吗?

附带说明,您的逻辑不会给出非常准确的结果,因为您的过程可能会在您开始和结束测量之间切换。

你期待:

<                    your process                     >
|<---------------your alarm duration----------------->|

什么时候,可能更像(| 是上下文切换):

<your process> | <other processes ...> | <your process>
|<---------------your alarm duration----------------->|

【讨论】:

  • man7.org/linux/man-pages/man2/timer_create.2.html 告诉我 CLOCK_PROCESS_CPUTIME_ID 应该解决计时器问题..还是我误解了什么?我目前没有使用任何优化
  • 如果您不使用任何优化,那将是有意义的。嗯,我不知道 CLOCK_PROCESS_CPUTIME_ID,所以我不确定它是否如您所想。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-04-11
  • 1970-01-01
  • 2021-03-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多