阅读:2762回复:27
关于寄存器访问的问题
各位老大,我现在对一个pci芯片的寄存器进行访问,这个芯片是内存映射的,我的访问方式是
pBuffer->length=(*(volatile UINT8 *)(cantemp->Baseaddress+Message15+Messagecon))>>DLC_Shift;这段地址我用VirtualCopy转换过了,参数是 PAGE_READWRITE |PAGE_NOCACHE|PAGE_PHYSICAL,现在的情况是当我访问一次的时候读出的数据是0xff或者0x00,只有多读几遍才可以正确的读出数据,但是我在调试的时候用pb带的看mem的窗口看就我的那段内存的数据就是正确的,不知道为什么我在程序中读这个内存的值就是错的, |
|
沙发#
发布于:2004-12-14 15:12
老大,我也想过这个问题,所以在调试状态下曾经把那个内存工具关了,但是现象依旧。
|
|
论坛版主
![]() |
板凳#
发布于:2004-12-14 13:54
你看到的虚拟地址最终仿真器也是从物理地址读来的嘛,仿真器要读还不是要发读命令,当然,所谓读命令对不同控制方式的设备含义是不一样的,比如对SDRAM,是同过/cs,/we,/cas,/ras,cke等等控制信号线的组合来给其内部控制寄存器提供命令,还有很多方式,我就不多说了,有些设备对命令有严格时序要求,而且读动作会通过连续一组“命令”来做,这样的话仿真器和你的代码如果都对设备发命令字,就会把时序弄乱,我不知道仿真器是不是自己会避免这种情况。
|
|
地板#
发布于:2004-12-14 13:36
是不是debugger和你的代码混着读这个地址破坏了时序了??可以说的详细一点吗,还有我看的内存地址是我的虚拟地址不是物理地址,这才是我奇怪的地方,
|
|
论坛版主
![]() |
地下室#
发布于:2004-12-14 13:03
你在读那段数据的时候不要把看mem的窗口打开看那段数,是不是debugger和你的代码混着读这个地址破坏了时序了,对了,你在mem里面看的那段地址空间就是0xe8000000?
|
|
5楼#
发布于:2004-12-13 16:52
可以肯定板子是没有问题的,现在最奇怪的事情是用pb带的mem观看的程序可以看到我的那段虚拟内存的值是正确。真是太奇怪了
|
|
论坛版主
![]() |
6楼#
发布于:2004-12-13 16:24
喔,兄弟说得对,virtualcopy应该可以,0xe8000000这个已经超多ce内核地址了,这个地址应该是给的物理地址, 而且给了PAGE_NOCACHE的,ce应该知道用不可缓存地址来访问。
对了,确定板子没问题? |
|
7楼#
发布于:2004-12-13 14:37
有没有可能是你对CAN接口芯片的操作有问题?如通过CAN的发送或接收。
|
|
|
8楼#
发布于:2004-12-13 13:27
现在还有一个很奇怪的现象,我头几次没有读到数据,但是多发几次就收到正常了,正是奇怪了,我用pb的mem观察工具就每次都可以看到
|
|
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的一部分寄存器访问就出现上面我说的情况 |
|
论坛版主
![]() |
10楼#
发布于:2004-12-10 17:45
MmMapIoSpace这个不是指用来映射i/o空间的的意思,这个和HalTranslateBusAddress一起用来映射总线空间到虚拟mem空间,你的作了第一步,现在用MmMapIoSpace映射一次就行了。你试试
|
|
11楼#
发布于:2004-12-10 17:35
好像应该是mem中的位置,老大这是什么意思,还有我现在的空间不是io空间,所以我没有用MmMapIoSpace函数,我的这个地址是真正的mem地址,我的表达不是很好,也不知道你能明白吗
|
|
论坛版主
![]() |
12楼#
发布于:2004-12-10 17:32
好像应该是mem中的位置:),你刚说你用pb看了,那用MmMapIoSpace来映射
|
|
论坛版主
![]() |
13楼#
发布于:2004-12-10 17:26
哇,没看到这句,你用的是这个地址是pci使用的内存空间,还是pci总线空间
|
|
论坛版主
![]() |
14楼#
发布于:2004-12-10 17:17
你需要找到你所使用的物理地址对应的ce内核不可缓存虚拟地址,然后映射的时候用ce内核不可缓存虚拟地址来做,你可以找bsp里面的OEMAddressTable表来确定这个对应关系.
|
|
15楼#
发布于:2004-12-10 17:14
老大,我是pci设备,cpu是x86,0xe8000000是我的bios分配的
|
|
论坛版主
![]() |
16楼#
发布于:2004-12-10 17:05
:),好像有点儿不对,你的物理地址多少?0xe8000000?这个地址有问题,超过范围了喔,你的这个地址怎么来的?这段是你的芯片内部寄存器地址?你的芯片手册上是多少?看看
|
|
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了,不对了 |
|
18楼#
发布于:2004-12-10 16:02
老大,不对呀我的那段虚拟内存都是0xff了
|
|
19楼#
发布于:2004-12-10 15:33
怎么寄存器的值都没有反映了
|
|
上一页
下一页