flyingsea
驱动牛犊
驱动牛犊
  • 注册日期2004-04-11
  • 最后登录2005-06-17
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:1559回复:3

pci数据传输与内存读写

楼主#
更多 发布于:2005-05-18 10:24
我用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位数据再传输到内存。这是我猜的,不知道对不对。
waterbird521
驱动牛犊
驱动牛犊
  • 注册日期2003-05-13
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分103分
  • 威望18点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2005-05-18 21:50
dma传输的数据是你自己设定的,改变一下数据源的内容,分析一下是不是你想象的那样,试试看。
请问你用了sram了吗?那个型号好用?同步还是异步的?
wistful
驱动牛犊
驱动牛犊
  • 注册日期2003-10-29
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2005-05-22 10:53
试试这么做行不
printf(\"%u\\n\",(unsigned int)*((unsigned short int*)puf+j));
flyingsea
驱动牛犊
驱动牛犊
  • 注册日期2004-04-11
  • 最后登录2005-06-17
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地板#
发布于:2005-05-28 10:57
多谢两位了,我的问题已经解决了,我申请内存时把它改成WORD类型的就可以了,真奇怪,既然不支持unsigned int类型,可编译时却不出错,真晕。至于dma当然还是定义了几位就是几位,不是猜测的那样。
另外,我用的是fifo,觉得用的还可以,我用的idt72v2105。

[编辑 -  5/28/05 by  flyingsea]
游客

返回顶部