恩智浦非对称双核微控制器的研究 智能应用 影音
AIEXPO2024
Event

恩智浦非对称双核微控制器的研究

图一
图一

在开发MCU应用系统时,如果单颗MCU无法满足系统的要求,一个很普遍的做法就是使用2颗或更多的MCU,把一部分「杂项工作」分配给另一个有「助理」性质的低端MCU来完成。但是,采用2颗MCU,缺点也是很明显的,尤其是在芯片与PCB成本、系统可靠性,以及功耗上面,都有先天的不足。

进一步地,若是采用了不同架构的MCU,还要面临需要不同的开发工具与开发人员的挑战。如果换个思路,让MCU内部包含了2个内核,其中一个用于主控,另一个用于协控,并且它们主控与协控在架构上能向下兼容、高效通信,则在很多场合下,都可以既保存多机系统的强大,又免去多机系统的不足。

图二

图二

1.背景与基本概念

事实上,这即是「非对称多处理器(简称AMP)」架构的特点。AMP是与「对称多处理器(简称SMP)」相对的架构,后者各处理器有一致的程序设计模型,并且在分配工作时主要以均衡为原则。而AMP的优点在于精细的任务分工,灵活地适应不同情景,物尽其用,以最佳地平衡成本、性能与功耗。此外,AMP的程序设计难度也更低。因此,在MCU应用领域,AMP较SMP更为适合。

与独立的双MCU相比,AMP架构有很多优点。其中相当关键的,就是再添加1个内核的代价远比添加1个独立的MCU要低,尤其是当2个内核架构相似时,甚至仅相当于在现有硅片上再添加1、2个UART。另一方面,2个内核可以有相同的主频,并且可以通过汇流排矩阵平等地访问片上的资源。而在分立的双MCU方案中,协控MCU的主频常常远低于主控,并且双方使用低速的串行链路通信。

接下来,我们以目前唯一的泛用型AMP MCU产品——恩智浦半导体新推出的LPC4300系列为例,尤以LPC4350型号为代表,对AMP MCU作一简单的介绍。

2.非对称双核MCU的特点

AMP MCU一般用于相对大型的系统,在功能和性能上都有较高的要求。从功能上,应支持较多的外设。LPC4350片载2个高速USB、2个CAN、工业以太网、图形LCD控制器,以及SDHC等界面;外加一些独有的逻辑可配置外设以及众多传统外设,适用于工控、能源、医疗、音讯、车载、电机、监控等众多行业产品的开发。性能的改善则是AMP MCU的灵魂。内核、储存体,以及汇流排架构对于性能有着至关重要的影响。图一展示了LPC4350的实现方式。

首先是内核的选择。LPC4350基于32位的ARM Cortex-M4和Cortex-M0内核(以下简称M4和M0),2个内核均可在高达204MHz的主频下执行代码。其中,M4以信号处理和浮点运算能力见长,胜任很多原先要采用DSP才能满足的应用,并且继承了Cortex-M3的控制能力;另一方面,M0以其成本、能效和处理能力的压倒性优势,正迅速吸引开发人员从8/16位架构向上过渡。更重要的是,M4完全向下兼容M0,使用同一套开发工具即可开发、调试。

其次是储存体的容量和组织方式。LPC4350配备多达264KB片上RAM,并且这些RAM划分成4个组,每组连接一条单独的汇流排,而并非铁板一块。如若不然,将会出现2个核竞争使用同一块RAM的情况,性能反而还不如只用单个内核!进一步地,LPC4350还有2条汇流排连接到外部扩展的并行和串行储存体,故总共有6个独立的储存体位址空间——LPC4350无片上快闪存储器。对于有片上快闪存储器的型号,片上快闪存储器也分为2块。

最后是汇流排架构。LPC4350内部有1个八层汇流排矩阵,它如同一组纵横开关,可以把CPU与包括储存体在内的众多从设备通过汇流排任意连接。合理分配汇流排接通关系,避免多个主设备(如CPU和DMA)同时访问相同的储存体或外设,可以最大地保证各条数据流程并行不悖,从而可以充分发挥性能上的优势。

3.内核间通信

内核间的通信可分为两类。一类是控制与状态信息的通信,另一类则是数据通信。前者一般不携带数据,但是往往有较高的实时要求;后者则主要是各类数据缓冲区,常常实时性要求偏低但数据量大。控制?状态通信有较大的通用性,并且与任务间同步较为相似,适合由系统软件实现并提供程序设计界面。而数据通信则往往与具体的应用相关较大,尤其是在数据结构上,需要量体裁衣。在实现时,适合由应用软件定义各种数据结构。

内核间通过共享的RAM进行通信,并且每个内核都可以触发对方的一个中断源,通过「准备数据-触发中断」的方式进行通信,如图二所示。当然,内核也可以定期检查共享RAM的状态。接下来我们介绍基于信息伫列和消息池的控制?状态通信方案。

3.1信息伫列

开设2个信息伫列,一个用于M4发送消息给M0,另一个则是M0发送消息给M4。2个伫列的位址需事先约定好。伫列是循环伫列,可以使用简单的阵列配以读、写下标来实现,也可以使用链表结构来实现。前者实现简单,开销小,但消息只能是定长,不便于携带其他信息,还有就是必须把阵列放置在共享存储器区连续的位置,灵活性低。

基于链表的实现用指标连结每则消息,每则消息除了公共的链表控制部分外,还可以根据消息类别携带各种各样的附加参数,并且可以由系统软件的存储器管理机制灵活分配消息存储器,不过,缺点是相对复杂,额外开销大。若涉及动态存储器管理,实时性将远不如基于阵列的方案。

信息伫列有一个缺点,就是消息的序列化处理,它没有优先顺序的概念。但实际上我们有RTOS以及嵌套中断机制的支持,本应实现消息的并发处理。

3.2消息池

消息池在存储结构上其实是简化的基于阵列的信息伫列——去掉了伫列的读、写下标记录器。池中每个元素是一个消息,并且有一个位元组指示每个池的状态——空闲?已处理、新、半处理。当发送方写入消息时,扫描阵列以查找空闲位置;当接收方读取消息时,也是扫描阵列以查找状态。可见,消息池是基于优先顺序来处理消息的——小下标的元素优先得到处理。但消息池的缺点也很明显:每个优先顺序只能存储单个消息,且消息数目不宜过多,否则遍历阵列将使实时性很难保证。

消息池的可扫描性实现了消息的并发处理,并且可以通过中断上下文和任务上下文分两次「反刍式」处理。在处理消息池的插断服务程序中,先扫描各消息完成第一次处理,执行消息中(如果有的话)对实时性要求较高的部分。如果系统中没有使用RTOS,可以在后台的主循环中再接下来二次扫描消息池以完成第二次处理。对于使用了RTOS的系统,可以根据消息的优先顺序创建或启动不同优先顺序的任务,使消息「附身」在这些任务的上下文中得到第二次处理。

消息池的一大缺点就是不宜支持较大数目的待处理消息。如有需要,可以给每则消息添加链表控制栏位,我们可以把同一优先顺序的消息链成一串,从而彻底消除这一局限。

4.1若干重要的细节:内核互斥

与多工之间的互斥相似,内核间也有互斥的问题。尤其严重的是,一个内核无法关闭另一个内核的中断,因此还无法通过关中断临界区来保护。唯一能保证的就是不会出现2个内核同时读写相同位址的情况。我们可以通过施加一些程序设计准则来实现互斥。最简易有效的,就是给不同内核在相同位址设置「唯读」或「只写」的权限,或者是有条件的读写权限。

比如,对于信息伫列的读位置,只有接收方可以写,而发送方只能读取来判断伫列是否空?满。又如,对于消息池,尽管发送方和接收方对池中的元素状态均可读可写,但有如下的条件:发送方只能把空闲状态改为非空闲,接收方只能把各种非空闲的状态改为空闲。再如,对于链表结构,可以只允许发送方更新各种指标。接收方通过更改链表中元素的状态以及触发中断,以指示发送方更新各指标的时机。要注意的是,由于架构上的局限,无法使用「自旋锁」来互斥。

4.2内核鉴别

M4向下兼容M0,这使我们可以重用很多原始程序码。但是,有时需要鉴别当前正在哪个内核上运行。有两种方法。一种是通过C/C++的预处理器,并且在编译器设置中预定义诸如「CORE_M4」以及「CORE_M0」。另一种则是在运行期通过读取一个名为「CPUID」的寄存器,根据CPUID来判定是M4还是M0。

4.3初始化与可执行映射

LPC4350在上电后,M4开始执行代码,而M0却一直保持在重置模式。这是绝大多数AMP的设计方式,使我们也可以无视M0的存在,而只按单核MCU来使用。但若要使用M0,M4就需要为M0准备好开始执行的一切环境,再释放M0。当M0处在重置模式时,我们可以通过JTAG发现M0,但是却无法操作它。因此,如果要调试M0的程序,需要先给M4下载适当的映射使其释放M0才可,不可能在拿到一个空白的芯片后直接先从M0动手。

尽管M4与M0各有自己的映射,但是M0的映射内含于M4的映射中,这样在生产时只需要烧写一次快闪存储器。M4在初始化期间需要为M0准备映射,把它拷贝到拟让M0执行的位置。由于M0固定从零位址开始取矢量,M4还需要设置M0的位址映射,把映射的首位址设置成为M0的零位址。

4.4调试时的细节

当我们使用调试模拟器连接MCU时通常都会产生重置信号,但范围可仅限于内核,也可重置全芯片。在调试M0时,需设定重定置范围仅包括M0,避免殃及正在运行的M4。另外,也需要编写适当的调试初始化脚本以准备好内核的执行环境。这些工作繁琐但有高度的通用性,我们可以借鉴现有的脚本。我们可以同时调试M4和M0,只需运行2个独立的IDE进程,分别打开相应的专案工程即可——经实践,至少在MDK+ULINK下可行。

5.核间任务分工

M0没有M4强大的处理能力,但是作为一个CPU,亦有完整的中断系统和基本的算术与数据传送能力,并且在LPC4350上可以在高达204MHz的主频下运行。合理地分担一些任务给M0,才能利用双核设计的优势。接下来,我们讨论两种主要的任务分工模型。

5.1处理高频中断:智能「DMA」

中断的回应是有额外开销的。既包括CPU的中断模型本身产生的硬件开销,也包括操作系统的中断管理产生的软件开销。当中断的频率很高时,比如,到达每秒数十甚至上百千次,这些额外开销将对CPU时间产生不可忽略的占用。更重要的是,中断的回应通常是淩驾在任务管理之上的,几乎总是可以影响所有任务的性能。DMA在很多情况下明显改善了这一状况。但是当DMA通道或汇流排分派不足,或者是设备不受DMA支持时,我们就可以让M0来回应这些高频的中断,合理组织数据缓冲区,如同一个智能的DMA一般。

例如,在调光设备中,需要进行多达几十甚至上百路的AD采样来获取每路灯光的预期亮度,以及同样多的LED来指示实际输出的亮度。后者需要非常多的PWM,极可能已超出硬件PWM通道的数目。因此,在实现AD采样与软件PWM时,均需要快速的通道数据流程处理与高频LED刷新以保证PWM精度。这两者很容易导致高达几十kHz的插断要求,仅中断回应的额外开销就可占用一半以上的CPU时间。传统的做法是使用若干颗MCU来分块处理。在LPC4350下,则可由M0来处理这些任务。同样的例子也适用于PLC应用,它需要快速地刷新多路控制。

5.2 为弱计算操作提供额外的处理能力

M0的整体性能约是M4的72%,但对于弱计算操作,如加减乘与逻辑运算、移位、以及简单的数据传送,并没有太多劣势。弱计算操作在程序中往往占一半以上的比例,尤其体现在驱动程序以及一些通讯协定栈上。合理地分配一部分弱计算操作任务给M0,可以有效地提升整体的处理能力,使得完成相同的任务只要更低的主频以降低功耗,或者反过来在有限的主频下完成需要更多的任务。

例如,在高精密工业运动控制中,对于电机的控制往往需要运算量很大的演算法,同时又要处理如CAN、工业以太网、以及各种现场汇流排的通信。我们可以让M4来运行电机控制演算法,而通讯协定栈与驱动程序则由M0来完成。同样的例子也适用于嵌入式音讯,由M4执行音讯编解码与音效处理演算法,而M0则负责音讯汇流排、USB等事务。

小结
通过以上我们对非对称双核MCU的介绍,可以看出相比于传统的使用多颗MCU的方案,在性能、成本、功耗、生产等诸多环节都有明显的优势。核间通信稍显复杂,但作为基础设施可由称底层系统软件来实现。在具体开发时,应根据实际问题合理分工任务,并且在初始化流程、内核鉴别,以及调试上,需注意一些操作细节。 (本图文由台湾恩智浦半导体提供,作者:高级应用工程师 宋岩,陈毅斌整理)