赞
踩
环境:JFMQL20S484 复旦微国产SOC处理器(对标zynq XC7Z020)
项目:XX项目
子项目:存储模块控制逻辑
子项目描述:PL实现FLASH阵列控制逻辑(NFC ip),PS实现以太网协议栈、freeRTOS和 NFC控制,PC通过以太网下发控制指令,实现对FLASH阵列的芯片选择、读、写、擦除、读速率测试、写速率测试等功能。
现象1:在FREERTOS 操作系统下,PS发送读FLASH命令,PL内的NFC启动读操作时序,然后将读到的数据存储到FIFO中,DMA将数据从FIFO中搬运到DDR中,但是在PS端去读DDR的内容,没有数据;
现象2:在裸机状态下,DMA可以将数据搬运到DDR中。
现象分析:操作系统和裸机状态的差异在是否使能CACHE,裸机没有使能CACHE,所以DMA可以直接将数据搬运到DDR中,但是操作系统需要使能CACHE,DMA将数据搬运到DDR中后,CACHE中的数据没有更新,所以PS无法读取到数据;
通过在网上查阅资料,zynq中PL向PS中搬运数据,需要调用以下函数:
- //写点什么到发送缓冲区sendram
- Xil_DCacheFlushRange((u32)sendram,sizeofbuffer);//将内容刷新至DDR
- //启动发送DMA过程。。。。
-
- //启动接收DMA过程。。。。。
- Xil_DCacheInvalidateRange((u32)recvram,sizeofbuffer);//将DDR内容拉进Cache
- //从recvram中读取数据吧!
通过调用复旦微提供的类似库函数,数据还是无法搬运到DDR中,联系了复旦微的技术人员,得到的答复是需要在接收数据之前调用invalidate_dcache_range(unsigned long start, unsigned long stop)函数,
在发送数据之前需要调用flush_dcache_range(unsigned long start, unsigned long stop)函数,修改之后,PL数据可以通过DMA搬运到DDR中。
这就是国产处理器与进口的差异所导致的。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。