两个核心比一个好!有时,两个不同的内核比两个相同的内核更好!本应用笔记解释了原因。
介绍
当大多数人想到多核处理器时,他们的脑海中会立即想到个人电脑、智能手机或其他高级计算设备。这些设备统一具有复杂的用户界面和抢占模式操作系统。
当我们阅读新PC或新智能手机的评论时,通常会提到的一件事是内核数量:“该设备中的CPU有四个内核,最多支持八个线程。有了这些信息,我们知道操作系统可以将任务调度到任何内核,以尝试平衡整体工作负载。
在这种环境中,所有计算核心都尽可能相同。毕竟,必须针对不同的 CPU 架构单独编译每个任务是没有意义的。
但对于深度嵌入式处理器,拥有大量相同类型的内核可能不如拥有多个专用内核那么理想。
差异化内核案例
首先,在许多深度嵌入式应用程序中,甚至可能没有操作系统。由设计人员决定哪些任务在哪些内核上运行、何时运行以及运行多长时间。其次,主任务很可能在单个线程中运行,任何其他内核都将在那里运行特定的专用任务。
在这些情况下,人们并不真正关心内核是否都相同,一个CPU处理所有监督任务,另一个从属计算内核处理专用任务。拥有在特定区域具有更多功能、使用更少功率或消耗更少芯片硅面积的专用内核更有意义。
例如,考虑MAX32655。它是一款基于 Arm Cortex-M4 的微控制器,Arm Cortex-M4 是一款功能强大、备受推崇的单线程 CPU 内核。MAX32655具有半兆字节闪存、128KRAM和许多外设,包括低功耗蓝牙无线电。®
现在,就停在那里。低功耗蓝牙可能听起来像是硬件功能,但它与软件和硬件一样多。你看,硬件实际上相当简单:发射器和接收器必须具有一定的频率捷变性,因为它们必须调谐到四十个可能的通道中的任何一个,并且它们必须快速完成。发射器和接收器均可快速打开和关闭以节省功率。他们必须处理高斯频移键控调制和解调。不是微不足道的,但也不是特别具有挑战性。
但是软件 - 这可能是真正的挑战!主机必须管理一整套协议——属性协议、链路层控制和适应协议、安全管理器协议等。并且有一个接口将主机连接到控制器层。正是这一层管理无线电硬件,也不是微不足道的。有一个设备管理器、链路管理器和链路控制器——这些功能块将无线电硬件的细节抽象到主机协议。
关于BLE软件堆栈的好消息是您不必编写它。在大多数环境中, 当您指定特定的 BLE 设备时,软件堆栈就会出现.坏消息是BLE软件堆栈要求很高。这并不是说它需要特别大的处理器带宽或存储,但BLE堆栈中的时序至关重要。这意味着当BLE需要完成某事时,需要立即完成!如果微控制器内核已经在执行一些时间关键型功能,则必须提供一些东西!
这就是第二个核心的用武之地。主内核被释放出来,将其资源投入到用户程序中,因为它可以将BLE任务移交给第二个内核。没有延迟问题,不用担心BLE堆栈会在错误的时刻中断内核。第二个独立核心解决了很多问题!
选择合适的核心
第二个内核对于运行BLE堆栈是有意义的。但是选择哪个核心呢?
一种选择是使用第二个Arm Cortex-M4。M4带来了很多资源。它是AMBA总线的原生版本,蓝牙库都针对Cortex-M系列内核进行了很好的编译。那么,为什么不是第二个 M4?
事实是,与Arm Cortex-M4一样高效,它比运行BLE堆栈的专门任务所需的CPU更多。更小,更慢,更适度的CPU会做得很好。但是哪个 CPU?
向RISC-V(发音为risk-five)核心问好!与Arm Cortex-M4一样,它是一个基于RISC架构的32位CPU。RISC,或简化指令集计算,是一种计算机体系结构哲学,它断言一小组简单的指令比一大组更复杂的指令更有效地执行。在大多数情况下,RISC在很大程度上赢得了CISC(复杂指令集计算)的争论。但是CISC计算仍然有一个巨大的堡垒:x86架构。大多数其他计算环境——以及几乎所有嵌入式处理器——都采用了RISC。
在评估新的CPU内核时,首先跳出的三件事是指令集架构,寄存器补码和程序员模型。下一节将探讨RISC-V和Arm Cortex-M4之间的这些因素有何不同。
比较指令集
在查看指令集之前,请记住:像C这样的高级语言不是计算机的母语。C 编译器将程序转换为一组由内核执行的机器指令。一个 C 语句可以转换为数十条机器指令。C编译器已经变得如此高效,以至于汇编语言编程,即一个语句完全转换为一个机器指令,已经成为一种失传的艺术。
然而,C语句——或Python,或JavaScript,或其他高级语言——最终用原生机器代码表达。因此,关注指令集的工作原理是有意义的。
Arm Cortex-M4基于ARMv7E-M指令集架构。虽然Arm Cortex-M4是32位CPU,但ARMv7E-M指令集使用Thumb-2指令编码,大多数情况下,这些是16位指令。这里有一个故事。
最初,Arm 指令集是 32 位的。尽管底层架构是RISC,但指令集很丰富,但在代码大小方面并不是特别有效。Arm在90年代中期提出了Thumb编码,以解决这些关于指令集效率的担忧。拇指指令的长度为 16 位,与以前使用的 32 位编码的子集非常接近。指令集效率更高,但留下了许多功能。
Thumb-2 于 2003 年推出,混合使用 16 位和 32 位编码,在恢复一些 32 位编码功能的同时保留了大部分代码密度优势。当然,这种方案有一个缺点:它会导致可变长度指令集。但是今天,Thumb-2编码已经成熟且易于理解,实际上是Arm Cortex-M4内核支持的唯一指令编码。
相比之下,大多数RISC-V方案(包括Maxim的MAX32655中使用的实现方案)都使用纯32位编码。RISC-V支持可选的压缩编码,其术语为16位指令支持。但与 Arm Cortex-M4 中的 Thumb 指令编码不同,它确实是可选的。
但是有什么指示呢?
ARMv7E-M和RISC-V指令集都支持负载存储架构。这意味着,算术和逻辑指令的操作数必须从内存显式加载到寄存器中,一旦执行操作,结果必须显式存储回内存。
负载存储架构是RISC内核的标志,但除此之外,ARMv7E-M指令集并没有太多的“减少”。ARM指令集包含数十条指令和指令变体,具有条件执行,作为指令操作数的移位,许多位和字节操作子指令以及多种内存寻址模式。把这一切加起来,它使ARM内核成为一个相当复杂的逻辑。
RISC-V并非如此。RV32I指令集中只有40条基本指令。由于其中许多可以分组到指令族中,因此指令集变得更加易于理解:有六个分支指令,五个加载指令,三个存储指令和两个用于函数调用的“跳转和链接”指令。把这些指令家庭放在一起,只有28个指令需要考虑。
为了使事情更简单,只有六种编码格式:注册到注册、立即、上层立即、存储、分支和跳转。就是这样!RISC-V编译器的代码生成部分很容易。
看看所有这些寄存器!
现在,寄存器补充:ARMv7E-M 架构指定了 16 个寄存器,其中 13 个是通用寄存器。RISC-V架构指定了32个寄存器,其中除一个寄存器外,其他所有寄存器都是通用的。以下是它们的工作原理。
臂寄存器命名为 R0 到 R15。但是前三个寄存器有特殊的用途:R15是程序计数器,对R15的任何写入实际上都是跳转到该位置。R14是链路寄存器。执行分支和链接(函数调用)时,返回地址存储在 R14 中。R13 是堆栈指针。PUSH指令递减R13并将指定寄存器中的值存储到降序存储器位置;POP 指令从升序内存位置加载值并递增 R13。
RISC-V寄存器被命名为x0到x31,只有一个用户可见的特殊用途寄存器:x0在读取时始终返回零值,写入x0的任何内容都会被丢弃。这对简化指令集编码来说是一个真正的福音。
所有其他寄存器都是真正的通用寄存器。按照惯例,x1 用作返回地址(Arm 称之为链接寄存器),x2 用作堆栈指针,但硬件中没有任何内容可以强制执行(除非在核心设计中实现了压缩扩展,但那是另一回事)。虽然 ARM BL(分支和链接)指令始终将返回地址存储在 R14 中,但 RISC-V JAL(跳转和链接)指令允许您指定获取返回地址的寄存器。
RISC-V指令集中似乎缺少一些指令,例如寄存器到寄存器的移动操作!相反,一个寄存器的内容使用 ADDI 指令移动到另一个寄存器:ADDI rd, rs, 0 将 rs 的内容添加到值零并将结果存储在 rd 中,从而有效地将 rs 中的任何内容移动到 rd。整洁!
您可能认为 ADDI 是 MOVE 的糟糕替代品,因为算术指令会修改标志寄存器,而 MOVE 不会。在RISC-V内核中,这不是一个问题,因为没有标志寄存器!相反,分支指令 - BEQ(如果相等则分支)、BNE(如果不等于则分支)、BLT(如果小于则为分支)、BGE(如果大于或等于则为分支)、BLTU(如果小于,则为分支,无符号)和 BGEU(如果大于或等于,则为分支,无符号)——都接受两个寄存器说明符,执行比较,然后有条件地获取分支。
但是,如果结果为零,如何分支?只需写 BEQ rs x0 .请记住,x0 始终包含值零。这使得编写测试零、非零、负或正值的分支指令变得容易。
因此,虽然RISC-V的指令集和程序员模型对于那些习惯于Arm指令集的人来说可能看起来有点陌生,但它确实功能强大且完整。
这些内核是如何堆叠的?
所以,现在我们来到一个大问题:为什么要使用RISC-V内核来运行BLE堆栈?
答案在于可定制性。所有商用CPU内核都允许一定程度的定制,这也适用于Arm Cortex-M系列。不过,一般来说,Arm 内核中提供的自定义选项是大粒度的。例如,它是否具有浮点运算或嵌入式跟踪?
相比之下,RISC-V内核具有芯片设计人员可以启用或禁用的一整套扩展:三种浮点单元(单精度,双精度和四精度),原子指令,整数乘除法,压缩指令以节省代码空间,以及其他规格尚未冻结。
在设计运行BLE控制器堆栈的内核时,RISC-V内核只需整数乘法和除法扩展即可构建。没有必要包含其他功能, 因为它们对运行 BLE 堆栈没有任何帮助.因此,没有理由占用硅空间并消耗支持这些功能的功率。我们可以比主 Arm Cortex-M4 更慢地为核心计时。更慢地对内核进行计时可以降低内核的功耗。
这就是为什么提前知道第二个内核的用途有助于芯片设计人员并有助于创造最佳的微控制器体验!
审核编辑:郭婷
全部0条评论
快来发表一下你的评论吧 !