STC8G1K单片机软件执行时间物理测量
为了能够评估STC8G1K08单片机算法的效率,需要有一种能够直接测量单片机程序执行时间的物理方法。使用单片机的一个管脚的变化来表明软件流程的起始和结束,从外部通过示波器等手段测量脉冲的宽度,便可以有效衡量单片机软件执行流程的时间。
下面通过一些基本实验来衡量这种方法的有效性。
实验平台
实验电路板在博文“8G1K实验电路板”给出了描述。使用单片机P3.2管脚来只是程序的起始和结束。
该管脚在初始化的时候输出模式设置为:PUSH-PULL。
#define FLAG_PIN 3, 2 // For test time pulse
- 1
PM_PP(FLAG_PIN);
- 1
单片机的运行时钟频率为:
f s y s = 35 × 1 0 6 H z f_{sys} = 35 \times 10^6 Hz fsys=35×106Hz
典型时间测量
1. 相邻ON,OFF指令
ON,OFF是定义的宏指令,实际就是对sbit赋值指令。
#define _ON(pt,pin) P##pt##pin=1
#define _OFF(pt,pin) P##pt##pin=0
#define _TOGGLE(pt,pin) P##pt##pin=~P##pt##pin
#define ON(x) _ON(x)
#define OFF(x) _OFF(x)
#define TOGGLE(x) _TOGGLE(x)
- 1
- 2
- 3
- 4
- 5
- 6
- 7
这应该是改变MCU输出管脚电平最为简介的指令了。下面通过测量连续ON,OFF 指令,测量对应管脚信号的变化情况。
ON(FLAG_PIN);
OFF(FLAG_PIN);
- 1
- 2
测量FLAG_PIN输出信号入下图所示,在波形的上升和下降起始位置之间的时间大约为: t 1 = 30 n s t_1 = 30ns t1=30ns。
由于MCU系统频率为 f s y s = 35 n s f_{sys} = 35ns fsys=35ns,所以 t 1 t_1 t1大约等于系统频率的倒数: t 1 ≈ 1 f s y s = 1 35 × 1 0 6 t_1 \approx {1 \over {f_{sys} }} = {1 \over {35 \times 10^6 }} t1≈fsys1=35×1061
▲ P3.2输出波形
使用ON,OFF命令测量实际执行时间的时候,需要将测量时间减去MCU工作的指令周期,也就是 t 1 t_1 t1。
2. 使用TOGGLE指令
根据前面定义TOGGLE宏命令,该指令是8051中指令对sbit取反操作,使用连续两次取反,可以使得管脚输出举行脉冲。
最终所测量得到的脉冲与前面连续ON,OFF脉冲相同。
3. 测量_NOP_时间间隔
在ON,OFF指令之间增加nop命令,则会反映出单个NOP命令的执行时间。
ON(FLAG_PIN);
_nop_();
OFF(FLAG_PIN);
- 1
- 2
- 3
测量结果如下图所示。相邻上升沿和下降沿之间的时间大约为60ns,相当于两个系统指令周期。
▲ 增加NOP指令之后的P3.2管脚信号
变量操作运行时间
1. unsigned char
(1)赋值语句: unsigned char c1 = 1;
执行时间为Tmcu=30ns。
(2)加法指令: unsigned char c1,c2; c1=c1+c2;
执行时间:3个Tmcu=90ns。
(3)减法指令: c1=c1-c2 执行时间:4个Tmcu=120ns;
(4)乘法指令: c1=c1*c2
执行时间5个Tmcu=150ns。
(5)除法指令: c1=c1/c2
执行时间:300ns。
2. unsigned int
(1)赋值语句: unsigned int n1 = 1;
执行时间:2Tmcu=60ns;
(2)加法: n1=n1+n2;
执行时间: 6Tmcu = 180ns。
(3)减法: n1=n1-n2;
执行时间: 7Tmcu=210ns。
(4)乘法: n1=n1*n2;
执行时间:25Tmcu=810ns
(5)除法指令: n1=n1/n2
执行时间:5us;
3. unsigned long
(1)赋值语句: unsigned int n1 = 1;
执行时间:150ns;
(2)加法: n1=n1+n2;
执行时间: 12TMuc = 360ns;
(3)减法: n1=n1-n2;
执行时间: 410ns
(4)乘法: n1=n1*n2;
执行时间:2.65us
(5)除法指令: n1=n1/n2
执行时间:18.3us;
对于32bit(long)ckzo ,乘法和除法都比较消耗时间,利用8G内部的MDU16(32位乘法/除法)单元,可以加快相应的计算结果。下面给出了数据手册中相关的运行速度说明。
▲ MDU16不同操作所需要的时钟数量
4. float
(1)赋值语句: f1 = 34.340;
执行时间:180ns;
(2)加法: f1=f1+f2
执行时间: 7.04us。
(3)减法: f1=f1-f2;
执行时间: 6.1us。
(4)乘法: f1=f1*f2;
执行时间:5.56us;
从现实的波形上来看,在执行过程中出现了不同的执行时间。使用EA = 0,来关闭全局终点,依然会出现这种情况。这说明不是中断引起的执行时间的差异。
▲ 出现不同的执行时间
(5)除法指令: f1=f1/f2;
执行时间:1.84us;
5. double
(1)赋值语句: f1 = 34.340;
执行时间: 180ns;
(2)加法: f1=f1+f2
执行时间: 6.18us。
(3)减法: f1=f1-f2;
执行时间: 1.94us。
(4)乘法: f1=f1*f2;
执行时间:2.14us;
注意:这个执行时间比起float还要短?为什么呢?
(5)除法指令: f1=f1/f2;
执行时间:1.84us;
文章来源: zhuoqing.blog.csdn.net,作者:卓晴,版权归原作者所有,如需转载,请联系作者。
原文链接:zhuoqing.blog.csdn.net/article/details/105761237
- 点赞
- 收藏
- 关注作者
评论(0)