WINCE6驱动加载问题

ggggihss   2009-8-28 17:25 楼主
几个WINCE6驱动加载问题
[HKEY_LOCAL_MACHINE\Drivers\test1]
"Order"=dword:0
"Dll"="\\ResidentFlash\\testDriver.dll"
"Prefix"="TST"
"Index"=dword:1
[HKEY_LOCAL_MACHINE\Drivers\test2]
"Order"=dword:0
"Dll"="\\ResidentFlash\\testDriver.dll"
"Prefix"="TST"
"Index"=dword:2

1、应用程序有几个线程都要读写testDriver.dll这驱动,一个DLL在注册表中设置多个Drivers项,想每个线程都单独打开驱动(如线程1 CreateFile(TEXT("TST1:"…)),线程2 CreateFile(TEXT("TST2:")…)),这样线程1与线程2会不会有冲突?

2、在驱动中,能否根据注册表相应的值(如Index)来执行不同的动作,这样是否就能保证不同的线程之间读写驱动不会相互干扰?
或者大家有什么好的建议,谢谢!

回复评论 (24)

不会冲突的,因为,你上面的注册表是被多次加载的,每个DLL都有自己独立的空间
看串口就是这么做的。
点赞  2009-8-28 17:35
2、在驱动中,能否根据注册表相应的值(如Index)来执行不同的动作,这样是否就能保证不同的线程之间读写驱动不会相互干扰?

那我这一步就不需要做了吧
点赞  2009-8-28 17:39
试想下 如果你的应用程序同时对设备进行操作会是什么样的情况
点赞  2009-8-28 17:46
不会冲突的,因为,你上面的注册表是被多次加载的,每个DLL都有自己独立的空间。例如wince6.0的SPI:
F BSP_NOSPI !
IF BSP_NOSPI1 !
[HKEY_LOCAL_MACHINE\Drivers\BuiltIn\SPI1]
    "Prefix"="SPI"
    "Dll"="spi.dll"
    "Index"=dword:1
    "Order"=dword:8
    "MemBase"=multi_sz:"48098000"
    "MemLen"=multi_sz:"00000100"
    "Timeout"=dword:300
    "Irq"=dword:41          ;IRQ_SPI1
    "IClass"=multi_sz:"{0AE2066F-89A2-4D70-8FC2-29AEFA68413C}"
ENDIF BSP_NOSPI1 !

IF BSP_NOSPI2 !
[HKEY_LOCAL_MACHINE\Drivers\BuiltIn\SPI2]
    "Prefix"="SPI"
    "Dll"="spi.dll"
    "Index"=dword:2
    "Order"=dword:8
    "MemBase"=multi_sz:"4809A000"
    "MemLen"=multi_sz:"00000100"
    "Timeout"=dword:300
    "Irq"=dword:42          ;IRQ_SPI2
    "IClass"=multi_sz:"{0AE2066F-89A2-4D70-8FC2-29AEFA68413C}"
ENDIF BSP_NOSPI2 !

IF BSP_NOSPI3 !
[HKEY_LOCAL_MACHINE\Drivers\BuiltIn\SPI3]
    "Prefix"="SPI"
    "Dll"="spi.dll"
    "Index"=dword:3
    "Order"=dword:8
    "MemBase"=multi_sz:"480B8000"
    "MemLen"=multi_sz:"00000100"
    "Timeout"=dword:300
    "Irq"=dword:43          ;IRQ_SPI3
    "IClass"=multi_sz:"{0AE2066F-89A2-4D70-8FC2-29AEFA68413C}"
ENDIF BSP_NOSPI3 !

IF BSP_NOSPI4 !
[HKEY_LOCAL_MACHINE\Drivers\BuiltIn\SPI4]
    "Prefix"="SPI"
    "Dll"="spi.dll"
    "Index"=dword:4
    "Order"=dword:8
    "MemBase"=multi_sz:"480BA000"
    "MemLen"=multi_sz:"00000100"
    "Timeout"=dword:300
    "Irq"=dword:30          ;IRQ_SPI4
    "IClass"=multi_sz:"{0AE2066F-89A2-4D70-8FC2-29AEFA68413C}"
ENDIF BSP_NOSPI4 !
它们用的都是同一个驱动,但是不会冲突
点赞  2009-8-28 17:50
驱动里会不会根据注册表相应的值,执行不同的动作呢
点赞  2009-8-28 21:26
重要的是你的驱动是不是访问的是同一个硬件
点赞  2009-8-28 23:26
不同的线程通过驱动访问硬件不同的地址
如TST1:操作0x5000000
TST2:操作0x50004000
……
点赞  2009-8-29 09:13
这个话题不错。
点赞  2009-8-29 09:17
如果驱动中涉及到对同一资源的访问如物理地址,寄存器,中断源。 那就要注意了。
点赞  2009-8-29 09:20
是的。
如果注册表只设置一个Drivers项目(如只有TST1
多个线程都通过TST1:来访问硬件,这样可能会造成堵塞吧。
点赞  2009-8-29 09:34
引用: 引用 9 楼 rushonin 的回复:
如果驱动中涉及到对同一资源的访问如物理地址,寄存器,中断源。 那就要注意了。


对,这时候要使用互斥才行。
点赞  2009-8-29 09:48
一般情况下不会。除非你createfile返回的句柄作为全局变量,在多个子线程中调用。
其它线程在createfile同一个设备时,会返回资源已被占用。
引用: 引用 10 楼 feishanm 的回复:
是的。
如果注册表只设置一个Drivers项目(如只有TST1
多个线程都通过TST1:来访问硬件,这样可能会造成堵塞吧。
点赞  2009-8-29 09:49
1. Device Manager 会不会帮你载 "\\ResidentFlash" 下的 .dll 档, 这个问题值得研究, 我倒是从来没试成功过.

2. WinCE 架构上是允许 LZ 要的功能, 但能不能做到, 还是要看 LZ 的 testDriver.dll 是怎麽写的. LZ 必须如 4 楼所述, 在 registry 中加入其 MemBase, 并在 TST_Init 中去读取, 以後所有操作皆是以该值操作.

3. %_WINCEROOT%\public\common\oak\drivers 下有很多很好的范例, LZ 可去参考

Paul, Chao @ Techware
点赞  2009-8-29 09:52
引用: 引用 12 楼 rushonin 的回复:
一般情况下不会。除非你createfile返回的句柄作为全局变量,在多个子线程中调用。
其它线程在createfile同一个设备时,会返回资源已被占用。
引用 10 楼 feishanm 的回复:
是的。
如果注册表只设置一个Drivers项目(如只有TST1
多个线程都通过TST1:来访问硬件,这样可能会造成堵塞吧。


是把返回的句柄作为全局变量,在多个线程中调用。
一个线程在ReadFile或WriteFile时,另外的线程应该是访问不了吧,直接到释放,这样可能就会造成堵塞。
点赞  2009-8-29 10:05
引用: 引用 13 楼 paul_chao 的回复:
1. Device Manager 会不会帮你载 "\\ResidentFlash" 下的 .dll 档, 这个问题值得研究, 我倒是从来没试成功过.

2. WinCE 架构上是允许 LZ 要的功能, 但能不能做到, 还是要看 LZ 的 testDriver.dll 是怎麽写的. LZ 必须如 4 楼所述, 在 registry 中加入其 MemBase, 并在 TST_Init 中去读取, 以後所有操作皆是以该值操作.

3. %_WINCEROOT%\public\common\oak\drivers 下有很多很好的范例, LZ 可去参考

Paul, Chao @ Techware


1---我是在CE系统启动后,应用程序启动时才去ActivateDevice
2---我也想这样实现,通过注册表相应的值去执行不同的动作,这样就能保证不同的线程之间读写驱动不会相互干扰。
点赞  2009-8-29 10:10
自己再顶一下
点赞  2009-8-31 09:50
引用: 引用 15 楼 feishanm 的回复:
引用 13 楼 paul_chao 的回复:
1. Device Manager 会不会帮你载 "\\ResidentFlash" 下的 .dll 档, 这个问题值得研究, 我倒是从来没试成功过.

2. WinCE 架构上是允许 LZ 要的功能, 但能不能做到, 还是要看 LZ 的 testDriver.dll 是怎麽写的. LZ 必须如 4 楼所述, 在 registry 中加入其 MemBase, 并在 TST_Init 中去读取, 以後所有操作皆是以该值操作.

3. %_WINCEROOT%\public\common\oak\drivers 下有很多很好的范例, LZ 可去参考

Paul, Chao @ Techware



1---我是在CE系统启动后,应用程序启动时才去ActivateDevice
2---我也想这样实现,通过注册表相应的值去执行不同的动作,这样就能保证不同的线程之间读写驱动不会相互干扰。


2个不同的dll空间,并不代表两个线程对同一设备操作不会产生干扰,一些关键的操作还是要通过同步和互斥才能实现吧
点赞  2009-8-31 11:30
每个线程操作不同的物理地址
点赞  2009-8-31 11:33
你的要求挺奇怪的,一个驱动要弄两个dll?难道wince6.0不能多次打开同一设备?注册表index值是device.exe加载设备时所用到的加载顺序,解决驱动依赖问题的。。。这关线程冲突什么事。既然怀疑线程间有可能冲突,就在冲突的地方做些处理啊。每个线程操作不同的物理地址,并不代表对设备没有影响,除非他们不是不相关的物理地址
点赞  2009-8-31 11:57
12下一页
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复