1 引言
WWW_PLCJ-S_COM-PLC-技.术_网(可-编程控-制器技术-门户)
新设备及新的接口规范等的不断出现,使得操作系统的设备驱动部分的开发工作层出不穷。我们在基于嵌入式Linux智能控制器的开发中,首先遇到了LonWorks现场总线设备的驱动程序问题。于是我们对Linux的驱动程序实现机制进行了深入研究,并开发了LonWorks现场总线设备的驱动程序。WWW_P※LCJS_COM-PLC-)技.术_网
2 关于LonWorks现场总线
WWW_PL※CJS_COM-PLC-技.术_网
现场总线是一种工业数据总线,是连接智能现场设备和自动化系统的高可靠的数字式、双向传输的通信技术,可方便地构成全数字化的分布式现场控制网络。对于防护工程这种工程轴线长、监控测点分散的系统,特别适合采用现场总线技术构成工程的分布式智能化控制系统。WWW_P※LCJS_CO※M-PLC-技-.术_网
在各种现场总线中,LonWorks总线技术以其在技术先进性、可靠性、开放性、拓扑结构灵活性等方面独特的优势,为集散式监控系统提供了很强的实现手段。使其特别适合于建筑的楼宇自动化系统。根据防护工程是一种特殊的地下建筑工程以及其布局特点,特别适合采用LonWorks现场总线技术实现其内部设备的自动化监控。WWW_P※LCJS_COM-PLC-)技.术_网
网络接口卡是主计算机与LonWorks网络的接口,使计算机能够完成与LonWorks节点之间的数据交换。在我们设计的智能控制器中,采用专门的嵌入式LonWorks现场总线接口卡作为嵌入式CPU与Lon- Works现场总线网络之间的接口设备。WWcW_PLCJS_COM-PLC-技.术_网
2.1 LonWorks现场总线网卡的原理WWW_PLCJ-S_COM-PLC-技.术_网(可-编程控-制器技术-门户)
了解LonWorks现场总线卡的工作原理,对编写驱动程序是必要的,故我们首先给出其工作原理,并对此作一些必要的解释。图1是嵌入式LonWorks网卡的硬件电路方框图。WWW_PLCJS※COM-PLC-技.术_网(可※编程控※制器技术门户)
WWW_PLCJS@_COM%-PLC-技.术_网
WWW_PLCJS@_COM%-PLC-技.术_网
WW.W_PLC※JS_C,OM-PL,C-技.术_网
图1 ISA网卡的硬件电路方框图
P_L_C_技_术_网——可——编——程——控-制-器-技——术——门——户
WWW_P※LCJS_COM-PLC-)技.术_网
过去实现微控制器与ISA总线的接口一般使用8155、8255,电路复杂,调试困难,在本网卡的设计中,使用可编程逻辑阵列(CPLD)来实现与ISA总线的接口逻辑,只用一个芯片就完成了所有功能,大大简化了网卡的电路。P.L.C.技.术.网——可编程控制器技术门户
2.2 LonWorks现场总线网卡的工作过程WW.W_PLCJS_COM-PLC-技.术_网
计算机与微控制器之间数据交换接口的应用程序框图如图2、3所示。在程序框图中,主要实现了计算机与微控制器之间读写数据、置标志位和清除标志位的功能。CPLD内部实现了存储数据和标志位的寄存器。W1WW_P4LCJS_COM-PLC-技.术_网
——可——编——程——控-制-器-技——术——门——户
W1WW_P4LCJS_COM-PLC-技.术_网
WW.W_PLCJS_COM-PLC-技.术_网
图2 主机写数据程序框图
WW.W_PLC※JS_C,OM-PL,C-技.术_网
WWW_P※LCJS_CO※M-PLC-技-.术_网
WWW_P※LCJS_COM-PLC-)技.术_网
WWW_PLCJS@_COM%-PLC-技.术_网
图3 从机接收数据程序框图
WWW_PL※CJS_COM-PLC-技.术_网
WWW_PLCJS_COM-PLC-技.术_网
3 LonWorks现场总线网卡设备驱动实现WWW_PLCJ-S_COM-PLC-技.术_网(可-编程控-制器技术-门户)
我们在Linux平台上开发和设计了LonWorks现场总线网卡的软件。软件部分由应用程序和设备驱动程序两部分构成,这里首先主要讨论的是设备驱动程序部分。在Linux平台上实现对硬件的驱动支持可以有两种方式:一种是直接在用户空间来实现;另一种是使用Linux内核中提供的机制来实现。考虑到用户空间驱动程序的局限性,比如为了访问特权指令(I/O指令)必须做一些影响系统安全的设置等等,我们在开发中采用了第二种方式。——可——编——程——控-制-器-技——术——门——户
3.1 Linux的可加载模块机制WWW_PLCJS@_COM%-PLC-技.术_网
Linux内核提供了两种机制来开发设备驱动程序:一种是直接把驱动程序链接到内核中:另一种则是通过称为Linux可加载模块的机制来开发可动态加载和卸载的驱动模块。而第一种方式可以在后一种方式成功后,采用与内核一起提供的配置工具和接口来完成。所以,我们只研究可加载模块机制。P_L_C_技_术_网——可——编——程——控-制-器-技——术——门——户
Linux作为单核结构其效率比较高,但是系统灵活性不足,为了平衡这两者的关系,它提供了可动态加载机制。利用这种机制我们可以开发Linux内核模块,并且可以动态的对它加载和卸载。Linux下的设备驱动程序一般都支持这种方式,且模块被加载到内核后,它就可以任意的利用核心提供的各种资源和服务了。为了让模块利用核心提供的资源,Linux内核维护了一张所有内核资源的符号表(在接下来的部分我们称它为内核资源符号表),用于在模块载入时解决对相应资源的引用问题。并且,Linux允许模块的堆栈操作,由此一个模块可以使用其他模块所提供的资源。也就是说:一个模块对另一个模块的资源的使用与其对内核资源的使用非常相似,不同的只是这些服务的资源从属于另一个模块而已。每当一个模块被加载Linux就会有一个修改内核资源符号表的过程,将该模块所提供的服务和资源加入进去,这样另一个模块载入时,如果需要就可以引用这个模块的资源了。而卸载一个模块时,就要知道当前模块是否正在被使用。如果没有被使用,在卸载时要能够通知该模块它将被卸载,以便由它自己释放已被它占用的系统资源。然后,Linux还要从内核资源符号表中删除所有该模块提供的资源和服务。——可——编——程——控-制-器-技——术——门——户