2013-12-10 27 views
0

我試圖訪問我的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函數?

+1

這是你可以在用戶空間中做的事嗎?如果幸運的話,已經有了一個內核接口來爲你做這件事,否則你可能不得不編寫一個內核模塊來執行此操作,並從你的應用程序調用該模塊。 – Rup

回答

2

首先,提醒一句:這些寄存器可能使用的操作系統,所以如果你跟他們不甘示弱,有機會,你打破的東西...

這就是說,有兩種選擇:

  • 正確的一個:寫一個內核驅動程序,你就會有足夠的功能來訪問硬件在一個健全的和可控的方式。或者有可能是已經有一個驅動程序完全按照你所要做的來做,如果是這樣的話,你只需找到它並使用它公開的接口即可。讀取內核源碼很有趣!
  • 簡單的方法是:從用戶模式下,打開/dev/memmmap()您想要訪問進程內存的地址。然後你可以讀/寫(請使用volatile指針!)。請注意,您不能read()/write()從/到/dev/mem,只有mmap()

顯然,對於用戶模式的事情,你必須有適當的權限或者是root權限。

+0

但nmap()在寄存器中並沒有真正改變,它只映射它在那裏。所以我不能重置硬件計時器...也許一個multimediatimer是一個解決方案? – Blackkeeper

+0

'mmap()'將映射那裏的任何內容並返回一個指針。然後使用(轉換爲易失性)指針來修改內存映射寄存器。 – rodrigo

0

猜測:您正在使用linux。

如果你正在嘗試做這與Linux的結合,通常有一個驅動器,其在內部用於調度,任務蕾和其他的東西(甚至定時器Yes!) - 在用戶空間,你應該使用pollepoll不任何文件描述符,並只使用超時。這將使您儘可能接近調度程序粒度。

另一種方法是檢查是否使用定時器內核代碼,如果不是你可以簡單地通過一個內核模塊導出它,雖然這至少需要CPU的一個基本的瞭解,內核是如何工作和它如何在沒有安全隱患或崩潰風險的情況下實施(如果不是兩者)。


我省略這裏的裸機方式...