宋 杰, 丁志远
(安徽大学 计算机科学与技术学院,安徽 合肥 230039)
·专题研究———虚拟仿真实验( 24)·
基于Proteus的X86中断仿真异常问题探究和对策
宋 杰, 丁志远
(安徽大学 计算机科学与技术学院,安徽 合肥 230039)
X86系列的CPU及其系统一直是“微机原理”课程的主流内容,其中中断是此课程的核心部分。目前,核心实验仍然是采取使用真实硬件进行实验的方式,但这种方式也带来实验项目受限,元器件易损坏等问题。随着Proteus对8086系列的CPU提供仿真功能,很多高校也开始将X86系列的微机原理实验向上移植。仿真实验便于实验内容扩展,便于学生自行实验,没有实验场地约束,破解了实验时间、地点的难题。仿真实验毕竟和物理实验有所差异,有不够完善之处,在移植过程中,实现中断的8259实验出现了一些问题。本文就此问题进行了研究和实验,剖析了产生问题的原因,并给出了多种解决问题的方法。
Proteus; intel 8086; 中断; intel 8259; 仿真
Proteus软件不仅具有其他EDA工具软件的仿真功能[1-2],还能仿真单片机、ARM及外围器件及虚拟仪器[3-5],在单片机领域获得了巨大的成就,在仿真设计和实验方面的功效已得到了广泛的认可[6]。用虚拟软件代替实验箱的硬件电路,形象具体,增强了学生的感性认识,有助于对实验原理的理解,通过软件仿真,不仅节约了硬件资源,拓展了实验范围,而且提高了教学效率[7]。
Proteus V7.6版本后开始提供对8086CPU的仿真,使原先只是针对单片机系列的仿真逐渐扩展到X86领域[8]。国内很多高校已开展了研究[9-12],在实践过程中,大部分仿真都获得了理想的结果,但在仿真8259中断时,或多或少遇到了问题。本文从多角度、多方法对此问题进行了分析、验证并提供了解决对策。
中断机制是现代计算机系统中的重用基础机制,它在系统中协调系统对各种外部事件的响应和处理。中断是CPU对系统发生的某个事件作出的一种反应,中断系统是计算机的重要组成部分。中断系统的应用大大提高了计算机性能和效率。
2.1 建立中断仿真模拟系统
8259A是专门对中断控制而设计的可编程中断控制器。单个的8259A能管理8级向量优先级中断,最多可以级联成64级的向量优先级中断系统。8259A有多种工作方式,各种工作方式的设定是在初始化时通过软件进行的[13]。仿真电路采用经典的电路结构,如图1所示。
图1 基于8259A的中断仿真模拟系统电路图
2.2 仿真模拟系统程序设计
在对8259A进行编程时,首先必须进行初始化。一般先使用CLI 指令将所有的可屏蔽中断禁止,然后写入初始化命令字。在初始化主片8259 时,写入初始化命令字的顺序是:ICW1、ICW2、ICW3然后是ICW4[14]。关键代码由如下部分构成:
(1)8259A的初始化代码。
(2)设置中断向量代码(实验设中断向量为60H)。
(3)中断处理子程序(代码略)。
3.1 仿真验证
按下单次脉冲单元按键,触发外部中断,即可控制K0~K7控制LED0至LED7的亮与暗,当K0~K7全部闭合时,中断子程序自动返回到原程序。但是,仿真表明,若按照上述原理以及8259A的编程操作,并不能通过Proteus软件的到预想的仿真结果。
3.2 中断仿真失败的数据分析
(1) 8086寄存器。点击中断触发按钮后,IP寄存器的值为00B8H,CS寄存器的值为8E00H。而非在代码中设置的中断向量60H*4。这说明8086并未按照正确的中断向量执行中断处理子程序。
(2) 8259寄存器。点击中断触发按钮后,8259中的中断服务寄存器的值为10000000B,说明8259已经对中断触发按钮进行了响应,并对其进行了处理。
(3) 内存空间。查找在代码中设置的中断向量地址,即60H*4号地址的单元,发现其连续的4个空间的值分别为:30H、00H、00H、00H,即中断子程序的地址为30H。表明中断向量写入正确。
3.3 失败原因推理
通过上述数据分析,中断向量写入正确,则仿真失败的原因应该与8086芯片以及8259芯片有关。8259的中断服务寄存器中的值表明8259以对中断进行了响应,而8086中的IP与CS寄存器没能得到正确的中断向量,由此可推测8086芯片与8259芯片中的信息联络出现问题。
由上述原理、数据分析可进行如下两种假设:
(1)8259没有向8086发出或发出了不正确的中断类型号,即问题出现在8259芯片上。
(2)8259发出了正确的中断类型号,但8086接收出错,即问题出现在8086芯片上。
3.4 分析仿真失败原因实验设计
为了对仿真失败的原因进行探究,从空间和时间的角度设计如下两个实验。
(1) 实验1。根据8086的数据分析可知,8086没有得到正确的中断向量,故跳转到了错误的中断处理子程序的入口地址。下面从空间的角度,将原源代码进行如下修改:
把整个中断向量表全部写入INT0中断子程序的入口地址,即添加如下代码[15]:
MOV AX,OFFSET INT0 ;取INT0的偏移地址
MOV BX,SEG INT0 ;取INT0的段地址
L: MOV [SI],AX ;将整个中断向量表全部写入INT0的入口地址
MOV [SI+2],BX
ADD SI,4
LOOP L
实验结果:可得到仿真的预想的效果,即8086可以正确跳转到INT0中断子程序。
(2) 实验2。由于8086不能跳转到正确的中断子程序入口地址,从时间角度入手,将原源代码进行如下修改:
在源程序的末尾以循环的方式不断向数据总线输入INT0的中断子程序的入口地址,即将源程序末尾的JMP 语句换为如下代码:
LI: MOV DX,800H ;将任意外设地址写入DX
MOV AL,60h ;中断类型号为60H
OUT DX,AL
JMP LI
实验结果:可得到仿真的预想的效果,即8086可以正确的跳转到INT0中断子程序。
3.5 两种假设的判定实验设计
根据两种假设,要想知道问题出现在8086还是8259芯片上,需要了解8259是否发出了正确的中断向量。因此,使用虚拟逻辑分析仪对数据总线上的数据进行监控[6]。
(1) 线路连接。将数据总线的低八位链接在虚拟逻辑分析仪的A0~A7,8086的INTA引脚链接逻辑分析仪的A8引脚,如图1所示。
(2) 操作步骤。将逻辑分析仪的捕捉分辨率设为0.2 m,设置A0至A8的触发条件为任意条件触发。开始仿真后,获得捕捉的逻辑波形,如图2所示。
图2 逻辑分析仪捕获图
(3) 实验结果。观察捕获的波形可发现,8086通过INTA引脚发出连续的两个负脉冲(A8引脚),在第二个脉冲期间,8259送出了正确的中断类型号60H。
在仿真的过程中查看仿真日志,就可以发现,日志上记录的信息表明8259发送了正确的中断类型号。
这个实验从另一角度更加确切地证明了此结论。
3.6 两种假设的最终实验结论
前述实验结果,可以证明8259芯片向8086发送了正确的中断类型号。进一步对代码进行修改,并用逻辑分析仪进行捕捉。
在主程序末尾添加如下代码:
MOV DX,800H ;任意外设地址
MOV AX,60H ;中断类型号为60H
OUT DX,AX ;目的是将60H输出至数据总线
使用逻辑分析仪捕捉数据,可发现无论8259向8086发送的中断类型码是多少(如:将中断类型号设置为50H,而实际的中断类型号仍为60H),8086识别的中断类型号都是最后输出至数据总线的数据,亦即中断源发送中断请求前最后一次出现在数据总线上的数据。
结论:第二个假设是正确的,即8259发出了正确的中断类型号,但8086接收出错,即问题出现在8086芯片上。
根据前面得出的结论可知,由于8086芯片的故障,使得中断仿真失败。为了可以正常进行8059中断实验,在当前情况下,给出两个主要的应对解决方法:
(1) 方法一。根据实验一可知,从空间的角度,将原源代码进行修改,即把整个中断向量表全部写入INT0中断子程序的入口地址。
(2) 方法二。由实验二可知,从时间角度入手,将原源代码进行修改,即在源程序的末尾以循环的方式不断向数据总线输入INT0的中断子程序的入口地址。
通过以上两种方法,在无中断嵌套的情况下可以进行正确的中断仿真。
但是,需特别指出,在需要进行中断嵌套的情况下,由于8086识别的中断类型号是中断源发送中断请求前最后一次出现在数据总线上的数据,而且中断源发送中断的时间具有随机性,故无法通过代码的方式来保证8086接受到正确的中断类型号。所以在中断嵌套的情况下,目前无法进行正确的仿真。
X86系列的Proteus仿真实验大都获得了较好的结果,但在8259中断实验不够圆满,这说明仿真实验具有一定的局限性,我们可以通过某些方法进行改进、克服。同时也要通过实验告诉学生这个问题的本质,促进他们对微机系统更深入的了解。
[1] 方天红,张升义. Proteus在“数字逻辑电路”课程项目驱动教学中的应用[J]. 实验室研究与探索,2014(4):195-198.
[2] 郭亚琴,王正群,秦 燕. Proteus软件在电子产品设计与制作中的应用[J]. 实验室研究与探索,2013(12):101-104.
[3] 周润景,袁伟停.基于PROTEUS的ARM虚拟开发技术[M].北京:北京航空航天大学出版社,2007.
[4] 周润景,张丽娜.基于Proteus的电路及单片机系统设计与仿真[M].北京:北京航空航天大学出版社,2006.
[5] 江世明.基于Proteus的单片机应用技术[M].北京:电子工业出版社, 2009 .
[6] 周润景,张丽娜.PROTEUS入门实用教程[M].北京:北京航空航天大学出版社,2006.
[7] 王海燕,杨艳华.Proteus和Keil软件在单片机实验教学中的应用[J]. 实验室研究与探索,2012(5):88-91.
[8] 顾 辉,梁惺彦.微机原理与接口技术——基于8086和Proteus仿真[M].北京:电子工业出版社.2011.
[9] 张亚军. Proteus在《微型机原理》课程教学中的应用[J]. 科技视界,2014(13):177-179.
[10] 王 娟. Proteus软件在单片机专题实训中的应用[J]. 实验技术与管理,2010(8):73-77.
[11] 杨骁涵. 微机原理与接口技术虚拟实验平台的设计与实现[D].北京邮电大学, 2012.
[12] 李现国,张 艳.Proteus仿真在微机原理及接口技术教学中的应用[J]. 实验技术与管理,2010(12):125-127.
[13] 周荷琴,吴秀清.微型计算机原理与接口技术[M].5版.合肥:中国科学技术大学出版社,2013.
[14] 徐 晨,陈继红,王春明,等.微机原理及应用[M].北京:高等教育出版社,2004.
[15] 沈美明,温冬婵.IBM PC汇编语言程序设计[M].北京:清华大学出版社,2002.
The Analysis and Resolution on Error Simulation of X86 Interrupt with Proteus
SONGJie,DINGZhi-yuan
(Computer Science and Technology School, Anhui University, Hefei 230039, China)
X86 CPU and its interface system are popular in "Computer Principle" course, and interrupt is one of the most important contents. Now, physical experiment is still the main method, but experiment items are limited and the electrical components are easy to be damaged. Many universities are doing simulation experiments on Proteus because it provides the simulation of 8086 CPU. Experiment item is easy expanded by simulation, and students can do it by themselves. The experiment time and location are flexible. Simulation experiments still have a few differences with physical experiment, and are not very perfect. There are still some problems with 8259 interrupt experiment. Some studies and experiments have been done on this problem. The analysis of the causes and solutions of the simulation are presented.
Proteus; Intel 8086; interrupt; Intel 8259; simulation
2015-01-08
国家自然科学基金(61271352);安徽省高等教育振兴计划重大教学改革研究项目(2013zdjy040)
宋 杰(1966-),男,安徽合肥人,博士,副教授,安徽大学网络工程系主任,研究方向:嵌入式系统、智能计算。
E-mail:jsong@ahu.edu.cn
TP 391.9; G 434
A
1006-7167(2015)08-0081-04