Re: [問題] 為何要使用asmlinkage?
※ 引述《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)
→
11/04 00:59, , 1F
11/04 00:59, 1F
→
11/04 01:00, , 2F
11/04 01:00, 2F
→
11/04 01:01, , 3F
11/04 01:01, 3F
→
11/04 01:21, , 4F
11/04 01:21, 4F
→
11/04 01:22, , 5F
11/04 01:22, 5F
→
11/04 01:30, , 6F
11/04 01:30, 6F
→
11/04 01:30, , 7F
11/04 01:30, 7F
※ 編輯: troylee 來自: 122.116.91.238 (11/04 02:13)
→
11/07 04:28, , 8F
11/07 04:28, 8F
→
11/07 04:29, , 9F
11/07 04:29, 9F
→
11/07 04:29, , 10F
11/07 04:29, 10F
討論串 (同標題文章)
本文引述了以下文章的的內容:
完整討論串 (本文為第 4 之 4 篇):