zoukankan      html  css  js  c++  java
  • X86嵌入式处理器开发(续)

    --------------------------------------------------------------------------------

        本人在用188EB开发过一个通讯控制器,配有8个串口,其中有两个?同步/异步,6个异步。配有512K ROM,512K RAM,RTM,8K串行EEPROM。用TC作开发工具,除了应用程序外,主要的难点在于:C语言的?动代码;定位工具;串行EEPROM的接口库。这里仅介绍C语言的?动代码。

        本来,各种C语言编译器都提供?动代码,以X86?例,无论是TC、MSC、BC都有。TC在不同模式下?动代码不一样,?C0X.OBJ.一般编程,用不着去修改?动代码。但有的场合就有必要了。笔者?一套系统开发软件时发现:一套系统当没有操作系统时,要想使得系统正常运行是相当困难的。笔者开发的系统CPU?188EB,无操作系统,开发工具?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 0h, 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元。

        另外,?自行设计的系统写BIOS,也可代?设计嵌入式控制系统。(16BIT OR 32BIT,186 OR 386 )

    提供186系列串行EEPROM C 语言接口库,简单调试工具,象征性收费。

  • 相关阅读:
    基于WINCE嵌入式系统的FM1702的读写器(2)
    WINCE 按键驱动编写
    WinCE内存调整
    USB模块
    网络模块
    wince6.0下ov9650的图像保存
    Windows CE内存泄漏
    MPEG4解码函数
    centos 7 gitlab安装 李刚
    docker 17.12.0ce 空间大小和容器大小限制修改 李刚
  • 原文地址:https://www.cnblogs.com/cnlmjer/p/4099892.html
Copyright © 2011-2022 走看看