阅读:1559回复:3
pci数据传输与内存读写
我用9054开发的用户板,采用dma方式传输数据,局部总线是16位。
我用malloc()函数申请了一块内存 (具体是puf=(unsigned int *)malloc(378000)), 把dma的数据传输到内存。之后我用函数输出内存的数值 printf(\"%u\\n\",(unsigned int)*(puf+j));(j是循环变量)。 可是每个内存单元输出的是32位的数,按说应该是16位呀。而且我的j值只能取到94500,也就是378000/4。如果取189000运行就出错。但是如果取94501,它输出的最后一个数据会明显不同。(应该是出了我申请的内存范围了)。这是为什么?那位大虾帮助解释一下。 不论我输出为%u,%d,%x输出的都是32位数据。 是不是跟硬件有关,还是纯软件的问题。难道是pci总线与内存数据传输采用的是32位,虽然我用16位dma,但它实际上把相邻两个16位数据拼成一个32位数据再传输到内存。这是我猜的,不知道对不对。 |
|
沙发#
发布于:2005-05-18 21:50
dma传输的数据是你自己设定的,改变一下数据源的内容,分析一下是不是你想象的那样,试试看。
请问你用了sram了吗?那个型号好用?同步还是异步的? |
|
板凳#
发布于:2005-05-22 10:53
试试这么做行不
printf(\"%u\\n\",(unsigned int)*((unsigned short int*)puf+j)); |
|
地板#
发布于:2005-05-28 10:57
多谢两位了,我的问题已经解决了,我申请内存时把它改成WORD类型的就可以了,真奇怪,既然不支持unsigned int类型,可编译时却不出错,真晕。至于dma当然还是定义了几位就是几位,不是猜测的那样。
另外,我用的是fifo,觉得用的还可以,我用的idt72v2105。 [编辑 - 5/28/05 by flyingsea] |
|