阅读:3401回复:9
VxWorks中IO空间和Memory空间的访问
有哪位大侠知道如何在VxWorks中访问设备寄存器的IO空间?如果要使用Memory空间,需经过哪些操作?两种空间是不是和Windows一样,用不同的函数来访问?
|
|
最新喜欢:南天灵
|
沙发#
发布于:2001-12-13 02:32
I think you can find it in vxworks programme guid
|
|
|
板凳#
发布于:2001-12-13 08:56
IO空间的访问函数我找到了,但memory...
是这样的,我通过pci的配置空间得到了寄存器的基地址,然后就直接把地址里内容读出来,但内容不对。不知是否还有什么如地址转换或地址映射的工作。 |
|
|
地板#
发布于:2001-12-14 22:43
I am not sure if you set MMU correctly, if your chip has MMU.
you can just use a pointer points to memory address and read that address. for example: volatile unsigned int * puiMemAddress = 0x12345678; unsigned int ui; ui = *puiMemAddress; Be aware of the volatile, you should always apply that. otherwise you should apply -fvolatile to your gcc command line. :) |
|
|
地下室#
发布于:2001-12-15 09:49
gavinux, 多谢指点,我将地址指针的类型改为volatile UINT32 *了,但用*pBaseAddr取出内容时出现了Exception Number 14, Page Fault
我不太清楚mmu的意思。我的目标机是普通的Intelx86,如果有mmu,还要进行哪些操作?我在代码中加入了 sysMmuMapAdd((void *)baseAddr, 21*4L,/*size of baseAddr*/ VM_STATE_MASK_FOR_ALL, VM_STATE_FOR_PCI); 但无济于事。 大侠做过pci的驱动吗?能否email一些代码过来?我的email: ymvivian@sina.com 或是我将我的代码发给你,麻烦你帮我看看? Thank you. |
|
|
5楼#
发布于:2001-12-16 01:31
MMU=Memory Management Unit, which is used to map you physical address to a virtual address. After the map, all the address used in your code should be virtal address.
I don\'t know your Intelx86 x=?, I think there is no MMU when x<=4. I am pretty sure your code wants to R/W an invalide address. Sorry, I didn\'t do anything related to PCI. :( |
|
|
6楼#
发布于:2001-12-18 09:18
从PCI空间的地址寄存器里读出的是设备的物理地址而已,但是我们要访问的是这个设备在某一操作系统(如,vxworks)里的虚拟地址,所以你在读出设备物理地址之后,还需要在vxworks里找到一个实现memory map 功能的函数才行。象这样的一个函数在每个OS中都有提供。
|
|
|
7楼#
发布于:2001-12-18 13:30
一定要转换为虚拟地址吗?如果我不初始化MMU,或我没有MMU,可不可以直接访问物理地址?
如果是IO空间,是不是就不用转化了,直接用访问IO空间的函数就行了? |
|
|
8楼#
发布于:2001-12-18 14:07
是的
|
|
9楼#
发布于:2002-10-30 10:24
从PCI的配置空间中可以读出内存基地址和IO基地址,内存基地址自己可以指定,如果没有MMU,虚拟地址和物理地址应该是一样的吧,OS中提供的address map函数也有什么都不作的。如果是直接的PCI设备就可以直接操作寄存器了!
|
|