我正在使用 AM3358 SoC,運行一個 ARM Cortex-A8處理器,運行 Linux 3.12. 我在設備樹中啟用了一個子設備,它探測我的驅動程序,在那裡調用設備樹節點的資源。
我要求沒有緩存的原因是它並不是連接到,匯流排的實際內存設備,當然可以從處理器緩存中獲益。 所以訪問需要總是經過實際的線路。
當我這樣做的時候:u16 __iomem *addr = ioremap_nocache(...);
iowrite16(1, &addr[0]);
iowrite16(1, &addr[1]);
iowrite16(1, &addr[2]);
iowrite16(1, &addr[3]);
ioread16(&addr[0]);
ioread16(&addr[1]);
ioread16(&addr[2]);
ioread16(&addr[3]);
我看到使用邏輯分析儀在導線上進行 8訪問。 但是,當我這樣做的時候:u16 v;
addr[0] = 1;
addr[1] = 1;
addr[2] = 1;
addr[3] = 1;
v = addr[0];
v = addr[1];
v = addr[2];
v = addr[3];
我看到了四個寫訪問,但不是隨後的讀訪問。
我是否缺少什麼ioread16() 和直接存儲器訪問之間的區別,知道整個rtc範圍應該可以訪問。
這種行為可能是任何編譯器優化的結果? 我沒有看到生成的指令,但是直到那時,可以能有人有足夠有趣的回答。