C6748內部有一個專門用於計數的計數器。
方法一:
在要測的代碼前后設置兩個斷點,然后點擊:Run—Clock—Enable.在CCS左下方的狀態欄將出現一個時鍾標記,該時鍾標記即為代碼執行的時鍾周期(雙擊該時鍾標記可以清零該時鍾)。C6748的CPU為456MHZ,則為:時鍾周期X1/456 (us)。
方法二:代碼中得到時鍾周期
利用寄存器中的計數器,
①位於Core Register中的TSCL和TSCH(兩個64位計數器,只讀)。計數頻率與CPU同頻
測量方式是在代碼執行前讀取TSCL和TSCH寄存器的值,執行后再讀取TSCL和TSCH寄存器的值,則兩次的差值則為代碼周期。
cregister TSL; //由於TSCL和TSCH是位於CPU核心內部,沒有被映射到統一的內存編址上,對他的訪問不能通過內存地址的方式,可創建關鍵字的方式,注意關鍵字的名字必須和寄存器一樣。 //或直接添加頭文件<C6x.h>,該頭文件中已經定義好了 #include <c6x.h> //在要測量的代碼所在的函數中,添加以下函數 unsigned int beforeL,beforeH; unsigned int afterL,afterH; TSCL = 0; TSCH = 0; beforeL = TSCL; //這里為要測量的代碼 //**************** afterL = TSCL; printf("%d\n",afterL-beforeL); //將時間打印出
當時鍾周期較長,需要用到兩個計數器時,則會用到c6x.h中的 long long _itoll(unsigned, unsigned)-將兩個整形的數合並成long long長整形的數。
cregister TSL; //由於TSCL和TSCH是位於CPU核心內部,沒有被映射到統一的內存編址上,對他的訪問不能通過內存地址的方式,可創建關鍵字的方式,注意關鍵字的名字必須和寄存器一樣。 //或直接添加頭文件<C6x.h>,該頭文件中已經定義好了 #include <c6x.h> //在要測量的代碼所在的函數中,添加以下函數 unsigned int ,beforeL,beforeH; unsigned int after,afterL,afterH; long long before; long long after; TSCL = 0; TSCH = 0; beforeL = TSCL; beforeH = TSCH; before = _itoll(beforeH, beforeL) //這里為要測量的代碼 //**************** afterL = TSCL; afterH = TSCH; after = _itoll( afterH, afterL) printf("%d\n",after-before); //將時間打印出
當然,嚴謹的說,代碼中的賦值語句也會占用一定的時鍾周期,則會有誤差。因此,可以額外加一個變量去測量這幾個賦值語句所占用的時鍾周期,然后在之前得到的時鍾周期中去除即可。
②位於PLL0和PLL1中的EMUCNT0和EMUCNT1(兩個64位計數器,只讀 ),與相應的PLL鎖相環頻率有關。