图像采集处理之DDR内存分配

来源:互联网 发布:找客户的app软件 编辑:程序博客网 时间:2024/06/10 11:24

由于这是设计之后的一些资料整理和总结,有时候没有兼顾设计流程,知识点总结的顺序可能没有按照最初的设计顺序,这只是为了方便自己以后翻阅,还请不喜勿喷!

本设计中是用HLS加速的方法来对获取的视频进行算法处理,所以这过程中就必然会设计到PS与PL的数据交互,Xilinx Zynq中提供了专用于视频/图像等流数据传输的IP模块----VDMA,这种专用于视频传输的DMA和内存之间进行数据交互,大大降低了双Cortex-A9的数据处理压力。

Z-Turn Board上的DDRIII上有1GB大小的内存空间,由于本设计中会在ARM核上跑Linux OS,所以首先对DDR进行分块,一部分用于Linux OS的运行,一部分用于和VDMA之间进行数据交互,我是这样分配的---前512MB用于运行Linux OS,后256MB用于VDMA和DDRIII之间进行数据交互,还有Reserved 256MB for xylonfb driver。用于Linux OS文件系统使用不是ramdisk,而是SD卡 EXT4格式的文件系统。

接下来,首先修改u-boot中的DDRIII分配:进入u-boot/......./include/configs,打开zynq_zturn.h    gedit zynq_zturn.h

在上图中#define PHYS_SDRAM_1_SIZE可以看出总的DDRIII内存大小是1GB,现在将用于运行Linux OS的DDRIII物理空间大小定义成512MB-------->

#define PHYS_SDRAM_1_SIZE (512 * 1024 * 1024) 

修改设备树里面关于DDRIII的配置

进入内核中找到dts  ....//Kernel/linux-xlnx/arch/arm/boot/dts# gedit zynq-zturn.dts

将上图中memory修改成如下配置:

memory {
  device_type = "memory";
  reg = <0x0 0x20000000>; 
 };



修改启动参数:

bootargs = "console=ttyPS0,115200 root=/dev/mmcblk0p2 rw earlyprintk mem=512M rootfstype=ext4 rootwait devtmpfs.mount=0";  

用SD卡启动系统后,接下来可以用top命令监视内存、cpu的情况。

由于在Linux OS中操作内存时用的不是DDR的实际物理地址,而是映射后的用户空间的地址,这个地址可能超过DDR物理地址空间的范围。VDMA和DDR进行数据交互的时候使用的又是实际的物理地址,所以这其间不能简单的使用内存分配函数来进行处理,而是涉及到物理地址和映射地址(虚拟地址)之间的转换的事情,这个在后续章节阐述。


0 0