各位好!
我现在基于CE6系统,利用芯片的DMA,读取设备的数据。
应用程序将定义的数据的首地址及数据长度,通过DeviceIoControl传给驱动程序。驱动程序中启动DMA,并开启一个线程等待DMA中断。中断后,停止DMA工作,并将DMA所读取的数据复制给传入的数据地址中(CeSafeCopyMemory),这时会时不时地出现类似指针越界的情况(约10%左右的出错率)。
如果驱动程序中启动DMA后,直接死等DMA中断(不单独使用线程),然后直接复制数据,就不会出错,这是什么原因呢?不知有没有谁遇到过。
------解决方案--------------------
DMA只会操作物理地址,应用层传下来的是虚拟地址。
你需要在驱动里开辟物理地址,然后应用层去映射虚拟地址