2010-08-13 152 views
0

我看到一些代碼將讀/寫一些外設寄存器。我發現寫入操作之後都出現了一些延遲。在我看來,軟件需要等待該值在HW上生效。有些網頁說寄存器每個時鐘週期都會更新一次。我想這就是等待的原因。那麼,我的問題是:如何讀/寫一個寄存器

  1. 讀操作是否也需要這樣的延遲?如果是的話,當軟件需要讀/寫一個寄存器時,這樣做的正確順序是什麼?像

[延遲]

TMP = some_register //讀

some_register = TMP + 1 //寫

[延遲]

TMP = some_register //讀取

[延遲]

some_register = TMP + 1 //寫

[延遲]

  • 如果SW沒有寫入操作之後這樣的延遲是什麼?我實際上看到一些沒有延遲的寫入操作可以在一些較慢的CPU上正常工作。但是當代碼在一些更快的CPU上運行時,它會失敗。我認爲延遲是合理的。我只需要解釋爲什麼它適用於較慢的CPU。

  • 我對寄存器的功能不是很熟悉。任何有用的材料或鏈接?

  • +0

    什麼平臺/ CPU,x86,SPARC,BBC Micro? :D – Skurmedel 2010-08-13 16:27:26

    +0

    您使用哪種微控制器或微處理器和外部硬件? – starblue 2010-08-13 16:30:16

    +0

    X86 ............ – woho 2010-08-13 16:30:30

    回答

    0

    在寫入之後做出延遲。

    • 寫入
    • 延遲

    硬件;外部串行板將需要一些時間才能發生。 CPU可以非常快速地將數據寫入IO寄存器。許多IO芯片不接受經常發生的變化。

    IO端口上最簡單的設備是連接到LED的鎖存器。 如果你寫1,燈會亮。如果你寫0,它會熄滅。 如果您將0,1,0,1寫入設備的速度超過其可更改狀態的速度,則不會更新。設備可以可靠地從計算機的數據總線獲取數據的速度通常比將輸出更改爲現實世界的速度快。 IO設備中有更大的電壓和更高的電流,並且它們需要更多時間才能進行更改,而不是註冊更改所需的小信號。爲了降低功耗,許多設備使用時鐘輸出引腳。這是因爲CMOS器件(CMOS是當今常見的芯片製造技術)消耗的功率與比特的變化率成正比。把所有的位保持一樣使用littel的功率。更改使用它。

    帶時鐘控制IO的設備(和串行端口就是這種情況的明確例子)只會在下一個時鐘上更改/更新。

    當你使用一個串口發送串行數據,它可以採取數以百萬計的CPU時鐘爲要發送的數據(如串行端口的速率(波特率)設置非常低)

    的簡單串行端口最簡單的正確延遲是讀取「狀態寄存器」的「就緒位」,並在準備發送另一個字節時寫入。

    高級解決方案使用緩衝區和中斷。這有點讓你擔心。