DMA的学习——数据通路的问题?

解决:

  dma应该只有一个硬件设备(固定映射),然后一个dma顺序完成不同的写任务。

  bram ctrl的映射地址是edit addr的那个,但是不能直接使,要用宏定义的那个数(后面多了一个U,我也不知道为啥)。找自己的bram ctrl的base宏定义是什么名字要去xparameters.h找,看名字找,好像没有表格。。。

  路径:bsp的include里面

重要!记得类型转换成(int *)!!!!!!!!!!!!!!!!!!!!!!

static int * Src = (int*)XPAR_AXI_BRAM_CTRL_0_S_AXI_BASEADDR;

  看源码有点乱,dma怎么实现的内外存?内存就是用数组表示就行,外存的地址怎么找的?

1.好像是用DmaCmd的bd结构体先赋值?

  问题是dma怎么获得的外存地址?

    DmaCmd.ChanCtrl.SrcBurstSize = 4;//设置cmd参数
    DmaCmd.ChanCtrl.SrcBurstLen = 4;
    DmaCmd.ChanCtrl.SrcInc = 1;
    DmaCmd.ChanCtrl.DstBurstSize = 4;
    DmaCmd.ChanCtrl.DstBurstLen = 4;
    DmaCmd.ChanCtrl.DstInc = 1;
    DmaCmd.BD.SrcAddr = (u32) Src;//写
    DmaCmd.BD.DstAddr = (u32) Dst;
    DmaCmd.BD.Length = DMA_LENGTH * sizeof(int);

  写dma的时候只初始化了src的值,dst清零了,两个空间都是在内存里:

            /* Initialize source 给源数据赋值*/
            for (Index = 0; Index < DMA_LENGTH; Index++)
                Src[Index] = DMA_LENGTH - Index;

            /* Clear destination 清空结果数组*/
            for (Index = 0; Index < DMA_LENGTH; Index++)
                Dst[Index] = 0;         

  dma回读的代码如下:

   int *Src;//局部变量
    int *Dst;

    Src = (int *)DmaCmd->BD.SrcAddr;//重新赋值?src不是全局变量吗?为什么不直接使?
    Dst = (int *)DmaCmd->BD.DstAddr;

/* compare the src and dst buffer */
    for (Index = 0; Index < DMA_LENGTH; Index++) {
        if ((Src[Index] != Dst[Index]) ||
                (Dst[Index] != DMA_LENGTH - Index)) {
            Status = -XST_FAILURE;
        }
    }

2.助教的示例中,将src的值变为板上地址?

在示例工程的源代码中,修改第 121行代码 为
static int * Src = (int*)XPAR_AXI_BRAM_CTRL_0_S_AXI_BASEADDR;
即可实现内存与 PL缓存之间的数据传输。

  板上地址获得:看platform文件,直接抄就可以吗?是不是已经做了虚拟存储mma了?

3.不用dma,直接往bram的地址写也可以,用自带的out函数

  https://blog.csdn.net/NarutoInspire/article/details/79401559?utm_source=blogxgwz7

原文地址:https://www.cnblogs.com/iwanna/p/10011717.html

时间: 2024-10-26 06:14:28

DMA的学习——数据通路的问题?的相关文章

【知识强化】第五章 中央处理器 5.3 数据通路的功能和基本结构

下面我们进入第三节的学习,也就是数据通路的功能和基本结构.我们这一节呢主要讲解单总线它的这样的一个基本结构. 我们再来回顾一下我们之前都学了一些什么.我们在第一节中讲解了CPU的功能和结构,我们讲解了CPU具有五大功能,分别是指令控制.操作控制.时间控制.数据加工和中断处理.然后我们讲解了为了实现这些功能,我们需要哪些结构,于是我们讲解了运算器和控制器它的基本结构与它的内部的基本的组成部分.那么第二节呢我们讲解了指令的执行过程,首先我们给出了指令周期的概念,我们说一条指令它的执行呢可以分为不同的

cortex_m3_stm32嵌入式学习笔记(十九):DMA实验(高速传输)

DMA,全称为: Direct Memory Access,即直接存储器访问. DMA 传输方式无需 CPU 直接控制传输,也没有中断处理方式那样保留现场和恢复现场的过程,通过硬件为 RAM 与 I/O 设备开辟一条直接传送数据的通路, 能使 CPU 的效率大为提高. 即DMA传输前,CPU要把总线控制权交给DMA控制器,而在结束DMA传输后,DMA控制器应立即把总线控制权再交回给CPU. 一个完整的DMA传输过程必须经过下面的4个步骤. 1.DMA请求 CPU对DMA控制器初始化,并向I/O接

[linux驱动][Linux内存]DMA学习笔记一

http://www.cnblogs.com/hanyan225/archive/2010/10/28/1863854.html 1,概念DMA是一种无须CPU的参与就可以让外设与系统内存之间进行双向数据传输的硬件机制.使用DMA可以是系统CPU从实际的IO数据传输过程中摆脱出来,从而大大提供系统吞吐率.DMA方式的数据传输由DMA控制器(DMAC)控制,在传输期间,CPU可以并发地执行其他任务,当DMA结束后,DMAC通过中断通知CPU数据传输已经结束,然后由CPU执行相应的中断服务程序进行后

stm32寄存器版学习笔记08 DMA

DMA(Direct Memory Access),直接存储器访问.DMA传输方式无需CPU直接控制传输,通过硬件为RAM与I/O设备开辟一条直接传送数据的通路,使CPU效率大大提高.stm32f103有2个DMA控制器,DMA1有7个通道,DMA2有5个通道,专门用来管理来自外设对存储器的访问请求,还有一个仲裁器来协调各个DMA请求的优先权. 1.DMA各通道请求 从外设产生的DMA请求通过逻辑"或"输入到DMA控制器,这就意味着同时只能有一个请求有效. 例如,串口1发送的DMA,就

STM32学习日志--使用DMA功能自动更新PWM的输出

/******************************************************************************* 编译环境: EWARM V5.30 硬件环境: DZY2.PCB STM32 FW: V3.0.0 作者 : szlihongtao ****************************************************************************** REV : V1.00 DATE : 2011

STM32学习笔记8(DMA控制器)

DMA简介(1) DMA,全称为:Direct Memory Access,即直接存储器访问,DMA 用来提供在外设和存储器之间或者存储器和存储器之间的高速数据传输.当 CPU 初始化这个传输动作,传输动作本身是由DMA 控制器 来实行和完成.DMA 传输对于高效能嵌入式系统算法和网络是很重要的.DMA 传输方式无需 CPU 直接控制传输,也没有中断处理方式那样保留现场和恢复现场的过程,通过硬件为 RAM 与 I/O 设备开辟一条直接传送数据的通路,能使 CPU 的效率大为提高.STM32 最多

重学计算机组成原理(二)- 制定学习路线,攀登“性能”之巅

0 学习路线的知识点概括 学习计算机组成原理,就是学习计算机是如何协调运行的 计算机组成原理的英文叫Computer Organization Organization 意"组织机构". 该组织机构能够进行各种计算.控制.读取输入,进行输出,达成各种强大的功能. 把整个计算机组成原理的知识点拆分成了四大部分 计算机的基本组成 计算机的指令和计算 处理器设计 存储器和I/O设备. 0.1 计算机的基本组成 计算机的硬件组成 这些硬件,怎么对应到经典的冯·诺依曼体系结构的 除此之外,还需要

AJAX学习

一.概述 ajax不是一种新的语言,它是异步的javascript和xml.传统的请求式网页在发送请求和页面响应是同步进行的,我们知道,B/S架构中在浏览器中跑的代码是javascript.HTML标签还有CSS样式文件等,我们的请求可以由javascript代码来写,服务器端的请求数据接受可以由xml来做(因为xml的优势就在于数据的传递,xml容易被解析),而ajax就是将传统的这一过程异步化,达到发出请求后不必刷新整个页面也可以得到响应,其实这一思想不仅可以用在B/S架构的程序设计中,在C

Smart210学习记录------块设备

转自:http://bbs.chinaunix.net/thread-2017377-1-1.html 本章的目的用尽可能最简单的方法写出一个能用的块设备驱动.所谓的能用,是指我们可以对这个驱动生成的块设备进行mkfs,mount和读写文件.为了尽可能简单,这个驱动的规模不是1000行,也不是500行,而是100行以内. 这里插一句,我们不打算在这里介绍如何写模块,理由是介绍的文章已经满天飞舞了.如果你能看得懂.并且成功地编译.运行了这段代码,我们认为你已经达到了本教程的入学资格,当然,如果你不