在CPLD管理下实现高效多串口中断源
①INTREQ为n个中断的或;
②CPU对INTEN只写,操作过程分3步。
第1步,中断安装后设置INTEN=1。javascript:window.open(this.src);" style="cursor:pointer;"/>
第2步,进入中断服务程序后CPU设置INTEN=0。
第3步,退出中断服务程序的最后指令。
outportb(0x20,0x20);
outportb(INTEN_PORT,0x01);//INTEN_PORT为INTEN的口地址
③中断响应的时序如图3所示。
在ISR置位期间,有中断请求INTREQ产生时,此时如果触发了中断,则会使上次中断服务无法完成,因而造成中断丢失。因此,在ISR配置期间,将中断允许INTEN设置为0,防止其它中断请求触发中断,并用INTREQ锁存未被响应的中断请求。退出中断服务后,得中断允许INTEN设置为1,保证其它中断请求能够被响应,并延迟50μs,以确保此次中断服务完全退出。
④中断控制寄存器的状态图(描述8位状态机的转换)如图4所示。
在退出中断时,将INTEN设置为1,从状态S3转换到状态S0。时间上延迟了5Δt=50μs,确保当前中断完全退出。INTREQ锁存中断请求,以确保下一中断能获得响应。
javascript:window.open(this.src);" style="cursor:pointer;"/>
4 软件设计
在设计中断服务程序时,要注意中断服务程序必须具备自我保护能力,并能访问到所有当前段地址和堆栈指针;接管中断向量前要关中断;在中断程序入口处要立即开中断;以允许较高级的中断产生;中断程序执行IRET指令前,应向中断控制器发出结束中断命令EOI。在安装中断时,将INTEN设置为1,在中断服务中轮流检查多个串口,如果有中断服务产生,则将INTEN设置为0;退出中断服务的时候,将INTEN设置为1。
上面基于嵌入式系统的精简特性,提出了一种高效多串口中断源的实现方案;大大节省了资源,确保中断请求的无漏检测和服务,并有效地解决了多个串口共享同一中断源时所造成的冲突和丢失等问题。