2011-12-31 57 views
3

我正在研究MSP430通過其SPI總線與另一個芯片進行通信的系統。我正在通過SPI總線發送一系列設置命令,並在從設備芯片的Ready線路上輪詢。我使用IAR作爲我的IDE,我正在編譯代碼時沒有任何優化。該代碼看起來像這樣:太快讀取MSP430 IO寄存器?

for(int i = 0; i < NUM_SETUP_COMMANDS; i++) 
{ 
    SendSetupCommand(); //puts data in SPI Tx buffer, sets Chip select low 

    while(P1IN & 0x40) //wait for Chip ready line to go low 
    { 
     for(int x; x < 1024; x++) 
     { 
      //do nothing 
     } 
    } 

    HandleReadyLine(); //Transmit/Receive data on SPI bus 
} 

有和沒有空內循環,此代碼工作正常。所有的設置信息都通過SPI總線正確傳輸。沒有內循環,這個代碼塊需要大約10秒。使用inner for循環,該代碼塊需要大約100 ms。

看起來像讀取P1IN儘可能快,沒有內循環,導致P1IN不會更新得快。這有意義嗎?是否有明確的理由,增加/刪除內循環會導致如此劇烈的時間變化?

+2

看看asm,驗證innner循環沒有被優化出來。同時驗證while線正在做你想做的事。請注意,循環後重新讀取P1IN不會在while行看到的狀態下看到0x40位。如果你正在優化內部循環消失,如果沒有優化,這可能是你沒有看到輸入狀態改變的原因。 – 2012-01-01 00:32:45

+0

我沒有檢查asm,內循環沒有被優化。 「請注意,在循環之後重新讀取P1IN,預計不會看到0x40位的狀態,即while行看到」 - 您能否進一步解釋該聲明,我不認爲我遵循。有一點需要注意的是,在沒有for循環的情況下,P1IN最終會改變狀態。它最終會工作,沒有for循環似乎需要更長的時間。 – 2012-01-01 01:17:02

+0

另外,如果您在while循環中讀取P1IN,那麼感謝您的回覆和建議 – 2012-01-01 01:27:27

回答

1

它應該沒有任何區別。

一些調試建議:

我會建議減少內循環迭代爲零,看看是否能更改系統時間。也嘗試交換一個nop的內部循環,看看是否有相同的效果。你也可以看看生成的程序集,看看這兩個彙編之間是否有明顯的區別。最後,(如果可以的話)確定SPI線的範圍,看看兩者之間是否有任何不同。

+0

我曾嘗試改變內部循環的迭代。我發現如果for循環的運行次數少於650次,那麼它就會像for循環不存在一樣。 我還沒有嘗試過使用nop。我會接下來嘗試。 不幸的是,我沒有訪問SPI線路。我只能訪問幾個GPIO測試點。 – 2012-01-01 01:13:04

+0

感謝您的調試建議。 – 2012-01-01 01:26:03

+0

想法#1 - 如果在第一次讀取P1IN之前延遲100毫秒會發生什麼?想法#2 - 使SendSetupCommand()等待,直到發送緩衝區爲空,以確保外部IC在while循環開始之前收到消息。 – spearson 2012-01-01 10:38:52

1

循環可能已經過優化。 的一種方式,以確保它沒有被優化爲瓶坯虛擬計算如

for(int i = 0; i < NUM_SETUP_COMMANDS; i++) 
{ 
    SendSetupCommand(); //puts data in SPI Tx buffer, sets Chip select low 

    while(P1IN & 0x40) //wait for Chip ready line to go low 
    { 
     volatile unsigned int i; 
     for(int x; x < 1024; x++) 
     { 
      j++; 
     } 
    } 
    HandleReadyLine(); //Transmit/Receive data on SPI bus 
} 

這裏的關鍵是「揮發性」關鍵字,其由編譯器禁止變量j的優化,因此你的循環不應該除去。

+0

關於微控制器世界中的「易失性」關鍵字的一點注意:對由ISR(中斷服務例程)和主代碼訪問的變量使用易失性。每次訪問時都應該從RAM中提取這些變量。如果某種形式的優化將其放入寄存器中,以便更快地訪問,並且當時ISR想要訪問它:ISR將訪問RAM而不是寄存器。因此可能存在相同變量的兩個不同版本。可能具有不同的值,這是不好的.... – Blup1980 2012-09-16 08:49:53