Re: [問題] 巨集格式疑問
※ 引述《abcxxxx (撐過就是神)》之銘言:
: 各位好,
: 我的程度無法解析這段程式碼,第一次看到...
: 所以也無法預期它的結果是如何(無奈)
: #define BANK_BASE(i) (((unsigned long
: [CFI_MAX_FLASH_BANKS])CFG_FLASH_BANKS_LIST)[i])
: 如果覺得太難看我有po在codepad上
: http://codepad.org/KFLZto8O
: 已經有在網路上找到解釋,但是不知道這段的思路是怎走的
: http://ppt.cc/dpA3
: 拜託各位了
: 餵入的資料(Input):
: 預期的正確結果(Expected Output):
: 錯誤結果(Wrong Output):
: 程式碼(Code):(請善用置底文網頁, 記得排版)
: 補充說明(Supplement):
為了慶祝我總算看懂了,所以我決定 reply ....
關鍵只有一個:這是個 no-name 陣列,然後請見諒,我不知道它的正式名稱是不是
叫 no-name array, 這是我亂叫的。
我們舉個比較簡單的例子,假設要設一個 no-name array ,資料型態是 int,
有兩個元素,可以這麼宣告。
int [2] ; // 它是 no-name array, 但這麼做根本沒用
但這種方式沒辦法給初值,所以應該是非法,具小弟所知, no-name 東西必須要給值
(比較常見的 no-name struct 大概就讓人有印象了..)
(int [2]) { 123 , 456 } ; // no-name array 給初值
到目前為止,其實這一整個步驟,就是上篇版友 carylorrk 所說的,
將 {123,456} 強制轉形成兩個元素的整數陣列,我想他的說法應是比較正確的。
再來是,如果要取得這個 no-name array 的第零個索引值,也就是 [0] 裡面的 123 的
話,就變成了
( (int [2]) { 123 , 456} ) [0] ; // 取得 no-name array[0]
最後再由於它裡定義成了 macro ,所以最外圍會被加上大括號。
上面這行我在 gcc (code::blocks 12.11) 裡面 printf 出來真的會輸出 123 ,
附 code http://codepad.org/otdaPtgt
然後知道上面之後,下面沒興趣看的話請按個讚後就可以略過不看了..
---------------------
你給的網頁裡的說明資訊其實是針對只有一個元素的陣列情況,
原型
#define BANK_BASE(i)
(( (unsigned long [CFI_MAX_FLASH_BANKS])CFG_FLASH_BANKS_LIST)[i])
先追 CFI_MAX_FLASH_BANKS
#define CFI_MAX_FLASH_BANKS CONFIG_SYS_MAX_FLASH_BANKS
#define CONFIG_SYS_MAX_FLASH_BANKS 1
查到是 1 ,變成下面這樣
#define BANK_BASE(i)
(( (unsigned long [1])CFG_FLASH_BANKS_LIST)[i])
換句話說它是一個 unsigned long no-name array, 只有一個元素。
然後再查 CFG_FLASH_BANKS_LIST,
#define CONFIG_SYS_FLASH_BASE 0x10000000
#define CONFIG_SYS_FLASH_BANKS_LIST { CONFIG_SYS_FLASH_BASE}
所以原式又變成了
#define BANK_BASE(i)
(( (unsigned long [1]){0x10000000})[i])
換句話說,它是一個 no-name array, 裡面只有一個元素,放的是 0x10000000,
然後你輸入的 i 也只能是 0 而已。
那如果今天 FLASH 想要支援兩個 bank 以上呢??
嗯,我看你給的網頁其實覺得他寫的沒很清楚,上網找其他的 #define 果然有找到類
似的東西,不過要把關鍵字一直丟進去 google ,我懶得一個一個做對應,
直接把我找到得資訊 po 了。
1. 想要支援 2 個 banks 時怎麼改
http://ppt.cc/TxOt , 裡面的 -#define 應該指的是把原始碼的 #define 去掉
+#define 應是在原始碼裡面加上該 #define。然後重要的 #define 我列出來,
你要代入再自己慢慢代
#define CONFIG_SYS_MAX_FLASH_BANKS 2 // 這跟剛剛不一樣了唷
#define CFG_FLASH_BASE 0
#define CFG_FLASH_BANKS_LIST
{ CFG_FLASH_BASE, CFG_FLASH_BASE+flash_info[0].size }
等效
#define CFG_FLASH_BANKS_LIST { 0 , 0+flash_info[0].size}
2. flash_info[0].size
明顯是 struct,再 google 查一下。 http://ppt.cc/nHiQ
大致上可以推出,它是計算一個 BANK 有多大。
3. 小結
總結如果是兩個 banks 的話, macro 展開就如下
#define BANK_BASE(i)
( ( ( (unsigned long) [2] ) { 0 , 0x10000000} ) [i] )
然後那個 0x10000000 , 是我假設 flash_info[0].size 大小是 0x10000000,
簡單的說這個 macro 是取得第 i 片 CFI (快閃記憶體介面) 的起始位置值無誤。
--
~ 這輩子與神手無緣
我只好當神獸了 ~
卡卡獸
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 180.177.73.224
※ 編輯: EdisonX 來自: 180.177.73.224 (03/23 01:23)
推
03/23 01:55, , 1F
03/23 01:55, 1F
推
03/23 02:20, , 2F
03/23 02:20, 2F
→
03/23 02:21, , 3F
03/23 02:21, 3F
推
03/23 14:46, , 4F
03/23 14:46, 4F
推
03/23 18:13, , 5F
03/23 18:13, 5F
推
03/23 22:24, , 6F
03/23 22:24, 6F
推
03/23 23:56, , 7F
03/23 23:56, 7F
推
03/24 01:22, , 8F
03/24 01:22, 8F
推
03/24 18:18, , 9F
03/24 18:18, 9F
推
03/25 00:49, , 10F
03/25 00:49, 10F
推
04/15 23:53, , 11F
04/15 23:53, 11F
討論串 (同標題文章)