X86嵌入式處理器開發(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ì)簡單,提供的外部資源(指定時(shí)器、中斷控制器、I/O口、地址譯碼、DMA控制器、DRAM控制器……)要多一些,另外ELAN300,ELAN400簡直就是一臺(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)用,簡化用戶的開發(fā)難度,Intel和AMD兩大公司推出了自己各有特色的產(chǎn)品,特別值得一提的是AMD公司的產(chǎn)品,應(yīng)用起來特別是硬件設(shè)計(jì)非常簡單,但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模式,對應(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)代碼。但有的場合就有必要了。筆者為一套系統(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)楹苌僖姷筋愃莆恼隆O旅姘阎饕獌?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 ; enable NMI
out 0a0h, al
mov al, 0bch ; enable 8259 PIC 1011-1100 (irq0,1,6 enabled)
out 21h, al
;上面內(nèi)容非PC 機(jī)可以不要
sti ; enable interrupts
call _main ; CALL C MAIN()
jmp start ;
_TEXT ends
_TEXTEND segment
public codeend
db 16 dup(?) ; a paragraph, thus _CONST is one byte more
codeend label byte
_TEXTEND ends
_STACK segment
db 1024 dup ("STACK");/* 預(yù)留的堆??臻g */
stackend label word
_STACK ends
_BSSEND segment
public endbss
endbss label byte
_BSSEND ends
_DATAEND segment
public enddata
enddata label byte
_DATAEND ends
end
編譯連接:
tasm /mx tcstart
bcc -a- -c -f- -G- -K -B -ml -M -N- -O- -r- -v- -y- -Z- -S -O- 1.c
tlink /m tcstart 1 tclib, 1, 1
locate 1; LOCATE 工具,本人無源代碼。
本人重寫了一個(gè)工具, EXEBN1.EXE 連同本文一起貢獻(xiàn)給讀者。
EXEBN1中在文件長度>64K時(shí)或使用CONSTANT說明時(shí),會(huì)出問題,正式版本600元。
評(píng)論