degyhy123
驱动小牛
驱动小牛
  • 注册日期2002-11-12
  • 最后登录2014-02-09
  • 粉丝0
  • 关注0
  • 积分15分
  • 威望71点
  • 贡献值0点
  • 好评度4点
  • 原创分0分
  • 专家分0分
阅读:2762回复:27

关于寄存器访问的问题

楼主#
更多 发布于:2004-12-10 11:55
各位老大,我现在对一个pci芯片的寄存器进行访问,这个芯片是内存映射的,我的访问方式是
 pBuffer->length=(*(volatile UINT8 *)(cantemp->Baseaddress+Message15+Messagecon))>>DLC_Shift;这段地址我用VirtualCopy转换过了,参数是   PAGE_READWRITE |PAGE_NOCACHE|PAGE_PHYSICAL,现在的情况是当我访问一次的时候读出的数据是0xff或者0x00,只有多读几遍才可以正确的读出数据,但是我在调试的时候用pb带的看mem的窗口看就我的那段内存的数据就是正确的,不知道为什么我在程序中读这个内存的值就是错的,
degyhy123
驱动小牛
驱动小牛
  • 注册日期2002-11-12
  • 最后登录2014-02-09
  • 粉丝0
  • 关注0
  • 积分15分
  • 威望71点
  • 贡献值0点
  • 好评度4点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2004-12-14 15:12
老大,我也想过这个问题,所以在调试状态下曾经把那个内存工具关了,但是现象依旧。
wxl_50685330
论坛版主
论坛版主
  • 注册日期2002-11-19
  • 最后登录2018-09-25
  • 粉丝0
  • 关注0
  • 积分1000分
  • 威望521点
  • 贡献值0点
  • 好评度419点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2004-12-14 13:54
你看到的虚拟地址最终仿真器也是从物理地址读来的嘛,仿真器要读还不是要发读命令,当然,所谓读命令对不同控制方式的设备含义是不一样的,比如对SDRAM,是同过/cs,/we,/cas,/ras,cke等等控制信号线的组合来给其内部控制寄存器提供命令,还有很多方式,我就不多说了,有些设备对命令有严格时序要求,而且读动作会通过连续一组“命令”来做,这样的话仿真器和你的代码如果都对设备发命令字,就会把时序弄乱,我不知道仿真器是不是自己会避免这种情况。
根据地的兄弟们,团结就是力量
degyhy123
驱动小牛
驱动小牛
  • 注册日期2002-11-12
  • 最后登录2014-02-09
  • 粉丝0
  • 关注0
  • 积分15分
  • 威望71点
  • 贡献值0点
  • 好评度4点
  • 原创分0分
  • 专家分0分
地板#
发布于:2004-12-14 13:36
是不是debugger和你的代码混着读这个地址破坏了时序了??可以说的详细一点吗,还有我看的内存地址是我的虚拟地址不是物理地址,这才是我奇怪的地方,
wxl_50685330
论坛版主
论坛版主
  • 注册日期2002-11-19
  • 最后登录2018-09-25
  • 粉丝0
  • 关注0
  • 积分1000分
  • 威望521点
  • 贡献值0点
  • 好评度419点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2004-12-14 13:03
你在读那段数据的时候不要把看mem的窗口打开看那段数,是不是debugger和你的代码混着读这个地址破坏了时序了,对了,你在mem里面看的那段地址空间就是0xe8000000?
根据地的兄弟们,团结就是力量
degyhy123
驱动小牛
驱动小牛
  • 注册日期2002-11-12
  • 最后登录2014-02-09
  • 粉丝0
  • 关注0
  • 积分15分
  • 威望71点
  • 贡献值0点
  • 好评度4点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2004-12-13 16:52
可以肯定板子是没有问题的,现在最奇怪的事情是用pb带的mem观看的程序可以看到我的那段虚拟内存的值是正确。真是太奇怪了
wxl_50685330
论坛版主
论坛版主
  • 注册日期2002-11-19
  • 最后登录2018-09-25
  • 粉丝0
  • 关注0
  • 积分1000分
  • 威望521点
  • 贡献值0点
  • 好评度419点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2004-12-13 16:24
喔,兄弟说得对,virtualcopy应该可以,0xe8000000这个已经超多ce内核地址了,这个地址应该是给的物理地址, 而且给了PAGE_NOCACHE的,ce应该知道用不可缓存地址来访问。

对了,确定板子没问题?
根据地的兄弟们,团结就是力量
wwei_wang
驱动大牛
驱动大牛
  • 注册日期2002-06-07
  • 最后登录2006-06-23
  • 粉丝0
  • 关注0
  • 积分77分
  • 威望9点
  • 贡献值0点
  • 好评度7点
  • 原创分0分
  • 专家分0分
7楼#
发布于:2004-12-13 14:37
有没有可能是你对CAN接口芯片的操作有问题?如通过CAN的发送或接收。
Come on, let us drive the world.
degyhy123
驱动小牛
驱动小牛
  • 注册日期2002-11-12
  • 最后登录2014-02-09
  • 粉丝0
  • 关注0
  • 积分15分
  • 威望71点
  • 贡献值0点
  • 好评度4点
  • 原创分0分
  • 专家分0分
8楼#
发布于:2004-12-13 13:27
现在还有一个很奇怪的现象,我头几次没有读到数据,但是多发几次就收到正常了,正是奇怪了,我用pb的mem观察工具就每次都可以看到
degyhy123
驱动小牛
驱动小牛
  • 注册日期2002-11-12
  • 最后登录2014-02-09
  • 粉丝0
  • 关注0
  • 积分15分
  • 威望71点
  • 贡献值0点
  • 好评度4点
  • 原创分0分
  • 专家分0分
9楼#
发布于:2004-12-11 10:28
老大,我现在是用 pDevDesc->adwMemBase[dwIndex]  =(DWORD) VirtualAlloc( 0,pDevDesc->Info.Window.memWindows[dwIndex].dwLen, MEM_RESERVE, PAGE_NOACCESS );和VirtualCopy( (LPVOID)pDevDesc->adwMemBase[dwIndex],
                            (LPVOID)((pDevDesc->Info.Window.memWindows[dwIndex].dwBase)>>8),
                            
   pDevDesc->Info.Window.memWindows[dwIndex].dwLen,
                            PAGE_READWRITE |PAGE_NOCACHE|PAGE_PHYSICAL );来映射我的pci内存地址,也是可以访问我的寄存器的,我有一个情况没有说就是我的pci设备接的串口和can控制器,串口寄存器访问正常,can的一部分寄存器访问就出现上面我说的情况
wxl_50685330
论坛版主
论坛版主
  • 注册日期2002-11-19
  • 最后登录2018-09-25
  • 粉丝0
  • 关注0
  • 积分1000分
  • 威望521点
  • 贡献值0点
  • 好评度419点
  • 原创分0分
  • 专家分0分
10楼#
发布于:2004-12-10 17:45
MmMapIoSpace这个不是指用来映射i/o空间的的意思,这个和HalTranslateBusAddress一起用来映射总线空间到虚拟mem空间,你的作了第一步,现在用MmMapIoSpace映射一次就行了。你试试
根据地的兄弟们,团结就是力量
degyhy123
驱动小牛
驱动小牛
  • 注册日期2002-11-12
  • 最后登录2014-02-09
  • 粉丝0
  • 关注0
  • 积分15分
  • 威望71点
  • 贡献值0点
  • 好评度4点
  • 原创分0分
  • 专家分0分
11楼#
发布于:2004-12-10 17:35
好像应该是mem中的位置,老大这是什么意思,还有我现在的空间不是io空间,所以我没有用MmMapIoSpace函数,我的这个地址是真正的mem地址,我的表达不是很好,也不知道你能明白吗
wxl_50685330
论坛版主
论坛版主
  • 注册日期2002-11-19
  • 最后登录2018-09-25
  • 粉丝0
  • 关注0
  • 积分1000分
  • 威望521点
  • 贡献值0点
  • 好评度419点
  • 原创分0分
  • 专家分0分
12楼#
发布于:2004-12-10 17:32
好像应该是mem中的位置:),你刚说你用pb看了,那用MmMapIoSpace来映射
根据地的兄弟们,团结就是力量
wxl_50685330
论坛版主
论坛版主
  • 注册日期2002-11-19
  • 最后登录2018-09-25
  • 粉丝0
  • 关注0
  • 积分1000分
  • 威望521点
  • 贡献值0点
  • 好评度419点
  • 原创分0分
  • 专家分0分
13楼#
发布于:2004-12-10 17:26
哇,没看到这句,你用的是这个地址是pci使用的内存空间,还是pci总线空间
根据地的兄弟们,团结就是力量
wxl_50685330
论坛版主
论坛版主
  • 注册日期2002-11-19
  • 最后登录2018-09-25
  • 粉丝0
  • 关注0
  • 积分1000分
  • 威望521点
  • 贡献值0点
  • 好评度419点
  • 原创分0分
  • 专家分0分
14楼#
发布于:2004-12-10 17:17
你需要找到你所使用的物理地址对应的ce内核不可缓存虚拟地址,然后映射的时候用ce内核不可缓存虚拟地址来做,你可以找bsp里面的OEMAddressTable表来确定这个对应关系.
根据地的兄弟们,团结就是力量
degyhy123
驱动小牛
驱动小牛
  • 注册日期2002-11-12
  • 最后登录2014-02-09
  • 粉丝0
  • 关注0
  • 积分15分
  • 威望71点
  • 贡献值0点
  • 好评度4点
  • 原创分0分
  • 专家分0分
15楼#
发布于:2004-12-10 17:14
老大,我是pci设备,cpu是x86,0xe8000000是我的bios分配的
wxl_50685330
论坛版主
论坛版主
  • 注册日期2002-11-19
  • 最后登录2018-09-25
  • 粉丝0
  • 关注0
  • 积分1000分
  • 威望521点
  • 贡献值0点
  • 好评度419点
  • 原创分0分
  • 专家分0分
16楼#
发布于:2004-12-10 17:05
:),好像有点儿不对,你的物理地址多少?0xe8000000?这个地址有问题,超过范围了喔,你的这个地址怎么来的?这段是你的芯片内部寄存器地址?你的芯片手册上是多少?看看
根据地的兄弟们,团结就是力量
degyhy123
驱动小牛
驱动小牛
  • 注册日期2002-11-12
  • 最后登录2014-02-09
  • 粉丝0
  • 关注0
  • 积分15分
  • 威望71点
  • 贡献值0点
  • 好评度4点
  • 原创分0分
  • 专家分0分
17楼#
发布于:2004-12-10 16:36
老大,我换成了  bRes = VirtualCopy( (LPVOID)pDevDesc->adwMemBase[dwIndex],
                            (LPVOID)(pDevDesc->Info.Window.memWindows[dwIndex].dwBase),
                            pDevDesc->Info.Window.memWindows[dwIndex].dwLen,PAGE_READWRITE | PAGE_NOCACHE );但是这个虚拟内存里的东西都是0xff了,不对了
degyhy123
驱动小牛
驱动小牛
  • 注册日期2002-11-12
  • 最后登录2014-02-09
  • 粉丝0
  • 关注0
  • 积分15分
  • 威望71点
  • 贡献值0点
  • 好评度4点
  • 原创分0分
  • 专家分0分
18楼#
发布于:2004-12-10 16:02
老大,不对呀我的那段虚拟内存都是0xff了
degyhy123
驱动小牛
驱动小牛
  • 注册日期2002-11-12
  • 最后登录2014-02-09
  • 粉丝0
  • 关注0
  • 积分15分
  • 威望71点
  • 贡献值0点
  • 好评度4点
  • 原创分0分
  • 专家分0分
19楼#
发布于:2004-12-10 15:33
怎么寄存器的值都没有反映了
上一页
游客

返回顶部