ymvv
驱动牛犊
驱动牛犊
  • 注册日期2001-11-30
  • 最后登录2005-05-09
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:3097回复:9

VxWorks中IO空间和Memory空间的访问

楼主#
更多 发布于:2001-12-10 11:39
有哪位大侠知道如何在VxWorks中访问设备寄存器的IO空间?如果要使用Memory空间,需经过哪些操作?两种空间是不是和Windows一样,用不同的函数来访问?

最新喜欢:

南天灵南天灵
没有你,我不知道怎么办...
gavinux
驱动牛犊
驱动牛犊
  • 注册日期2001-03-23
  • 最后登录2005-02-28
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2001-12-13 02:32
I think you can find it in vxworks programme guid
[url=http://embdev.gotdns.org/]http://embdev.gotdns.org/[/url]
ymvv
驱动牛犊
驱动牛犊
  • 注册日期2001-11-30
  • 最后登录2005-05-09
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2001-12-13 08:56
IO空间的访问函数我找到了,但memory...

是这样的,我通过pci的配置空间得到了寄存器的基地址,然后就直接把地址里内容读出来,但内容不对。不知是否还有什么如地址转换或地址映射的工作。
没有你,我不知道怎么办...
gavinux
驱动牛犊
驱动牛犊
  • 注册日期2001-03-23
  • 最后登录2005-02-28
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地板#
发布于: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. :)
[url=http://embdev.gotdns.org/]http://embdev.gotdns.org/[/url]
ymvv
驱动牛犊
驱动牛犊
  • 注册日期2001-11-30
  • 最后登录2005-05-09
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地下室#
发布于: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.
没有你,我不知道怎么办...
gavinux
驱动牛犊
驱动牛犊
  • 注册日期2001-03-23
  • 最后登录2005-02-28
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
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.  :(
[url=http://embdev.gotdns.org/]http://embdev.gotdns.org/[/url]
Pharos
驱动牛犊
驱动牛犊
  • 注册日期2001-08-13
  • 最后登录2005-02-28
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2001-12-18 09:18
从PCI空间的地址寄存器里读出的是设备的物理地址而已,但是我们要访问的是这个设备在某一操作系统(如,vxworks)里的虚拟地址,所以你在读出设备物理地址之后,还需要在vxworks里找到一个实现memory map 功能的函数才行。象这样的一个函数在每个OS中都有提供。
没有我,你怎么办,你的泪水谁为你擦干; 谁为你打伞,安慰你心寒,失眠的夜你最怕孤单。
ymvv
驱动牛犊
驱动牛犊
  • 注册日期2001-11-30
  • 最后登录2005-05-09
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
7楼#
发布于:2001-12-18 13:30
一定要转换为虚拟地址吗?如果我不初始化MMU,或我没有MMU,可不可以直接访问物理地址?

如果是IO空间,是不是就不用转化了,直接用访问IO空间的函数就行了?
没有你,我不知道怎么办...
stonysh
驱动牛犊
驱动牛犊
  • 注册日期2001-08-01
  • 最后登录2004-01-15
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
8楼#
发布于:2001-12-18 14:07
是的
lirui_Fiberhome
驱动牛犊
驱动牛犊
  • 注册日期2002-10-30
  • 最后登录2002-10-30
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
9楼#
发布于:2002-10-30 10:24
从PCI的配置空间中可以读出内存基地址和IO基地址,内存基地址自己可以指定,如果没有MMU,虚拟地址和物理地址应该是一样的吧,OS中提供的address map函数也有什么都不作的。如果是直接的PCI设备就可以直接操作寄存器了!
游客

返回顶部