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 while (tcur < tend); return 0;}
zynq 的定時器中斷實驗
本文通過定時器中斷實驗,介紹zynq 的中斷和定時器的基本使用方法。本文是在helloworld 實驗的基礎上完成的,所以必須先完成了helloworld 的實驗。這個可以學習本部落格的helloworld 實驗,或者開發板提供的helloworld 實驗。1 中斷和定時器介紹 中斷對於保證任務的實...
ZYNQ中FreeRTOS中使用定時器
使用普通的timer中斷方式時,timer中斷可以正常執行,但是udp通訊程序無法啟動。其中timerintrhandler是中斷服務程式,列印程式執行時間與從bram中讀取的資料。void setupinterruptsystem xscugic gicinstanceptr,xscutimer ...
mysql工具定時器 mysql的定時器
mysql定時器是系統給提供了event,而oracle裡面的定時器是系統給提供的job。廢話少說,下面建立表 create table mytable id int auto increment not null,name varchar 100 not null default introduc...