I am using a Zynq processor on a MicroZed board and I am working to incorporate FreeRTOS into the project. I am using DMA to send data from the PS to the PL. The problem I am experiencing is that I don’t get the interrupt from the PL when the transfer is complete hence I cannot acknowledge it and the interrupt stays high forever.
I followed the following procedure:
I have a minimal bare metal application that sends the packet from the PS to the PL using SimpleTransfer DMA. The application sets up the dma and interrupts to receive the interrupt and I can watch the acknowledgement in an ILA I have setup on the device. I have arranged all of the interrupt and dma setup in a single function so I can just copy it to the FreeRTOS implementation, comment out a few lines and be good.
I got the FreeRTOS blinky demo to work. I removed everything except the blinky code to get the example as simple as possible. I left in the two tasks to turn on and off the led.
I copied this application to a new project and added a semiphore and a new task that fires once when the semiphore fires that sends the dma packet to the PL. I used the interrupt and dma setup procedure that I used in the minimal bare metal app. I can see the interrupt go high in the ILA in the PS and it never goes low. I am not able to acknowledge the interrupt because I get the interrupt in my FreeRTOS implementation.
I have an application that I built 6 months ago that uses the same concept, it is more complicated in that it services DMA from the PL to the PS in scatter gather. It actually had a FreeRTOS task as the interrupt service. This problem I don’t need to service the interrupt except to acknowledge that the packet was sent. I look at this old application and cannot seem to see anything different. I am still looking.