无论是做linux下的驱动开发,还是Windows CE平台下的驱动开发,对流式驱动模型一定非常熟悉。在此架构下,把所有的硬件设备都看成文件,和设备的交互其实就是读写文件,也就是数据流动。这样开发驱动不仅简单实用,并且用户也用一致的接口访问硬件,大大降低了学习代价。但是在.NET Micro Framework平台下,却没有提供这样的驱动开发接口,用户如果想在应用层操作硬件,必须要做一个专门的接口库(Interop),如果有n个设备,对应的驱动接口库文件也必须n个,如果一个应用程序和n个设备通信,那就必须引用n个库了。另外如果库接口有更改,那么上层和底层代码还必须重新编译才能使用。
正是基于流式驱动的一些优点和Interop驱动接口开发的繁杂,所以我在.NET Micro Framework系统上构建了一套流式驱动架构。尤为值得一提的是,在流式驱动架构的基础上,还实现了的用户可以在MDK IDE环境下,采用C++开发流式驱动(参见相关文章《.NET Micro Framework动态调用C/C++底层代码》)。
流式驱动应用层的C#接口代码如下:
public sealed class GeneralStream { publicGeneralStream(); public event GeneralStreamEventHandlerNotice; public int Close(); public int IOControl(intcode); public int IOControl(intcode, int parameter); public int IOControl(intcode, byte[] inBuffer, intinCount, byte[] outBuffer, int outCount); public int Open(stringname); public int Open(string name,int config); public int Open(string name,string config); public int Read(byte[]buffer, int offset, intcount); public int Write(byte[]buffer, int offset, intcount); }
以上接口其实和WinCE平台下的流式接口非常类似了,但是比较有特色的是,还提供了一个事件通知接口,这样就为各种硬件驱动开发提供了更灵活的支持。有了这个流式接口,一般情况下,为上层C#语言提供专有的硬件底层功能,就不需要再编写接口相关的代码了,直接写相关的C/C++代码,然后编译链接即可。
当前已经基于流式驱动接口,实现了10个设备和功能模块的驱动,下面先简单介绍一下,后续将详细写文章一一介绍。
序号 |
名称 |
说明 |
备注 |
000 |
UserDriver |
用户流式驱动开发接口 |
MDK下的C++开发 |
001 |
Watchdog |
看门狗驱动 |
|
002 |
Ultrasonic |
超声波模块驱动 |
测距 |
003 |
DHT11 |
温湿度模块驱动 |
|
004 |
GPIO |
GPIO特殊功能驱动 |
比如可以配置开漏 |
005 |
Counter |
高速计数器 |
|
006 |
ADIS16227 |
ADIS16227模块驱动 |
基于特殊的SPI接口 |
007 |
MAX7219 |
MAX71219芯片驱动 |
LED和点阵控制 |
008 |
PCD8544 |
Norkia5110显示模块驱动 |
|
009 |
LCD1602 |
LCD1602模块驱动 |
在开发ADIS16227、Norkia5110和LCD1602模块驱动的过程中,深切感受到,给用户留一个C++驱动开发接口非常重要,因为这类驱动,上层应用一是没有现成的接口,二是直接用C#是不能实现的,所以必须底层移植,如果没有现成用户接口,就必须依赖厂商了,这很大层度上限制了用户的开发的主动性和灵活性,还有对产品及项目的把控性。
关于这部分内容,我在用户流式驱动开发接口(UserDriver)的文章中会详细介绍。
-----------------------------------------------------------
MF简介:http://blog.csdn.net/yefanqiu/article/details/5711770