能否高速传输数据?如何快速传输数据?
在绝大多数32位控制器中,处理器本身在外设和内外存间传输数据时每次只传输一个字节。如果要传输的数据量不大,这没什么问题。但若数据传输速率达到1Mbps,即使是快速处理器也要瘫痪。在1Mbps速率下,数据传输占用 28% 的处理器资源;速率到 2Mbps 时,数据传输占用 50% 以上的处理器资源;而速率达到 4Mbps 时,处理器就不能处理其他事务了。如果考虑到全速 USB2.0 的数据速率为 12Mbps,CAN 的数据速率为 1Mbps,以太网络的数据速率为 100 Mbps,SAM7 SPI 和 USART 外设的数据速率也能达到 25Mbps,那么很明显任何一个需要在大范围互连的嵌入式控制系统都必须解决数据传输的问题。在一个涉及大量数据传输的应用中,微控制器能否既是网关又是控制器?
Atmel的DMA方案产品有一个外设DMA控制器 (PDC),能直接将每个SAM7X 外设连接到片上内存,并配有一个更高级的专门DMA,针对以太网MAC。由于 PDC 完全独立于处理器运行,因此它没有任何中断的成本,并能大幅度降低数据传输所需的时钟周期数。每个 SAM7X 外设都有两条专用 PDC 通道,各用于接收和发送数据。每个 PDC 通道的用户接口都集成在各外设的内存中,并有一个 32 位内存指针寄存器;一个 16 位传输计数寄存器;一个用于下一个存储的 32 位内存指针寄存器和一个用于下一个传输的传输计数寄存器。外设通过收发信号触发 PDC 传输。当第一个编程好的数据块被传输后,对应的外设会产生一个传输结束中断,第二个数据块便会自动开始传输,而ARM处理器此时可并行处理第一个数据块。这样,就可以消除为更新处理器上DMA内存指针所带来的实时中断限制,对于维持外设上的高速数据传输来说,这是非常关键的。
在这个方案下,可以随时读取下一个数据传输的存储位置和剩余要传输的数据块。PDC 有一些专用的状态寄存器,它们显示各个传输通道是否激活。通过一些控制位,便可安全地读取指针和计数寄存器,而不会出现两次读数不同的情况。PDC将状态标志发送给在状态寄存器中可见的那个外设。当该外设接收到一个外部字符,便会发送一个接收就绪的信号给PDC,而 PDC 便会请求访问系统总线。当该请求获得允许,PDC便开始读取外设的接收保持寄存器,然后触发一个内存写操作。每次传输后,相关的PDC内存指针地址将增加,剩余的传输数目将减少。当内存块满时,下一个内存块的传输便会自动开始;或者会有一个信号传送到外设,以停止传输。至于向外设发送数据,传输过程正好与此相反。如果在相同的外设上同时出现相同类型 (接收或发送) 的请求,请求的优先级别由外设的编号决定;当请求不是同时发生,则按请求出现的先后而处理。来自接收方的请求先处理,然后处理发送方的请求。
SAM7X 结构中的 DMA 方案使其能同时充当网关和控制器,甚至在高数据速率下也能如此。
实时应用的支持
虽然许多 32 位系统厂商都努力在其微控制器上增加连通性,采用USB、以太网或其他协议,但大部分都不曾解决实时应用的问题。大多数的嵌入式控制应用是确定过程式的,即指令和数据必须在一个可以准确预计的时钟周期内到达正确的地方。这是“实时”应用的本质所在。可惜,绝大多数 32 位控制器都不具备实时应用所要求的性能。
ARM结构最初是为了便携式PC而开发的,其操作系统管理中断处理和制定处理的优先级别。但它从来不是面向确定过程式实时应用的。为克服在外部非易失性内存中存储代码导致的性能下降,PC 处理器在高速缓存中采用代码遮蔽技术。但当某一需要的指令代码正好不在高速缓存中时,这种技术就会导致不可预见的延迟。如果不用借助操作系统来实现外设连接,那就需要中断屏蔽和额外的软件支出。总之,这种使 ARM 适合于 PC 应用的结构同时也使它不太适合实时应用。AT91SAM7 器件是ARM7微控制器中独特的产品,配备了一整套支持实时应用的功能,包括一个有8个优先级别的中断控制器、基于硬件的细致位操作、上电复位电路、单电源电压、欠压监测器和实时时钟。
确定过程式处理
SAM7X 微控制器上的 25ns 高速非易失性闪存允许其在单周期内直接从闪存读取指令,而无需代码遮蔽,并能确保以确定过程式的方式完成指令处理。SAM7X可在不借助高速缓存的情况下以 38MIPS 的速度处理闪存的原始数据;而在处理片上SRAM的数据时速度可达50MIPS。
中断控制
实时控制应用通常是由中断驱动的应用,其特点是有多个中断源,且对每个中断都会有一个可预计的响应。ARM核结构采用了一个简单的双中断机制;在该机制中,其中一个中断负责处理所有非紧急的中断任务,并没有硬件制定优先级别。这在高度互连的嵌入式系统中是不能接受的,因为这样互连环境下的高吞吐量通信接口要求快速中断处理与低优先级系统功能并行。Atmel 公司的AT91ARM7通过一套可独立屏蔽的中断向量源和一个有8个优先级的中断控制器解决了这个问题。其基本的中断处理程序永久驻留在SRAM中,负责判别各中断源的优先级别。一旦需要,它便会执行一条指令,使用中断号 (每一个中断源均获分配专用的中断号) 把相应中断服务程序的向量直接加载到程序计数器中。可惜的是,ARM7 结构没有细致的位操作指令,因而要15条指令 (即要15个时钟周期) 才能完成这些置位/复位操作。ARM7先用6个指令取消中断,然后用9个指令执行RMW操作,完成复位,最后用6个指令重新激活中断。这牵涉大量的编程、除错调试和处理操作,尤其是当支持这些操作的指令来自8位或16位处理器时,工作量更加庞大。
细致位操作
在现今对成本敏感的应用中,节省代码和数据空间是首要考虑的问题,因此能在I/O空间中对个别位字进行设置 (set) 和清除 (clear) 就最理想不过。如果不具备这种位操作的能力,则需要在目标的 I/O地址内执行一个读、改、写 (Read-Modify-Write, RMW) 操作;也就是说,将该 I/O 空间读入 SRAM、修改目标位,然后将结果写回I/O寄存器。当然,这很耗费闪存和SRAM等的系统资源,而且也增加功耗。位操作得以发挥优势的另一种情况是激活和取消中断。如果要利用 RMW操作来激活或取消某个中断,你必须先取消所有中断,接着进行 RMW操作来激活或取消特定的中断,然后重新激活所有中断。Atmel 公司已对 ARM7 结构进行了扩充,允许在 I/O 空间内设置和清除位字。每个外设都有一个“设置”控制寄存器和一个“清除”控制寄存器。这样,就可用一个 6 个周期的加载/移动/存储序列来处理所有中断屏蔽以及位设置和清除操作,从而减少 60% 的处理开支和代码。
单电源
随着工艺技术的尺度越来越小,微控制器的核心电源的电压范围必须适当。在0.18微米工艺节点,核心电源一般在1.8V。然而,为了与传统的8位系统兼容,32位微控制器必须由一个电压范围从 3.0V 到 3.6V 的单电源来供电。新的微控制器用一个片上调压器产生核心部分和其他片上子系统所要求的1.8V电压。具有这个带外部连接的1.8V电源,能更好地基于系统板提供的功能来控制各个功率源。至于使用这个片上调压器还是使用具有更高效率或更低待机功耗的外接电源,可完全由终端用户自行决定和控制。这个调压器具有在CPU低速 (500Hz 到1.5MHz) 时进入待机模式的特点,这可降低调压器的功耗,使电流降到20mA。在这种情况下,最大输出电流为1mA,足以驱动CPU和大多数外设,这有助于弥补32位微控制器较高的待机电流。
结语
现今嵌入式系统逐步朝着嵌入式网络发展,常常要与其它网络联网。为这样的设计选择一个微控制器需要同时考虑器件的互连能力、数据传输能力、安全性,且又不失实时应用处理所要求的监管和控制功能。微控制器供货商正纷纷推出针对这类应用的32位微控制器。设计人员需要根据自己的特定系统来评估每一种产品。