当谈到32 位微控制器时,基于ARM 的产品已经占据重要地位。那么,这会是故事的全部吗?不见得,行业内最重要的公司之一,Microchip Technology,正全力推动其基于MIPS 架构的芯片。他们最新推出的产品在提醒我们,成功的嵌入式设计需要指令集之外的诸多因素。
在计算机历史上,从实验室走出过多少种不同的指令集架构?可能曾经有数百种架构取得过一些商业上的成功;如果算上诸多博士论文中出现过的,数目可能会多达几千种。拿流行时尚做比喻,计算机体系结构发展就好似女生裙摆的高度一般,经常来回变化。
曾经有一段时间它非常要紧—— 比如在汇编语言编程的时期。至于兼容性,至少在表面上它依旧是件重要的事情,特别是在电脑或视频游戏方面(例如,有一些需要执行以前的二进制文件)。但实际上,严格的目标代码兼容性对多数嵌入式设计来说已经不再是一个大问题。更多的问题是关于工具链的兼容性和代码模块的可用性,指令集本身已经不是问题之一。
随着芯片不断地集成系统功能,设计人员需要的是一个拥有全部所需存储器、外设和胶合逻辑的芯片。并且这个芯片必须省电、有良好的工具和支持,以及合适的价格。
这并不是说在特定的应用当中,体系结构并没有优劣之分。事实上,这个问题很有趣,看看那些当初为“计算机”设计的架构—— 如ARM 和MIPS,不断下沉,以更好地适应嵌入式“控制器”应用的需求。这些“计算机”架构最后都终于认识到要在嵌入式应用里面解决诸如代码密度、低功耗、快速并确定的中断响应等问题。
认识 PIC32
在 MCU 领域的竞争里,无疑MIPS 是在追赶ARM。但是,拥有像Microchip 这样的重量级选手支持,差距正在缩小。看看新的PIC32 5XX/6XX/7xx 系列产品,高度集成了以太网、USB 和CAN 应用。
我在以前的文章中(“MIPS for the Masses”,Circuit cellar 216 期,2008)介绍过PIC32的内核。拥有5 级流水线,性能相对较高(比如与ARM Cortex - M3 相比)。不过,这只是处理器内核级别的性能差异。比如Microchip PIC32 的性能为1.5 DMIPS / MHz,而Cortex - M3是1.25 DMIPS / MHz 的。在实际中,32 位微控制器的flash 存储器访问时间是性能瓶颈。如以80MHz 运行的PIC32 可能需要2 个等待周期。通常采用宽总线(128 位)、高速缓存和预取等技术来减轻flash 访问的瓶颈问题。
或者,可以使用片内的RAM来达到0 等待周期。’5xx 系列包含64KB 的RAM,’6xx’和7xx 系列中的部分型号有多达128KB 的RAM。不过要记住,代码和数据访问之间的争抢可能导致一些延迟。此外,256KB 或512KB 的flash 空间足够用来放置你的代码(加上额外12 KB 的启动代码空间)。
外设方面,这些新产品提供了完整的I/O(见图1)。‘5xx/6xx/7xx 编号代表了大的接口功能:USB、CAN 和以太网。‘5xx 系列包含一个USB 2.0 和一个CAN(2.0b)模块;‘6xx系列包含USB 模块与一个10/100 以太网MAC。而‘7xx 系列集成了所有这些,包含USB、以太网和两个CAN 模块。
普通I/O 方面,这些产品遵循了不同应用需求的趋势。我们看到5 个16 位计数器/定时器,其中任何两对可以组合成为32 位单元。由于封装尺寸(有64 脚和100 脚可选)和引脚复用的限制,你能得到最多六个UART、四个SPI 以及五个I2C 接口。在模拟方面,有一个16通道多路复用器连接一个10 位1 MSPS 的ADC 和两个模拟比较器。除了这些MCU 能力,另外还有8/16 位数据总线和16 位地址总线扩展功能,外加两个片选。所有的数据流可以通过8个通用DMA通道控制,辅以4个专用DMA通道('5XX 和'6XX 系列)或8个专用DMA通道('7XX 系列)。
源自上世纪80 年代的MIPS 是RISC 方面“精简”特性的杰出代表。当响应中断时,它们可以要对PC 和状态寄存器压栈,不然的话就转由软件去处理。对这种极端简约存在一些争议,可能少了一些有用的东西。考虑到这一点,PIC32 系列包括一个全功能优先级/向量可编程的中断控制器;以及一组替代寄存器组用于快速中断响应和上下文切换。
另外,不要忽视那些可能导致严重预算问题的胶合逻辑,如看门狗定时器、低电压检测、电压整流器、主时钟/外设时钟/实时时钟等。这些功能的集成,使PIC32 系列成为真正适用于“控制”应用的芯片,有别于“计算机”芯片。
入门
跟以前一样,Microchip 的芯片评估很容易,而且便宜。PIC32 以太网入门套件(见照片1)定价$72,提供一切你需要的部件。虽然名字为“以太网”入门套件,该套件配备了高端的'795 型号MCU,同时支持USB 功能。
该套件还包括配有一个“轻量级”GCC 编译器的Microchip MPLAB IDE。文档中关于“轻量级”编译器的说明有点矛盾。“轻量级”版本编译器暗示不支持先进的代码优化,但是我拿到的版本显然不是这样,在下一节你将看到这一点。或许实际上该工具包是所谓的“评估”版本,支持所有功能,但只有60 天有效期。
PIC32 采用的架构来源于“计算”,因此它非常适合管理面向PC 的以太网和USB 接口。让我们看一些演示程序,你就会明白我的意思。
多年来Microchip 一直在为其小型的PIC 芯片提供部分网络软件栈,PIC32 做得更多,它提供了全功能、免费的BSD TCP/IP 网络堆栈。包含所有的网络服务、套接字等,以及这些常用的协议:DHCP、UDP、ICMP、ARR 等。'795 型芯片中有512KB 的片上flash,有充足的空间存储一些漂亮的演示程序,让我们浏览一下入门电路板(见照片2)。
USB 支持不错,。OTG功能允许一个设备在USB 主、从设备之间动态切换。一个典型的应用案例是打印机,当连接到PC 时它是一个从设备,而当连接到相机时它成为主设备。现在所有的USB 芯片似乎都有OTG 了,不过我自己从没有遇到过需要以这种方式切换的情况。
不管OTG 是否真正有用,它使得PIC32 能在更多的传统领域中得到应用,无论是作为主设备或从设备。USB“嵌入式主设备”在使用中有一些限制,不像“标准主设备”如电脑,举例来说PIC32 不提供VBUS 电源(100-500 mA),但是你可以在个人电脑的USB接口上找到这种电源——当然这完全可以理解。另外,速度限制也需要注意,,作为从设备时能够“全速”(12 Mbps),而作为主设备时只能提供“低速”(1.5 Mbps)。
这个套件包含了一些实用的演示。其中一个演示让该板子成为一个标准人机接口设备(HID)——比如鼠标。因为HID 驱动已经是标准,你可以把它直接插入PC 使用。另外,你可以把这个套件配置成USB 主设备,从而利用PIC32 不断完善的FAT 文件管理软件库,有一些演示展示了如何访问广泛使用的USB 存储器(见照片3)。
不过需要指出的是这个套件中没有包含CAN 演示。因为我不懂也没有实验条件进行有意义的CAN 测试,如果你需要该功能,你需要自己来评估和结论。
优化的迷宫
结构体系进化的重要标志之一,曾经是编译器的优化。您可能还记得有些人把“RISC”缩写调侃为“Relegate the Impossible Stuff to the Compiler”,即“把不可能完成的任务丢给编译器”。然而,在调试时,一个太过自我聪明的编译器其问题也是显而易见的。比如PIC32 的“C”编译手册有提到说,当调试经过优化的代码时“可能偶尔会碰到令人惊讶的结果。”
例如,有些变量和代码会消失,如果编译器认为你其实并不需要它们。举例说你声明了一个变量,然后给它赋值一个常数,接着在某个计算时调用了这个变量。不要为找不到那个变量和赋值语句而抓狂,编译器只是比你更聪明一点,它在计算中直接调用了常数。
当你在一个条件分支指令处点击了单步执行,然后看到光标移动到了下一条指令处,这是否意味该条件分支的条件未被满足呢?未必,请注意这是MIPS 架构的一个特性,即分支指令的下一条指令总是会被执行,当编译器找不到合适的指令时会填充一条NOP 指令。你必须再执行一次单步操作,才能确认分支条件是否被满足(在这种情况下,你会看到光标跳到分支目标处)或不满足(光标跳转到下一条顺序指令)。更先进的“代码移动”优化能够导致更多的优化干预。请记住,有时指令可以被挪动很远的距离,甚至超出你认为应在的循环之外。
不过,调试优化过的代码也是可能的,尤其是你喜欢头脑风暴的话(例如,在分支指令后跟一个分支指令会发生什么?)。通常缺省的编译器优化只生成简单的代码,会完整保留你的意图即使可能它效率底下。当调试时在断点触发处,,你可以放心地修改某个变量的值,而不用担心编译器会捣什么鬼(比如虽然你从源代码中看不到,但一些赋值语句已经被挪动并执行了)。
需要紧记的是,编译器优化设置(见照片4)能够产生很大影响。我试着跑过一个USB主机演示程序,采用了如表1 所示的不同编译器设置,你可以看到,不同设置下(速度/大小取向、循环展开,采取MIPS-16 的16 位代码优化选项)生成的代码大小相差能够高达2倍。
保持简洁
PIC32 在精简MIPS 架构使其服务于嵌入式应用方面做得很好。比如,全部的活动功耗只有1mA/MHz 水平,从它提供的性能来看这是非常难得的。它们的批量价格也比较合理,特别考虑到那些完整的外设和存储器配备。
然而竞争也非常激烈,像Cortex - M3、瑞萨SH(现在叫RX)、爱特梅尔的AVR32 以及飞思卡尔的ColdFire 等。这些竞争对手在行业里已经有很长的时间,它们的产品也具有很广的覆盖面,在高端产品上能提供跟PIC32类似的集成度和性能,同时还有许多入门级的简单产品。
我认为MIPS 也在低端产品线上延伸,他们最近发布的“M14K”内核就是明证,在保留当前版本性能的基础上,在代码密度、中断响应和外设一致性上取得了非常大的进步。
其中最深刻的变化是一套新的“microMIPS”指令集。类似于ARM 的Thumb-2,microMIPS 采用了可变长度的操作码(16 和32 位),以同时取得两者的优点,即接近32位代码的性能和16 位代码的密度(见图2)。定长指令集是原始RISC 革命的标志性特点,这在当时是合理的(虽然我并没有觉得),但在今天,架构师们意识到用32 位存储器(即使不考虑功耗的开销)只是做个寄存器累加或短跳转是没有意义的。同上,在软件方面,编译器和IDE 都很好,但MIPS 和Microchip 也应该注意那些简单的替代产品,如ARM 的mbed、AVR 的Arduino,还有他们自己阵营的PICAXE。有些人可能还认为32 位芯片只是火箭科学家的事,但火箭能卖掉多少个?
想卖出更多的芯片吗?很简单,只要做到更低功耗低、更易使用、更便宜。然后接着再这样继续。