【发布时间】: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 <label>指令需要 3 个周期。但是,ARM 上的减法运算仅使用 1 个周期。- 有什么方法可以从 PC 寄存器中减去?
- PC 上是否允许减法?
- 还有其他方法可以减少实现相同逻辑所需的周期数吗?
编辑:我正在使用 CodeSourcery 的 arm-none-linux-gnueabi- 工具链,没有进行任何优化
【问题讨论】:
-
这是一个非常糟糕的方法。您的进程将多次与 CPU 进行上下文交换以处理中断/允许其他进程运行。
-
如果我的操作系统原则不正确,请见谅,但是在上下文切换到我的进程时,我的寄存器状态不会被保存和恢复吗?
-
他是说你不会得到准确的测量结果。回到主题,您使用了哪些优化标志?
标签: c arm inline-assembly