zynq下的ucos系统并没有像uart一样,已经封装成ucos系统下的调用方式。如果在ucos系统下使用,就需要按照ucos系统的方式,进行封装sdk下的xdmaps中函数,因为ucos将中断的调用方式,重新做了封装,所以直接使用xdmaps估计中断会存在问题。
首先是dmsps的初始化,封装函数如下,基本调用xdmaps中的函数,增加了互斥信号量与使用信号量,见上面UCOS_DMAPS的定义。ps dma含有8个通道,每个通道可以单独工作,这里只有使用了通道0,所以只对通道0进行了信号量控制。
初始化中可包含了,对dma通道0中断的映射,这个完全是调用ucos的函数进行的。并且中断处理函数的指针与xdmaps中的handle也是不一样的,如下所示。中断id需要在sdk中查询,然后赋值,见上图中的XPAR_XDMAPS_0_DONE_INTR_0。前4个通道与后4个通道的中断id是不连续的。
启动dma传输还是使用xdmaps中的XDmaPs_Start()函数,只是在启动前,增加了获取互斥信号量与通道信号量的内容,代码如下。
最后是dma中断处理,函数如下所示,调用了xdmaps中的XDmaPs_DoneISR_0()中断函数,里面有清中断标志操作等,如果自己写,不一定能写全,所以直接调用了。这里就是释放dma通道信号,使程序回到dma发送函数中,完成发送同步。