STC8G1K單片機軟件執行時間物理測量

爲了能夠評估STC8G1K08單片機算法的效率,需要有一種能夠直接測量單片機程序執行時間的物理方法。使用單片機的一個管腳的變化來表明軟件流程的起始和結束,從外部通過示波器等手段測量脈衝的寬度,便可以有效衡量單片機軟件執行流程的時間。

下面通過一些基本實驗來衡量這種方法的有效性。

實驗平臺

實驗電路板在博文“8G1K實驗電路板”給出了描述。使用單片機P3.2管腳來只是程序的起始和結束。

該管腳在初始化的時候輸出模式設置爲:PUSH-PULL。

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

單片機的運行時鐘頻率爲:
fsys=35×106Hzf_{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輸出信號入下圖所示,在波形的上升和下降起始位置之間的時間大約爲:t1=30nst_1 = 30ns

由於MCU系統頻率爲fsys=35nsf_{sys} = 35ns,所以t1t_1大約等於系統頻率的倒數:t11fsys=135×106t_1 \approx {1 \over {f_{sys} }} = {1 \over {35 \times 10^6 }}
▲ P3.2輸出波形

▲ P3.2輸出波形

使用ON,OFF命令測量實際執行時間的時候,需要將測量時間減去MCU工作的指令週期,也就是t1t_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;

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章