打印
[应用相关]

怎么知道cortex汇编指令的运行时间

[复制链接]
3921|12
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
大Qin|  楼主 | 2015-12-22 12:03 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
如果系统时间为72M,怎么知道一条汇编语言是单周期还是双周期和运行时间呢,在哪里查表吗?
比如说如图,LDR这里的理论运行时间是多少,谢谢啦

沙发
yhn1973| | 2015-12-22 12:30 | 只看该作者
ldr一般要2个时钟

使用特权

评论回复
板凳
泰山特曲123| | 2015-12-22 12:38 | 只看该作者
无法估算,因为有三级流水线对指令进行缓存

使用特权

评论回复
地板
lxyppc| | 2015-12-22 12:41 | 只看该作者
arm体系比较复杂,没发给出一个确定的时间
比如你说的这条指令,数据和程序都在程序区
内核需要访问两次程序区,一次取指令,一次取数据
有的芯片还要分析cache的情况

使用特权

评论回复
5
大Qin|  楼主 | 2015-12-22 14:56 | 只看该作者
yhn1973 发表于 2015-12-22 12:30
ldr一般要2个时钟

我用硬件仿真  states增加3 代表是运行3个系统clk吗

使用特权

评论回复
6
yhn1973| | 2015-12-22 15:11 | 只看该作者
访问闪存时还可能会有等待

使用特权

评论回复
7
大Qin|  楼主 | 2015-12-22 15:21 | 只看该作者
泰山特曲123 发表于 2015-12-22 12:38
无法估算,因为有三级流水线对指令进行缓存

那算运行时间怎么算,谢啦

使用特权

评论回复
8
大Qin|  楼主 | 2015-12-22 15:23 | 只看该作者
lxyppc 发表于 2015-12-22 12:41
arm体系比较复杂,没发给出一个确定的时间
比如你说的这条指令,数据和程序都在程序区
内核需要访问两次程 ...

。。。那我想算上面的运行clk,怎么计算呢,谢谢

使用特权

评论回复
9
john_lee| | 2015-12-22 17:05 | 只看该作者
大Qin 发表于 2015-12-22 15:23
。。。那我想算上面的运行clk,怎么计算呢,谢谢

对于一些需要时序的IO操作(主要是通信线路),应尽量使用外设的硬件来产生需要的信号时序,而避免自己操作GPIO来模拟信号时序。

使用特权

评论回复
10
xmshao| | 2015-12-22 20:51 | 只看该作者
如果有兴趣,可以查看关于各ARM CORTEX内核的用户手册。各个内核都有,里面有指令集的介绍。附件是M0的用户手册。

Cortex-M0_User_Guide.pdf

928.24 KB

使用特权

评论回复
11
huangqi412| | 2015-12-23 10:04 | 只看该作者
有流水线,

使用特权

评论回复
12
643757107| | 2015-12-23 11:54 | 只看该作者
具体需要几个周期,肯定不是两个。可能是8个。理由如下:
ARM7具有3级流水线结构(取指、译码、执行),对大多数指令来说每条流水线的处理都是单周期的,不过某些情况下,取指和执行的周期数会延长,导致流水线进入stall状态,指令执行时间超过1个周期。
经过在LPC213x/214x(NXP ARM7TDMI-S)上的试验,得出各类指令的执行周期数如下:
1、大部分算术运算和逻辑运算指令都是单周期的(乘法例外)。
2、STR指令需要增加1个总线周期。如果地址位于内部SRAM,则是2个周期;如果地址位于AHB、VPB等外设总线上(例如访问外设的寄存器),由于局部总线和外设总线桥接还有额外延时,因此需要再增加一些周期数,在LPC213x/214x上,当VPB和主频相同时,需要再增加5个周期额外延时,即用STR指令访问外设寄存器需要7个期。
3、LDR指令需要增加2个总线周期。同理,如果地址位于内部SRAM,则是3个周期;如果地址在外设总线上,同样需要再增加一些周期数,在LPC213x/214x上,当VPB和主频相同时,LDR指令需要8个周期。
4、对于一次操作多个寄存器的STM、LDM类指令,指令周期数与STR、LDR类似,但每增加一个寄存器需要增加一个总线周期,例如当地址位于内部SRAM、寄存器个数为N时,执行周期数为1+N(STM)和2+N(LDM)。
5、无条件跳转语句和跳转语句成功跳转,需要重新填充流水线,因此至少需要3个周期(假设访问程序存储空间是单周期的)。
6、LDR指令的目标寄存器为R15(PC)时,相当于读总线+跳转,至少需要5个周期(假设访问程序存储空间是单周期的)。
7、乘法指令根据操作数位数的不同,从2-5个周期都有可能。
8、对于所有的带条件的指令,如果条件不满足,指令不被执行,都只需要花1个周期来跳过该指令。
9、实际应用时,还需考虑程序存储器的访问速度(影响流水线取指阶段的周期数)以及Cache的命中情况。

使用特权

评论回复
13
643757107| | 2015-12-23 11:55 | 只看该作者
LDR指令的格式:
LDR{条件}   目的寄存器     <存储器地址>
作用:将 存储器地址 所指地址处连续的4个字节(1个字)的数据传送到目的寄存器中。
LDR指令的寻址方式比较灵活,实例如下:
LDR R0,[R1]                                                      ;将存储器地址为R1的字数据读入寄存器R0。
LDR R0,[R1,R2]                                             ;将存储器地址为R1+R2的字数据读入寄存器R0。
LDR R0,[R1,#8]                                             ;将存储器地址为R1+8的字数据读入寄存器R0。
LDR R0,[R1],R2                                               ;将存储器地址为R1的字数据读入寄存器R0,并将R1+R2的值存入R1。
LDR R0,[R1],#8                                               ;将存储器地址为R1的字数据读入寄存器R0,并将R1+8的值存入R1。
LDR R0,[R1,R2]!                                          ;将存储器地址为R1+R2的字数据读入寄存器R0,并将R1+R2的值存入R1。
LDR R0,[R1,LSL #3]                                   ;将存储器地址为R1*8的字数据读入寄存器R0。
LDR R0,[R1,R2,LSL #2]                         ;将存储器地址为R1+R2*4的字数据读入寄存器R0。
LDR R0,[R1,,R2,LSL #2]!                       ;将存储器地址为R1+R2*4的字数据读入寄存器R0,并将R1+R2*4的值存入R1。
LDR R0,[R1],R2,LSL #2                            ;将存储器地址为R1的字数据读入寄存器R0,并将R1+R2*4的值存入R1。
LDR R0,Label                                                ;Label为程序标号,Label必须是当前指令的-4~4KB范围内。

要注意的是
LDR Rd,[Rn],#0x04                                                              ;这里Rd不允许是R15。

另外LDRB 的指令格式与LDR相似,只不过它是将存储器地址中的8位(1个字节)读到目的寄存器中。
LDRH的指令格式也与LDR相似,它是将内存中的16位(半字)读到目的寄存器中。

LDR R0,=0xff
这里的LDR不是arm指令,而是伪指令。这个时候与MOVE很相似,只不过MOV指令后的立即数是有限制的。这个立即数必须是0X00-OXFF范围内的数经过偶数次右移得到的数,所以MOV用起来比较麻烦,因为有些数不那么容易看出来是否合法。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

4

主题

14

帖子

1

粉丝