S32K3XX单片机DMA原理深度解析(上)

本文涉及的产品
数据传输服务 DTS,数据迁移 small 3个月
推荐场景:
MySQL数据库上云
简介: S32K3XX单片机DMA原理深度解析(上)

1 简介

1.1 DMA系统框图

首先一起来看看S32K3XX单片机DMA系统的庐山真面目

从上图中可以看出,eDMA主要由两部分构成,一部分是 eDMA引擎,负责仲裁,控制,数据传输等工作;另一部分是传输控制描述符,存储了各个通道操作所需的属性数据,比方说,传输数据的源地址,目的地址等。整个系统设计得精巧而优雅。

eDMA引擎主要有两个功能:

地址计算

数据传输

传输控制描述符主要负责32个通道中每个通道传输控制描述符的存储。


1.2 各模块简介

Address path

  • 第一通道和第二通道(抢占通道)的TCD保存
  • 管理所有主机总线的地址计算

允许一个通道在数据完成读写任务时被抢占。

当一个通道被激活的时候,它会一直运行直到小循环完成,除非被一个更高优先级的通道抢占。

当选择执行任何通道时,将从本地内存中读取其TCD的内容,并将其加载到地址路径通道x寄存器中进行正常启动,并将其加载到通道y寄存器中进行抢占启动。在小循环完成执行后,地址路径硬件将TCDn_{SADDR, DADDR, CITER}的新值写回本地内存。如果主迭代(大循环)计数耗尽,则执行额外的处理,包括最终地址指针更新,重新加载TCDn_CITER字段,以及作为分散/收集操作的一部分可能从内存中获取新的TCDn。有关详细信息,请参考动态分散/收集(Dynamic scatter/gather)部分。


Data path

这个模块实现了总线主读/写数据路径。它包含一个数据缓存和必要的复杂逻辑来支持任何需要进行的数据对齐。内部的读数据总线是主输入,内部的写数据总线是主输出。

地址和数据路径模块可直接支持两级流水式内部总线。地址路径模块代表了第一级流水式总线,数据路径模块代表了第二级流水式总线。


Program model/channel arbitration

该模块实现了eDMA编程模型的第一部分以及通道仲裁逻辑。可编程的模块寄存器与内部的外设总线相连。eDMA的外设请求输入和中断请求输出也可以通过这个模块相连。


传输控制描述符(TCD)可分成两部分:Memory controller和Memory array


Memory controller

该逻辑实现了所需的双端口控制器,并管理来自eDMA引擎的访问以及来自内部外围总线的引用。如前所述,在同步访问中,eDMA引擎被赋予优先级,外围事务被停止。


Memory array

TCD存储的用于每个通道的传输配置文件。也就是所要执行的通道数据的各种相关信息。

1.3 特点

eDMA是一种高度可编程的数据传输引擎,可以最大限度地减少主机处理器所需的任何干预,eDMA模块具有以下特点:

  • 所有的数据移动都通过双地址传输:从数据的源头读出到目标写入
    — 可编程的源地址和目标地址以及传输大小
    — 支持复杂地址计算
  • 在最少干预主机处理器的前提下,实现了32通道的复杂数据传输。
    — 内部数据buffer,被用作所有数据传输的临时存储器
    — 连接到 crossbar switch,以控制总线的数据移动
  • TCD支持两层深的嵌套传输操作
    — 每个通道的32字节TCD保存
    — 由小字节传输计数定义的内部数据传输循环
    — 由主迭代计数定义的外部数据传输循环
  • 可通过三种方法让通道处于活动状态
    — 直接软件初始化
    — 通过连续转换中的通道连接机制进行初始化
    — 每个通道一个Peripheral-paced的硬件请求
  • 固定优先级和轮询通道仲裁
  • 通过可编程中断请求报告通道完成情况
    — 每个通道都可以独立产生中断,可以在主循环计数完成时产生断言
    — 每个通道的可编程错误结果,被逻辑地加在一起形成一个中断控制器的错误中断
  • 可编程支持分散/收集DMA处理
  • 支持复杂数据结构

2 工作流程概述

2.1 基本工作流程

2.1.1 通道激活

本例使用eDMA外设请求信号的断言来请求通道n的服务。通过软件和TCDn_CSR[START]字段激活通道遵循与外设请求相同的基本流程(也就是说,软件和硬件的通道激活方式基本一致)。

eDMA请求输入信号在内部注册,然后通过eDMA引擎:首先通过控制模块,然后进入程序模块和通道仲裁。

在下个周期中,通道仲裁采用固定优先级可选的循环算法进行仲裁。在仲裁执行完毕后,激活的通道号通过地址路径发送,并转换为访问TCDn本地存储器所需的地址,接下来,访问TCD内存,并从本地内存读取所需的描述符,然后将其加载到eDMA引擎地址路径的主通道或辅助通道执行寄存器中。TCD内存为64位宽,以尽量减少获取激活通道描述符并将其加载到地址路径寄存器所需的时间。

2.1.2 数据传输(数据流动)

与数据传输相关的模块(地址路径、数据路径和控制)通过所需的源读取和目标写入序列来执行实际的数据移动。源读取被启动,获取的数据被临时存储在数据路径块中,直到在目标写入期间将其传输到内部总线上。这个从源头读取/从目标写入操作一直持续到字节数(NBYTES)传输结束。

2.1.3 更新内存,申请中断

搬运NBYTES的数据后,执行基本数据流的最后阶段。在此段中,地址路径逻辑对一些TCD中的某些字段(例如,SADDRDADDRCITER)执行所需的更新。

如果主要迭代(大循环)计数耗尽,则执行额外的操作。这包括最后的地址调整和将BITER字段重新加载到CITER字段中。此时还会发生可选中断请求的断言,以及使用描述符中包含的scatter/gather地址指针(如果启用了scatter/gather)从内存中取出一个新的TCDTCD内存的更新和中断请求的断言显示在上面的图中。

注:相关寄存器/字段解释

NBYTES:TCD Transfer Size

定义了每次DMA请求需要搬运的字节数

BITER:TCD Beginning Major Loop Count

通道最开始设定的主循环次数

CITER :Current Major Iteration Count

通道的当前主循环计数。每次通道完成一个服务请求并将其写回TCD内存时,它都会减少

2.2 故障报告和处理

通道错误在错误状态寄存器(CHn_CSRTCDn_CSR)中报告,可能由以下任何一种原因引起:

  1. 配置错误,传输控制描述符中的某些/个设置是非法的
  2. 通过“ 错误取消传输”的硬件或软件请求 取消已经被激活的通道
  3. TCD内存错误
  4. 总线主机读或写周期的错误终止

而当报告配置错误时,可能由下面这些因素的状态不一致引起的:

  1. 起始地址或者目的地址
  2. 起始或目的地址偏移
  3. 小循环字节计数
  4. 传输大小

造成这些错误的原因可能源于以下几个方面:

  1. 地址和偏移必须与零模传输大小的边界对齐
  2. 小循环的计数大小必须起始和目的传输大小的整数倍
  3. 所有源读取和目标写入都必须配置为程序传输大小的自然边界
  4. 如果一个分散/收集操作在通道完成时使能,但分散/收集地址(DLAST_SGA)没有对齐到32字节的边界,这时候就会报告配置错误。
  5. 如果在通道完成时使能小环路通道连接,如果TCDn_CITER[ELINK]字段不等于TCDn_BITER[ELINK]字段,则在尝试连接时报告配置错误。

2.3 通道抢占

  1. 通道抢占允许在更高优先级的通道请求数据传输的时候,当前通道被挂起;
  2. 不支持嵌套抢占,也就是说,已经抢占的通道,不能被抢占
  3. 通道的抢占被禁用时,失去了抢占功能,即使是优先级更低的通道,依然不能被抢占;
  4. 为了避免相互占用,可以都设置为低优先级(也就是0)。

3 核心原理

3.1 大循环和小循环

下图显示了每个DMA请求如何启动一个小循环传输,或者迭代。DMA仲裁可在每个小循环后发生,并且允许一个级别的小循环DMA抢占。大循环中的小循环的数量由开始迭代计数(BITER)指定。

其实大循环和小循环的很多属性都可以很灵活地进行配置,详情请移步4.1小节。

3.2 eDMA仲裁机制简介

eDMA由多个优先级组成分层仲裁方案。采用固定优先级仲裁,在特定条件下也可以选择轮询仲裁。优先级顺序如下图所示:

仲裁组优先:每个通道都可以通过配置 CHn_GRPRI 寄存器来设置通道优先级,总共有32个优先级(0-31),数值越大,优先级越高。

通道优先:每个通道都可以通过配置 CHn_PRI 寄存器来设置通道优先级,总共有8个优先级(0-7),数值越大,优先级越高。

通道数(通道编号):当两个及其以上的通道有相同的仲裁组优先级和通道优先级的时候,就需要通过通道编号来区分优先级,通道编号越高,优先级越高,不可自定义

轮询:启用轮询时,任何配置了轮询的通道操作在仲裁组中优先级最低。通过将CSR[ERCA]字段设置为1来启用轮询。启用后,通道优先级为0 (CHn_PRI=0)的通道将被使用轮询仲裁。轮循仲裁将在仲裁组中请求服务的通道(CHn_PRI=0)之间轮换通道选择。如果请求服务将在任何循环通道中被选择,仲裁组内的任何非零通道将继续使用固定优先级仲裁。

任何通道优先级大于0的通道都会在循环之前得到服务。

3.2.1 固定组仲裁,固定通道仲裁

在该模式下,eDMA最高优先级组最高优先级的通道中选择执行通道业务请求。如果对eDMA进行编程,使高优先级组内的通道具有大量请求或大量数据传输,则该组可能会消耗eDMA控制器的所有带宽。也就是说,如果在控制器仲裁下一个DMA请求时,在最高优先级组中的通道上总是有至少一个DMA请求待处理,则不会为低优先级组提供服务DMA请求。这种方案的优点是:通道的延迟可能很小

3.2.2 固定组仲裁,轮询通道仲裁

请求的优先级最高的组先得到服务。如果高优先级组中不存在挂起请求,则为低优先级组提供服务。

在组内,非零通道优先级的通道优先得到服务。对于所有优先级为0的通道,优先选择通道编号较高的请求进行服务,然后一次到请求服务的最低通道。通道仲裁可以为低优先级通道提供一种公平机制

这种方案可能引起与固定组仲裁,固定通道仲裁相同的带宽消耗问题,最高优先级组中的所有通道都将得到服务。最高优先级组上的服务延迟很短,但随着组优先级的降低,服务延迟可能会长得多。

相关文章
|
5天前
|
Java
并发编程之线程池的底层原理的详细解析
并发编程之线程池的底层原理的详细解析
15 0
|
29天前
|
安全 Java 数据安全/隐私保护
【深入浅出Spring原理及实战】「EL表达式开发系列」深入解析SpringEL表达式理论详解与实际应用
【深入浅出Spring原理及实战】「EL表达式开发系列」深入解析SpringEL表达式理论详解与实际应用
66 1
|
2天前
|
安全 索引
【集合】03 Linkedlist原理深入解析
【集合】03 Linkedlist原理深入解析
6 0
|
2天前
|
Java Spring 容器
SpringBoot自动装配原理之@Import注解解析
SpringBoot自动装配原理之@Import注解解析
|
4天前
|
缓存 JavaScript 前端开发
|
5天前
|
SQL 分布式计算 资源调度
一文解析 ODPS SQL 任务优化方法原理
本文重点尝试从ODPS SQL的逻辑执行计划和Logview中的执行计划出发,分析日常数据研发过程中各种优化方法背后的原理,覆盖了部分调优方法的分析,从知道怎么优化,到为什么这样优化,以及还能怎样优化。
|
5天前
|
JSON Java Maven
Javaweb之SpringBootWeb案例之 SpringBoot原理的详细解析
Javaweb之SpringBootWeb案例之 SpringBoot原理的详细解析
8 0
Javaweb之SpringBootWeb案例之 SpringBoot原理的详细解析
|
5天前
|
前端开发 JavaScript 编译器
深入解析JavaScript中的异步编程:Promises与async/await的使用与原理
【4月更文挑战第22天】本文深入解析JavaScript异步编程,重点讨论Promises和async/await。Promises用于管理异步操作,有pending、fulfilled和rejected三种状态。通过.then()和.catch()处理结果,但可能导致回调地狱。async/await是ES2017的语法糖,使异步编程更直观,类似同步代码,通过事件循环和微任务队列实现。两者各有优势,适用于不同场景,能有效提升代码可读性和维护性。
|
15天前
|
机器学习/深度学习 分布式计算 BI
Flink实时流处理框架原理与应用:面试经验与必备知识点解析
【4月更文挑战第9天】本文详尽探讨了Flink实时流处理框架的原理,包括运行时架构、数据流模型、状态管理和容错机制、资源调度与优化以及与外部系统的集成。此外,还介绍了Flink在实时数据管道、分析、数仓与BI、机器学习等领域的应用实践。同时,文章提供了面试经验与常见问题解析,如Flink与其他系统的对比、实际项目挑战及解决方案,并展望了Flink的未来发展趋势。附带Java DataStream API代码样例,为学习和面试准备提供了实用素材。
38 0
|
1月前
|
存储 并行计算 算法
C++动态规划的全面解析:从原理到实践
C++动态规划的全面解析:从原理到实践
95 0

推荐镜像

更多