引言
Xilinx公司推出了32位软核MicroBlaze,用来替代片上的微控制器,可以有效地缩小PCB板的面积和器件数量,降低整个系统的成本。MicroBlaze采用 32位哈佛RISC架构,32位独立的地址总线和数据总线。Spartan6 FPGA为Xilinx公司的低成本、低功耗FPGA。第6代Spartan系列含最多150 000个逻辑单元、高级储存器支持、250 MHz DSP Slice和3.125 Gbps低功耗收发器。本设计中首次采用Spartan6芯片搭载MicroBlaze软核作为硬件平台应用于保护装置中,在此硬件平台上开发适用于对稳定性要求苛刻的电力自动化技术产品。
1 可抢占可嵌套的中断方法实现
Spartan6芯片搭载MicroBlaze软核的保护装置的硬件平台开发中[1],需求分析中明确要求,硬件平台需要提供定时器中断、串口中断、CAN总线中断、以太网接口中断以及A/D采样中断等多个中断信号。基于Spartan6芯片开发的平台首次在保护装置中应用;Spartan6芯片是Xilinx公司的一款FPGA芯片,此款芯片资源丰富,性能可靠,具有PFGA所特有的可灵活配置的特性,各项指标满足在非电量保护装置中应用。但是芯片原有的中断控制器资源与所选用μC/OSII操作系统配合,不支持中断间的抢占与嵌套[2];如果不同优先级的中断同时被触发,原有的中断机制无法区分中断优先级的高低。虽然原有中断控制器上面可以设置多中断的优先级,但是汇编代码中却缺乏相应的处理机制,使之前设置的中断优先级失去意义;应用过程中只能尽量地缩短中断服务程序代码,力争把中断服务程序时间缩到最短;但是实际运用中仍然无法避免多个中断被同时触发的情况发生,严重时可能会导致系统死机。因此有必要开发一种可抢占的并且可嵌套的中断处理机制,解决上述问题。
对于本硬件平台在多中断同时响应时不能区分中断优先级高低的问题,通过硬件工程修改设置、改变参数等常规方法都无法解决。由于本硬件平台移植了μC/OSII操作系统,因此只能在μC/OSII操作系统关于中断处理的相关底层代码中加入我们自主研发的中断控制方法,来解决上述问题。根据μC/OSII操作系统的特点,μC/OSII操作系统每次是在中断退出时通过调用中断级的任务调度函数,从而实现多任务的切换。因此需要在中断嵌套时禁止任务切换,保证系统运行稳定。Spartan6芯片的软核Microblaze中的中断控制器提供了硬件上的中断优先级设置,但是驱动程序以及μC/OSII中并没有区分优先级,使硬件设置的优先级失去作用[3]。因此本方案中通过查表获得当前运行任务最高的优先级后,屏蔽所有低优先级任务。每次清除上述最高优先级中断后立刻开放此中断,保证中断可以嵌套。
在主函数中首先初始化中断向量表;当中断被触发后跳入汇编代码,跳入汇编程序后首先进行压栈处理进行保护现场操作;同时考虑到μC/OSII中的任务调度是在中断退出时执行的,因此在中断嵌套的过程中不进行任务调度;所以此处采用计数器统计进入中断次数;如果进入中断,计数器加1,如退出中断计数器减1;通过计数器的值作为判断条件,判断是否允许任务调度,从而确保中断嵌套时禁止任务调度。随后读取中断使能寄存器与中断向量寄存器的值,获取当前被触发的中断中的最高的优先级。通过查表处理屏蔽比当前中断优先级低的所有中断,并开放比当前中断优先级高的所有中断,从而实现在多中断同时被触发时,优先级高的首先得到执行,并且可抢占其他正在运行的低优先级的中断;同时,允许比当前中断优先级高的中断对当前中断的抢占。然后清除当前中断的标志位,使其重新开放,实现中断的可嵌套;然后跳转出汇编程序,将当前最高优先级的中断参数传递到C代码中的中断处理函数以及操作系统中的任务调度函数,C代码获得此最高优先级中断参数后,会进入相应的中断处理函数;同时μC/OSII操作系统进行任务切换并重新调用汇编程序,恢复中断现场;C代码会清除中断为下一次进入中断做好准备。 软件流程框图如图1所示。
图1 软件流程图
2 可抢占可嵌套的中断方法试验验证
在硬件平台中设置定时器每1 ms发生一次中断,定时器的中断优先级较高。串口不定时地接收到数据,接收到一次数据发生一次串口接收中断,定时器中断优先级高于串口接收中断优先级。当中断被触发后相应的中断信号的电平由低变高,中断处理函数完成中断相关处理后,中断信号由高电平回复为低电平。将定时器中断信号与串口接收中断信号分别引出,并接示波器观察。图2中,示波器通道1是定时器中断波形,通道2是串口接收中断波形。如图1所示,定时器中断先被触发,串口中断后被触发,CPU处理完定时器中断后才去处理串口中断的处理程序。图3中,示波器通道1是定时器中断波形,通道2是串口接收中断波形。如图2所示,串口接收中断先被触发,定时器中断后被触发,CPU中止串口中断处理程序而转入定时器中断的处理程序,定时器中断处理程序执行结束后,继续执行串口中断的处理程序。
图2 低优先级中断不能抢占高优先级中断示意图
由图2和图3可以明确得出结论,低优先级中断不能打断高优先级中断,需要高优先级中断处理结束后,才处理低优先级中断;反之高优先级中断可以打断低优先级中断。也就是说中断的可抢占功能得到了充分的验证。由于示波器无法明确捕捉到中断嵌套的实现,因此在中断程序代码中加标志位计数,进入中断时,标志位加1,退出时标志位减1;并将标志位的数值打印出来,以检测进入同一中断的的次数。打印信息证明,中断嵌套可以正确稳定地实现,实际运用中结合工程实际情况,兼顾系统稳定与运行效率,把嵌套次数设置为3,既能满足现场运行的需要又能防止中断嵌套占用过多的资源。
图3 高优先级中断可以抢占低优先级中断示意图
结语
通过上述对基于Spartan6芯片μC/OSII操作系统的可抢占、可嵌套的中断方法的实现描述,并通过搭建测试平台,由示波器输出波形以及计数器打印信息等手段的验证,基于Spartan6芯片μC/OSII操作系统的可抢占、可嵌套的中断方法的实现解决了原有系统中无法区分中断优先级而产生的问题,性能可靠,完全符合产品开发的要求。同时,在硬件平台的长时间运行过程中其性能稳定,不会出现死机等异常情况。此方法方便移植,通用性强,为解决同类问题提供了思路,避免了针对同样问题的重复开发,减少了工作量,提高了效率。