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