问题紧急求教!

在QNX下如何开辟一个Buffer?这样可以吗?
typedef unsigned long U32;

unsigned long *irqBuf;
unsigned long DmaMem[50];

irqBuf = (U32*)DmaMem;

那么我又如何取得这个Buffer的地址呢?这样可以吗?
nsigned long DMA_dest0;

DMA_dest0 = (U32)(DmaMem);
或者
DMA_dest0 = (U32)irqBuf;

我现在编程时需要作DMA传输,需要预先在内存中开辟一个Buffer,并把这个Buffer的地址告诉我的硬件设备。但是按照上面的方法发现数据并没有进入Buffer,在此向各位大虾求教。

要用mmap(),去查一下mmap()的函数说明。你需要一个“物理上连续”的内存空间。根据你所用的硬件和CPU,可能还要non-cache.

感谢唐先生。
那么我是否可以这样做:
typedef unsigned long U32;

unsigned long *irqBuf;

irqBuf = (U32*)malloc( 50 ); //这里根据函数说明size:The number of bytes to allocate. 那么如果我要申请的Buffer是双字的,size是否应该是50*4=200呢?

DMA_dest0 = mmap( irqBuf,
200(?or 50?),
PROT_READ|PROT_WRITE|PROT_NOCACHE,
MAP_PHYS|MAP_ANON,
NOFD,
0 );

请唐先生不吝赐教。

你要一个可以DMA的Buffer,是50个unsigned long的长度。

   unsigned long *irqBuf;
   off_t phy_irqbuf;

   irqBuf = (unsigned long *)mmap(0, 50 * sizeof(unsigned long),
                                                   PROT_READ|PROT_WRITE|PROT_NOCACHE,
                                                   MAP_PHYS|MAP_ANON, NOFD, 0);
   mem_offset(irqBuf, NOFD, 50 * sizeof(unsigned long), &phy_irqbuf, NULL)

你可以在你的程序中直接读写irqBuf,那个phy_irqbuf是irqBuf的物理地址,用来传给硬件(DMA控制器)的。
如果是x86,PROT_NOCACHE可以不要,x86总是可以snoop cache的。

谢谢唐先生:)