我試圖訪問我的Raspberry Pi的寄存器。在C編程中訪問Raspberry PI寄存器
爲了更具體一點,http://www.raspberrypi.org/wp-content/uploads/2012/02/BCM2835-ARM-Peripherals.pdf有一些硬件計時器在頁172-173。
我想使用它們,因爲我必須編寫兩個函數HW_GetTimer()
和HW_ClearTimer()
。
我找不到與這些寄存器進行通信的好方法。這可能嗎?有沒有我不知道的現有C函數?
我試圖訪問我的Raspberry Pi的寄存器。在C編程中訪問Raspberry PI寄存器
爲了更具體一點,http://www.raspberrypi.org/wp-content/uploads/2012/02/BCM2835-ARM-Peripherals.pdf有一些硬件計時器在頁172-173。
我想使用它們,因爲我必須編寫兩個函數HW_GetTimer()
和HW_ClearTimer()
。
我找不到與這些寄存器進行通信的好方法。這可能嗎?有沒有我不知道的現有C函數?
首先,提醒一句:這些寄存器可能使用的操作系統,所以如果你跟他們不甘示弱,有機會,你打破的東西...
這就是說,有兩種選擇:
/dev/mem
和mmap()
您想要訪問進程內存的地址。然後你可以讀/寫(請使用volatile
指針!)。請注意,您不能read()
/write()
從/到/dev/mem
,只有mmap()
。顯然,對於用戶模式的事情,你必須有適當的權限或者是root權限。
但nmap()在寄存器中並沒有真正改變,它只映射它在那裏。所以我不能重置硬件計時器...也許一個multimediatimer是一個解決方案? – Blackkeeper
'mmap()'將映射那裏的任何內容並返回一個指針。然後使用(轉換爲易失性)指針來修改內存映射寄存器。 – rodrigo
猜測:您正在使用linux。
如果你正在嘗試做這與Linux的結合,通常有一個驅動器,其在內部用於調度,任務蕾和其他的東西(甚至定時器Yes!) - 在用戶空間,你應該使用poll
或epoll
不任何文件描述符,並只使用超時。這將使您儘可能接近調度程序粒度。
另一種方法是檢查是否使用定時器內核代碼,如果不是你可以簡單地通過一個內核模塊導出它,雖然這至少需要CPU的一個基本的瞭解,內核是如何工作和它如何在沒有安全隱患或崩潰風險的情況下實施(如果不是兩者)。
我省略這裏的裸機方式...
這是你可以在用戶空間中做的事嗎?如果幸運的話,已經有了一個內核接口來爲你做這件事,否則你可能不得不編寫一個內核模塊來執行此操作,並從你的應用程序調用該模塊。 – Rup