2X86嵌入式处理器开发
主要型号有:in 80186/188, 80186/188ea, 80186/188eb, 80186/188ec, 80386ex ……, in的站点。
amd 80186/188,80186/188ed,80186/188em,80186/188es,elan300,elan400,zui近还推出了用于网络的80186/188ch,型号我记不清了,有兴趣的可以到去找。
比较而言我自己觉得amd的产品要好一些,设计简单,提供的外部资源(时器、中断控制器、i/o口、地址译码、dma控制器、dram控制器……)要多一些,另外elan300,elan400简直就是一台个人计算机,它集成了pc机除了dram和磁盘控制器之外几乎所有的电路(把lcd显示器接口也集成到里面了,包括rtm,tmr,int controller,dma,dram controller,sio,keyboard……)。若用diskonchip作为硬盘的话加上dram,lcd显示器,键盘,网卡就是一台pc机了。
为了适应工业领域的应用,简化用户的开发难度,in和amd两大公司推出了自己各有特色的产品,特别值得一提的是amd公司的产品,应用起来特别是硬件设计非常简单,但amd公司没有推出象 in appbuilder一样的工具,编程还是要困难一点。另外x86系列的一个缺点就是仿真器非常昂贵,我们可以在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语言编译器都提供启动代码,以x86为例,无论是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 工具,本人无源代码。
下一篇:新一代CPLD及其应用
全年征稿/资讯合作
联系邮箱:1271141964@qq.com
- 凡本网注明"来源:智能制造网"的所有作品,版权均属于智能制造网,转载请必须注明智能制造网,https://www.gkzhan.com。违反者本网将追究相关法律责任。
- 企业发布的公司新闻、技术文章、资料下载等内容,如涉及侵权、违规遭投诉的,一律由发布企业自行承担责任,本网有权删除内容并追溯责任。
- 本网转载并注明自其它来源的作品,目的在于传递更多信息,并不代表本网赞同其观点或证实其内容的真实性,不承担此类作品侵权行为的直接责任及连带责任。其他媒体、网站或个人从本网转载时,必须保留本网注明的作品来源,并自负版权等法律责任。
- 如涉及作品内容、版权等问题,请在作品发表之日起一周内与本网联系,否则视为放弃相关权利。