網路城邦
上一篇 回創作列表 下一篇   字體:
搞什麼鬼?c語言的記憶體概念
2008/09/02 18:40:29瀏覽15748|回應1|推薦2

char mem_1[2];

char mem_2[2];

char *array[] = {

mem_1, mem_2

};

上段程式在 PC 上是很正常的程式,可是當搬到 single chip ,如 8052 時,就不是這麼回事了,所以我在前一篇文章就有提到,能夠做 memory assignment ,在 embedded system 是很重要的事。而 PC 端的程式, compiler 與 OS 都幫你做完了。

這些記憶體宣告會放在預設的記憶體位置 ( 文末會提到 ) ,以 8052 為例, internal ram=256bytes ,共佔了 10bytes

char mem_1[2]; // 2bytes

char mem_2[2]; // 2bytes

char *array[] = { // 6bytes ????

mem_1, mem_2

};

8052 為 16bit address ,照道理 array[] 應該只佔 2*2=4bytes ,怎麼會變成 6bytes 呢?因為 8052 內部記憶體分成好幾塊,每一塊都是獨立,一定要透過指令才能進行搬移,可是 c 語言並沒有針對這種結構做設計,所以只好再用 1byte 來做標籤,所以可以想像,一個 [*ptr=5] 會翻出多少指令,這是寫 PC 或 ARM 的程式設計師無法想像的地方。

如果這些陣列是不會變動的,照我之前寫的 " 搞什麼鬼 ?c語言的關鍵字:const" ,是可以放在 rom 裡面的

char const mem_1[2]; // 2bytes in rom

char const mem_2[2]; // 2bytes in rom

char const * array[] = { // 6bytes in ram????

mem_1, mem_2

};

熟悉 pointer 的程式師會知道,上面的 array[] 寫法是沒用的,因為那個 const 是形容 (char *) ,所以 array[] 還是會擺在 ram 裡面,要改成下面才行。

char * const array[] = { // 6bytes in rom

mem_1, mem_2

};

改成下面,多加一個 const ,才是正確的型別

char const * const array[] = { // 4bytes in rom

mem_1, mem_2

};

上述手法可以適用在許多cpu,尤其是許多內建flash的cpu,不一定只有8051才適用,同時也可以避免掉使用pragma所造成的可攜性問題。

前面提到,一個 pointer 需要靠其中的標籤來判斷到底該用那些指令來存取,而這個判斷還是由指令形成,如果我們確定 pointer 的指向一定是 " 某種 " 記憶體,這個標籤就可以省掉了,不但少了空間,更減少多餘的指令執行,這對於某些需要在 1~2us 運作完畢的程式,是非常重要的手法,此時 c 語言的關鍵字就不夠用了,要搬出 8051 compiler 特有的關鍵字: code,xdata,idata,data,bdata 等 ...

char code mem_1[2]; // 2bytes in rom

char code mem_2[2]; // 2bytes in rom

char code * code array[] = { // 4bytes in ram????

mem_1, mem_2

};

第二個 code 告訴 compiler array[] 是放在 rom 內。

第一個 code 告訴 compiler array[] 的內容是 " 指向 rom" 的 pointer。

其實和const很像。

其餘關鍵字就比照辦理,小心keil c的const不是flash,此時如果不會看 map 檔,拼命在檢查程式碼,那真會看死人的,所以用 Keil C 就要使用 code 等的關鍵字來控制才行,所以此時就要適時的使用 #define 來使程式碼具有可攜性,將來有一天搬到 ARM 甚至是 pc 編成 DLL 檔時時還可以用。

這裏順道提到一個很重要的問題,一定要想通,就是

1. 32bit CPU 的 "32bit"

2. 64bit ADDRESS BUS 的 "64bit"

3. CISC

4. RISC

上述四點互有什麼關係?因為這四點是相通的,給個提示,看一下 ARM7 的指令集,每一個 BIT 的意義,之前我看到有些人在吵 CISC/RISC ,其實都吵錯了還不知道,這些東西想通了,這一整篇就沒什麼問題了。

( 心情隨筆心情日記 )
回應 推薦文章 列印 加入我的文摘
上一篇 回創作列表 下一篇

引用
引用網址:https://classic-blog.udn.com/article/trackback.jsp?uid=cchahacaptain&aid=2184329

 回應文章

aaa
只有8051
2009/03/27 17:05
為什麼8051解釋的這麼多,51只是很簡單的cpu耶
彼得鄧(cchahacaptain) 於 2009-03-30 17:16 回覆:
呵呵~~被抓到了!
不過,不要看簡單ㄡ,搞錯的還滿多的。
我的時間不多,不要看小小一篇,最快要花上好幾個小時才寫的出來,有的甚至要好幾天的修改。
比較大號的cpu,如dsp或arm系列,甚至是一些工控cpu,那裡面的模式還滿複雜的,寫出來誰看的懂呢?
8051大概是比較有交集的東西,從這裡開始,至少可以知道個方向,8051的相關元件與工具都很容易取得,甚至用麵包板就可以做出,compiler也很容易取得,組合語言的指令也不難,有需要的人可以很快從這些東西得到一些結果,就算要去試也不會有茫茫大海的感覺。
各領域細節部份,術業有專攻,絕對不是三言兩語就可以說完,所以有問題一定要請教相關領域的前輩才是,我知道的東西也不多,也不可能懂所有東西,我也不想去懂,例如dsp54xx,從我沒使用開始算,大概三個月就忘了80%了,所以不要妄想什麼都懂,沒用到就忘光光了,但至少要懂個大概,唬唬人也好,不要唬錯了,臉就丟大了。
曾經有人告訴我說巴黎的首都是阿爾卑斯山,還有九份扁食...
也有人說組合語言可以控制cpu內部電路,然後可以把cpu燒掉,所以組合語言很厲害...
還有一個PC軟體經理糾正我說,8052怎麼可能只有256 bytes的ram,256 byte怎麼可能能寫程式?應該是256K bytes才對吧~~~~