看板 LinuxDev 關於我們 聯絡資訊
※ 引述《mayasky ( )》之銘言: : 不太一樣..volatile是說不要最佳化 : 例如對一些I/O mapping 的區段 : 你做最佳化就有可能有問題 : ex. : compiler 會reorder 既然您都提到了 Memory Mapped I/O 就應該用這個來舉例摟~ Ex. 程式設定某 Register, 同時 MCU 的 I/O 也會去修改這個 Register 或是某個 Bit 對程式是 Read-only, 寫入 0/1 也不會更變他的值 所以 Compiler 預期你的 Register 在寫入後也不會揮發掉.. int NonVol() { char *RegA = (char *)0x40000000; *RegA = 0x00; if (0x00 != *RegA) { return 1; } else { return 0; } } int Vol() { volatile char *RegA = (char *)0x40000000; *RegA = 0x00; if (0x00 != *RegA) { return 1; } else { return 0; } } /* End of File */ $ gcc -O3 -S novol.c -o novol.s 這時聰明的 Compiler 會怎麼作最佳化呢? NonVol: .LFB13: xorl %eax, %eax movb $0, 1073741824 ret ; 原本 if (*RegA == 0x00) 被最佳化掉, ; 因為 compiler 預期 0x40000000 不會被改變 ; 所以直接回傳 eax == 0 Vol: .LFB14: movb $0, 1073741824 movzbl 1073741824, %eax testb %al, %al setne %al movzbl %al, %eax ret -- It is better to be approximately right than exactly wrong. -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 122.116.91.238 ※ 編輯: troylee 來自: 122.116.91.238 (11/02 23:38)
mayasky:我想他問的是function的declare...這才會對應到他的問題 11/04 00:59
mayasky:他問是否和asmlinkage一樣..這可以加變數前嗎? 11/04 01:00
mayasky:且教學最好的方式就是抽象化.發問人不一定懂x86 11/04 01:01
mayasky:且您似乎沒提到重點?就算是問變數的宣告 11/04 01:21
troylee:我的重點在最後最佳化後的組合語言, 很明顯看到第一個 11/04 01:30
troylee:function 最佳化後連判斷都不判斷了, 直接回傳 0 11/04 01:30
※ 編輯: troylee 來自: 122.116.91.238 (11/04 02:13)
clampsakura:其實volatile只是直接操作區域是記憶體. 而非用gpr 11/07 04:28
clampsakura:當作是temp. asmlinkage 要看asm code. 一般而言也不 11/07 04:29
clampsakura:一定要使用.只要你在asm中按照C規則去傳遞parameters 11/07 04:29