基于S3C2440与WinCE平台上的FIQ驱动程序的实现

2012-11-24 02:17开元海
网络安全与数据管理 2012年24期
关键词:驱动程序内核调用

开元海,汪 超,郑 勇

(1.贝加莱工业自动化西安分公司,陕西 西安710075;2.台州职业技术学院 机电工程学院,浙江 台州318000;3.安徽省滁州市第一职业高级中学,安徽 滁州239002)

Microsoft Windows CE是一个 32位、紧凑、高效、可扩展的操作系统,适用于各种嵌入式系统和产品。它拥有多线程、多任务、确定性的实时、完全抢占式优先级的操作系统环境,专门面向只有有限资源的硬件系统。同时,它的模块化设计方式使得系统开发人员和应用开发人员能够为多种多样的产品来定制它,可以选择、组合和配置Windows CE的模块和组件来创建用户版的操作系统[1]。良好的用户界面使其在导航仪等消费类电子中得到了广泛的应用。在工业控制方面,有少数厂家以它作为内核开发工业控制器,也有一些厂家只是作为终端显示设备。在外围没有CPLD、FPGA或DSP协同工作的情况下,对于实时性较高的应用场合一般不会选择WinCE。

本文以步进电机驱动程序为例,针对普遍使用的IRQ中断,提出用ARM处理器的FIQ中断在实时性能要求高的场合中的应用方法,可以大大提高控制系统实时处理能力,进而可以替代某些场合中使用的专用芯片或PLD芯片来满足性能要求,以节约成本,降低功耗。

1 IRQ中断过程简述

对于一个硬件中断,系统内核在捕获之后,会交给OEMInterruptHandler函数处理,这个函数就是实现中断处理的中心函数。函数可以从CPU的寄存器里获得中断的信息,这些信息可以指出是哪个中断源触发了中断。

在得到触发中断源信息后,最简单的中断处理办法就是在OEMInterruptHandler中直接对中断源进行判断,然后调用服务程序。

另一种中断处理办法是应用程序建立中断服务线程(IST),然后申请一个系统逻辑中断号(SYSINTR),创建一个事件(Event),使用InterruptInitialize函数将 Event与SYSINTR绑定,随后 IST阻塞在等待Event上面。当硬件中断发生后,OEMInterruptHandler只给系统返回一个SYSINTR,用来标记需要哪个程序来服务中断,系统根据绑定关系激活相应的Event,使得随后的 IST得以运行。在中断处理完成之后需要调用 InterruptDone,参数为该中断的SYSINTR,用来通知系统中断处理完成,系统重新使能该中断。这种处理方法可以使中断被关闭、系统被锁定的时间最短。此外,还需要实现OEMInterruptEnable和OEMInterruptDisable函数来改变处理器中断屏蔽寄存器[2]。处理过程如图1所示。

当使用上文所述IRQ中断服务程序结构时,为了使实时性更好,采用直接在OEMInterruptHandler中对中断源进行处理的方式对步进电机驱动器Q2HB44MA和步进电机57BYGHM403进行控制。由于中断优先级和响应速度的原因,步进电机在旋转过程中产生剧烈振动,根本无法在实际应用场合中使用。

2 FIQ中断驱动程序在WinCE系统中的实现

2.1 ARM处理器快速中断FIQ

FIQ和IRQ是ARM处理器中两种不同类型的中断。FIQ比IRQ有更高优先级,如果FIQ和IRQ同时产生,那么先处理FIQ。当CPU处于FIQ模式处理FIQ中断的过程中,预取指令异常,未定义指令异常,软件中断全被禁止,所有的中断被屏蔽。所以FIQ会很快被执行,不会被其他异常或者中断打断。而IRQ不一样,当ARM处于IRQ模式处理IRQ中断时,如果来了一个FIQ中断请求,那么正在执行的IRQ中断处理程序会被抢断,ARM切换到FIQ模式去执行该FIQ中断[3]。

2.2 步进电机加减速实现

步进电机在启动或停止时若步进脉冲变化太快,转子由于惯性而跟随不上电信号的变化,会产生失步或超步现象。一般来说对于电机起始转速小于2 r/s时,根据负载情况可能不会出现失步或超步的现象。但在转速较高、负载较大的情况下,为了避免失步或超步现象,通常采用加减速控制。加减速过程需要设定步进电机的起始频率、稳定频率和加速时间,但是在控制中则需要计算出加速过程所需要的脉冲个数。对于加速过程有以下关系式:

经过化简计算得:

其中:fa为起始频率,fΔ为每步增长的频率,fb为稳定频率,t为加速时间,n为加速过程脉冲数量。

2.3 添加步进电机结构和IOCTL接口

WinCE操作系统设计借鉴了Windows 2000/XP操作系统的设计,从体系结构上,它具有分层结构的特点,从上到下为应用程序层、操作系统层、OEM层和硬件层。OEM层是逻辑上位于硬件和操作系统之间的一层硬件相关代码。它的主要作用是对具体的硬件进行抽象,抽象出统一的接口,然后WinCE内核可以使用这些接口与硬件进行通信,这样在移植WinCE到新的硬件平台时可以减少对操作系统的修改,通俗地说就是为WinCE操作系统抹平MCU的差异,使其能方便地移植到其他MCU上运行。OEM抽象层(OAL)是整个OEM层的主体,它包含了高度硬件相关的代码,OAL主要负责WinCE内核与硬件交互。

为了能够用WinCE的流接口驱动程序操作ARM处理器的FIQ中断,需要修改WinCE系统OEM层中的OAL部分。在s2440.h文件中定义步进电机数据结构,包括起始频率、稳定频率、上升脉冲数、剩余脉冲数、当前上升/下降沿状态等运行参数和状态变量。

在oemioctl.c文件中定义步进电机结构的全局变量。为了使驱动程序可以访问到此变量,使用WinCE系统的IOCTL接口。在WinCE5.0中,应用程序和驱动程序可以通过调用KernelIoControl()函数来访问WinCE内核,导致调用OEMIoControl函数,这样应用程序和驱动程序就可以访问到OAL中的资源了,可以说OEMIoControl是一个很有用的WinCE内核输入/输出函数。在OEMIoControl函数中添加case语句使得驱动程序传来的运行参数和运行/停止命令可以得到记录和响应,在更新参数命令处理中把运行的参数赋值给步进电机结构变量;在开始运行命令处理中打开定时器FIQ中断使能、设置定时器周期、开始定时器运行;在停止命令中记录停止信息使得在当前脉冲循环完成后停止脉冲的输出。

2.4 添加中断处理过程代码

由于在IOCTL的开始运行命令处理中打开了定时器的FIQ中断使能,当定时器时间达到时,中断服务程序不再是 OEMInterruptHandler,而是 FIQHandler。由FIQHandler调用OEMInterruptHandlerFIQ函数进行处理。

在armtrap.s汇编文件中的FIQHandler入口处,调用OEMInterruptHandlerFIQ函数的前后应该使用msr汇编指令添加禁止/使能FIQ中断的操作。

在arminit.c文件的OEMInterruptHandlerFIQ函数中添加更新GPIO口输出电平、脉冲计数、加减速/恒速状态切换、定时器周期之更新等操作,如果当前发送脉冲为最后一个脉冲的下降沿,则需要关闭FIQ的中断使能,这样当脉冲发送完成后会产生普通IRQ中断来触发OEMInterruptHandler函数的调用,让系统通知驱动程序当前运动任务的完成。

另外,还需要实现OEMInterruptEnable和OEMInterruptDisable函数来改变处理器中断屏蔽寄存器。

2.5 驱动程序添加

驱动程序采用WinCE的普通流接口驱动程序,通过KernelIoControl接口对步进电机进行参数设置和启/停控制,在设置参数之前应该使用式(2)计算加/减速脉冲个数。

综合以上过程,采用FIQ中断的处理流程图如图2所示。

3 试验测试

文章采用Windows CE5.0嵌入式操作系统,结合ARM处理器的FIQ中断机制,完成了步进电机驱动程序的实现,在这种机制下,很好地克服了采用普通IRQ中断的驱动程序实时性能不高的问题,可以在实时性能要求较高的应用场合中应用。在试验过程中可以看到,使用本文提出的采用FIQ中断的驱动程序,可以平稳地输出120 kHz的脉冲,远远超过普通步进电机驱动器最高输入脉冲频率的20 kHz。

本文针对采用普通IRQ中断的驱动程序实时性能不高的问题,实现了使用ARM处理器的FIQ中断来开发驱动程序。使用普通IRQ中断的驱动程序来发送脉冲时,由于中断优先级和响应时间的问题,步进电机产生剧烈振动,导致根本不能在实际应用中使用。实践证明,驱动程序使用FIQ中断是稳定的且能获得比IRQ中断更好的实时性能,合理采用可以替代某些场合中的专用芯片或PLD芯片,以节约成本,降低功耗。

[1]卢爱臣,王剑宇,郭伟,等.基于 WinCE自动控制台的设计与实现[J].微计算机信息,2011(2):87-88.

[2]微软公司.Windows CE设备驱动程序开发指南[M].北京:北京希望电子出版社,1999.

[3]杜春蕾.ARM体系结构与编程[M].北京:清华大学出版社,2003.

[4]何宗键.Windows CE嵌入式系统[M].北京:北京航空航天大学出版社,2006.

猜你喜欢
驱动程序内核调用
多内核操作系统综述①
强化『高新』内核 打造农业『硅谷』
活化非遗文化 承启设计内核
核电项目物项调用管理的应用研究
阻止Windows Update更新驱动程序
Linux内核mmap保护机制研究
计算机硬件设备驱动程序分析
基于系统调用的恶意软件检测技术研究
利用RFC技术实现SAP系统接口通信
妙用鼠标驱动