zynq 的64位全局定時器

zynq 有一個64位全局定時器,我覺得有點實用價值,比如精確的實時計算,代碼運行時間計算。怎麼用呢?我就google 了一下,有篇文章推薦查看2個文件。這2個文件名分別是 sleep.c, xtime_l.c。這2個文件是Vivado 安裝的時候就安裝好了的樣例程序,我的是在這個目錄下:C:\Xilinx\SDK\2015.4\data\embeddedsw\lib\bsp\standalone_v5_3\src\cortexa9查看這2個文件,就可以清楚其用法了。

實驗:

在我的helloworld 工程裏添加

#include "sleep.h"
#include "xtime_l.h"

然後在main 函數裏添加:

main()

{    

u64 tbegin,tend;  

 long int tdiff;      

print("Begin dealay 5s\n");      

XTime_GetTime(&tbegin);      

sleep(5);    

XTime_GetTime(&tend);    

tdiff=tend-tbegin;    

print("End of dealay 5s");  

 printf("\n5s=%ldT\n1s=%d\n",tdiff,COUNTS_PER_SECOND);

}

編譯連接並執行就有如下顯示:

Begin dealay 5s

End of dealay 5s

5s=1666666833T

1s=333333343
程序分析:程序就是取定時器值,到tbegin, 延遲5秒, 取定時器值到tend。 2項相減得差值並顯示。爲了對照也顯示1s 的標準值常量COUNT_PER_SECOND。程序運行的結果基本一致。定時器的頻率是系統時鐘的1/2, 這個是ug585 p239裏寫明瞭的。long int 原來還是32bits的, 延遲到50s 就超界了,顯示負數。XTime: 其實就是 u64。我們再看看sleep.c 裏 sleep 函數的定義:
s32 sleep(u32 seconds)

{  

XTime tEnd, tCur;  

XTime_GetTime(&tCur);  

tEnd  = tCur + (((XTime) seconds) * COUNTS_PER_SECOND);  

do  {    

XTime_GetTime(&tCur);

 } while (tCur < tEnd);  return 0;}

這個延遲程序直接由全局定時器控制,所以是很準確的。xtime_l.c 文件裏有void XTime_SetTime(XTime Xtime_Global) void XTime_GetTime(XTime *Xtime_Global)這2個函數的原型定義,這裏直接操作全局定時器的寄存器。本文程序就是根據這2個文件的內容編寫出來的。有了這些內容,就可以精確地任意定時了。原來sleep(s)是精確延遲的,但單位是秒數。
--------------------- 
作者:leon_zeng0 
來源:CSDN 
原文:https://blog.csdn.net/leon_zeng0/article/details/79776175 
版權聲明:本文爲博主原創文章,轉載請附上博文鏈接!

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