dma传输与memcpy传输对比测试程序

系统性能优化——Linux系统上运用DMA实现memcpy DMA(Direct Memory Access)是一种高效的数据传输方式,允许某些硬件子系统在不需要CPU介入的情况下直接访问系统内存。高效性:通过DMA,数据可以直接在内存和I/O设备之间传输,而不需要经过CPU。这样可以减少CPU的负担,使其可以处理其他任务。自主性:一旦CPU初始化了传输操作,DMA控制器就会接管总线控制权,自行完成数据传输任务。这意味着在传输过程中,CPU可以并行执行其他操作。高速性:DMA通常用于高速数据传输,特别是在大量数据的移动时,能够显著提高系统的吞吐量。硬件控制。 阅读详情
/*
 * DMA test module
 *
 * Copyright (C) 2007 KEDACOM Corporation
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License version 2 as
 * published by the Free Software Foundation.
 */
#include <linux/delay.h>
#include <linux/dmaengine.h>
#include <linux/init.h>
#include <linux/kthread.h>
#include <linux/module.h>
#include <linux/moduleparam.h>
#include <linux/random.h>
#include <linux/slab.h>
#include <linux/wait.h>
#include <linux/gfp.h>
#include <linux/kernel.h>
#include <linux/highmem.h>
#include <linux/mm.h>
#include <linux/dma-mapping.h>
#include <linux/async_tx.h>
#include <linux/jiffies.h>

#define XFER_TIMES 4000
#define XFER_LEN  1<<20

void *dma_src,*dma_dest;
struct dma_chan *chan = NULL;

static int __init dmatest_init(void)
{

    int xfer_order = get_order(XFER_LEN);
    int i,ret ;
    dma_cap_mask_t mask;
    dma_cookie_t cookie;
    enum dma_status status;
    u64 j1,j2;

    dma_src = __get_free_pages(GFP_KERNEL | GFP_DMA, xfer_order);
    if (!dma_src) {
        printk(KERN_ALERT "dma_src :alloc memory fail.\n");
        ret = -ENOMEM;
        goto CLEAN;

    }
    
    dma_dest = __get_free_pages(GFP_KERNEL | GFP_DMA, xfer_order);
    if (!dma_dest) {
        printk(KERN_ALERT "dma_dest :alloc memory fail.\n");
        ret = -ENOMEM;
        goto CLEAN;
    }
    printk(KERN_NOTICE"dma_src=%#x,dma_dest=%#x\n",dma_src,dma_dest);    
    dma_cap_zero(mask);
    dma_cap_set(DMA_MEMCPY, mask);
    chan = dma_request_channel(mask, NULL, NULL);
    
    if (chan) {
        printk(KERN_NOTICE "dma_request_channel ok,current channel is : %s\n",dma_chan_name(chan));
    }else {
        printk(KERN_NOTICE "dma_request_channel fail,no dma channel available.\n");
        ret = -1;
        goto CLEAN;
    }
    
    j1 = get_jiffies_64();
    for(i =0;i<XFER_TIMES;i++) {
        cookie = dma_async_memcpy_buf_to_buf(chan, dma_dest, dma_src, XFER_LEN);
        if (dma_submit_error(cookie)) {
            printk(KERN_NOTICE"submit error\n");
            ret = -1;
            goto CLEAN;
        }
    }
    
    dma_async_memcpy_issue_pending(chan);
    do {
        status = dma_async_memcpy_complete(chan, cookie, NULL, NULL);
    
    } while (status == DMA_IN_PROGRESS);

    if (status != DMA_SUCCESS)
        printk(KERN_NOTICE "dma xfer dont accomplish,status=%d\n",status);
    j2 = get_jiffies_64();
    printk(KERN_NOTICE"dma xfer time cost:%d ms.\n",jiffies_to_msecs(j2-j1));

    j1 = get_jiffies_64();
    for(i =0;i<XFER_TIMES;i++){
        memcpy(dma_dest, dma_src, XFER_LEN);
    }
    j2 = get_jiffies_64();
    printk(KERN_NOTICE"memcpy time cost:%d ms.\n",jiffies_to_msecs(j2-j1));
    return 0;

CLEAN:
    if (chan)
        dma_release_channel(chan);

    if (dma_src)
        free_pages(dma_src,xfer_order);

    if (dma_dest)
        free_pages(dma_dest,xfer_order);

    return ret;

}
/* when compiled-in wait for drivers to load first */
module_init(dmatest_init);

static void __exit dmatest_exit(void)
{
    if (chan)
        dma_release_channel(chan);

    if (dma_src)
        free_pages(dma_src,get_order(XFER_LEN));

    if (dma_dest)
        free_pages(dma_dest,get_order(XFER_LEN));

}
module_exit(dmatest_exit);

MODULE_AUTHOR("ZhangZhuan <zhangzhuan@kedacom.com>");
MODULE_LICENSE("GPL v2");
【RK3568+PG2L50H开发板实战】Linux与FPGA高效数据交互:DMA_memcpy案例详解 本文详细解析了在RK3568 ARM平台与PG2L50H FPGA开发板之间,如何通过DMA_memcpy案例构建高效数据通道。文章深入剖析了基于PCIe总线的DMA传输核心原理、驱动交互流程,并提供了从环境检查到性能测试的完整实战步骤,重点探讨了传输带宽优化策略与常见问题排查方法,为异构计算系统的数据交互设计提供实用指南。 阅读详情

相关推荐

【RK3568+PG2L50H开发板实验例程】Linux部分 | FPGA dma_memcpy_demo 读写案例

本文介绍了ARM端通过PCIe总线对FPGA的DRAM进行读写操作的实现方案。应用程序通过ioctl触发DMA传输后,等待驱动上报input事件作为传输完成的信号。测试流程包括:ARM端配置DMA参数并启动传输,FPGA端实现PCIe端点功能和处理BAR0空间事务。操作步骤详细说明了如何部署测试程序、查看PCIe设备状态、启用设备以及执行测试,最终输出传输速率和错误统计等结果。该方案实现了高效的数据传输控制机制,为ARM与FPGA间的数据交互提供了可靠解决方案。

MYMINIEYE的博客 1334

【亲测免费】 探索高效DMA传输:u-dma-buf用户空间可映射DMA缓冲区

探索高效DMA传输:u-dma-buf用户空间可映射DMA缓冲区 在嵌入式系统和设备驱动开发中,高效的DMA(直接内存访问)操作是关键。u-dma-buf是一个专为Linux设计的内核驱动程序,它允许在用户空间中分配连续内存块作为DMA缓冲区,并提供用户空间直接访问这些内存的能力。这个项目对于那些希望在用户空间实现设备驱动的开发者来说,无疑是一个巨大的福音。 1、项目简介 u-dma-buf的主要...

gitblog_00005的博客 924

【RK3568+PG2L50H开发板实战】Linux与FPGA高效数据交互:DMA_memcpy性能优化指南

本文以RK3568开发板与PG2L50H FPGA的异构系统为例,深入探讨了通过PCIe总线实现Linux与FPGA间高速DMA数据传输的性能优化。文章从基础环境搭建与基准测试入手,逐步剖析了驱动层内存管理、DMA配置、中断处理,以及应用层ioctl调用、内存映射和测试策略等关键优化点,旨在帮助开发者榨干硬件性能,实现高效稳定的数据交互。

perl8的博客 618

memcpy函数优化及DMA对比

优化算法结构,提高芯片的使用效率,挖掘芯片的潜在能力,对提高产品质量,降低产品成本有着重要意义,在性能受限的嵌入式设备更加重要。

qq_40044462的博客 7763

DMA技术实战:从原理到验证,构建高效数据传输系统

直接内存访问(DMA)是一种关键计算机体系结构技术,其核心原理是允许外围设备与内存之间直接进行数据交换,无需CPU的持续干预。这一机制通过专用的DMA控制器实现,能够显著提升系统整体性能,尤其在处理大规模、高速数据流时优势明显。从技术价值角度看,DMA通过卸载CPU的数据搬运任务,大幅降低了处理器占用率,使其能专注于计算密集型操作,从而优化了系统资源分配。在工程实践中,DMA技术广泛应用于嵌入式系统、高速数据采集(如视频流、网络包处理)、实时音频处理以及硬件加速卡等场景。本文聚焦于一个具体的DMA控制器项目

ciya3282的博客 383

DMA技术深度解析:从原理到22DMA-07项目实战验证

直接内存访问(DMA)作为计算机体系结构中的关键技术,其核心原理是通过专用控制器在外设与内存间直接进行数据搬运,绕过CPU干预。这一机制从硬件层面实现了数据传输的并行化,显著降低了CPU负载和传输延迟,是提升系统整体性能的关键。在嵌入式系统、高性能计算和数据采集等场景中,DMA技术对于实现高带宽、低延迟的数据流处理具有不可替代的价值。本文以“22DMA-07”这一具体的DMA控制器项目为切入点,深入探讨其功能验证与性能评估方法,涵盖了从环境搭建、驱动集成到内存到内存传输、外设接口测试以及多通道并发等核心验证

weixin_30512043的博客 385

Linux DMA 内存拷贝与memcpy 速率比较

代码: #include &amp;lt;linux/kernel.h&amp;gt; #include &amp;lt;linux/fs.h&amp;gt; #include &amp;lt;linux/init.h&amp;gt; #include &amp;lt;linux/module.h&amp;gt; #include &amp;lt;linux/device.h&amp;gt; #include &a

我的学习笔记 1万+

LPC3180 NAND Flash DMA与硬件ECC机制详解及GPIO配置实战

在嵌入式系统开发中,DMA(直接内存访问)技术是提升存储子系统性能、降低CPU负载的关键机制。其原理在于由专用控制器接管总线,在外设与内存间建立直接数据通道。Scatter/Gather模式进一步优化了此过程,它通过链表管理非连续内存块的数据搬运,完美适配了NAND Flash按页读写、数据与ECC分离存储的特性,从而在数据采集、工业控制等对可靠性与实时性要求高的场景中发挥巨大价值。本文以NXP LPC3180微控制器为例,深入剖析其集成的NAND Flash控制器如何利用Scatter/Gather DM

weixin_33924220的博客 370

linux dma驱动,linux下DMA驱动测试代码

DMA传输可以是内存到内存、内存到外设和外设到内存。这里的代码通过dma驱动实现了内存到内存的数据传输。/*Function description:When we call dmatest_read(),it will transmit src memory datato dst memory,then print dst memory data by dma_callback_func(voi...

weixin_29159127的博客 869

基于ESP32与I2S的嵌入式音频流媒体系统:UDP实时传输实战

在嵌入式系统和物联网应用中,实现低延迟、高质量的音频流传输是一个常见需求。其核心原理通常涉及数字音频接口协议与网络传输协议的结合。I2S作为一种广泛使用的数字音频接口标准,负责将模拟音频信号高质量地转换为数字PCM数据。而UDP协议以其无连接、低开销的特性,成为实时流媒体传输的理想选择,尤其适用于对延迟敏感但对少量丢包容忍度较高的场景,如语音对讲和环境音采集。这种技术组合在智能家居、远程会议、分布式音频采集等应用场景中具有重要价值。本文通过一个具体的实战项目,详细解析了如何利用ESP32-S3的硬件I2S外

既是过河之卒,惟有奋力向前。 334

DMA的应用示例(4)-前期准备

DMA

human!的专栏 804

Linux内核4.14版本——DMA Engine框架分析(6)-实战(测试dma驱动)

Linux DMA模块测试代码

yangguoyu8023的博客 2210

udmabuf:适用于Linux的用户空间可映射dma缓冲区设备驱动程序

u-dma-buf(用户空间可映射DMA缓冲区) 概述 u-dma-buf的介绍 u-dma-buf是Linux设备驱动程序,用于在内核空间中分配连续的内存块作为DMA缓冲区,并使它们在用户空间中可用。 当用户应用程序使用UIO(用户空间I / O)在用户空间中实现设备驱动程序时,打算将这些存储块用作DMA缓冲区。 通过打开设备文件(例如/ dev / udmabuf0)并映射到用户存储空间,或使用read()/ write()函数,可以从用户空间访问u-dma-buf分配的DMA缓冲区。 打开设备文件时,可以通过设置O_SYNC标志来禁用分配的DMA缓冲区的CPU缓存。 在保持启用CPU缓存的同时,还可以刷新或使CPU缓存无效。 u-dma-buf分配的DMA缓冲区的物理地址可以通过读取/sys/class/u-dma-buf/udmabuf0/phys_addr 。 加载设备驱

GM-3568JHF丨ARM+FPGA异构开发板应用开发教程:08 FPGA DMA 读写案例

案例功能描述:ARM端利用PCIe总线对FPGA的DRAM执行读写操作。应用程序通过ioctl函数触发DMA数据传输后,将等待驱动程序发出的input事件作为响应。应用程序接收到该事件时,表示DMA数据传输已经结束。

ShiMetaPi的博客 583

『ISOBUS 入门』第 00 节 导言:ISOBUS 的宏观图景与入门路径

ISOBUS 是由三部分构成的集成系统:两段CAN网络(拖拉机与农具侧)、标准化通信约定及认证流程。其核心在于通过统一协议实现跨品牌设备即插即用。标准体系以ISO 11783为基础,分层涵盖物理层、传输层至应用层,关键功能如虚拟终端(VT)、任务控制器(TC)和文件服务器依赖严格的会话管理与角色分工。实际部署中,总线上传输多种协议报文,故障排查需结合地址声明、多包传输与角色权限分析。学习应从真实报文入手,建立“角色—数据流—功能块”认知链,避免仅学标准或仿真替代实测,方能有效应对复杂现场问题。

linx295的博客 281

c++11 无锁队列

/************************************************************************* &gt; File Name: lockfreequeue.cpp &gt; Author: &gt; Mail: &gt; Created Time: Wed 08 Aug 2018 11:38:08 AM CST ********...

qq_35728402的博客 5021

从零解析DMA项目:如何将模糊代号转化为可运行系统

直接内存访问(DMA)是计算机系统中用于提升数据传输效率的核心硬件机制,它允许外部设备绕过CPU直接与内存交换数据,从而释放CPU算力,降低系统延迟。其技术价值在于为高速数据采集、存储和网络处理等场景提供了底层性能保障。在工业控制、嵌入式系统和数据采集等应用场景中,DMA驱动开发与集成是关键环节。面对诸如“24DMA-09”这类内部项目代号,工程师需要一套系统的方法论,从信息收集、环境构建到驱动调试,将模糊需求转化为可验证、可维护的**白盒**系统。本文聚焦**DMA驱动**开发实践,分享从识别硬件、编译内

weixin_30482181的博客 342

BES平台集成第三方音频算法避坑指南:以声加ENC为例,聊聊文件放置、内存分配与授权那些事

本文详细解析了在BES平台上集成声加ENC降噪算法的全流程,包括技术选型、系统架构设计、内存管理及量产授权等关键环节。特别针对BES平台的双核架构和内存限制,提供了文件放置、内存分配与授权验证的实用解决方案,帮助开发者高效实现音频算法集成。

weixin_33720956的博客 514

深入解析Tiva™ MCU的EEPROM、Flash保护与μDMA实战配置

在嵌入式系统开发中,数据存储安全与高效数据传输是核心挑战。Flash存储器作为固件载体,其读保护与执行保护机制通过硬件寄存器实现权限隔离,能有效防止代码被非法读取或篡改,保障知识产权与系统安全。EEPROM则提供了字节可修改的非易失存储,适用于关键参数保存,其中断机制与块隐藏功能提升了系统响应与数据安全性。微直接内存访问(μDMA)控制器通过通道映射与乒乓缓冲等模式,将CPU从繁重的数据搬运中解放出来,显著提升系统实时性与吞吐量。本文以TI Tiva™ C系列微控制器为例,深入探讨如何协同配置EEPROM中

weixin_30715523的博客 383

基于Cadence IC617的共源级放大器设计:从直流到交流的virtuoso仿真实践

本文详细介绍了使用Cadence IC617的Virtuoso平台进行共源级放大器设计的完整仿真流程。从电路图绘制、直流工作点分析,到负载电阻RD的参数扫描及其对增益和带宽的影响,再到交流小信号频率响应仿真,提供了从理论到实践的全面指导,帮助初学者掌握模拟集成电路设计的核心仿真技能。

jj890的博客 479

骑砍Ⅱ霸主MOD开发(16)-FaceKey&BannerKey

摘要:本文介绍了FaceKey人物模型和BannerKey旗帜模型的生成流程。FaceKey通过序列化参数生成人物模型,包括头部(脸部、嘴、睫毛、眼睛)、眉毛、头发、身体和躯干等组件,每个部分通过特定标签和骨骼绑定实现。BannerKey则通过解析参数生成旗帜模型,包括模型、贴图和颜色等元素。两种模型都采用参数化设计和XML配置文件实现模型生成与定制。

骑砍战团&霸主MOD开发 2286

基于STM32与USB2.0的自制虚拟示波器:从ADC采样到上位机显示全解析

模数转换器(ADC)是连接模拟世界与数字系统的核心接口,其采样原理基于奈奎斯特定理,决定了信号数字化的精度与带宽。在嵌入式开发与电子测量领域,高性能ADC结合微控制器(MCU)能构建灵活的数据采集系统,其技术价值在于实现了低成本、可定制的信号分析工具。通过USB2.0接口进行高速数据传输,可将采集到的信号实时传送至PC进行可视化处理,广泛应用于物联网设备调试、传感器信号分析、创客教育及低速串行协议解码等场景。本文以热门的STM32系列MCU为核心,详细解析如何利用其内置ADC与USB FS控制器,配合双缓冲

weixin_34248023的博客 391

【Flutter 问题系列第 16 篇】如何防止软键盘弹出后顶掉内容

Flutter 如何防止软键盘弹出后顶掉内容

“Allen Su”的博客 3316

Xilinx FPGA PCIe | XDMA IP 核 / 应用 / 测试 / 实践

……

u013669912的博客 7926

华为OD新系统机试真题 - 准备生日礼物(Py/Java/C/C++/Js/Go)

华为OD机试新系统真题 4.8【准备生日礼物】,提供C语言、Java、C++、Python、Go、JavaScript源码实现,并提供完整思路讲解,以及在线OJ模拟做题。华为OD机试真题【准备生日礼物】

qq_45776114的博客 1479

详解舵机的基本原理以及控制方法

文章目录什么是舵机?伺服控制硬件连接舵机规格SG90MG90SMG996R总结 什么是舵机? 舵机是伺服电机的一种,伺服电机就是带有反馈环节的电机,我们可以通过伺服电机进行精确的位置控制或者输出较高的扭矩; 舵机也叫也叫 RC 伺服器,通常用于机器人项目,也可以在遥控汽车,飞机等航模中找到它们。 类似舵机这样的伺服系统通常由小型电动机,电位计,嵌入式控制系统和变速箱组成。 电机输出轴的位置由内部电位计不断采样测量,并与微控制器(例如STM32,Arduino)设置的目标位置进行比较; 根据相应的偏差,控制

一名热爱技术的工程师的博客。分享技术干货,记录美好生活。永远相信美好的事情即将发生。 4万+
上一篇: mii,gmii,sgmill,xgmill,xaui
下一篇: 查看预装Win8/8.1电脑内置系统激活密钥(即OEM Key)
legendmaker
博客等级 码龄18年 9粉丝 15原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值