一,单片机的延迟函数和周期计算
1 延迟函数
要想学习延迟函数内部实现原理就要学习对应的汇编代码,才可以深刻理解延迟函数的内部是实现原理
void Delay500ms(void) //@11.0592MHz
{
unsigned char data i, j, k;
_nop_();
i = 4;
j = 129;
k = 119;
do
{
do
{
while (--k);
} while (--j);
} while (--i);
}
将上述代码转换为对应的汇编语言如下
DELAY500MS: ;@11.0592MHz
PUSH 30H
PUSH 31H
PUSH 32H
MOV 30H,#4
MOV 31H,#129
MOV 32H,#112
NEXT:
DJNZ 32H,NEXT
DJNZ 31H,NEXT
DJNZ 30H,NEXT
POP 32H
POP 31H
POP 30H
RET
转化为汇编语言,需要计算时间的话,还需要知道指令执行的时间怎么进行计算
2 机器周期,时钟周期,指令周期
学习这个时间的计算我要学习时间周期,机器周期和指令周期
这些周期有什么用呢?这些周期是给我门用计算这个周期是要花费多少的时间
大概概述一下就是
(1) 时钟周期
时钟周期就类似于一个单位,这个时钟周期为0.09微秒。
(2) 机器周期
机器周期就类似于一个指令周期的一个单位,这个机器周期默认为12个时钟周期。
(3) 指令周期
当然你想缩短机器周期的时间开销,你可以调整为6个时钟周期,在默认状态下是12个时钟周期。
指令周期的详细含义:
一个指令周期是完成一个指令所需要的时间,由一个机器周期或者多个组成,这个为我们后面计算时间十分重要,因为在计算时间的时候,还要计算执行指令的时间开销。
3 汇编指令
下面为一个汇编指令图的样例
这个就是那个手册里面每一个指令所需要开销所花的时间,6时钟指令我们是可以调的,这就可以让cpu的运行时间缩短一倍
在STC-ISP里面也有6T模式可以自己进行设置
我们来计算一下每一个指令所需要花的多少时间
根据手册上每一个汇编指令所需要花的时间,我们来统计
(1) NOP
就是一个空操作,不执行任何的指令操作,花销是1个机器周期。
(2) PUSH
就是一个直接把这个地址里面的数据进行压栈,开销2个机器周期。
在这里的含义为,把这个30H的数据压入,下一个PUSH也是这样的操作,两个都是开销2个机器周期。
(3) MOV
含义为把所对应的数据放入到对应的地址里面,开销为2个机器周期
就是把这个2和194分别放到30H和31H地址里面去,时间开销为2个机器周期
(4) DJNZ
这个指令类似于循环,DJNZ 地址所表示的值 不为0所跳转的地方,每一次执行开销为2个机器周期
观察上面的代码可以看出当前地址存放的为194,然后减到0,然后跳到下一个DJNZ,但是在执行该DJNZ的时候,由跳到了NEXT,然后又执行了一次一个DJNZ,然后为0-1变成了-1,跟上面描述,为-1的时候,看作为255,此时又要执行255次,然后减到0之后就再执行一次第二个DJNZ,就结束了。
(5) POP
就是将栈里面的数据弹出栈,开销为2个机器周期。
(6) RET
表示子程序返回,开销为2个机器周期。
所以后面我们就有了467个机器周期,只需要乘以机器周期的时间开销就好了
4 6T模式
这个模式由上述可知,这个就是可以使得这个LED灯闪烁的更快,也就是6个机器周期执行一个指令,但是我们一般都是12个机器周期执行一个指令
————————————————
版权声明:本文为CSDN博主「一只自律的鸡」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/2401_86738532/article/details/151758875
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?注册
×
|