阅读:1312回复:7
我是新手,终于开发出了第一个驱动程序,放分庆贺!
另外请教高手,在应用程序和驱动程序共享内存时,我想开辟一块内存,应用程序写入,驱动程序读出,模拟FIFO操作,不知哪位大侠实现了,请帮小弟一把!
|
|
沙发#
发布于:2002-10-18 10:11
另外请教高手,在应用程序和驱动程序共享内存时,我想开辟一块内存,应用程序写入,驱动程序读出,模拟FIFO操作,不知哪位大侠实现了,请帮小弟一把! 驱动和应用程序共享内存你搜索一下论坛文章,我也这样搞定的 FIFO我想可以对于一段固定的内存,维护两个指针,一个读指针一个写指针就可以了 |
|
板凳#
发布于:2002-10-18 10:27
谢谢你第一个回答我,共享内存的贴子我都翻过了,也看懂了,现在就是担心,对同一块内存同时进行读写操作时,会不会因为冲突而死机,是不是要开辟双缓冲,谁有这方面的资料?
|
|
地板#
发布于: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 |
|
|
地下室#
发布于:2002-10-18 11:16
版主的意思我可不可这样理解:ShareData分成两块,每块有一个标识,通过设置这个标识位使的读写不发生冲突,这根双缓冲的原理是一样的。最后问一句,ShareData在驱动程序和应用程序当中是怎样定义的?最好给点代码
|
|
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 ); } //搞定。 |
|
|
6楼#
发布于:2002-10-18 12:43
骗子!亮出来50分,只给了5分!!! :mad: :mad: :mad:
|
|
|
7楼#
发布于:2002-10-18 14:44
怎么只能给一次分?我另开帖子吧!
|
|