阅读:2748回复: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的处理器上使用 |
|