| 
			 
					阅读:2881回复:13
				 
				在CE 3.0下如何对端口地址进行直接访问?多谢!!
					不知道能否在CE3.0或更高版本中,直接端口,我C标准库的函数好象是不支持的。多谢大家!!!(我用的是EVC3.0) 
							[编辑 - 12/18/03 by wdsjmg]  | 
	|
| 
			 沙发# 
								发布于:2003-12-19 09:56				
			用户被禁言,该主题自动屏蔽! 				 | 
	|
| 
			 板凳# 
								发布于:2003-12-19 10:25				
			
					多谢帮助!
 
							我已经调用了READ/WRITE_PORT_UCHAR/USHORT/ULONG,它好象在POCKET 2000下不能编译的,我没有在那里发现必需的CEDDK.LIB头文件,改变成POCKET 2002环境后,发现可以调用该函数,但是始终编译不过去,后来发现在POCKET 2002中没有发现CEDDK.LIB的链接库。我不知道为什么找不到该链接库,问题出在了那里,请指教,多谢了。 编译错误提示如下: CFTestDlg.obj : error LNK2019: unresolved external symbol WRITE_PORT_USHORT referenced in function \"protected: void __cdecl CCFTestDlg::OnButton1(void)\" (?OnButton1@CCFTestDlg@@IAAXXZ) ARMRel/CFTest.exe : fatal error LNK1120: 1 unresolved externals  | 
	|
| 
			 地板# 
								发布于:2003-12-19 10:48				
			用户被禁言,该主题自动屏蔽! 				 | 
	|
| 
			 地下室# 
								发布于:2003-12-19 11:00				
			用户被禁言,该主题自动屏蔽! 				 | 
	|
| 
			 5楼# 
								发布于:2003-12-19 11:37				
			
					是我那里做错了么?
 
							在CE下没有KERNEL和APP之分的,那些函数是可以在APP中使用的。 不过我很奇怪,我这里实现的有什么问题么? 我刚开始是在POCKET 2000下调用的,哪个环境下面好象根本不支持这些函数。后来更改到POCKET 2002环境,可以调用了,但是出现了我刚才提到的问题。我查找调用那些函数需要链接的头文件和链接库,发现在2002的头文件存在,但是链接库是没有的。不知道是为什么???是我的EVC3。0安装有问题,还是少了什么东西? 多谢了,另外你有QQ么?可以方便联系;)  | 
	|
| 
			 6楼# 
								发布于:2003-12-19 13:01				
			用户被禁言,该主题自动屏蔽! 				 | 
	|
| 
			 7楼# 
								发布于:2003-12-19 13:03				
			用户被禁言,该主题自动屏蔽! 				 | 
	|
| 
			 8楼# 
								发布于:2003-12-19 13:05				
			
					这些函数都可以找到源代码,在 %_WINCEROOT%\\Public\\Common\\Oak\\Drivers\\CEDDK\\Ddk_io.c. 
 
							比如: VOID WRITE_PORT_ULONG( PULONG Port, ULONG Value ) { #if defined(x86) __asm { mov dx, word ptr Port mov eax, Value out dx, eax } #else *(volatile PULONG const)Port = Value; #endif } 所以,问题的关键不在于怎么样才能调用这个函数,而在于Port的地址对不对,是不是合法的,可以访问的. CE下当然后KERNEL和APP之分,APP只有USER权限,不能直接访问物理地址.通过这些代码我们可以看到,WRITE_PORT_ULONG并没有做权限切换,也不会验证你输入的port参数的地址是否正确,它只是简单的赋值.所以如果你想在APP里正确的使用,你必须把PORT的物理地址通过MmMapIoSpace()或VirtualAlloc()/VirtualCopy()映射成虚拟地址,这样APP才有权限去读写. 所以我想你也不用再去找什么LIB和DLL了,JUST DO THIS: *(volatile PULONG const)Port = Value;  | 
	|
					
						
  | 
	
| 
			 9楼# 
								发布于:2003-12-19 13:50				
			
					多谢你的帮助:)
 
							不过我发现了另外的问题,POCKET 2000/2002 ARM环境下,好象还不支持VirtualCopy()函数,就更不用提MmMapIoSpace()了。HELP里面好象只提到了VirtualAlloc,VirtualFree, VirtualProtect, VirtualQuery四个函数,因此我还是不知道该怎么把系统端口的内容怎么影射到AP中。多谢指教。 [编辑 - 12/20/03 by wdsjmg]  | 
	|
| 
			 10楼# 
								发布于:2003-12-22 09:04				
			用户被禁言,该主题自动屏蔽! 				 | 
	|
| 
			 11楼# 
								发布于:2004-01-13 16:59				
			
					我要进行对系统内存的地址影射,就必须知道指定设备端口I/O ADDRESS具体对应的物理地址,但是我得不到该物理地址。
 
							我需要访问的好象是PCMCIA bus,I/O端口是0x1f0,ARM得处理器,不知道我该怎么得到该端口的具体物理地址,请指教,多谢了。  | 
	|
| 
			 12楼# 
								发布于:2004-05-08 10:15				
			
					你将ceddk.lib的路径指到你的工程目录下(那里有)这样我想你就可以调用了				 
							 | 
	|
| 
			 13楼# 
								发布于:2004-05-08 14:02				
			
					READ_PORT_UCHAR/USHORT/ULONG
 
							WRITE_PORT_UCHAR/USHORT/ULONG 只对X86有用,不能在ARM的处理器上使用  | 
	|