爲了能夠評估STC8G1K08單片機算法的效率,需要有一種能夠直接測量單片機程序執行時間的物理方法。使用單片機的一個管腳的變化來表明軟件流程的起始和結束,從外部通過示波器等手段測量脈衝的寬度,便可以有效衡量單片機軟件執行流程的時間。
下面通過一些基本實驗來衡量這種方法的有效性。
實驗平臺
實驗電路板在博文“8G1K實驗電路板”給出了描述。使用單片機P3.2管腳來只是程序的起始和結束。
該管腳在初始化的時候輸出模式設置爲:PUSH-PULL。
#define FLAG_PIN 3, 2 // For test time pulse
PM_PP(FLAG_PIN);
單片機的運行時鐘頻率爲:
典型時間測量
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輸出信號入下圖所示,在波形的上升和下降起始位置之間的時間大約爲:。
由於MCU系統頻率爲,所以大約等於系統頻率的倒數:
▲ P3.2輸出波形
使用ON,OFF命令測量實際執行時間的時候,需要將測量時間減去MCU工作的指令週期,也就是。
2. 使用TOGGLE指令
根據前面定義TOGGLE宏命令,該指令是8051中指令對sbit取反操作,使用連續兩次取反,可以使得管腳輸出舉行脈衝。
最終所測量得到的脈衝與前面連續ON,OFF脈衝相同。
3. 測量_NOP_時間間隔
在ON,OFF指令之間增加nop命令,則會反映出單個NOP命令的執行時間。
ON(FLAG_PIN);
_nop_();
OFF(FLAG_PIN);
測量結果如下圖所示。相鄰上升沿和下降沿之間的時間大約爲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;