簡體   English   中英

讀MSP430 IO寄存器太快了?

[英]Reading MSP430 IO register too quickly?

我正在開發一個系統,MSP430通過其SPI總線與另一個芯片通信。 我正在通過SPI總線發送一系列設置命令,並在從芯片的就緒線上進行輪詢。 我正在使用IAR作為我的IDE,而我正在編譯代碼而沒有任何優化。 代碼看起來像這樣:

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
 }

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

看起來盡可能快地讀取P1IN,沒有內部for循環,導致P1IN不能快速更新。 這有道理嗎? 是否有明顯的理由添加/刪除內部for循環會導致如此劇烈的時序變化?

循環可能已經過優化。 確保它不被優化的一種方法是預先形成虛擬計算,例如

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
}

這里的關鍵是“volatile”關鍵字,禁止編譯器對變量j進行優化,因此不應刪除循環。

它應該沒有任何區別。

一些調試建議:

我建議將內循環的迭代減少到零,看看是否會改變系統時序。 同時嘗試將內循環換成nop,看看是否有相同的效果。 您還可以查看生成的程序集,看看兩個編譯之間是否有任何明顯的結果。 最后,(如果可以的話)確定SPI線的范圍,看看兩者之間的行為是否有任何差異。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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