外设请求接口

上图展示了外设请求接口,由一个外设请求总线和一个DMAC确认总线组成,其中:

dr表示外设请求中线,da表示DMAC确认总线

两条总线都使用valid/ready握手机制(AXI协议所描述)。对于握手机制详细信息,请查看AMBA AXI Protocol v1.0 Specification

外设使用 drtype[1:0]:

  • 请求单次传输
  • 请求burst传输
  • 确认一个flush请求

DMAC使用datype[1:0]:

  • 当它完成了请求的单次传输后发起信号
  • 当它完成了请求的burst传输后发起信号
  • 发起一个flush请求

(关于burst,参考https://www.pianshen.com/article/2653254175/)

drlast让外设能够在最后一个DMA传输开始时通知DMAC

如果DMAC被配置为支持多个外设请求接口,每个接口要分配一个唯一的ID号_<x>.

映射到一个DMA channel

DMAC支持分配一个外设请求接口到任意的DMA channel。当一个DMA channel执行DMAWFP时,其中的peripheral[4:0]字段指定了这个channel所关联的外设。

握手规则

DMAC使用DMA握手规则(当一个DMA channel线程处于active状态,即非Stopped状态时)如下表所示:

外设长度管理

外设请求接口能够让一个外设控制一个DMA周期所包含的数据量,不需要让DMAC感知它包含多少数据传输数。外设通过:

drtype[1:0]选择是单次传输还是burst传输

drlast用来通知DMAC最后一次传输开始

DMAC长度管理

如果使用外设请求接口并且DMAC在控制一个DMA周期所包含的数据量,那么必须使用DMALDP<S|B>和DMASTP<S|B>指令。使用这些指令会让DMAC能够更新datype[1:0]来通知外设它完成了最后的DMA传输

外设请求接口时序图

Burst请求

T1

DMAC检测到了一个burst传输请求

T3-T6

DMAC执行burst传输

T7

DMAC设置davalid为HIGH,并且设置datype[1:0]来指示burst传输完成

单次和burst请求

T1

DMAC检测到单次传输请求

T3

DMAC忽略了单次传输请求,因为DMA channel线程执行过了一个DMAWFPB指令

T5

DMAC检测到了一个burst传输请求

T7-T10

DMAC执行burst传输

T11

DMAC设置davalid为HIGH,并且设置datype[1:0]指示burst传输完成

DMAC对一个burst请求执行单次传输

下图表示当一个外设请求一次burst传输时,DMAC的MFIFO里没有足够的数据产生一次burst的情况下,DMAC通过多个单次传输来完成请求的时序。

T1

DMAC检测到一个burst传输请求

T3

MFIFO没有足够多的数据让DMAC产生一次burst传输,因此DMAC执行了一次单次传输

T4

DMAC产生davalid和datype[1:0]信号来指示一次单次传输的完成

T5-T10

DMAC执行剩下的三个单次传输

T11

DMAC设置davalid和datype[1:0]来请求外设flush掉所有和当前DMA周期相关的控制寄存器

T12

外设通过drvalid和drtype[1:0]来确认flush请求

使用事件和中断

通过编程Intterupt Enable寄存器,可以使用DMASEV指令来:

产生一个event给DMAC来处理

使用irq[x]中的一个来发起中断

使用event重启DMA channel

当编程Interrupt Enable寄存器来产生event时,可以用DMASEV和DMAWFE指令来重启一个或多个DMAchannel。

要重启一个单独的DMA channel:

  1. 第一个DMA channel执行DMAWFE,并且在它等待event发生的时候停住

  2. 另一个DMA channel执行DMASEV,使用相同的event号。这样会产生一个event,第一个DMA channel会重启。DMAC会在它执行DMASEV后的一个时钟周期后清除掉event。

可以编程让多个cahnnel等待相同的event。例如,如果四个DMA cahnnel都执行DMAWFE等待event 12,当另一个DMA channel对event 12执行DMASEV时,这四个channel全部在同一时间重启。DMAC在它执行了DMASEV的一个时钟周期后清除这个event。

由于event只有一个时钟周期长度,如果某一个DMA channel没有在DMASEV发生前执行DMAWFE,那么这个DMA channel必须等到event再次产生。

event只有在一种情况下回存在长于一个时钟周期,是在一个DMA channel执行DMASEV并且没有任何其它DMA channel执行过使用相同event号的DMAWFE的时候。

中断微处理器

DMAC提供irq[x]信号用于产生高有效,电平触发的中断到外部微处理器。当编程使用Interrupt Enable寄存器来产生中断时,在DMAC执行完DMASEV后它会设置对应的irq[x]为高电平。

外部微处理器能够写Interrupt Clear寄存器来清除中断(执行DMAWFE不会清除中断)。

Abort

Abort类型

当一个abort发生时,根据DMAC是否提供了带DMAC的精确状态(precise state)的abort handler,abort可以被定义为“精确的”还是“不精确的”:

precise DMAC会更新PC寄存器,值是产生abort的指令地址

imprecise PC寄存器可能会包含没有触发abort的指令地址

Abort源

percise abort

非安全状态下,一个DMA channel线程尝试编程Channel Control寄存器并产生一个安全的AXI事务

非安全状态下,一个DMA channel线程对于一个被设置为安全的event执行DMAWFE或DMASEV。

(对于每个event,Interrupt Enable寄存器控制DMAC是产生event还是发出一个中断信号)

非安全状态下,一个DMA channel线程对于一个被设置为安全的外设请求接口执行DMAWFP,DMALDP,DMASTP或DMAFLUSHP。

非安全状态下,DMA管理线程执行DMAG0试图启动一个安全的DMA channel线程

当DMAC取指时,在AXI master接口上收到一个ERROR响应

一个线程执行了一条未定义指令

一个线程执行了一条指令,该指令带有针对DMAC配置的非法操作数。

(当DMAC发起信号通知一个精确abort时,触发abort的指令没有被执行,相反,DMAC会执行一个DMANOP)

imprecise abort

DMAC在执行一个data load操作时接收到了AXI master接口上的ERROR响应

DMAC在执行一个data store操作时接收到了AXI master接口上的ERROR响应

一个DMA channel线程执行DMALD,并且MFIFO空间太小,不够保存数据时

一个DMA channel线程执行DMAST,并且MFIFO空间不够完成数据传输时

一个DMA channel线程由于资源饥饿导致锁住,这会导致内部watchdog timer超时

watchdog abort

DMAC包含了逻辑来确定什么时候一个或多个channel由于资源饥饿导致锁住。举个例子,如果MFIFO或load/store队列满了,这可能会阻止DMAC执行指令。如果锁定的条件持续了1024个aclk周期,则DMAC会abort这个DMA channel线程。

Abort处理

DMAC的架构没有设计从abort中恢复的机制,因此必须使用一个外部agent,比如微处理器,在一个abort发生时来终止线程。下图展示了DMA管理线程和channel线程在abort发生后的运行状态。

DMA channel线程

线程立即进入Faulting completing状态,DMAC会:

设置irq_abort为高

停止这个DMA channel的指令执行

对这个DMA channel的所有cache表项进行invalidate

更新Channel Program Counter寄存器,值为abort指令的地址(假设abort是精确的)

在read和write queue中剩余的任何指令都不再产生AXI访问

允许当前active的AXI事务完成

(当DMA channel对应的事务完成后,线程进入Faulting状态)

DMA 管理线程

线程立即进入Faulting状态,并且DMAC设置irq_abort为高

外部agent响应irq_abort置为有效的方式:

  • 读Fault Status DMA Manager寄存器的状态来确定DMA管理器是否处于Faulting。Fault Type DMA manager寄存器在Faulting状态下会提供abort发生原因。

  • 读Fault Status DMA Channel寄存器的状态来确定DMA管理器是否处于Faulting。Fault Type DMA Channel寄存器在Faulting状态下会提供abort发生原因。

为了让处于Faulting状态的线程进入Stopped状态,外部agent必须:

  1. 编程Debug Instruction-0寄存器,使用DMAKILL指令的编码

  2. 写Debug Command寄存器

(注意如果abort的线程是安全态的,必须用安全态APB接口来更新这些寄存器)

处于Faulting状态的线程执行完DMAKILL后,它会进入Stopped状态。

PL330 DMAC笔记(3) - 外设请求接口,事件和中断,Abort相关推荐

  1. Python自动化学习笔记(八)——接口开发、发送网络请求、发送邮件、写日志...

    1.接口开发(flask模块) Python自动化学习笔记(七)接口开发部分的内容补充 1.1参数为json格式: flask.request.is_json #判断参数是否是json格式 flask ...

  2. 学习笔记——请求接口报400错误

    问题: 在请求接口时报了400错误, 400错误是请求时传过去的数据参数或者格式发生错误导致的.传递过去的是一种类似数组结构的数据.后台需要通过特殊的编码方式才能解析. 1.解决: 请求接口传值的时候 ...

  3. 微机原理与接口技术:中断技术 详细笔记与例题解析

    文章目录 笔记 1.中断原理 1.1.中断的基本概念 1.2.中断工作方式的特点 1.3.中断管理 1.3.1.对中断全过程的控制 1.3.2.中断源的识别 1.3.3.中断的优先权 中断优先权的确定 ...

  4. java 轮询请求接口_Android RxJava 实际应用讲解:(无条件)网络请求轮询

    前言 Rxjava,由于其基于事件流的链式调用.逻辑简洁 & 使用简单的特点,深受各大 Android开发者的欢迎. Github截图 RxJava如此受欢迎的原因,在于其提供了丰富 & ...

  5. java http请求实现_java工程实现http请求接口

    java工程实现http请求接口 java工程实现http请求接口 1.实现代码 package com.home; import com.alibaba.fastjson.JSON; import ...

  6. django通过ajax请求接口返回多条数据,并动态生成表格,请求表单后将表格数据并入库

    一.最近在做接口相关的开发,需求是这样的,通过一个接口所需要传递的参数,调用接口后,处理接口响应的参数,返回多条数据,并动态生成表格,请求表单后将表格的数据入库,下面是我改过的代码,跟实际代码有些出入 ...

  7. Android Studio笔记4.2 安卓触摸事件

    文章目录 一.前言 二.笔记4.2 安卓触摸事件 (一)安卓触摸事件概述 1.触摸分类 (1).单点触摸 (2).多点触摸 2.触摸动作 3.触摸监听器 4.触摸方法 5.触点个数与坐标 6.安卓触摸 ...

  8. 计算机主机和外设的接口是,外设接口

    外设指除了主机箱.显示屏.键盘以外的设备.接口是指MD产品输入输出的地方.那么外设接口就是连接外围设备的接口. 中文名 外设接口 外文名 Peripheral Interface 英文简写 PI定   ...

  9. GD32E230开发笔记-GD32E230外设SPI的初始化

    GD32E230开发笔记-GD32E230外设SPI的初始化 1.SPI1初始化函数 2.SPI1读写函数 1.SPI1初始化函数 void SPI1_Init() {spi_parameter_st ...

  10. 《Go语言圣经》学习笔记 第七章 接口

    <Go语言圣经>学习笔记 第七章 接口 目录 接口是合约 接口类型 实现接口的条件 flag.Value接口 接口值 sort.Interface接口 http.Handle接口 erro ...

最新文章

  1. JAVA并发之多线程基础(2)
  2. CodeForces 1204 (#581 div 2)
  3. 服务器端虚拟化安卓,安卓服务器端实例
  4. C语言中输入输出格式控制
  5. PyG图神经网络框架torch-geometric安装
  6. matlab smooth 函数,matlab中smooth函数平滑处理数据实例
  7. webpack5打包普通html项目,webpack打包其他资源
  8. Web 开发的svg 图标大集合
  9. docker学习笔记一:基本安装和设置容器静态ip
  10. C++中strftime()的详细说明
  11. 小学计算机课动画制作的评课稿,信息技术评课稿
  12. 通讯录管理系统(C语言版)
  13. 笔记本电脑计计算机硬盘分区,笔记本电脑如何分区,教您笔记本电脑如何分盘...
  14. Win10中Jenkins的安装和基本使用流程
  15. 广州O2O分销系统定制开发
  16. docker-Login 报错 Error response from daemon
  17. python实现单机斗地主手机版下载_单机斗地主手机版下载免费版乐
  18. Oracle报错ORA-19400 ORA-24279产生原因和MOS官方解决办法
  19. 三极管放大电路的三种接法(转)
  20. 【DevOps】什么是混沌工程?

热门文章

  1. 【线代】行/列分块矩阵中向量正交有什么用?如何表述?向量正交和线性无关有什么关系?
  2. 体系结构13_Tomasulo算法
  3. X11 - X client数量达到上限并报错Maximum number of clients reachedxlsclients
  4. QQ “安全检查未通过,禁止下载该文件” 解决方法
  5. Practical Test Reminders, Character Arrays, C-Strings
  6. 2022数学建模美赛A题详细思路获取
  7. MOOC 中国大学 python爬取股票信息
  8. 网络安全策略和网络安全机制
  9. 领域驱动设计(domain driven design)战略篇之一 战略 Bounded Context
  10. G - Calculation【欧拉公式降幂】