任何一个处理器都必须与存储器紧密配合才能实现各种功能,处理器对存储器的控制能力对系统的整体性能有至关重要的影响。PXA255通过DMA控制器(DMA Controller)、存储控制器(Memory Controller)和MMU实现对各种存储器的控制。
3.1 DMA控制器(DMA Controller,DMAC)
DMA控制传输(DMAC)是使CPU处理其他与数据总线无关的处理,而有DMA控制器负责数据传输的机制。这种机制使得CPU从繁重的数据传输中解脱出来,可以执行其他计算,从而大大提高了系统的运行速度。
PXA255的DMA控制器提供了16个DMA通道,从0~15。每个从外设传来的DMA请求信号必须持续一个时钟周期以上。这些通道提供了flow-through的数据传输方式。
DMA控制器的框架如图3-1所示。
<shapetype id="_x0000_t75" coordsize="21600,21600" o:spt="75" o:preferrelative="t" path="m@4@5l@4@11@9@11@9@5xe" filled="f" stroked="f"><stroke joinstyle="miter"></stroke><formulas><f eqn="if lineDrawn pixelLineWidth 0"></f><f eqn="sum @0 1 0"></f><f eqn="sum 0 0 @1"></f><f eqn="prod @2 1 2"></f><f eqn="prod @3 21600 pixelWidth"></f><f eqn="prod @3 21600 pixelHeight"></f><f eqn="sum @0 0 1"></f><f eqn="prod @6 1 2"></f><f eqn="prod @7 21600 pixelWidth"></f><f eqn="sum @8 21600 0"></f><f eqn="prod @7 21600 pixelHeight"></f><f eqn="sum @10 21600 0"></f></formulas><path o:extrusionok="f" gradientshapeok="t" o:connecttype="rect"></path><lock v:ext="edit" aspectratio="t"></lock></shapetype>
图3‑1 DMA控制器
DMAC只支持flow-through传输方式。flow-through传输在数据被目标内存缓冲锁存之前,先通过DMAC。DMAC可以使用flow-through传输方式来执行内存至内存的数据传输。
<chsdate year="1899" month="12" day="30" islunardate="False" isrocdate="False" w:st="on"><span lang="EN-US">3.1.1</span></chsdate> DMAC通道
DMAC有16个通道,每个通道由32位的寄存器控制。每个通道都可以为CPU内部或者外部的模块提供flow-through数据传输。外设每次传输数据的大小和端口的大小必须在通道的控制寄存器中设置。
软件要确保Cache中数据的一致性,由于DMA控制器并不探测Cache中数据是否有效,因此,系统中为DMA分配的内存区域应该被设置成非缓冲型的。在外设向处理器请求DMA传输时,外设的缓冲区应该被填满,如果有未填满的缓冲区出现在DMA传输中,则被认为是本次传输的最后一个传输包。
<chsdate year="1899" month="12" day="30" islunardate="False" isrocdate="False" w:st="on"><span lang="EN-US">3.1.2</span></chsdate> DMA信号
DMA中要使用到的信号有DREQ[1:0]、DMA_IRQ和PERQ[37:0],具体如表3-1所示。
表3-1 DMA信号
信 号
|
信号类型
|
来源/目标
|
描 述
|
DREQ[1:0]
|
输入
|
来自引脚
|
外部设备请求线信号,DMA探测这个信号的上升沿作为有效请求
|
DMA_IRQ
|
输出
|
中断控制器
|
高电平作为中断信号
|
PREQ[37:0]
|
输出
|
片上设备
|
内部设备的DMA请求信号线。片上设备使用PREQ来发送DMA请求
|
<chsdate year="1899" month="12" day="30" islunardate="False" isrocdate="False" w:st="on"><span lang="EN-US">3.1.3</span></chsdate> DMA通道优先级模型
DMA通道优先级模型允许请求高带宽需求的设备请求比低带宽需求设备更频繁地被处理。DMA通道被分为4种类型,每种类型包含4个通道。通道在每个分类中按照round-robin优先级算法分配优先级。类型0具有最高优先级,类型1比类型2、类型3的优先级高。类型2、类型3具有相同的低优先级。高带宽需求设备必须被设置到类型0的DMA通道。内存至内存的数据移动以及低带宽需求的设备请求必须被标记成通道类型2或者3。优先级模型并不能影响正在被执行的请求。
当所有通道都在进行数据传输时,那么它们将被按照以下顺序执行:
n 类型0执行;
n 类型1执行;
n 类型0执行;
n 类型2执行;
n 类型0执行;
n 类型1执行;
n 类型0执行;
n 类型3执行。
在8次通道处理中,类型0将被执行4次,类型1被执行2次,类型2、类型3各被执行1次。
<chsdate year="1899" month="12" day="30" islunardate="False" isrocdate="False" w:st="on"><span lang="EN-US">3.1.4</span></chsdate> DMA描述符
DMAC可以在两种模式下运行:无描述符存取模式和描述符存取模式。模式的选取由DCSRx[NODESCFETCH]位决定。同样在同一时间内,不同的通道里可以分别使用这两种模式。
通道在转换运行模式之前必须停止数据处理。如果出现错误,则通道停留在停止状态,等待程序处理。
1.无描述符存取模式
在无描述符存取模式下,DDADRx被保留。程序不可以向DDADRx中写入数据,并且必须加载DSADRx、DTADRx和DCMDx寄存器。当运行位被设置,DMAC立刻运行以传输数据。无描述符存取在数据传输的开始时被执行。
一个典型的无描述符存取操作顺序如下。
(1)复位后,通道处于未初始化状态。
(2)设置DCSR[RUN]位为0,设置DCSR[NODESCFETCH]位为1。
<shapetype id="_x0000_t202" coordsize="21600,21600" o:spt="202" path="m,l,21600r21600,l21600,xe"><stroke joinstyle="miter"></stroke><path gradientshapeok="t" o:connecttype="rect"></path></shapetype><shape id="_x0000_s1027" style="margin-top: 23.3pt; z-index: 2; left: 0px; margin-left: 232.7pt; width: 187.3pt; text-indent: 0px; position: absolute; height: 240.8pt; text-align: left" stroked="f" type="#_x0000_t202"><textbox inset="0,0,0,0"></textbox><wrap type="square"></wrap></shape>(3)程序将源地址写入DSADR寄存器,将目标地址写入DTADR寄存器,将命令写入DCMD寄存器。
(4)向DCSR[RUN]位中写入1,然后无描述符存取被执行。
(5)通道等待数据传输请求。
(6)通道传输数据,数据量由DCMD[SIZE]和DCMD[LENGTH]较小者决定。
(7)在DCMD[LENGTH]被设置为0之前,通道等待下一次数据请求。
(8)DDADR[STOP]被设置为1,通道运行终止。
DMA无描述符存取模式的状态如图3-2所示。
图3‑2 DMA无描述符存取模式
2.有描述符存取模式
在有描述符存取模式下,DMAC的寄存器用内存中的DMA描述符数据填充。多个DMA描述符可以被链成一个链表。这就允许DMA通道在一系列不连续的地址上进行数据传输。一个典型的有描述符存取模式的操作步骤如下。
(1)复位后,通道处于未初始化状态。
(2)程序将描述符地址(16字节对齐)写入DDADR寄存器。
(3)程序向DCSR[RUN]中写入1。
(4)DMAC从DDADR标记的地址中读取4字长的描述符,其中各字加载情况如下:
• Word [0] -> DDADRx寄存器;
• Word [1] -> DSADRx寄存器;
• Word [2] -> DTADRx寄存器;
• Word [3] -> DCMDx寄存器。
(5)通道等待数据传输请求。
(6)通道传输数据,数据量由DCMD[SIZE]和DCMD[LENGTH]较小者决定。
(7)在DCMD[LENGTH]被设置为0之前,通道等待下一次数据请求。
(8)DDADR[STOP]被设置为1,通道运行终止,否则继续运行。
DMA请求描述符的第一个字的0位决定了本描述符是否是本次操作中最后一个描述符,如果是,则在处理完本描述符后,DMAC停止操作。
DMA有描述符存取模式的状态如图3-3所示。
图3‑3 DMA有描述符存取模式
3.中断处理
如果程序接收到一个描述存取成功的中断,例如DCSRx[STARTINTR] = 0b1,则程序必须向这个位中写入1来清除中断标记。程序应当先读出DCSRx中的值,进行修改(DCSRx[STARTINTR]=0b1),不修改DCSRx[RUN],然后将修改后的值写回DCSRx。
<chsdate year="1899" month="12" day="30" islunardate="False" isrocdate="False" w:st="on"><span lang="EN-US">3.1.5</span></chsdate> DMA通道状态
一个DMA通道可以处于下列几种状态:
• 未初始化:通道在复位后处于未初始化状态;
• 有效描述符存取,未运行:在有描述符存取模式下,程序已经将描述符加载入通道的DDADR;在非描述符存取模式下,已经设置了DSADR、DTADR和DCMD值,但是DCSR[RUN]为0;
• 描述符存取,运行:正从内存中读取DMA描述符;
• 等待请求:通道正在等待开始传输数据的请求;
• 数据传输:通道正在传输数据;
• 通道错误:通道产生了错误,通道停留在停止状态,直到程序清除DCSR[RUN]位;
• 停止状态:通道终止运行。
<chsdate year="1899" month="12" day="30" islunardate="False" isrocdate="False" w:st="on"><span lang="EN-US">3.1.6</span></chsdate> 读写顺序
DMAC不能保证处理器到I/O设备(包括片上设备)的读写顺序。读写顺序必须由软件保证。
<chsdate year="1899" month="12" day="30" islunardate="False" isrocdate="False" w:st="on"><span lang="EN-US">3.1.7</span></chsdate> 字节传输顺序
DCMD[ENDIAN]位定义了一个字的数据写入内存或者从内存读出的顺序。DCMD[ENDIAN]为0代表小端(Little Endian)模式顺序。
如果数据从内部设备传输到内存,DCMD[ENDI-
AN]被设置为0,并且DCMD[SIZE]被设置为1,那么内存接收数据顺序如下:
• Byte[0];
• Byte[1];
• Byte[2];
• Byte[3]。
小端模式传输顺序如图3-4所示。
图3‑4 小端模式传输顺序
<chsdate year="1899" month="12" day="30" islunardate="False" isrocdate="False" w:st="on"><span lang="EN-US">3.1.8</span></chsdate> 传输数据
内部设备通过设备总线连接到DMAC,采用flow-through 数据传输方式。DMAC同样也可以执行内存至内存的flow-through数据传输。外部设备如伴随芯片直接和数据引脚连接,必须使用flow-through数据传输。
但是DMA操作不支持向flash中写入数据,否则会产生一个总线错误。在flow-through模式下,数据在被目标设备锁存前,先经过DMAC。
1.内部设备数据传输
通道映射寄存器(DRCMRx)中有4位用来为DMA请求分配DMA号。一个内部设备可以被映射到16个可能的通道。内部设备可以通过内部设备总线来产生有效请求(PREQ)。PREQ信号被每个设备时钟(PCLK)采样,只要出现非0的(PCLK),就会触发一次DRCMRx寄存器相应位是否有效的查找。这允许请求被映射到不同的通道上。
如果内部设备地址被加载到DSADR中,DCMDx[FLOWSRC]位必须被设置为1。这允许处理器在初始化传输之前等待传输请求。如果内部设备地址被加载到DTADR,DCMDx[FLOWTRG]必须被设置为1。
如果DCMDx[IRQEN]位被设置为1,则在DCMDx[LENGTH]被减少至0后,产生一个DMA中断。
2.使用flow-through DMA读时序执行内部设备数据传输
当内部设备通过PREQ总线向DMAC产生一次DMA读请求后,就会执行一次flow-through DMA读操作。需要传输的数据容量由DCMDx[SIZE]决定。当请求为最高优先级,则执行下列操作。
(1)DMAC要求存储控制器读取数据容量到DMAC的缓冲区中,地址由DSADRx[31:0]决定。
(2)DMAC将数据传送到I/O设备中,地址由DTADRx[31:0]决定,DCMD[WIDTH]描述了内部设备通信的数据宽度。
(3)在传输的最后,DSADRx自增,增加值为DCMDx[LENGTH]和DCMD[SIZE]较小者,而DCMDx[LENGTH]也自减去这个值。
对于向内部设备的flow-through DMA读操作,DMAC寄存器应当进行如下设置:
• DSADR[SRCADDR] = 内存地址;
• DTADR[TRGADDR] = 内部设备地址;
• DCMD[INCSRCADDR] = 1;
• DCMD[FLOWSRC] = 0;
• DCMD[FLOWTRG] = 1。
3.使用flow-through DMA写时序执行内部设备数据传输
当内部设备通过PREQ总线向DMAC产生一次DMA写请求后,就会执行一次flow-through DMA写操作。需要传输的数据容量由DCMDx[SIZE]决定。当请求为最高优先级时,则执行下列操作。
① DMAC将由DSADRx[31:0]标记地址的I/O数据读入DMAC写缓冲。
② DMAC将数据通过内部总线传输到存储控制器。DCMD[WIDTH]描述了内部设备通信的数据宽度。
③ 在传输的最后,DTADRx自增,增加值为DCMDx[LENGTH]和DCMD[SIZE]较小者,而DCMDx[LENGTH]也自减去这个值。
对于向内部设备的flow-through DMA写操作,DMAC寄存器应当如下设置:
• DSADR[SRCADDR] = 内部设备地址;
• DTADR[TRGADDR] = 内存地址;
• DCMD[INCTRGADDR] = 1;
• DCMD[FLOWSRC] = 1;
• DCMD[FLOWTRG] = 0。
4.伴随芯片和外部设备
(1)使用flow-through DMA读时序执行外部设备数据传输
当外部设备通过DREQ[1:0]总线向DMAC产生一次DMA读请求后,就会执行一次flow-through DMA读操作。需要传输的数据容量由DCMDx[SIZE]决定。当请求为最高优先级时,则执行下列操作。
① DMAC要求存储控制器读取数据容量到DMAC的缓冲区中,地址由DSADRx[31:0]决定。
② DMAC将数据传送到I/O设备中,地址由DTADRx[31:0]决定。DCMD[WIDTH]描述了内部设备通信的数据宽度。
③ 在传输的最后,DSADRx自增,增加值为DCMDx[LENGTH]和DCMD[SIZE]较小者,而DCMDx[LENGTH]也自减去这个值。
对于向外部设备的flow-through DMA读操作,DMAC寄存器应当如下设置:
n DSADR[SRCADDR] = 内存地址;
n DTADR[TRGADDR] = companion chip地址;
n DCMD[INCSRCADDR] = 1;
n DCMD[INCTRGADDR] = 0;
n DCMD[FLOWSRC] = 0;
n DCMD[FLOWTRG] = 1。
(2)使用flow-through DMA写时序执行外部设备数据传输
当外部设备通过DREQ总线向DMAC产生一次DMA写请求后,就会执行一次flow-through DMA写操作。需要传输的数据容量由DCMDx[SIZE]决定。当请求为最高优先级时,则执行下列操作。
① DMAC将由DSADRx[31:0]标记地址的I/O数据读入DMAC写缓冲。
② DMAC将数据通过内部总线传输到存储控制器。
③ 在传输的最后,DTADRx自增,增加值为DCMDx[LENGTH]和DCMD[SIZE]较小者,而CMDx[LENGTH]也自减去这个值。
对于向内部设备的flow-through DMA写操作,DMAC寄存器应当如下设置:
n DSADR[SRCADDR] = 内部设备地址;
n DTADR[TRGADDR] = 内存地址;
n DCMD[INCSRCADDR] = 0;
n DCMD[INCTRGADDR] = 1;
n DCMD[FLOWSRC] = 1;
n DCMD[FLOWTRG] = 0。
5.内存至内存数据移动
内存至内存数据移动不需要DREQ和PREQ的请求信号。处理器向DCSR[RUN]中写入1,然后有一个通道被配置成内存至内存移动。DCMDx[FLOWSRC]和DCMD[FLOWTRG]必须被设置成0。如果DCMD[IRQEN]被设置为1,在DCMDx[LENGTH]减少为0时,产生一个DMA中断。
一次flow-through DMA内存至内存数据移动包含以下步骤。
① 处理器向DCSR[RUN]中写入1,开始内存至内存数据移动。
② 如果处于描述符存取模式,DMA通道读取4字描述符。通道开始传输数据而不需要等待PREQ或者DREQ信号有效。DCMDx[SIZE]和DCMDx[LENGTH]中较小者描述了传输的数据量。
③ DMAC要求存储控制器读取数据容量到DMAC的缓冲区中,地址由DSADRx[31:0]决定。
④ DMAC向DTADRx[31:0]标记的地址中写入数据。
⑤ 在传输的最后,DSADRx和DTADRx自减,自减值为DCMD[SIZE]中DCMDx[LENGTH]较小者。
<chsdate year="1899" month="12" day="30" islunardate="False" isrocdate="False" w:st="on"><span lang="EN-US">3.1.9</span></chsdate> DMA控制寄存器一览
DMA控制寄存器信息如表3-2所示。
表3-2 DMA控制寄存器信息
地 址
|
名 称
|
描 述
|
0x4000_0000
|
DCSR0
|
DMA通道<f
分享到:
Global site tag (gtag.js) - Google Analytics
|
相关推荐
### Windows CE嵌入式开发入门—基于Xscale架构 #### 一、概述 《Windows CE嵌入式开发入门—基于Xscale架构》是一本专为希望深入理解和掌握Windows CE平台开发技术的学习者编写的教材。本书不仅介绍了Windows CE...
本篇文章主要探讨了基于Xscale架构的Windows CE嵌入式开发中驱动开发的分类及其特点。 首先,驱动按照加载方式可分为三类:本机设备驱动(Built-In Driver)、可加载驱动(Loadable Driver)和混合型驱动。 1. 本...
《Windows CE嵌入式开发入门-基于Xscale架构》是一本深入探讨Windows CE在Xscale架构上应用开发的专业书籍。Windows CE是一个精简版的微软操作系统,特别适用于嵌入式设备,如工业控制、移动设备和消费电子产品。...
"WindowsCE嵌入式开发入门-基于Xscale架构"的学习主要涉及以下几个关键知识点: 1. **Windows CE系统结构**:了解Windows CE的模块化设计,包括内核、BSP(板级支持包)、驱动程序、文件系统、应用程序接口等,这些...
《ARM嵌入式技术原理与应用——基于XScale处理器及VxWorks操作系统 [单片机与嵌入式系统 ┈→ 嵌入式系统教程]》是《ARM嵌入式技术系列教程》的理论教程,以采用XScale处理器的CVTPXA270教学实验系统为硬件平台,...
XSCALE是Intel公司开发的一款高性能、低功耗的32位RISC微处理器,它是基于ARMv5TE架构的。XSCALE处理器的特点包括: - **高性能**:相较于早期的ARM处理器,XSCALE提供了更高的性能。 - **低功耗**:适合用于手持...
IV实验丛书》之一,主要基于英蓓特公司目前最新嵌入式教学平台EduKit-IV,搭配核心Xscale PXA270板和其他相关模块,主要介绍嵌入式操作系统Windows CE6.0及其BSP包的开发,应用的开发等。 经历过近几年的嵌入式ARM...
### 基于XSCALE架构处理器WinCE系统BSP开发 #### XSCALE微架构与PXA255处理器 Intel的XSCALE微架构是专为移动设备和嵌入式系统设计的一系列处理器的核心,其中PXA255是这一系列中的明星产品。PXA255采用17mm×17mm...
《WINCE6.0基础教程和基于Xscale270嵌入式Windows CE开发实验与实践》是一本针对初学者和有一定经验的开发者设计的教材,旨在帮助读者深入理解和掌握Windows Embedded CE 6.0(简称WinCE6.0)在Xscale270处理器上的...
在03-第三章 嵌入式处理器 Intel Xscale270 概述.ppt中,你将深入学习到Intel XScale 270处理器的体系结构、性能指标、硬件特性,以及如何在Windows CE 6.0下进行系统配置和程序开发。这份资料将帮助你掌握如何充分...
XScale是Intel公司开发的一种基于X86指令集的微处理器,它采用了增强的ARM架构,旨在提供高性能的计算能力,同时保持较低的能耗,这使得XScale成为嵌入式系统,如公交报站器的理想选择。XScale处理器在处理数据和...
使用了Xscale PXA270嵌入式开发板和GPS接收模块,并以Embedded Visual C++作为开发工具。设计中通过串口通信读取GPS接收模块接收到的卫星原始信息,利用EVC的异步传输方式进行数据采集,并应用双缓冲技术解决数据...