打印
[STM32F1]

怎么知道一条汇编语言是单周期还是双周期和运行时间呢

[复制链接]
1451|26
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
dingy|  楼主 | 2022-2-1 20:20 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
如果系统时间为72M,怎么知道一条汇编语言是单周期还是双周期和运行时间呢,在哪里查表吗?

使用特权

评论回复
沙发
xxrs| | 2022-2-1 20:29 | 只看该作者

什么意思?不是很明白你说的什么,能再解释一下这个现象吗

使用特权

评论回复
板凳
dingy|  楼主 | 2022-2-1 20:31 | 只看该作者
比如说如图,LDR这里的理论运行时间是多少,谢谢啦

使用特权

评论回复
地板
zwll| | 2022-2-1 20:33 | 只看该作者
KEIL支持汇编,如果真的这么计较周期,可以查看下代码的汇编就知道了

使用特权

评论回复
5
renyaq| | 2022-2-1 20:35 | 只看该作者
ldr一般要2个时钟

使用特权

评论回复
6
jlyuan| | 2022-2-1 20:38 | 只看该作者

无法估算,因为有三级流水线对指令进行缓存

使用特权

评论回复
7
zwll| | 2022-2-1 20:40 | 只看该作者
arm体系比较复杂,没发给出一个确定的时间

使用特权

评论回复
8
dingy|  楼主 | 2022-2-1 20:42 | 只看该作者
比如你说的这条指令,数据和程序都在程序区

使用特权

评论回复
9
llljh| | 2022-2-1 20:46 | 只看该作者
内核需要访问两次程序区,一次取指令,一次取数据

使用特权

评论回复
10
pengf| | 2022-2-1 20:48 | 只看该作者

有的芯片还要分析cache的情况

使用特权

评论回复
11
dingy|  楼主 | 2022-2-1 22:13 | 只看该作者
我用硬件仿真  states增加3 代表是运行3个系统clk吗

使用特权

评论回复
12
zwll| | 2022-2-1 22:15 | 只看该作者
访问闪存时还可能会有等待

使用特权

评论回复
13
dingy|  楼主 | 2022-2-1 22:19 | 只看该作者
那算运行时间怎么算,谢啦

使用特权

评论回复
14
dingy|  楼主 | 2022-2-1 22:21 | 只看该作者
。。。那我想算上面的运行clk,怎么计算呢,谢谢

使用特权

评论回复
15
lizye| | 2022-2-1 22:21 | 只看该作者
对于一些需要时序的IO操作(主要是通信线路),应尽量使用外设的硬件来产生需要的信号时序,而避免自己操作GPIO来模拟信号时序。

使用特权

评论回复
16
zhaoxqi| | 2022-2-1 22:23 | 只看该作者

如果有兴趣,可以查看关于各ARM CORTEX内核的用户手册。各个内核都有,里面有指令集的介绍。附件是M0的用户手册。

使用特权

评论回复
17
wyjie| | 2022-2-1 22:25 | 只看该作者
具体需要几个周期,肯定不是两个。可能是8个。理由如下:
ARM7具有3级流水线结构(取指、译码、执行),对大多数指令来说每条流水线的处理都是单周期的,不过某些情况下,取指和执行的周期数会延长,导致流水线进入stall状态,指令执行时间超过1个周期。
更多操作

使用特权

评论回复
18
dengdc| | 2022-2-1 22:26 | 只看该作者

经过在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的命中情况。

使用特权

评论回复
19
heweibig| | 2022-2-1 22:28 | 只看该作者
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用起来比较麻烦,因为有些数不那么容易看出来是否合法。

使用特权

评论回复
20
zhanghqi| | 2022-2-1 22:31 | 只看该作者
好像是能算的 但是我不知道怎么算

使用特权

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

本版积分规则

745

主题

10920

帖子

6

粉丝