[英]how to access the Freescale P2020's Alternate Time Base Registers 64-bit timer register in VxWorks
在VxWorks中如何配置並讀取該寄存器? 也就是說,它在什么地址,以及我寫什么地址來配置其增量速率。
我們沒有使用RTP,所以沒有內核空間問題。 只需要將速率寫入某個控制地址,然后定期讀取64位無符號整數計時器。
在我們的應用中,我們需要一個高分辨率的64位定時器,軟件將使用該定時器來進行常規的定時測量。
示例代碼會很好。
這取決於您的應用程序希望如何使用計時器以及它將發生的環境。 我尚未使用該特定芯片,因此無法告訴您如何使用寄存器。
如果您想要的是類似時間戳的功能,您可以在操作前后讀取計數器並在兩者之間進行區別,則VxWorks板級支持包將通過sysTimestamp系列功能來提供該功能。 請參閱文檔。
但是,如果sysTimestamp不滿足您的要求,但是您仍然希望訪問寄存器以讀取當前時間, 並且您的代碼在內核空間中運行(與用戶空間AKA RTP相對),那么您只需要定義一個函數即可返回時間戳記...
uint64 myTimestamp() {
uint64 ts;
ts = *read & massage the register*
*deal with overflows, etc... *
return ts;
}
另一方面,如果您的應用程序在RTP上下文中運行,則事情會變得更加復雜,因為RTP與Windows中的進程非常相似,無法直接訪問硬件功能。
一種可能是將物理內核內存頁面映射到RTP,以便它可以直接訪問寄存器。 強烈建議不要這樣做,因為您已經在系統的保護機制上打了一個洞。 您還可以實現一個自定義系統調用,以專門讀取時間戳記寄存器。
這兩種解決方案都要求vxWorks具有中級-高級技能。
要訪問時基寄存器,您可以編寫一些匯編代碼來訪問它:
.global TBL_get
.global TBU_get
TBL_get:
mfspr r3, 268
blr
TBU_get:
mfspr r3, 269
blr
這將訪問時基寄存器的低位,然后訪問高位,並返回一個參數。
不要忘記在.h
文件中定義函數,如下所示:
uint32 TBL_get (void);
uint32 TBU_get (void);
然后調用這兩個函數並連接從函數返回的變量。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.