zynq 的64位全域性定時器

2021-09-10 04:22:44 字數 1210 閱讀 1839

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...