簡體   English   中英

如何訪問飛思卡爾P2020的交替時基寄存器的64位定時器寄存器中的VxWorks

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM