嵌入式微处理器在二十一世纪出现重大变化

2010-12-20 15:47:07 来源:半导体器件应用网 点击:1288

      自从8048/8051微处理器进入市场以来,已经过去了三十年。它的出现改变全世界对嵌入式微控制器应当是什么样的观点。这么多年来,每种新的微控制器都采用它们的基本结构,每种新产品都作了一些改进,目的是满足应用系统越来越高的要求。最早的结构仍然很重要,而且没有改变,现在是迎接新的多处理器核结构的时候了。这是最新设计的结构,用于二十一世纪的应用系统。在本文中,我们将讨论在结构设计方面的根本变化──由于需要更高的运作速度同时要省电,推动这种结构的出现。
二十世纪的应用系统
      在二十世纪,一般的应用系统使用8位微控制器,它能够读取传感器的信号。这类微控制器能够进行少量的数据处理,有一些I/O,大约是并行的,以便把字符送往显示器,或者把一个字节数据送到磁带或者其他的数据记录设备上记录下来。有一些I/O能够对简单的键盘或者一组开关进行扫瞄,全部工作可以用芯片上的实时时钟信号在要求的时间内完成。利用芯片上的时钟提供的精确时间信号,同步地传送数据,执行其他按时间进行的任务。
      这些应用系统使用的存储器并不多,也许只是64到256字节的RAM存储器,大多数是集成在芯片上。有一些微控制器也能够访问外部存储器,最初的接口只不过是地址和数据总线,它们通过处理器读取数据,在软件的控制下把数据送往外面的存储器或者取出来。
      所以,人们着眼于在要求的时间之内控制I/O,处理器进行的实际数据处理工作是很少的。这是因为处理器处理数据的能力非常有限,而且时钟的频率很低,只有几兆赫兹。尽管这些芯片处理数据的能力有限,对于大量简单的应用,从室内温度控制器到简单的家庭自动化系统,是绰绰有余的了。事实上,我是用最近推出的手持计算机撰写这篇文章的。这台计算机使用从最早的8048芯片衍生出来的微控制器专门读取我在键盘上的动作。随着时间的推移,出现了更小、功能更少的处理器,它的价钱较低。同时,出现了比较先进的,字长为16位和32位的其他微控制器,它们包含速度快得多、复杂得多的外部存储器接口,它们使用DMA控制器电路。然而,基本的想法仍然没有变。在一块芯片上有一两个处理器,从输入线上读取数据,把数据送到输出线上,按照需要改变I/O控制引脚。这些都是使用外面的实时时钟基准信号。
消费类电子产品推动二十一世纪应用系统的发展
      但是,现在应用系统有了很大变化。除了用传统的位触发(bit banging)方式,增加新的处理功能──算法的处理。今天,大量的应用系统是消费类多媒体系统,包括小小的MP3音乐播放器到具有视像功能的移动电话。而且期待已久的高分辨率电视也开始蜂拥而来,由于高分辨率电视的出现,突然之间,消费者们认识到他们需要家庭网络,在房间之间传送视频节目和音乐。
多媒体的功能
      所有新型消费类应用系统的核心部分都有数字量数据,这就是说显示和播放这些数据的器件中需要进行大量的数字信号处理。在设计用于多媒体的各种文件格式时,已经考虑到使用数学算法进行数字处理──快速富利叶变换(FFT),离散余弦变换(DCT)等等。在多媒体应用系统中需要宽频带,它要求二十一世纪的处理器有专门的电路来处理这些算法。但是仍然需要早期使用的通用I/O和实时时钟。新的芯片两者都需要!
面向位流
      因此早期的处理器把外部存储器看成是应用系统的数据源,也是应用系统中数据的去向。现代处理器要能够操作来自互联网、USB和1394以及电缆和人造卫星电视服务系统传过来的高速位流数据。消费类产品,例如相机、MP3播放器,甚至是移动电话,都普遍使用USB 2.0接口,要求速度达到480 Mb/s。视像应用系统通常使用1394接口,速度为200/400/800 Mb/s。现在千兆位的以太网甚至已经开始在家庭中出现,它的数据传送速度还更高。今天的处理器要处理这么高的数据速度,按照二十世纪的标准,速度之快不可思议。
      更严重的是,高分辨率音像网络联合会(HANA)用于家用网络的新标准认为FOUR 1394的位流速度会高达800 Mb/s。MP4格式的数据假定音频和视频有多个位流,以及供选用的其他数据流,用于传送标题和静止图像。在很多情况下,同一个处理器在对缓冲存储器送过来的MP4位流进行解码时,也要处理进来的位流,所以,必须立刻同时处理四个或者五个这样的高速度位流。
外接高速存储器接口
      由于需要把数据高速度地送往外接存储器,处理器只需要处理几百个字节数据的时代早已成为过去。今天,用于视频应用系统的一些专用处理器一定要能够对128兆字节的DDR SRAM存储器进行存取。在一块处理器芯片上实现比较大的寻址范围是比较容易的,但是这些存储器接口的速度现在极为重要。寻址空间大意味着处理器上有很多引脚用作外接存储器的接口。在很多这类应用系统中有多个位流,这表示必须有一个简单的方法能够迅速地切换存储器接口上的地址位。在大多数现代处理器中,这个接口(一般有三个)使用成熟的DMA(直接存储器寻址)控制器。有一些控制器甚至更进一步,它们可以进行变址寻址。这样很方便。例如,当控制器从存储器中取出多字节矢量时,就很方便。
低功耗
      许多现代消费类设备是用电池供电。它的处理工作量大,加上显示器,有时甚至还有一个磁盘驱动器,因此这些设备的电池负荷很大。所以功率是一个大问题,而处理器本身必须能够工作在低功率状态,以便延长电池寿命。当然,低功耗与高速处理不可兼得,所以在设计时要认真地权衡。
应用系统在本质上的变化明确地要求对处理器芯片的结构作出相应的改变。例如,由于需要多媒体的功能,需要处理高速算法的专门电路。由于需要进行高速处理,芯片设计人员把处理器核加到芯片上,这样,需要进行实时处理的任务就可以在一个处理器芯核中运行,同时其他任务可在第二个处理器核上运行。
多处理器核
      把任务分成两组──实时的任务和非实时的任务──的做法失败了,原因很简单,在现代的应用系统中,大多数任务都有一部分是实时进行的。简单地说,推动多媒体应用系统发展的动力是高速计算部件,它们竞相在很短的时间里,在下一批多媒体数据到来之前完成他们的算法。这个办法没有成功,就是说播音乐时会出现停顿,或者视像中会有尖脉冲噪音。
      近来的发展趋势是把一个甚两个DSP核和高速乘法器/累加器电路结合起来,跟上多媒体位流的速度。但是,由于增加速度更高位流的要求看来是无止境的,这个方法看来达到了它的极限。一个更好的方法是把几个处理器核集成到芯片上,每一个都比复杂的DSP核简单,但是每一个处理器核都有一个高速乘法器/累加器。这些处理器核如果妥善设计,就可以把计算任务分配给各个处理器核共同进行,从而能够执行复杂的算法。当然这需要重新写入算法,以便把计算任务分解,由多个处理器核分担,结果可能令人难以置信地提高了处理能力。
      用这个办法安排计算任务还有另外一个优点。由于使用DSP核的芯片灵活性小,而用若干处理器核的芯片可以编程,可以把处理器核的数量设计成是最优的,来解决这个问题。需要更高的速度吗?只要用更多的处理器核来进行处理就可以了。这个办法利用了处理器核的强大处理能力,所以,和 DSP不一样。DSP主要是由高速算法电路组成,处理器核增加了高速条件转移的功能,它还有其他传统计算电路部件的功能。因此,使用多处理器核的办法十分灵活,它解决问题的能力很强,不只是能够完成高速算法。
      多处理器核芯片的灵活性表现在,可以简单地指定各个处理器核完成需要执行的不同任务,解决范围广泛的各种问题。可以让一个处理器核去管理外接存储器,让八个处理器核负责快速富利叶变换,完成多媒体算法,再用几个处理器核带动应用系统中的各种I/O子系统。这与使用单个处理器处理多任务的传统方法完全不一样。大家知道,这个方法是让处理器在某一段时间做一个任务,然后切换到另一项任务等等,因而人们觉得它是执行多任务的处理器。如果有一些任务是关于I/O的,需要相当时间等着接收数据,这个感觉是没错的。但是,对于不需要等待数据的任务,这个感觉就完全破灭了──这个处理器只是由不同的任务共用资源,它的负担显然是很重的。在转换任务时,由于处理器把数据存放到寄存器和存放应用数据,需要上下文切换时间,这个问题就加重了。处理器越大、越复杂,上下文切换时间越长,这种多任务处理器的感觉就破灭得越严重。在多处理器核的方法中,每一个任务是用一个或者更多处理器核来完成,情况完全变了。上下文切换时间是零,道理很简单,每个处理器不会改变它的任务。多处理器的想法变成了现实。
本地RAM/ROM存储器
      当设计中使用了多个处理器时,存储器存取的问题就出来了。大多数多核芯片设计把几个处理器核和一个共用存储器放在一起。这样做简化了设计,因为每一个核只是处理器本身,问题转到多个处理器核如何共同使用一个存储器,以及存储器存取的仲裁,这是一个难题。通常用到某种仲裁网络或者交叉点切换开关。在只有三个到四个处理器核时,这个方法是可行的。但是,在芯片上需要几十个处理器核时,共用存储器的问题变得很复杂,令人望而却步。此外,由于越来越多处理器核需要对存储器进行存取,共用存储器的效率变得越来越低,很快就成为致命的瓶颈,把多核结构在处理方面的优点都淹没了。
      解决这个问题的办法是用本地存储器取代普通的共用存储器。本地存储器是属于各个处理器核的存储器。用这个办法,就不需要存储器仲裁,也不需要交叉切换开关,因为每个处理器核只是对自己的RMA/ROM存储器进行存取。
      用共用存储器来存放数据有一个大优点,这就是,只要为分配给每个处理器核它所需要的存储容量,就可以对存储器的大小进行优化。在每个处理器核都有它自己的本地存储器时,存储器的容量就需要权衡折衷。如果存储器容量太小,处理器核就不能充分发挥作用,如果存储器容量太大,又造成浪费,芯片就会很大,代价是效率。
      好在本地存储器的大小很容易确定。只要编写芯片必须处理的典型算法的源代码,并且试一下,很快就知道,需要的存储器容量有两种,一种是1000字节或者少一些,一种是容量很大,几兆字节,甚至几百兆字节。当使用很大的缓冲器来处理多媒体数据时,就会出现上面所说的第二种情况。但是只不过是芯片上的几个处理器核需要容量很大的本地存储器。很清楚,每个处理器核增加几兆字节的本地存储器,即使这样做是实际可行的,也是很浪费的。第一种存储器容量,也就是1000 字节,用今天的主流半导体工艺是很实际的,作为处理器核的本地存储器,的确是绰绰有余的。
      最后一个办法就是每一个处理器核都用小一些的本地存储器,1000字节的数量级,用于存放程序源代码和数据,再用一个大得多的外接存储器,作为缓冲存储器,满足多媒体的需要。只有少数处理器核需要用它。
处理器核之间的通讯
      很清楚的一点是,多核芯片的想法并不是用一组处理器核岛,每个岛有一组它自己的I/O脚,这些I/O脚是相互独立的。我们已经讲过,计算量很大的算法可以由几个处理器核分担进行。很明显,各个处理器核之间需要交换数据和合作。
      处理器核之间进行通讯的方式有两种:传送状态信号和传送数据块。从概念上讲,这两者之间并无区别,然而在通讯速度方面则有很大的不同。例如,状态信号可以送给相邻的核,说明数据已经就绪,等待传送,然后在它们之间传送数块。这两种通讯方式都要求效率很高,而实现高效率的办法可能完全不一样。在后面再来谈这个问题。
      对于存储器共用的情形,处理器之间的通讯可以用几个办法进行。如果只牵涉到两个处理器核,可以提供通讯电路,每一个处理器通过电路和其他处理器进行通讯,这是实际可行的。但是当处理器核的数量增加到几十个,芯片的面积和通讯电路的复杂程度会变得令人望而生畏。实现处理器核之间通讯的另一个办法是只限于在一组很少的处理器核之间进行通讯,典型的情形是在最靠近的两个处理器核之间进行通讯。这个方法简单得多,而且非常实际。
      实现处理器核之间的通讯电路是许多处理器面临的问题。如何实现通讯路径和进行处理?作为计算机的使用人员,对于我们运行的应用程序,习惯于让计算机去作出决定。例如,随着我们的文件增多,文字处理应用软件需要更多存储器,我们依靠计算机找到存储空间,指定那个存储空间供文字处理程序使用,一项文字处理也许需要重新指定存储块,并把一部分数据移到磁盘上。这个处理过程我们是完全看不见的,是计算机按需要进行的。
      在设计存储器分配系统时,甚至在磁盘操作系统时,考虑到要以很高的效率来运行软件,这时就是文字处理程序,这点并不是大家都清楚的。设计系统时,一开始就考虑到计算机自主地运作,指定存储块,把其他存储块的数据移到硬盘,而不是由使用者来做这件事。
      对于多核芯片,究竟如何指定这些处理器核去执行应用软件中的各个任务呢?这不是由应用程序自己来做,甚致不是一些操作系统。指定处理器核完成一项任务的过程是由设计人员/程序员来做的,设计人员和程序员把应用软件送到芯片上,而不由开发系统程序来做。把应用软件送到芯片的过程是设计课题中最基本的问题。为此,设计人员一定要了解哪一项任务需要交换最多的数据。然后指定邻定的处理器核完成这项任务,将处理器核的通讯优化。如果指定处理器核的过程是由开发系统以某种方式自动进行的,那么可以设计一个在处理器核之间进行通讯的系统,针对自动指定处理器核的过程进行优化。但是,由于这是由设计人员做的,最好是使用最简单、效率最高的通讯电路,它只在这个处理器核与邻近处理器核之间交换数据。当然,可以让处理器核把数据和状态信号用接力的方法传给较远的处理器核,但是,规定处理器核只与最近的处理器核直接交换数据,芯片设计就简单得多,应用软件设计人员反正需要指定处理器核的任务,对他们来讲,并无任何损失。
针对具体的应用系统进行自动设计和手工设计,两者之间往往会有冲突。既然计算机起的作用有时候是文字处理器,有时候是电影播放器,或金融电子数据计算器,不论是哪一种功能,与嵌入式处理器起的作用是完全不同的。在嵌入式处理器芯片中,不在相机和温度控制器这些功能之间来回切换。因此,不要用不论什么事、不论在那里,不论什么时候都做的结构,不要像大型交叉点开关那样可以在芯片上任何两个处理器核之间交换数据,因而对设计进行折衷。
      如果我们决定只在最靠近的相邻处理器核之间交换数据的话,通讯电路就变得很简单,效率也有可能很高。处理器核之间交换数据是通过共用寄存器进行,不需要解决冲突的电路,不需要优先权网络。但是有可能把某些状态信号和数据交换结合起来。传统的做法是,两个处理器通过一个共用寄存器传送数据,检测某个地方的状态位,它决定传送数据的状态。处理器A把数据送往寄存器,并把状态位设置为“高电平”,表示数据已经到位,等待读取。处理器B是通过软件检测状态位,看它是否变成“高电平”,状态位为“高电平”表示新的数据已经放在寄存器中。在读取数据之后,处理器 B将状态位复位,成为“低电平”,表示已经读取数据,寄存器已经准备好等待下一次传送数据。在这方面有很多不同的做法。不过,可惜的是,比起实际传送数据所用的时间,两个处理器读取状态位、检测状态位、写入状态位所用的时间更长。
多核芯片提供了一个简单得多的办法。处理器核A的源代码编写成这样:它总是认为寄存器是空着的,在等待数据。它的循环子程序没有检测和写入状态位的源代码,但是它变成是执行指令“送出数据(SendData)”-“送出数据”-“送出数据”,等等。同样处理器B的源代码认为一直有数据在等着它去读出,所以它的循环子程序现在只不过是执行指令“读取数据(ReadData)”-“读取数据”-“读取数据”,等等。在实际上这是如何实现的呢?处理器核A是送出数据的核,想把数据送到共用寄存器去,如果在寄存器中的数据还没读取,处理器核A 就停下来,一直到处理器核B读取了寄存器中的数据,在同一时刻,处理器核A回来执行原来要执行的哪条指令,也就“送出数据”。于是,从源代码的角度看,处理器核A总是认为寄存器总是空着的,在等待数据,没有必要读取和检测状态位。处理器核B做的事与之相似。处理器核B的源代码总是认为寄存器中一直存放着没有读出的数据。当它开始执行指令“读取数据”,从寄存器中取出数据时,如果寄存器中没有需要读取的数据,它也停下来。当新的数据在寄存器中出现时,处理器核B便执行“读取数据”指令,这条指令把数据从寄存器中取出来。同样,没有必要读取、检测状态位,没有必要将状态位置位。

... 

本文为哔哥哔特资讯原创文章,未经允许和授权,不得转载,否则将严格追究法律责任;
Big-Bit 商务网

请使用微信扫码登陆

x
凌鸥学园天地 广告