Re: [問題] 請教兩種語法

看板C_and_CPP作者 (「雄辯是銀,沉默是金」)時間11年前 (2013/12/09 07:08), 編輯推噓2(201)
留言3則, 2人參與, 最新討論串4/4 (看更多)
※ 引述《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

12/09 15:22, , 1F
不對,你不應該假設compiler真的不做最佳化
12/09 15:22, 1F

12/09 15:26, , 2F
volatile意指變數存取會有side effect,語意是不一樣的
12/09 15:26, 2F

12/09 20:14, , 3F
感謝說明
12/09 20:14, 3F
文章代碼(AID): #1IfMnMdq (C_and_CPP)
討論串 (同標題文章)
本文引述了以下文章的的內容:
問題
1
12
完整討論串 (本文為第 4 之 4 篇):
問題
1
12
文章代碼(AID): #1IfMnMdq (C_and_CPP)