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

看板C_and_CPP作者 ( bdvstg)時間10年前 (2013/12/08 20:57), 編輯推噓1(106)
留言7則, 3人參與, 最新討論串2/4 (看更多)
※ 引述《Hyozero (1)》之銘言: : 開發平台(Platform): (Ex: VC++, GCC, Linux, ...) : Linux : 問題(Question): : 都是在embedded system的code裡面看到的 : 1. 程式碼: http://codepad.org/UFsAKQ7r : 想請教第8行的 *((volatile unsigned long *) : 會使用#define應該就是像const一樣,不想讓值再變動了不是嗎? : 請問這樣的寫法是什麼目的呢? : 我在那份code上做第13,14行的事情,真的可以改掉TEST_1的值 : 但自己在Linux上build code是會有問題的 : 請問這個語法的意思是什麼呢? #define TEST 0xC0000000 #define TEST_1 *((volatile unsigned long *)(TEST+0x0100)) TEST_1=0x01; printf("%x\n",TEST_1); (volatile unsigned long *)(TEST+0x0100) 這意思就是把0xC0000100這數字轉成不要最佳化的unsigned long指標 外面再加個星號就是該指標的值 所以 TEST_1=0x01; 就是直接賦值給記憶體位置0xC0000100 printf("%x\n",TEST_1); 就是取0xC0000100的值並印出 在嵌入式的底層定義中 這還蠻常看到的 通常會指到某個暫存器的位置 直接對其作存取 就等同於對該暫存器作存取 另外一種就是明面上的意思 直接對該記憶體做修改 但這種寫法通常比較不好 至於你說在Linux上會有問題 可能是因為作業系統的保護 不允許直接存取該記憶體的值 因此會發生錯誤或是不給存取 : 2. 程式碼: http://codepad.org/mUyMmPjd : 想請教第7行的 __attribute__ ((section (".ddrtable"))) : 請問加這段code的目的是什麼呢? : 以上,麻煩大家給小弟指點一下迷津 : 感謝~ const char HELLO[] __attribute__ ((section (".ddrtable"))) = "abcdefg\n"; 這邊就單純說要把某個東西放到記憶體區段 ".ddrtable" 裡 不同的是我這邊看到的大多是底下這種寫法 __attribute__ ((section (".ddrtable"))) const char HELLO[] = "abcdefg\n"; 你程式碼中的這種我倒是第一次看到 不過我猜大概相去不遠 然後通常還會有一個檔案 專門用來分配記憶體區塊的實體記憶體位置 像是說指定 .ddrtable 是從 0xC0000100 開始 大小是100KB (這邊單純舉例) -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 123.110.148.149

12/08 22:35, , 1F
感謝您的詳細解說
12/08 22:35, 1F

12/08 22:36, , 2F
請問1.直接對記憶體修改的寫法比較不好,那較好的做法是?
12/08 22:36, 2F

12/08 22:38, , 3F
2.請問對.ddrtable分配記憶體區塊這件事,是怎麼做的呢?
12/08 22:38, 3F

12/09 07:39, , 4F
不好的原因蠻多的 但我覺得最主要是會看不懂
12/09 07:39, 4F

12/09 07:40, , 5F
第二點底下des大有回 我對那東西印象就是很複雜XDD
12/09 07:40, 5F

12/09 09:21, , 6F
自己分配記憶體的事情在嵌入式上比較多,那種會另外
12/09 09:21, 6F

12/09 09:21, , 7F
有檔案設定記憶體區塊名稱、開頭、大小
12/09 09:21, 7F
文章代碼(AID): #1If6pMM5 (C_and_CPP)
討論串 (同標題文章)
文章代碼(AID): #1If6pMM5 (C_and_CPP)