单片机 发明在80年代刚发明出来的出来的时候怎么烧程序

本来想直接写一篇关于保护模式嘚文章因为有一位读者不断地问我这个问题,随着问题的深入在评论上回答这个问题实在是太困难了,动起笔来发现涉及的事情太哆,免不了又是长篇大论惹人烦而且要写很长时间,不知道我能不能把它写完所以干脆把一些问题分离出来写,或许还可以坚持写出來

    在许多PC的CMOS设置里,都有一项叫做“A20 Enable“的设置不知道大家是否就此设置困惑过,这个A20是什么呢

    说A20则不得不说PC机的内存,我尽量用简短的语言说明白PC机内存的一些独有的术语在我刚接触PC机的时候(1985年前后),如果你的机器有一块10M或者20M的硬盘那已经是一台不错的机器,如果你的机器有256K的内存那绝对是高配置,那时候还没有3.5"的软盘都是使用5"的容量仅360K的软盘,所以那个时候设计IBM PC的IBM公司非常自信地认為,1M内存是一个根本达不到的天文数字我想由于这种思想的作怪(我猜的),IBM非常愚蠢地把PC机1M存储空间的最上面的384K用作了ROM和系统设备這种设计给现在的PC机的内存结构埋下了麻烦的伏笔,如果当初IBM把PC机的1M存储空间的最下面的384K用作ROM和系统设备可能现在就会少好多麻烦,这個后面说

写到这里的时候,我想起了许多事大家是否知道我国的第一台电子计算机是什么型号?是什么样子是1958年生产的103机,后来又囿了全晶体管的电子计算机很荣幸的是,在我工作过的单位里曾经有过这么一台全晶体管的电子计算机,就是那种使用穿孔纸带输入計算机程序占地好几百平方米,一旦开动需要几十人进行维护的家伙我到这个单位的时候,这台机器早已不再运转的80年代的时候,峩有幸参加了这台机器的拆解工作给我印象最深的是,我终于看到了当时在教科书里说的“磁鼓”(估计现在的教科书里也没有了)┅种看上去像筛子一样的东西,那就是当年的存储器用于在纸带上打孔进行程序输入的穿孔机我用过,样子很像老式的英文打字机还囿那种8英寸的软盘,估计现在也很少有人见过了

好了言归正传,大家都知道只有20位地址线,按理它的寻址空间是2^20应该是1024KB,但PC机的寻址结构是segment:offsetsegment和offset都是16位的寄存器,最大值是0ffffh换算成物理地址的计算方法是把segment左移4位,再加上offset所以segment:offset所能表达的寻址空间最大应为0ffff0h + 10ffefh(前面的0ffffh昰segment=0ffffh并向左移动4位的结果,后面的0ffffh是可能的最大offset)这个计算出的10ffefh是多大呢?大约是1088KB就是说,segment:offset的地址表达能力超过了20位地址线的物理寻址能力,你说这是不是有点麻烦在早先,由于所有的机器都没有那么大的内存加上地址线只有20位,所以当你用segment:offset的方式企图寻址100000h这个地址时由于没有实际的第21位地址线,你实际寻址的内存是00000h的位置如果你企图寻址100001h这个地址时,你实际得到的内容是地址00001h上的内容所以這个事对实际使用几乎没有任何影响,但是后来就不行了出现了80286,地址线达到了24位使segment:offset寻址100000h--10ffefh这将近64K的存储器成为可能,为了保持向下兼嫆于是出现了A20 Gate,这是后话我们后面再细说。

这张图很清楚地说明了问题大家都知道,DOS下的“常规内存”只有640K这640K就是从0--A0000H这段地址空間;所谓“上位内存区”,指的就是20位地址线所能寻址到的1M地址空间的上面384K空间就是从A0001H--100000H这段地址空间,也就是我们说的用于ROM和系统设备嘚地址区域这384K空间和常规内存的640K空间加起来就是20位地址线所能寻址的完整空间1024KB;由于80286和80386的出现使PC机的地址线从20位变成24位又变成32位,寻址能力极大地增加1M以上的内存寻址空间,我们统称为“扩展内存”;这里面绝大部分内存区域只能在保护模式下才能寻址到但有一部分既可以在保护模式下,也可以在实模式下寻址这就是我们前面提到过的地址100000h--10ffefh之间的这块内存,为了表明其特殊性我们把这块有趣的内存区叫做“高端内存”。

前面我们提过由于IBM的愚蠢设计给PC机的内存结构埋下了麻烦的伏笔现在我们来说说这个麻烦。我们都见过PC机上的內存条但是由于上位内存区的存在,这个内存条上的地址居然不能连续就是说,这个内存条上要有0--A0000H的地址空间还要有100000h--最大内存容量嘚地址空间,中间的384K地址空间必须留出来给ROM用在现如今一个芯片就好几兆的情况下,你说这个内存条应该怎么做当然我相信一定是可鉯做出来的,但肯定很麻烦如果当初IBM把这个“上位内存区”放在地址低端,就是0--6000h这一部分岂不是这个麻烦就没有了?!

但是实际的內存条上地址都是连续的,并没有人把这段地址空间留出来给ROM使用原因很简单,采用技术手段把这段地址空间空出来比浪费这384K内存的荿本还要高,所以在这个地址区域就出现了很奇怪的现象ROM和RAM的地址重叠。 实际上往往ROM并不能完全覆盖整个384K区域,这样就会有一些地址沒有被ROM占用那么这部分地址上的RAM仍然是可以使用的。实际上和ROM重叠的这384K RAM一般也不会被浪费,说到这里不得不说所谓的ROM Shadowing了,RAM和ROM的性能昰有很大差异的RAM的存取速度要远远大于ROM,而且RAM可以32位存取ROM通常只能16位,所以目前的PC机对这块RAM和ROM重叠的区域的处理采用一种ROM Shadowing的技术方式当机器加电后,先让ROM有效RAM无效,然后读出ROM内容再让ROM无效,RAM有效把读出的ROM内容放到相同地址的RAM中,并把相应位置的RAM设定为只读这樣就把ROM搬到了RAM中,地址完全一样只是性能比使用ROM要高些,这块RAM就好像ROM的Shadow一样

    回到我们的主题A20 Gate,出现80286以后为了保持和8086的兼容,PC机在设計上在第21条地址线(也就是A20)上做了一个开关当这个开关打开时,这条地址线和其它地址线一样可以使用当这个开关关闭时,第21条地址线(A20)恒为0这个开关就叫做A20 Gate,很显然在实模式下要访问高端内存区,这个开关必须打开在保护模式下,由于使用32位地址线如果A20恒等于0,那么系统只能访问奇数兆的内存即只能访问0--1M、2-3M、4-5M......,这显然是不行的所以在保护模式下,这个开关也必须打开

     早期的PC机,控淛键盘有一个单独的单片机 发明8042现如今这个芯片已经给集成到了其它大片子中,但其功能和使用方法还是一样当PC机刚刚出现A20 Gate的时候,估计实在找不到控制它的地方了同时为这点小事也不值得增加芯片,于是工程师使用这个8042键盘控制器来控制A20 Gate但A20 Gate真的和键盘一点关系也沒有,我们先从软件的角度简单介绍一下8042这个芯片

Port的操作及端口定义做一个说明。

    理论上讲我们只要操作8042芯片的输出端口(64h)的bit 1,就鈳以控制A20 Gate但实际上,当你准备向8042的输入缓冲区里写数据时可能里面还有其它数据没有处理,所以我们要首先禁止键盘操作,同时等待数据缓冲区中没有数据以后才能真正地去操作8042打开或者关闭A20 Gate。打开A20 Gate的具体步骤大致如下:

    后来由于感觉使用8042控制A20运行太慢了(确实,那么长的代码中间还要若干次的wait),所以后来又出现了所谓的Fast A20实际上,现在的大多数机器都是Fast A20Fast A20使用92h端口控制A20,同时BIOS里提供了一个軟中断来控制A20:

    特别要注意的是大家从这篇文章的文字中可能也能感觉到,A20 Gate的设计本身就让人感觉很别扭不是那么流畅,所以和A20有关嘚事情就难免也会有相同的感觉很奇怪的是,上面介绍的三种方法并不是在每台机器上都适用所以如果你要做一个商业软件其中要操莋A20,那一定要三种方式联合使用才比较稳妥否则会有意想不到的结果,LINUX公开的启动代码中就是这么做的

    在DOS下有时我们会在config.sys中写上一句:dos=high这句就会把驻留的DOS放到高端内存区域去,怎么放的呢关键点就是打开A20,然后把DOS从常规内存搬到100000h起始的区域去并把在常规内存中占用嘚内存释放掉,当然说起来容易实际做的时候还有很多细节要处理。

说到DOS=HIGH就不得不提醒大家另一件事,如果在config.sys中有dos=high这一句那么恐怕92h嘚方法和BIOS的方法都会不完全灵验(至于操作8042的方法灵不灵我没有试),这是DOS做了手脚因为DOS被放到了高端内存中,为了保证DOS能正常运行咜不允许你把A20给关掉,遇到这种情况不要惊慌不是我写得不对,确实是DOS太狡猾了

    还有最后一点要特别注意,92h的bit 0是给机器发复位信号的(8042 Output Port的bit 0也是)所以在向92h写数据时,千万不要让bit 0为1否则机器会重新启动,如果你的应用程序需要重新启动机器这也是方法之一,比jmp 0ffffh:0来的還要干脆

    在其它我们介绍保护模式的文章中,我们会用到上面提到的打开A20的方法届时可能就不会做更多的解释了。 

    另外涉及操作A20的資料其实很少,有些资料我手里也很缺乏比如92h除bit 0和bit 1以外的定义是什么我至今也不知道,包括本文中的一些内容也是摸索所得并没有资料予以佐证,所以万一有不对的地方不要见怪,并恳请指出

单片机 发明刚出来时烧程序是一佽性的(OTP ROM)有专用编程器

需求量大由厂家一次性掩膜写入程序,相当于不能编程了

后来发展成为用紫外线擦除(EPROM)由专用编程器写入

洅后来,发展成电可擦除芯片(EEPROM)仍需专用编程器写入

如今就改成串口编程(串行FLASH),基本上可以摆脱编程器了

过去单片机 发明难以普忣一是微机比较少,用汇编语言写程序加上人工查机器码太麻烦

二是需编程器少则几百元,多则上千元多数个人承受不起,许多人┅月工资只有几十块

三是单片机 发明不是真正的单片机 发明,仍需许多辅助芯片导致外围电路比较复杂,个人无法制作电路版实验囷应用受限。

你对这个回答的评价是

在真正意义上的单片机 发明intel8048发明之前就已经有了可编程只读存储器(PROM),那时的单片机 发明内部是不含存储器的程序必须存放在外扩PROM里,由专门的烧写器烧写批量大时也可交由工厂掩模ROM。

你对这个回答的评价是

你对这个回答的评价是?

采纳数:0 获赞数:3 LV1

古古怪怪古古怪怪古古怪怪古古怪怪

你对这个回答的评价是

我要回帖

更多关于 单片机 发明 的文章

 

随机推荐