看板 C_and_CPP 關於我們 聯絡資訊
※ 引述《Hyozero (1)》之銘言: : 開發平台(Platform): (Ex: VC++, GCC, Linux, ...) : Linux : 問題(Question): : 都是在embedded system的code裡面看到的 : 1. 程式碼: http://codepad.org/UFsAKQ7r : 想請教第8行的 *((volatile unsigned long *) : 會使用#define應該就是像const一樣,不想讓值再變動了不是嗎? : 請問這樣的寫法是什麼目的呢? u32 mpu_type_reg_addr = 0xe000ed90; (*((u32 volatile *)mpu_type_reg_addr)) = 0x5; (*((u32 volatile *)mpu_type_reg_addr)) = 0x7; gcc -O2 a.c 80482d0: c7 05 90 ed 00 e0 05 movl $0x5,0xe000ed90 80482d7: 00 00 00 80482da: 31 c0 xor %eax,%eax 80482dc: c7 05 90 ed 00 e0 07 movl $0x7,0xe000ed90 (*((u32 volatile *)mpu_type_reg_addr)) = 0x5; (*((u32 volatile *)mpu_type_reg_addr)) = 0x7; 都在 ---------------------------------------------- u32 mpu_type_reg_addr = 0xe000ed90; (*((u32 *)mpu_type_reg_addr)) = 0x5; (*((u32 *)mpu_type_reg_addr)) = 0x7; 80482d0: c7 05 90 ed 00 e0 07 movl $0x7,0xe000ed90 80482d7: 00 00 00 80482da: 31 c0 xor %eax,%eax 80482dc: c3 ret 只剩下 (*((u32 *)mpu_type_reg_addr)) = 0x7 這行 這是使用 -O2 才有的行為, 若不用 -O2 基本上 (*((u32 *)mpu_type_reg_addr)) = 0x5; (*((u32 *)mpu_type_reg_addr)) = 0x7; 並不會變成只有 = 0x7 這部份, = 0x5 還是會存在。 我的問題是: 大家提到的現象是在使用最佳化選項時才會遇到的嗎? 所以不用最佳化選項, 根本不需要使用 volatile 嗎? -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 58.114.144.159
littleshan:不對,你不應該假設compiler真的不做最佳化 12/09 15:22
littleshan:volatile意指變數存取會有side effect,語意是不一樣的 12/09 15:26
descent:感謝說明 12/09 20:14