關於 Mr.K 的第二封來信

On Fri, 7 Jan 2011 00:26:16 +0800, Mr.K wrote

User & <wt.ude.uqn|ccc#wt.ude.uqn|ccc> 於 2011年1月6日下午1:32 寫道:

您好:

很高興收到您的來信,給予我這麼多寶貴的意見。

關於兩份投影片,是我疏忽忘了傳上去,現在已經上傳好了,請從下列網址中下載:

http://sp1.wikidot.com/embedded

但必須注意的是,這兩份投影片是我五年前寫的,使用的組合語言是一種虛擬碼,而不是 CPU0 的組合語言,不過應該還是可以看得出意思。

• 投影片:EmbeddedBasics.ppt - 嵌入式系統基礎還是無法下載

五年前寫的沒關係,這些基礎我以前就懂,只是喜歡多看不同人如何把知識表達出來以及觀念是否正確,所以想要參考

我把名字打錯了,應該是 EmbeddedBasic.ppt,請從 http://sp1.wikidot.com/embedded 重新下載一次。

, 另外,關於哪種開發板好用的問題,由於我瞭解不多,僅能提供本身的經驗。我曾經使用新華的 Creator S3C2410 開發板,該板使用 ARM9 CPU,運作都算正常,但是新華的書籍寫得不太好,也不清楚,這是蠻大的缺陷。後來我看到長高科技的書寫得比較詳細,但是由於沒有買過長高的板子,所有並不清楚到底好不好用。


ok,沒關係 謝謝您的建議

關於在 Xilinx 或 Altera 開發板上實作出 CPU0 的想法,我認為這是可行的,我本身也很想要完成這樣一個專案,但是一直還沒有時間去完成它。目前我試過的就是「如何設計一顆簡易的 CPU」那篇當中用華盛頓大學的 Richard 教授所設計的那個 VHDL 程式,然後在 Altera Quartus II 上跑出來的結果。但是那個程式並沒有包含匯流排協定,而是將 RAM 放入後直接使用,這不太符合一般的設計方式,如果要將 CPU0 放上Altera 開發板,應該會需要處理匯流排的協定部分。(但我認為將 CPU0 放上 FPGA 是可行的)。


我也認為可行,入伍前 研究領域恰好有使用到FPGA,所以滿常使用ALTERA的開發平台DE2,DE2-70,NEEK…等等.

關於下列問題,由於我本身對 VHDL 的經驗太過有限,因此還沒有能力回答:

> 軟體怎麼放到SRAM上 還有要怎麼把執行畫面顯示在Console 因為不是用FPGA廠商提供的
> 軟體IDE 可能要使用UART輸出來看結果


以我對ALTERA平台以前實作的經驗, 它有提供自己的Nios II CPU和整個SOPC用的IDE(軟體C的設計,cross compiler,toolchain等…),而且整個SOPC都可以在這個IDE產生,裡面都已經設計好Avalon bus,以及外部周邊裝置的controller,中斷,IO Map或Mem Map也可以自動產生..等等.

難度就在於之前提的,自己寫HDL設計好簡易CPU後,若直接再設計個RAM,在RAM裡自行先擺好code再和CPU直接相接後,這樣執行是比較簡單的,
方法1:是可以把CPU0丟進SOPC裡當做Master端CPU使用的,需要依照Altera Avalon Bus spec定義某些腳位
方法2:是自己設計BUS
至於其它Slave周邊 應該就不難 自己寫controller 做mem map io就能控制
在軟體部份因為使用自己寫的編譯器和連結載入器 編譯後要執行 就不太確定如何下載到SRAM和在IDE console顯示
無法在IDE console顯示也不是什麼問題,使用UART接到PC上,寫個類似shell的簡單程式,就能看結果了
不過說這麼多 雖然有興趣想做 可是已經在上班了 放假時 就想休息 呵呵~
另外關於下列問題,則比較好回答。

> 編譯後就會以型別配置資料所需要的記憶體位址空間嗎?

> 例:int a;沒給值,那是否已經配置好a變數的記憶體位址?
> 還是說int a=10;或int a;a=10;後,編譯器才會配置好a變數的記憶體位址?
> 宣告跟定義主要差在什麼地方?

當編譯器編譯 int a=10 這種指令時,會在資料段保留一個四位元組的空間,裡面塞入整數 10 進去,以 CPU0 而言這個指令相當於

> .data
> a: WORD 10

但是對於 int a; 這種沒設初值的指令,則會被編譯到 BSS 段,如果寫成 CPU0 的組合語言,將會如下所示。

> .bss

區域變數未設初始值 也會在.bss?還是在.stack?
你所謂的當編譯器編譯 int a=10 這種指令時,會在資料段保留一個四位元組的空間
是指編譯後產生的.o檔就會保留還是連結後產生的執行檔就會保留?

.o 檔就會紀錄這個資料 (執行檔中也會有)。

"真正"配置變數記憶體位址的時候 我覺得是在runtime時(程式載入記憶體後) 而不是編譯後產生的o或連結後的執行檔 不曉得這觀念正確嗎?
像int a;沒設初值會RESB 1,那要是整個程式裡都沒使用a,這樣是否就浪費實體記憶體某段4bytes空間?

如果struct st{
inta;
intb;
};
struct st s;
這樣s有無佔記憶體空間?

s 會佔記憶體空間,如果 s 是全域或 static 變數,會放在 .bss 段,如果是函數中的區域變數,則會被放入堆疊段。如果有一些初始值,則這些初始值會被放在 .sdata 段 (靜態資料段).

您的系統程式一書中 有些地方不太懂
p2-21 立即載入 提到是直接將指令中的常數值載入暫存器 LDI R1,100
請問常數值100原本是存在Mem中的.data嗎?還是?

LDI 是載入立即數值的指令,這個立即數值直接被編碼在指令中,因而是儲存在程式段 .text 中的該指令內。

p2-24 LD R1,SUM 請問為什麼是001F0028?且下面RESW 1和WORD 0是給誰用?

這裡我漏掉了一點東西,

0000 LD R1, SUM
0004 LD R2, I

0024 EXIT: RET
0028 I: RESW 1
002C SUM: WORD 0

請注意 SUM 的位址是 002C,但 LD R1, SUM 在指令擷取階段之後程式計數器 PC 值就會從 0000 變成 0004,因此當我們採用相對於程式計數器的定址方式時,SUM (002C) 相對於 PC (0004) 的位址差異將會是 0028,因此整個指令被編碼為 001F0028,也就是 00 (指令碼) 1 (R1) F (R15=PC) 0028 (位址差異)。

LD R2,I 請問I是?為什麼是002F0020?

與上述編碼法相似,整個指令被編碼為 002F0020,也就是 00 (指令碼) 2 (R2) F (R15=PC) 0020 (位址差異 I=0028 - PC=0008。

高等 C 語言 何時會出版呢?想買一本來學習~
看了前言 現在我也覺得其實C語言用法其實不像學校教的而已
在嵌入式系統上有著各種寫法技巧
希望能有講解 指標進階用法 sizeof計算配置記憶體(包含動態) volatile用法 內嵌組合語言 前置處理器常用的技巧(#prgma #ifdef header #typedef struct or union etc…)

高等 C 語言目前我還沒有出版計劃,因此純粹以免費電子書的方式上網。雖然我也希望能以印刷出版的方式,但是想到出版社的編輯程序,以及我所需要耗費的時間,目前還沒有勇氣向出版社說我想出版 (因為我怕會花上更多的時間)。

謝謝您回信指教

若有我能幫上忙的地方
可以問看看

Best regards!

感謝您的提問,您真是個很好的讀者,讓我受益良多。

陳鍾誠 敬上


Open WebMail Project (http://openwebmail.org)

Unless otherwise stated, the content of this page is licensed under Creative Commons Attribution-ShareAlike 3.0 License