2X86嵌入式處理器開發(fā)
主要型號(hào)有:intel 80186/188, 80186/188ea, 80186/188eb, 80186/188ec, 80386ex ……, intel的站點(diǎn)http://www.intel.com。 amd 80186/188,80186/188ed,80186/188em,80186/188es,elan300,elan400,最近還推出了用于網(wǎng)絡(luò)的80186/188ch,型號(hào)我記不清了,有興趣的可以到http://www.amd.com去找。 比較而言我自己覺得amd的產(chǎn)品要好一些,設(shè)計(jì)簡(jiǎn)單,提供的外部資源(指定時(shí)器、中斷控制器、i/o口、地址譯碼、dma控制器、dram控制器……)要多一些,另外elan300,elan400簡(jiǎn)直就是一臺(tái)個(gè)人計(jì)算機(jī),它集成了pc機(jī)除了dram和磁盤控制器之外幾乎所有的電路(把lcd顯示器接口也集成到里面了,包括rtm,tmr,int controller,dma,dram controller,sio,keyboard……)。若用diskonchip作為硬盤的話加上dram,lcd顯示器,鍵盤,網(wǎng)卡就是一臺(tái)pc機(jī)了。 為了適應(yīng)工業(yè)領(lǐng)域的應(yīng)用,簡(jiǎn)化用戶的開發(fā)難度,intel和amd兩大公司推出了自己各有特色的產(chǎn)品,特別值得一提的是amd公司的產(chǎn)品,應(yīng)用起來特別是硬件設(shè)計(jì)非常簡(jiǎn)單,但amd公司沒有推出象 intel appbuilder一樣的工具,編程還是要困難一點(diǎn)。另外x86系列的一個(gè)缺點(diǎn)就是仿真器非常昂貴,我們可以在pc機(jī)上作軟件調(diào)試,編譯器用 msc,tc,bc 均可。但生成的是 .exe 文件需要操作系統(tǒng)加載運(yùn)行,無法寫入rom里,我們需要一個(gè)定位工具,把 .exe 文件的重定位段定位.另外由于沒有了操作系統(tǒng)的支持,所以需要重寫 c 語言的啟動(dòng)文件,在tc下有一個(gè) c0x.obj的文件(x=t,s,m,l,h為tiny, small, medium, large,huge模式,對(duì)應(yīng)的有一個(gè)c0.asm的匯編源程序),完成 c 語言的初始化,設(shè)置堆棧,與操作系統(tǒng)接口……,我們重寫 c 語言的啟動(dòng)文件就是重寫c0.asm. 當(dāng)然若能買一個(gè)嵌入實(shí)時(shí)操作系統(tǒng)就不要這樣麻煩了,可悲的是嵌入實(shí)時(shí)操作系統(tǒng)太貴,也有免費(fèi)的,或者學(xué)習(xí)起來太難,因?yàn)闆]有資料,用戶又太少。 -------------------------------------------------------------------------------- 本人在用80c188eb開發(fā)過一個(gè)通訊控制器,配有8個(gè)串口,其中有兩個(gè)為同步/異步,6個(gè)異步。配有512k rom,512k ram,rtm,8k串行eeprom。用tc作開發(fā)工具,除了應(yīng)用程序外,主要的難點(diǎn)在于:c語言的啟動(dòng)代碼;定位工具;串行eeprom的接口庫。這里僅介紹c語言的啟動(dòng)代碼。 本來,各種c語言編譯器都提供啟動(dòng)代碼,以x86為例,無論是tc、msc、bc都有。tc在不同模式下啟動(dòng)代碼不一樣,為c0x.obj.一般編程,用不著去修改啟動(dòng)代碼。但有的場(chǎng)合就有必要了。筆者為一套系統(tǒng)開發(fā)軟件時(shí)發(fā)現(xiàn):一套系統(tǒng)當(dāng)沒有操作系統(tǒng)時(shí),要想使得系統(tǒng)正常運(yùn)行是相當(dāng)困難的。筆者開發(fā)的系統(tǒng)cpu為80c188eb,無操作系統(tǒng),開發(fā)工具為tc2.0。為了能使得系統(tǒng)運(yùn)行,又不能用太低級(jí)的語言如匯編,可謂歷盡辛苦(當(dāng)然可以買現(xiàn)成的開發(fā)工具和仿真工具,太貴)。 筆者重寫了tc的啟動(dòng)代碼,另外還改寫了一個(gè)重定位工具(把exe文件變?yōu)榭芍苯訉懭雛om去的文件)。因?yàn)楹苌僖姷筋愃莆恼?。下面把主要?nèi)容寫出來,以饗讀者。以后我準(zhǔn)備把這個(gè)工具完善以下,做成一個(gè)重新定位的工具。 c語言的啟動(dòng)代碼如下: ; tcstart.asm ; for d000 code only, external eprom on memory card ; for pc rom extrn _main:far; /* 說明外部的c語言的main() 函數(shù),這也是 c 語言為什么非要從main()開始的原因 */ _text segment byte public "code" ; /* c語言生成的代碼段 */ _text ends _textend segment para public "codeend"; /* 代碼段的結(jié)束段 */ _textend ends _data segment para public "data"; /* c語言生成的初始化數(shù)據(jù)段 */ _data ends _dataend segment para public "dataend"; /* 初始化數(shù)據(jù)段的結(jié)束段 */ _dataend ends _bss segment para public "bss" ;/* c語言生成的非初始化數(shù)據(jù)段 */ _bss ends _bssend segment byte public "bssend";/* c語言生成的非初始化數(shù)據(jù)結(jié)束段 */ _bssend ends _stack segment para stack "stack" ; /* 堆棧段 */ _stack ends dgroup group _data, _dataend, _bss, _bssend /* 把數(shù)據(jù)的段構(gòu)成一個(gè)組,代碼連在一起 */ cgroup group _text, _textend /* 把代碼的段構(gòu)成一個(gè)組,代碼連在一起 */ _text segment ; /* 代碼段 */ assume cs:cgroup, ds:dgroup, es:dgroup, ss:_stack start: cli ; disable interrupts mov ax, _stack ; initialise stack mov ss, ax mov ax, offset stackend mov sp, ax mov ax, seg _bss ; /* bss seg clear */ mov es, ax mov cx, offset dgroup:endbss mov di, 0 mov ax, 0 rep stosb ; write to es:di mov ax, seg dgroup ;初始化數(shù)據(jù)段 mov es, ax ; point es to _data mov cx, offset dgroup:enddata mov si, 0 mov di, 0 assume ds:cgroup mov ax, seg _textend:codeend inc ax mov ds, ax ; point ds to _const rep movsb ; copy _const to _data push es ; point ds to _data pop ds ;下面內(nèi)容非pc 機(jī)可以不要 mov al, 80h &n |