现代嵌入式计算 - 第4章 - 嵌入式平台架构 (第一部分)

来源:互联网 发布:xmanager连接linux图形 编辑:程序博客网 时间:2024/05/17 01:35

嵌入式平台的构成是怎样的?在本章中,我们描述嵌入式平台的组成部分,和它们在系统中的作用。

作为一个嵌入式软件开发人员,您应该对平台有全局的了解,尤其当你开发设备驱动软件时,还需要了解到原理层面。


除了了解部件在物理上如何连接,你还需要从软件/处理器视角理解那些部件。理解软件和底层平台设备交互的关键是,系统内存映射表,和设备的寄存器。


有些设备寄存器是直接映射到处理器的地址空间,可以被软件直接访问,而有些设备是连接到某些总线上的,当我们希望访问这些设备的寄存器时,需要通过总线操作。


在本章中,我们描述构建嵌入式系统的组件。


平台概述

嵌入式平台应用到各种设备,从无线路由器,到复杂的汽车导航和多媒体系统,和工业控制系统的机器人等。涉及广泛的接口和不同的性能需求。


在嵌入式系统的开发中,您需要在各种系统集成芯片(SOC)里进行选择,这些芯片都支持连接您应用所需要的外设。在本节中,我们专注于支持系统运行所需的关键设备。


4.1给出本章中讨论的平台的概要图。


4.1

SOC系统概述。


处理器

嵌入式系统具有至少一个处理器。该处理器是应用程序的主要执行者。所述处理器通常运行操作系统,而操作系统承载所需的应用程序。

在现代系统中,嵌入式SOC有时包含额外的处理器单元,用于支持应用中某些具体的功能。

比如一个现代化的智能手机,该应用处理器运行用户界面,Web浏览器,或愤怒的小鸟,谷歌地图等应用程序。通常还会有一个基带处理器运行无线协议栈。有些平台还会有处理音频和图像的处理器。

这些辅助处理器上运行的软件通常被称为固件。该软件服务于特定的功能,通常不运行操作系统。

主处理器(应用处理器)显然是平台中心。在现代系统中,处理器通常是32位,这意味着,在处理器内的所有寄存器是32位宽,包括数据和地址寄存器。过去低性能的嵌入式系统通常使用16位微处理器,随着日益增加的负荷和互联网需求,这些微控制器也在向32位发展。同样,随着高性能或大内存需求的增加,64位系统也正在赢得市场。


处理器的指令可被分类为复杂指令集计算(CISC)或精简指令集计算(RISC)。英特尔处理器都基于CISC指令集,而ARMMIPSPowerPC基于RISC架构。CISC指令包含可变长度指令从而支持更紧凑的编码。另一方面,RISC是固定大小的指令(例如,PowerPC架构所有的指令都是4字节)。


处理器的另一个重要考量是,是标量或超标量体系架构?这是处理器的微架构属性。超标量体系架构的处理器支持指令的并行执行。该处理器通常包含多个功能相同的CPU关键单元,例如,英特尔Atom微架构包含两个算术逻辑单元。关键功能的多个副本允许处理器在每个时钟周期运行一个以上的指令。嵌入式处理器的趋势是朝超标量体系架构发展。


处理器还需要其它硬件的支持来执行任何有用的工作。比如支持多任务操作系统,处理器还需要如下关键能力:

存储初始指令的存储器和随机存取存储器(内存)。

中断控制器,进行中断事件的收集,按优先顺序交给处理器处理。

一个定时器,多任务操作系统通常依赖计时器中断,来触发操作系统的任务调度器。

•I /O设备的访问能力,诸如访问图形控制器,网络接口,和鼠标/键盘等。


处理器处在平台的中心,与平台上的其他设备进行交互。设备在系统中的位置,通过系统内存映射表(SystemMemory Map)来呈现。


系统内存映射表

了解任何嵌入式系统的关键是透彻理解系统内存映射表–-内存地图。系统内存映射表,是平台所有资源的地址列表,包括比如,DRAM内存,中断控制器和I/ O设备。系统内存映射表是从处理器的视角看整个系统。

当处理器产生一个读或写时,地址按系统内存映射表,由地址译码器并最终路由到适当的物理设备,来完成数据的读写。比如,当读写地址是映射到DRAM控制器,那么读写事务发生在内存上(比如DDR)。又比如,当读写地址映射到PCI总线上以太网控制器,这是可能是读或写一个网络数据包。

Intel系统(事实上大多数系统)的地址空间分成两个单独的子范围。第一是地址范围,是DRAM,第二个IO设备的地址。第一个地址范围,称为主存储器地址范围,第二个地址范围,是I/ O映射(MMIO)范围。

SOC中有一个寄存器,TOLM,表示本地内存的最大地址--- DRAM就被映射在1MTOLM的范围内。从零到1MB的地址映射是系统内存和MMIO的混合。

IO设备映射的MMIO地址范围,进一步分类如下:


固定映射地址。有些设备的访问地址是固定的。比如flash设备,定时器,中断控制器,以及其他一些功能。

•PCIe总线。我们会在后面提供更多的细节,有一部分MMIO地址是被路由到系统的PCI/ PCIe总线上。PCIe总线上的设备有可配置的地址译码器,通常被称为基地址寄存器(BAR)。

Intel平台上,PCIe总线逻辑抽象也用于内部设备。

这意味着,SOC内的设备,需要像外部PCIe设备一样被发现和译码,即使这些内部设备并未实际使用PCIe总线。例如,英特尔E6xx系列SOC的图形控制器,显示为MMIO地址空间的PCIe设备。发现和建立译码器的过程对于内部或外部设备是相同的。


4.2显示了英特尔体系平台的系统内存映射表的概述。



4.2

Intel平台的系统内存映射表


然而,许多其它嵌入式系统,地址映射(SOC内的设备)是静态的。所有

设备在SoC设计时分配了地址。这用做简化了硬件设计,

但系统软件必须知道访问每个设备的静态地址。这种模式,要用同一软件映像支持多种芯片变得困难。话虽如此,在许多情况下,嵌入式系统软件都面向特定的芯片。


中断控制器

处理器需要通过各种设备和外部环境交互。这些设备通常需要处理器,能够敏捷地做出响应。该设备需要一个机制来获得处理器的关注。中断提供这种机制,中断避免处理器不断查询设备。


鉴于我们经常有多个来源的中断,需要中断控制器来仲裁。中断控制器收集所有的硬件中断,然后呈现给处理器。在其根本上说,中断控制器就是传递外部事件给处理器核心。中断控制器方便处理器识别引起中断的事件,从而把事件交给对应的例外处理程序。


4.3显示了中断控制器的最简单的形式。它有三个寄存器。寄存器的每一位分配给一个中断源。第一个是中断状态寄存器。它反映了中断输入引脚上的状态。当中断请求时被设置为1,没有中断或中断清除后置为零。第二寄存器是中断屏蔽寄存器。通过使用该寄存器,可以屏蔽某些中断,防止它到达处理器核心。如果某个中断源对应的位在屏蔽寄存器中设置,来自该设备的中断将无法达到处理器。中断状态寄存器反映的是未屏蔽的中断线。


在这个简单的例子中,我们只有一条到处理器的中断线。当该中断线激活后,处理器保存处理器当前状态,然后把控制权交给中断控制程序。这个例子在ARM架构的器件中相当普遍。


中断处理程序读取中断状态寄存器,按预定的优先级读出最高优先级的中断位,然后交给对应的中断处理程序。这个情况下,优先级算法是软件控制的,并且你可以调整中断状态位被选中的顺序。


中断挂起寄存器往往采用锁存器的形式。当一个未屏蔽的中断激活,该中断对应的位在中断挂起寄存器中置位(1)。即使中断信号被除去,中断挂起位依旧是1。只有当中断处理程序服务中断,并且写一个逻辑1位来确认该中断已被服务,该位才清零。这种行为被称为,写1清零寄存器.


通过扫描找到最高优先级的中断,这种软件处理增加了时间。在嵌入式系统中,我们通常试图减少中断服务的开销。为此,一个硬件逻辑被引入,它基于优先级设置,从未屏蔽的中断源中找到最高优先级的中断。


中断信号可以是由芯片内部设备或者外部GPIO产生。中断触发有以下几种模式:


电平触发,分为高电平有效或低电平有效。如果是高电平有效,信号电平高,则表明中断激活;反之,信号电平低表明没有中断请求。与此相反的是低电平触发中断。

电平触发的方式经常被用于多个设备共享中断线。多个设备的中断线连接在一起,线路上的任何设备可以声明中断。


边沿触发,上升沿,下降沿,或两者兼而有之。在这种情况下,中断线的电平过渡表明一个中断请求信号。当中断线从逻辑低电平转换高,并且被配置为上升沿触发,指示设备已经产生中断。对于配置为下降沿触发,相反的过渡(从高电平到低电平)指示一个中断。


正如你所想的一样,系统(设备驱动程序)必须对不同的中断类型采取不同的处理方式。电平触发的中断持续有效,直到设备中断线电平信号改变为无效状态。

设备驱动器处理电平触发的中断,必须执行特定操作,以确保中断线电平信号被带到非活动状态。否则,该装置将不断产生中断。

边沿触发中断,能有效地自清除中断指示。在许多情况下,设备具有很多导致设备产生中断的内部事件,此时中断处理程序必须确保它处理了所有中断原因。基于电平触发的中断,如果驱动不清除设备中断源,设备将不断产生中断。


英特尔体系架构细节

讲述了Intel体系架构的两种中断控制器,8259PICAPIC,略


定时器

基于硬件的计时器是所有计算机系统的关键之一。基于硬件的计时器通常,从某设定值倒计时,当计数器达到零,触发一个给CPU的中断。计时器通常会自动重新启动(free-run)。操作系统至少需要一个定时器,特别对于多任务操作系统。



操作系统定时器被称为操作系统滴答(OStick)OStick的中断处理程序,触发操作系统调度程序

评估,是否当前的进程应该被暂停,而去执行另一个就绪任务。编程时,你应该知道一些定时器的属性:

时钟源。时钟源决定了定时器的倒计时间隔。时钟源通常是通过将系统时钟之一,硬件除法得出,该硬件除法器可以进行编程。

定时器精度。定时器的精度在很大程度上是由底层时钟或振荡器的精度来决定。源的精度以每百万份误差定义(PPM)。用振荡器的平台通常比那些使用晶体作为时钟源的平台精确得多。在嵌入式系统中,操作系统的tick用于维护系统时间。在这种情况下,振荡器或晶振的准确性是非常重要的。例如,用100PPM晶体源将具有100/10E6,这是0.01%的精度。鉴于每天有86,400秒,每天可以产生8.64秒的出入。一个好的经验法则是,12PPM相当于每天约1秒误差。你应该注意到,精度可随温度变化。在Intel系统里,有一个独立的实时时钟(RTC)。RTC的一个重要属性是断电时可维持时间,通过备用电池。然而,在嵌入式系统平台,往往没有备用电池。如果晶体/振荡器的PPM过高和精度不可接受,嵌入式平台通常依赖于外部代理提供一天中的更精确的时间。网络时间协议用于获得一天中的精确的时间。全球定位系统也提供精确的时间戳,也可以被用来维护平台的时间。

自由运行/单次。此属性定义定时器的行为。自由运行定时器从基准值开始,递减计数到零;一旦计数器达到零,会重新装入基准值,并继续从基准值倒计时。定时器可以被编程,在计数器达到零时触发中断。一个单次定时器,则在它达到零时,停止计数,而定时器必须由软件来明确地重新启动。自由运行模式也被称为周期模式,而单次定时器被称为非周期模式。

计数方向。定时器可以向上或向下计数。向下计数,到零产生事件。向上计数,到参考值时产生事件。

计数器。在这种情况下,定时器计算输入到计数器的时钟次数。计数器自动持续运行,不会重新启动。计数器从零开始,当计数器寄存器里所有的位变成1,则从头开始;也就是说,一个32位的计数器将从0xFFFFFFFF翻转到零。

看门狗定时器(WDT– Watch Dog Timer)。这是一类特殊的定时器。它在定时器满时,通常产生一个不可屏蔽的中断(NMI),或复位硬件。如果软件因某些原因不工作,WDT被用来保证系统重新启动。因此软件必须在适当的时间间隔维护WDT,防止WDT过期。嵌入式软件采用多种不同的策略,以确保整个系统正确地运行。最简单的是,有一个专门的任务,睡一段时间,醒来,然后服务WDT。设置这个任务的优先级为高;以防止在重负载下的系统,没有足够的时间来运行这个进程/任务。

更多复杂的策略,利用操作系统的任务上下文切换的时机。



4.11示出了通用定时器的逻辑结构。



硬件定时器,经常在软件延时程序的循环中,被频繁读取。特别是当延迟短的情况,对于较长的延迟,最好是调用相应的操作系统的服务,从而允许操作系统运行其它任务。



Intel定时器和计数器

0 0