阅读:1767回复:17
关于多个设备用一个dll的问题
各位老大,我的多个设备要加载同一个dll文件,我想问一下我的这个文件是被加载一次,然后不同的设备用不同的函数还是5个设备就加载5次这个dll文件,还有,如果加载一次的话,我在文件中定义的静态全局变量是不是可以被多个设备使用
|
|
论坛版主
|
沙发#
发布于:2004-09-16 13:04
DLL只被加载一次,不同的进程调用loadlibrary时把它映射到自己的地址空间,dll中的所有数据都会被共享
|
|
板凳#
发布于:2004-09-16 13:21
"dll中的所有数据都会被共享"应该不是吧?
dll中有share属性的数据段才会被共享吧。 |
|
论坛版主
|
地板#
发布于:2004-09-16 13:31
:)我的错
|
|
论坛版主
|
地下室#
发布于:2004-09-16 13:39
哎呀呀,刚才说全会被共享是凭想象哈:),试了一下,好像函数可以共享,但是每个load这个库的进程会建立自己的数据块,leo_cyl兄弟,怎么指定一个数据的属性为share?在源代码中给什么修饰关键字?还是编译的时候给参数?
|
|
5楼#
发布于:2004-09-16 13:48
关注中
|
|
论坛版主
|
6楼#
发布于:2004-09-16 14:01
刚才试了,静态变量好像也是分离的,每个进程都是自己的,但测试是在2k平台做的。
|
|
论坛版主
|
7楼#
发布于:2004-09-16 14:10
对了,degyhy123兄弟,你的设备如果是同一个进程(device.exe)启动的,那么它们在同一个进程地址空间,那么可以共享,但如果还有display和touch或键盘等的驱动,是由gwes.exe起来的话就不行了。
|
|
8楼#
发布于:2004-09-16 14:11
好久没用过了。如果有说错的地方别见怪。
在source code 里,用 #pragma data_seg("seg_name") int i; 。。。 指定一个数据段。 然后在dll的def文件中指定该数据段为shared 具体参考help吧 |
|
论坛版主
|
9楼#
发布于:2004-09-16 15:03
*.def里面写
SECTIONS Seg_name READ WRITE SHARED *.c里面写 #pragma data_seg("seg_name") 对不起大家,我认罪:))) |
|
论坛版主
|
10楼#
发布于:2004-09-16 15:05
#pragma data_seg("seg_name")
variables Lists #pragma data_seg() |
|
11楼#
发布于:2004-09-17 07:50
各位老大,我的dll是由一个device。exe加载的话,是不是不用加share的那个东西呢
|
|
12楼#
发布于:2004-09-17 09:21
严重关注中 :P
|
|
|
13楼#
发布于:2004-09-17 09:44
除非有特别需要,一般来说,一个架构设计良好的驱动程序很少在多个dll中共享数据段。可以用其他比较安全的方法实现,如进程/线程间通讯。
|
|
14楼#
发布于:2004-09-17 10:01
是这样的,我的设备是一个pci桥片带多个can和串口的控制器,所以只有这样写了
|
|
论坛版主
|
15楼#
发布于:2004-09-17 12:59
由于你的设备不是被不同的进程启动的,这些数据只有一个,不会出问题。但是你可以把这些设备使用的数据区分开阿。
你写一个总的驱动,对上呈现出一个设备,并把桥挂接的各个设备使用的数据区分离开,上层使用这个设备的时候给出标示,驱动内部区分是操作哪个设备,就类似于一个pci设备的多个功能。 |
|
16楼#
发布于:2004-09-17 16:35
老大可以说的清楚一些吗,我还不是很明白??
|
|
论坛版主
|
17楼#
发布于:2004-09-17 19:48
在驱动初始化的时候,开辟一块缓冲区,并分配给每个设备一块(你可以把设备收到的数据放这里面,上层就直接对这些缓冲区操作),上层在对设备进行操作时,通过给出不同的ioctl来告诉下面操作的是哪个设备(也就是操作哪个缓冲区),驱动中就根据事先定义好的ioctl来动作,当然,你也可以定义一个Ioctl,传下来的消息里面再给出标示,让驱动区分是操作哪个设备。ISR里面根据不同的设备把数据放到相应的缓冲区里面。
大概就这样,兄弟再结合具体情况看看吧 |
|