STC8G1K单片机软件执行时间物理测量

为了能够评估STC8G1K08单片机算法的效率,需要有一种能够直接测量单片机程序执行时间的物理方法。使用单片机的一个管脚的变化来表明软件流程的起始和结束,从外部通过示波器等手段测量脉冲的宽度,便可以有效衡量单片机软件执行流程的时间。

下面通过一些基本实验来衡量这种方法的有效性。

实验平台

实验电路板在博文“8G1K实验电路板”给出了描述。使用单片机P3.2管脚来只是程序的起始和结束。

该管脚在初始化的时候输出模式设置为:PUSH-PULL。

#define FLAG_PIN            3, 2           // For test time pulse
PM_PP(FLAG_PIN);

单片机的运行时钟频率为:
f s y s = 35 × 1 0 6 H z f_{sys} = 35 \times 10^6 Hz

典型时间测量

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)

这应该是改变MCU输出管脚电平最为简介的指令了。下面通过测量连续ON,OFF 指令,测量对应管脚信号的变化情况。

        ON(FLAG_PIN);
        OFF(FLAG_PIN);

测量FLAG_PIN输出信号入下图所示,在波形的上升和下降起始位置之间的时间大约为: t 1 = 30 n s t_1 = 30ns

由于MCU系统频率为 f s y s = 35 n s f_{sys} = 35ns ,所以 t 1 t_1 大约等于系统频率的倒数: 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 }}
▲ P3.2输出波形

▲ P3.2输出波形

使用ON,OFF命令测量实际执行时间的时候,需要将测量时间减去MCU工作的指令周期,也就是 t 1 t_1

2. 使用TOGGLE指令

根据前面定义TOGGLE宏命令,该指令是8051中指令对sbit取反操作,使用连续两次取反,可以使得管脚输出举行脉冲。

最终所测量得到的脉冲与前面连续ON,OFF脉冲相同。

3. 测量_NOP_时间间隔

在ON,OFF指令之间增加nop命令,则会反映出单个NOP命令的执行时间。

        ON(FLAG_PIN);
        _nop_();
        OFF(FLAG_PIN);

测量结果如下图所示。相邻上升沿和下降沿之间的时间大约为60ns,相当于两个系统指令周期。

▲ 增加NOP指令之后的P3.2管脚信号

▲ 增加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不同操作所需要的时钟数量

▲ 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;

发布了464 篇原创文章 · 获赞 552 · 访问量 14万+

猜你喜欢

转载自blog.csdn.net/zhuoqingjoking97298/article/details/105761237
今日推荐