ARM的I/O訪問問題 (DCache使能、MMU未使能問題)

來源:互聯網
上載者:User

 

今天調試出了特別奇怪的問題,經常用的串口發送居然都不好使了,代碼大約是這樣的:

 

if( flag in memory mapped reg) {

  write char to transmit reg

}

 

從串口發出去的東西總是不對,用jtag調試發現,單步的時候是正確的,但是只要全速運行就出錯。

 

思考之後,感覺只可能是flag讀回來是不對的,但怎麼可能呢??

 

仔細思考後,發現一個問題,ARM如何知道每次都要通過讀這個地址來獲得flag呢?

雖然已經將memory-mapped reg 的地址定義為 volatile,但是這隻是告訴gcc不最佳化進寄存器,但是

ARM還可以從Cache中讀啊,ARM沒有專用的IO指令,如何才能讓它必須讀記憶體位址呢?

 

答案是兩種:

1)關閉D-Cache

2)使能D-Cache和MMU,配置MMU,使得記憶體映射的寄存器地址處設定為none-cached

 

而偏偏我開啟了D-Cache,卻未使能MMU。導致這樣的結果是因為我正在做作業系統移植的最低層操作,

我想開啟D-Cache可以提高速度,就開啟了,但是我的作業系統不使用MMU,而我也懶得配置MMU為直接映射,

乾脆就禁掉了。結果就悲催了!!也好,以後就能多注意點東西。

 

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.