lrx666
驱动太牛
驱动太牛
  • 注册日期2001-08-17
  • 最后登录2010-10-25
  • 粉丝0
  • 关注0
  • 积分14分
  • 威望47点
  • 贡献值0点
  • 好评度4点
  • 原创分0分
  • 专家分0分
阅读:1313回复:7

我是新手,终于开发出了第一个驱动程序,放分庆贺!

楼主#
更多 发布于:2002-10-18 09:57
另外请教高手,在应用程序和驱动程序共享内存时,我想开辟一块内存,应用程序写入,驱动程序读出,模拟FIFO操作,不知哪位大侠实现了,请帮小弟一把!
horsedo
驱动小牛
驱动小牛
  • 注册日期2001-11-29
  • 最后登录2018-05-29
  • 粉丝0
  • 关注0
  • 积分2分
  • 威望10点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
  • 社区居民
沙发#
发布于:2002-10-18 10:11
另外请教高手,在应用程序和驱动程序共享内存时,我想开辟一块内存,应用程序写入,驱动程序读出,模拟FIFO操作,不知哪位大侠实现了,请帮小弟一把!

驱动和应用程序共享内存你搜索一下论坛文章,我也这样搞定的
FIFO我想可以对于一段固定的内存,维护两个指针,一个读指针一个写指针就可以了
lrx666
驱动太牛
驱动太牛
  • 注册日期2001-08-17
  • 最后登录2010-10-25
  • 粉丝0
  • 关注0
  • 积分14分
  • 威望47点
  • 贡献值0点
  • 好评度4点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2002-10-18 10:27
谢谢你第一个回答我,共享内存的贴子我都翻过了,也看懂了,现在就是担心,对同一块内存同时进行读写操作时,会不会因为冲突而死机,是不是要开辟双缓冲,谁有这方面的资料?
Tom_lyd
驱动大牛
驱动大牛
  • 注册日期2001-09-02
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分10分
  • 威望1点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
地板#
发布于:2002-10-18 10:51
不一定需要双缓冲,我用下面这种方法轻松地实现了。
我首先开辟一个大的缓冲,例如:64K,然后一个单元一个单元地用,直至用完,再又从头开始用。每个单元的格式如下:
typedef struct _SHARED_BUF
{
     int  nsync;     //同步、有效性标识
     ULONG  len;     //本单元的长度
     CHAR  Data[1]   //数据  
} SharedData;

然后,驱动程序每写一块内存,就根据数据的实际长度,置len于合适的值,并把数据拷至Data中。在大的缓中检测到当前该写的位置后,把nsync 置1。应用程序取了这段数据后,就把nsync清0,以供驱动程序可以再次使用。也就是驱动程序在大的缓冲中搜索当前可写的位置时,根据的就是SharedData结构,仅当nsync为0的时候,才写这段内存,避免应用程序还没有来得及取这段数据,驱动程序就把它覆盖了这种现象。
这种技术被称为time stamp synchronization
Tom_lyd
lrx666
驱动太牛
驱动太牛
  • 注册日期2001-08-17
  • 最后登录2010-10-25
  • 粉丝0
  • 关注0
  • 积分14分
  • 威望47点
  • 贡献值0点
  • 好评度4点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2002-10-18 11:16
版主的意思我可不可这样理解:ShareData分成两块,每块有一个标识,通过设置这个标识位使的读写不发生冲突,这根双缓冲的原理是一样的。最后问一句,ShareData在驱动程序和应用程序当中是怎样定义的?最好给点代码
Tom_lyd
驱动大牛
驱动大牛
  • 注册日期2001-09-02
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分10分
  • 威望1点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2002-10-18 12:15
上面不是已经给出定义了吗?之所以把数据定义为CHAR Data[1] ,是考虑到每块数据的长度可能不同,需要实际存储时确定。所以每块数据的长度也可能是不同的。
给你一个参考:
#pragma pack(1)//byte aligned
typedef sturct _SHARE_DATA
{
    int     nSync;
    ULONG   DataLen;
    CHAR    Data[1];
}SHARE_DATA, *PSHARE_DATA;

#paragma pack()
加上预编译宏是为了使结构按字节方式对齐,否则可能造成读取数据不一致的情况发生。
这个声明在应用层和驱动是通用的。
再说的明白一点,比如说你现在需要存储这样的一个字符串, \"Hello WDM\", 那么你应该这样:

CHAR * pString = \"Hello WDM\";
int len = strlen( pString );

//
// 在大缓冲区中搜索当前应该写的位置
PULONG pBuffer; //设pBuffer为你的大缓冲的起始地址
pCurBuf = (PSHARE_DATA)pBuffer;
while( pCurBuf && pCurBuf->nSync != 0 ) //不为0则不可写
{
    pCurBuf += pCurBuf->DataLen;
    //如果搜索到最末尾都没有空闲空间,怎么处理看你自己
    if( pCurBuf > pBuffer+Buffer_size; //Buffer_size为你的大
缓冲的总大小
    {
        pCurBuf=NULL;
        break;
    }
}
if( !pCurBuf )
//没有空间可写
else
{
    pCurBuf->nSync = 1; //置为已写标识
    pCurBuf->len;
    RtlCopyMemofy( pCurBuf->Data, pString , len );
}

//搞定。




Tom_lyd
VanCheer
驱动老牛
驱动老牛
  • 注册日期2002-02-21
  • 最后登录2003-08-28
  • 粉丝0
  • 关注0
  • 积分-20分
  • 威望-10点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2002-10-18 12:43
骗子!亮出来50分,只给了5分!!! :mad: :mad: :mad:
[img]http://www.driverdevelop.com/forum/upload/VanCheer/2003-03-21_mon.gif[/img][img]http://www.driverdevelop.com/forum/upload/VanCheer/2002-12-07_smallbaby.jpg[/img]
lrx666
驱动太牛
驱动太牛
  • 注册日期2001-08-17
  • 最后登录2010-10-25
  • 粉丝0
  • 关注0
  • 积分14分
  • 威望47点
  • 贡献值0点
  • 好评度4点
  • 原创分0分
  • 专家分0分
7楼#
发布于:2002-10-18 14:44
怎么只能给一次分?我另开帖子吧!
游客

返回顶部