Re: [問題] 請教兩種語法
※ 引述《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
12/08 22:36, 2F
推
12/08 22:38, , 3F
12/08 22:38, 3F
→
12/09 07:39, , 4F
12/09 07:39, 4F
→
12/09 07:40, , 5F
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
討論串 (同標題文章)