關 閉

        新聞中心

        EEPW首頁 > 工控自動化 > 學習方法與實踐 > X86嵌入式處理器開發

        X86嵌入式處理器開發

        ——
        作者: 時間:2007-12-26 來源:中國EDA技術 收藏
                 CPU 原來是用于個人計算機的,大家都知道的如 8086/88,80186/188,80286,80386,80486,Petium,Celeon,Pentium II……,隨著個人計算機的發展,許多原來的CPU紛紛被淘汰,但這些處理器并未退出歷史舞臺,繼續在各個領域發揮著作用,在工業控制領域,80x186/188EA,80x186/188EB,80x186/188EC,80386EX等得到廣泛的應用。 

                主要型號有:Intel 80186/188, 80186/188EA, 80186/188EB, 80186/188EC, 80386EX ……, Intel的站點http://www.intel.com。 

                AMD 80186/188,80186/188ED,80186/188EM,80186/188ES,ELAN300,ELAN400,最近還推出了用于網絡的80186/188CH,型號我記不清了,有興趣的可以到http://www.amd.com去找。 

               比較而言我自己覺得AMD的產品要好一些,設計簡單,提供的外部資源(指定時器、中斷控制器、I/O口、地址譯碼、DMA控制器、DRAM控制器……)要多一些,另外ELAN300,ELAN400簡直就是一臺個人計算機,它集成了PC機除了DRAM和磁盤控制器之外幾乎所有的電路(把LCD顯示器接口也集成到里面了,包括RTM,TMR,INT Controller,DMA,DRAM Controller,SIO,KEYBOARD……)。若用DISKONCHIP作為硬盤的話加上DRAM,LCD顯示器,鍵盤,網卡就是一臺PC機了。 

                為了適應工業領域的應用,簡化用戶的難度,Intel和AMD兩大公司推出了自己各有特色的產品,特別值得一提的是AMD公司的產品,應用起來特別是硬件設計非常簡單,但AMD公司沒有推出象 Intel  AppBuilder一樣的工具,編程還是要困難一點。另外系列的一個缺點就是仿真器非常昂貴,我們可以在PC機上作軟件調試,編譯器用 MSC,TC,BC 均可。但生成的是 .EXE 文件需要操作系統加載運行,無法寫入ROM里,我們需要一個定位工具,把 .EXE 文件的重定位段定位.另外由于沒有了操作系統的支持,所以需要重寫 C 語言的啟動文件,在TC下有一個 C0X.OBJ的文件(X=T,S,M,L,H為Tiny, Small, Medium, Large,Huge模式,對應的有一個C0.ASM的匯編源程序),完成 C 語言的初始化,設置堆棧,與操作系統接口……,我們重寫 C 語言的啟動文件就是重寫C0.ASM. 當然若能買一個嵌入實時操作系統就不要這樣麻煩了,可悲的是嵌入實時操作系統太貴,也有免費的,或者學習起來太難,因為沒有資料,用戶又太少。 

                本人在用80C188EB過一個通訊控制器,配有8個串口,其中有兩個為同步/異步,6個異步。配有512K ROM,512K RAM,RTM,8K串行EEPROM。用TC作工具,除了應用程序外,主要的難點在于:C語言的啟動代碼;定位工具;串行EEPROM的接口庫。這里僅介紹C語言的啟動代碼。 

                本來,各種C語言編譯器都提供啟動代碼,以為例,無論是TC、MSC、BC都有。TC在不同模式下啟動代碼不一樣,為C0X.OBJ.一般編程,用不著去修改啟動代碼。但有的場合就有必要了。筆者為一套系統開發軟件時發現:一套系統當沒有操作系統時,要想使得系統正常運行是相當困難的。筆者開發的系統CPU為80C188EB,無操作系統,開發工具為TC2.0。為了能使得系統運行,又不能用太低級的語言如匯編,可謂歷盡辛苦(當然可以買現成的開發工具和仿真工具,太貴)。 
            

                筆者重寫了TC的啟動代碼,另外還改寫了一個重定位工具(把EXE文件變為可直接寫入ROM去的文件)。因為很少見到類似文章。下面把主要內容寫出來,以饗讀者。以后我準備把這個工具完善以下,做成一個重新定位的工具。  

            C語言的啟動代碼如下: 
        ; tcstart.asm 
        ; for d000 code only, external eprom on memory card 
        ; FOR PC ROM  
        extrn  _main:far;  

        /*  說明外部的C語言的MAIN() 函數,這也是 C 語言為什么非要從MAIN()開始的原因 */ 
        _text segment byte public "CODE" ; /* C語言生成的代碼段 */ 
        _text ends 
        _textend segment para public "CODEEND";  /* 代碼段的結束段 */ 
        _textend ends 
        _data segment para public "DATA"; /* C語言生成的初始化數據段 */ 
        _data ends 
        _dataend segment para public "DATAEND"; /* 初始化數據段的結束段 */ 
        _dataend ends 
        _bss segment para public "BSS"  ;/* C語言生成的非初始化數據段 */ 
        _bss ends 
        _bssend  segment byte public "BSSEND";/* C語言生成的非初始化數據結束段 */ 
        _bssend  ends 
        _stack segment para stack  "STACK" ; /* 堆棧段 */ 
        _stack ends 
        DGROUP group _DATA, _DATAEND, _BSS, _BSSEND /* 把數據的段構成一個組,代碼連在一起 */ 
        CGROUP group _TEXT, _TEXTEND /* 把代碼的段構成一個組,代碼連在一起 */ 
        _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  ;初始化數據段 
        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 
                                     ;下面內容非PC 機可以不要 
        mov al, 80h      ; enable NMI 
        out 0a0h, al 
        mov al, 0bch     ; enable 8259 PIC  1011-1100 (irq0,1,6 enabled) 
        out 21h, al 
                                     ;上面內容非PC 機可以不要 
        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");/* 預留的堆棧空間 */ 
        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 工具,本人無源代碼。 
          本人重寫了一個工具, EXEBN1.EXE 連同本文一起貢獻給讀者。 
          EXEBN1中在文件長度>64K時或使用CONSTANT說明時,會出問題,正式版本600元。 



        評論


        相關推薦

        技術專區

        關閉
        主站蜘蛛池模板: 闵行区| 江永县| 青浦区| 松阳县| 宁武县| 祁连县| 自治县| 莆田市| 龙门县| 青海省| 柘荣县| 靖安县| 登封市| 义马市| 莱西市| 楚雄市| 绥江县| 岐山县| 罗江县| 施甸县| 仪陇县| 诸城市| 承德县| 曲麻莱县| 龙陵县| 内乡县| 伊金霍洛旗| 井冈山市| 南康市| 乃东县| 海盐县| 安宁市| 泰州市| 小金县| 香港| 东山县| 镇安县| 扬州市| 临沭县| 隆昌县| 三亚市|