Xilinx Axi Dma Userspace模式下 寄存器 +MMAP 测试程序
- 新上传的测试程序
- 等kenrel的部分 完成测试没问题, 可以分享一下 框架图 (long long time)
- gtthub https://github.com/HongDaYuGithub/fpga_arm_driver.git
邮箱: hongdayu.mars@gmail.com 有问题可以相互讨论
#include <cstdio>
#include "zynq7035.h"
#include <string>
#include "ftp.h"
#include <vector>const static std::string Use = "UserSpace Dma Test \n\n""-u [ftp romte login name] \n""-p [ftp romte login password]\n""-rf [ftp romte get filename]\n""-dma_size [dma test mem calloc size\n]""-dma_addr [dma test mem phy addr\n]""-dma_mode [axi dma mode\n]\n""axi dma mode:\n""[DIRECT_DMA_MODE 0x1]\n""[SG_DMA_MODE 0x2]\n""[RO_MODE] 0x4\n""[WO_MODE] 0x8\n""if you want all please use 0xFF \n";// 这是测试代码所以这部分代码可以共享一下
// kernel 的部分,和 实际的业务代码, 就不好分享了,(虽然的kernel 的部分 还没有做)
// RW 测试模式下恐有些问题,不建议 0xFF
// 使用命令行的时候建议使用 bash 脚本 综合测试,之所以没有配置文件感觉太麻烦
// 直接从ftp 获取数据源进行测试, 会分享到 github 中 遵循 MIT 协议
// 根据 read 和 write 的模式 页可以进行设置void args_parser(std::vector<std::string> args,Ftp& ftp_use,uint32_t& dma_addr,uint32_t& dma_size,uint8_t& _dma_mode_mask){ //// 命令行的解析函数,// 正常的命令行解析函数for(int i = 0 ; i < args.size() ; i++){if(args[i] == std::string("-u")){ftp_use.login_name = args[++i];}else if(args[i] == std::string("-p")){ftp_use.login_password = args[++i];}else if(args[i] == std::string("-rf")){ftp_use.filename = args[++i];}else if(args[i] == std::string("-ra")){ftp_use.ftp_addr = args[++i];}else if(args[i] == std::string("-dma_size")){dma_size = (uint32_t)std::stoul(args[++i],nullptr,16);}else if(args[i] == std::string("-dma_addr")){dma_addr = (uint32_t)std::stoul(args[++i],nullptr,16);}else if(args[i] == std::string("-dma_mode")){_dma_mode_mask = (uint8_t)std::stoul(args[++i],nullptr,16);}}if(dma_size == 0 || dma_addr == 0 || \ftp_use.login_name.size() == 0 || \ftp_use.login_password.size() == 0 || ftp_use.filename.size() == 0 || \ftp_use.ftp_addr.size() == 0 || _dma_mode_mask == 0){printf("%s",Use.c_str());exit(1);}
}int main(int argc,char* argv[]){ // 如果失败只能重启使用std::vector<std::string> args;for(int i = 1 ; i < argc ; i++){args.push_back(std::string(argv[i]));}uint32_t dma_addr,dma_size;uint8_t dma_mode;Ftp _ftp;args_parser(args,_ftp,dma_addr,dma_size,dma_mode); //获取dma的一个物理地址,在脚本中计算好,传入主程序解析使用char *buffer = (char*)calloc(sizeof(char)*2,dma_size); //开辟一段连续的内存空间_ftp.ftp_get(buffer,dma_size); //ftp 获取传输进来的 buffer, 这个buffer 为 dma 映射的区域Zynq7035 fpctr(COMMON_FPGA_BASEADDR,1024); //Fpga 的通用配置函数,无法同时测试收发Fpga* fpga_rw = &fpctr;uint32_t version;fpga_rw->read(0x0,version);printf("fpga version is %#x\n",version);fpctr.init_zynq7035(dma_mode);// 目前 硬件 用了 两种 不同的方案 一个 dma engine 用来 read 另一个 dma engine 用来 write// 只是用来测试的,所以无伤大雅if(dma_mode&RO_MODE){if(dma_mode&DIRECT_DMA_MODE){fpctr.read2slave(std::vector<uint32_t>());}else if(dma_mode&SG_DMA_MODE){printf("SG DMA READ MODE NONE \n");}}if(dma_mode&WO_MODE){if(dma_mode&DIRECT_DMA_MODE){printf("SAMPLE DMA WRITE MODE NONE \n");}else if(dma_mode&SG_DMA_MODE){fpctr.dmawrite_sg(buffer,dma_size);}}return 0;
}
问题一 : 在用户空间 无法连续使用大空间 往里面填写数据, 导致篡改了内核的某些进程的数据,导致内核直接挂死, 连续小内存的使用,没有任何的大问题, 但是无法满足业务要求,今天在测试一天如果,无法解决,直接在内核 做测试用例,同时创建业务代码
问题二: 上行的用户空间的测试用例没有任何问题,可能,测试了只有几个可能性,只有几个内存页的使用,其实也是小内存的使用,不影响大内存的使用
Xilinx Axi Dma Userspace模式下 寄存器 +MMAP 测试程序相关推荐
- 处理器不同模式下寄存器
1.1.1 ARM处理器不同模式下寄存器 CPU的模式不同,在其对应模式下可以使用的寄存器也不相同,如表3-2所示: 表3-2 ARM处理器模式下寄存器 寄存器类别 寄存器在汇编中的名称 各模式下 ...
- axi dma direct 模式 总结
STUCT XAxiDma 这些都是 github Xilinx 官方库中的源码,sample dma 的主要流程代码 DMA 控制器 mem addr 发送到fifo 设备, fifo 通过寻址 取 ...
- Xilinx axi dma driver 驱动构建 (二)
在xilinx axi_dma 驱动 中大部分都是初始化,和分配的通道的 功能 xilinx dma 的初始化驱动 完全可以采用 寄存器的方式代替; 就拿我们的业务例子来说, 是可以的功能单一简单 主 ...
- xilinx axi dma 深入开发(一)
以下为官方 axidma-proxy 源码 /*** Copyright (C) 2021 Xilinx, Inc** Licensed under the Apache License, Versi ...
- xilinx axi dma linux 快速搭建框架
kernel axi dma 驱动 也是更具数据手册来的, 先把业务简单跑起来,然后在做到内核里,熟悉 dma engine 框架 xilinx 驱动的 整个驱动框架,都是基于 platform bu ...
- AXI DMA总结、内核axidmatest.c测试程序分析、SG mode
AXI DMA 概述: XILINX提供的AXI DMA支持Scatter/Gather mode和Direct Register mode 数据位宽支持32,64,128,256,512,1024b ...
- xilinx sdk在Debug模式下根据地址在内存里观察值
写个简单赋值语句测试一下,进入Debug模式,鼠标靠在变量上会显示内存地址 在memory下monitors旁+号新建观察,把地址输进去就可以看见放在内存里的值了
- ZYNQ学习之路11.AXI DMA
一. AXI DMA简介 AXI DMA IP核提供了AXI4内存之间或AXI4-Stream IP之间的内存直接访问,可选为分散收集工作模式,初始化,状态和管理寄存器等通过AXI4-Lite 从机几 ...
- axi dma 寄存器配置_FPGA Xilinx Zynq 系列(三十二)AXI 接口
大侠好,欢迎来到FPGA技术江湖,江湖偌大,相见即是缘分.大侠可以关注FPGA技术江湖,在"闯荡江湖"."行侠仗义"栏里获取其他感兴趣的资源,或者一起煮酒言欢. ...
最新文章
- 外观模式 - 设计模式学习
- 大佬告诉你JavaScript面试题大全之基础面试题(附答案)
- 贪吃蛇一直显示正在连接服务器,贪吃蛇大作战进不去怎么办 解决方法
- linux如何在shell中自动生成1到100的数组
- mysql创建账号并赋予权限
- Project Pacific的第一次接触(转)
- 嵌入式操作系统内核原理和开发(系统中断仿真)
- 关于wkhtmltopdf生成pdf空白
- 团队作业8----第二次项目冲刺(Beta阶段) 第二天
- C语言malloc与calloc区别
- 聊一聊如何把SSL证书安装到小鸟云服务器上
- mysql database alias_mysql小结——基础篇
- MySQL数据库的索引、事务和存储引擎
- 2020年拼多多校招面试题及答案-最全最新-持续更新中
- python绘制网络拓扑图_python绘制网络拓扑_网络拓扑的python表示
- Android利用Socket与硬件通信之智能家居APP
- pillow进行图像处理
- PaperFree-论文查重
- 【MTK】 关于电信使用VoLTE异常
- c语言看门狗指令pic,PIC指令介绍
热门文章
- [HAOI2009]毛毛虫
- jQuery中的closest()和parents()的差别
- CCF201612-3 权限查询(100分)
- 创建自己的CA机构 - openssl cert 双向认证
- Swift实战-豆瓣电台(六)视图跳转,传参及回跳
- python django 的启动脚本
- 【译】Android系统简介—— Activity
- 【C】——如何用线程进行参数的传递
- 反编译华为U8825D“framework-res.apk”出现的错误提示(1)
- SWIG,C#沟通C++的桥梁