當談到32 位微控制器時,,基于ARM 的產(chǎn)品已經(jīng)占據(jù)重要地位,。那么,,這會是故事的全部嗎,?不見得,,行業(yè)內(nèi)最重要的公司之一,,Microchip Technology,,正全力推動其基于MIPS 架構(gòu)的芯片,。他們最新推出的產(chǎn)品在提醒我們,成功的嵌入式設計需要指令集之外的諸多因素,。
在計算機歷史上,,從實驗室走出過多少種不同的指令集架構(gòu)?可能曾經(jīng)有數(shù)百種架構(gòu)取得過一些商業(yè)上的成功,; 如果算上諸多博士論文中出現(xiàn)過的,,數(shù)目可能會多達幾千種,。拿流行時尚做比喻,計算機體系結(jié)構(gòu)發(fā)展就好似女生裙擺的高度一般,,經(jīng)常來回變化,。
曾經(jīng)有一段時間它非常要緊—— 比如在匯編語言編程的時期,。至于兼容性,,至少在表面上它依舊是件重要的事情,,特別是在電腦或視頻游戲方面(例如,有一些需要執(zhí)行以前的二進制文件),。但實際上,嚴格的目標代碼兼容性對多數(shù)嵌入式設計來說已經(jīng)不再是一個大問題,。更多的問題是關于工具鏈的兼容性和代碼模塊的可用性,指令集本身已經(jīng)不是問題之一,。
隨著芯片不斷地集成系統(tǒng)功能,,設計人員需要的是一個擁有全部所需存儲器,、外設和膠合邏輯的芯片,。并且這個芯片必須省電,、有良好的工具和支持,以及合適的價格,。
這并不是說在特定的應用當中,,體系結(jié)構(gòu)并沒有優(yōu)劣之分,。事實上,,這個問題很有趣,,看看那些當初為“計算機”設計的架構(gòu)—— 如 ARM 和MIPS,不斷下沉,,以更好地適應嵌入式“控制器”應用的需求,。這些“計算機”架構(gòu)最后都終于認識到要在嵌入式應用里面解決諸如代碼密度,、低功耗,、快速并確定的中斷響應等問題。
認識 PIC32
在 MCU 領域的競爭里,,無疑MIPS 是在追趕ARM,。但是,,擁有像Microchip 這樣的重量級選手支持,差距正在縮小,。看看新的PIC32 5XX/6XX/7xx 系列產(chǎn)品,,高度集成了以太網(wǎng),、USB 和CAN 應用,。
我在以前的文章中(“MIPS for the Masses”,Circuit cellar 216 期,,2008)介紹過PIC32的內(nèi)核。擁有5 級流水線,,性能相對較高(比如與ARM Cortex - M3 相比),。不過,,這只是處理器內(nèi)核級別的性能差異,。比如Microchip PIC32 的性能為1.5 DMIPS / MHz,,而Cortex - M3是1.25 DMIPS / MHz 的,。在實際中,32 位微控制器的flash 存儲器訪問時間是性能瓶頸,。如以80MHz 運行的PIC32 可能需要2 個等待周期,。通常采用寬總線(128 位),、高速緩存和預取等技術(shù)來減輕flash 訪問的瓶頸問題。
或者,,可以使用片內(nèi)的RAM來達到0 等待周期,。’5xx 系列包含64KB 的RAM,’6xx’和7xx 系列中的部分型號有多達128KB 的RAM,。不過要記住,,代碼和數(shù)據(jù)訪問之間的爭搶可能導致一些延遲。此外,256KB 或512KB 的flash 空間足夠用來放置你的代碼(加上額外12 KB 的啟動代碼空間),。
外設方面,,這些新產(chǎn)品提供了完整的I/O(見圖1)。 ‘5xx/6xx/7xx 編號代表了大的接口功能:USB,、CAN 和以太網(wǎng),。‘5xx 系列包含一個USB 2.0 和一個CAN(2.0b)模塊;‘6xx系列包含USB 模塊與一個10/100 以太網(wǎng)MAC,。而‘7xx 系列集成了所有這些,,包含USB,、以太網(wǎng)和兩個CAN 模塊,。
普通 I/O 方面,這些產(chǎn)品遵循了不同應用需求的趨勢,。我們看到5 個16 位計數(shù)器/定時器,,其中任何兩對可以組合成為32 位單元。由于封裝尺寸(有64 腳和100 腳可選)和引腳復用的限制,你能得到最多六個UART,、四個SPI 以及五個I2C 接口,。在模擬方面,有一個16通道多路復用器連接一個10 位1 MSPS 的ADC 和兩個模擬比較器,。除了這些MCU 能力,,另外還有8/16 位數(shù)據(jù)總線和16 位地址總線擴展功能,外加兩個片選,。所有的數(shù)據(jù)流可以通過8個通用DMA通道控制,,輔以4個專用DMA通道(''5XX 和''6XX 系列)或8個專用DMA通道(''7XX 系列),。
源自上世紀80 年代的MIPS 是RISC 方面“精簡”特性的杰出代表。當響應中斷時,,它們可以要對PC 和狀態(tài)寄存器壓棧,,不然的話就轉(zhuǎn)由軟件去處理。對這種極端簡約存在一些爭議,,可能少了一些有用的東西,。考慮到這一點,,PIC32 系列包括一個全功能優(yōu)先級/向量可編程的中斷控制器,;以及一組替代寄存器組用于快速中斷響應和上下文切換。
另外,,不要忽視那些可能導致嚴重預算問題的膠合邏輯,,如看門狗定時器、低電壓檢測,、電壓整流器,、主時鐘/外設時鐘/實時時鐘等。這些功能的集成,,使PIC32 系列成為真正適用于“控制”應用的芯片,,有別于“計算機”芯片。
入門
跟以前一樣,,Microchip 的芯片評估很容易,,而且便宜。PIC32 以太網(wǎng)入門套件(見照片1)定價$72,,提供一切你需要的部件,。雖然名字為“以太網(wǎng)”入門套件,該套件配備了高端的''795 型號MCU,,同時支持USB 功能,。
該套件還包括配有一個“輕量級”GCC 編譯器的Microchip MPLAB IDE。文檔中關于“輕量級”編譯器的說明有點矛盾,。“輕量級”版本編譯器暗示不支持先進的代碼優(yōu)化,,但是我拿到的版本顯然不是這樣,在下一節(jié)你將看到這一點,?;蛟S實際上該工具包是所謂的“評估”版本,支持所有功能,,但只有60 天有效期,。
PIC32 采用的架構(gòu)來源于“計算”,因此它非常適合管理面向PC 的以太網(wǎng)和USB 接口,。讓我們看一些演示程序,,你就會明白我的意思。
多年來Microchip 一直在為其小型的PIC 芯片提供部分網(wǎng)絡軟件棧,,PIC32 做得更多,,它提供了全功能、免費的BSD TCP/IP 網(wǎng)絡堆棧,。包含所有的網(wǎng)絡服務,、套接字等,以及這些常用的協(xié)議:DHCP,、UDP,、ICMP、ARR 等,。''795 型芯片中有512KB 的片上flash,,有充足的空間存儲一些漂亮的演示程序,讓我們?yōu)g覽一下入門電路板(見照片2),。
USB 支持不錯,,。OTG功能允許一個設備在USB 主,、從設備之間動態(tài)切換,。一個典型的應用案例是打印機,當連接到PC 時它是一個從設備,,而當連接到相機時它成為主設備?,F(xiàn)在所有的USB 芯片似乎都有OTG 了,不過我自己從沒有遇到過需要以這種方式切換的情況,。
不管 OTG 是否真正有用,,它使得PIC32 能在更多的傳統(tǒng)領域中得到應用,無論是作為主設備或從設備,。USB“嵌入式主設備”在使用中有一些限制,,不像“標準主設備”如電腦,舉例來說PIC32 不提供VBUS 電源(100-500 mA),但是你可以在個人電腦的USB接口上找到這種電源——當然這完全可以理解,。另外,,速度限制也需要注意,,,作為從設備時能夠“全速”(12 Mbps),,而作為主設備時只能提供“低速”(1.5 Mbps)。
這個套件包含了一些實用的演示,。其中一個演示讓該板子成為一個標準人機接口設備(HID)——比如鼠標,。因為HID 驅(qū)動已經(jīng)是標準,你可以把它直接插入PC 使用,。另外,,你可以把這個套件配置成USB 主設備,從而利用PIC32 不斷完善的FAT 文件管理軟件庫,,有一些演示展示了如何訪問廣泛使用的USB 存儲器(見照片3)。
不過需要指出的是這個套件中沒有包含CAN 演示,。因為我不懂也沒有實驗條件進行有意義的CAN 測試,,如果你需要該功能,你需要自己來評估和結(jié)論,。
優(yōu)化的迷宮
結(jié)構(gòu)體系進化的重要標志之一,,曾經(jīng)是編譯器的優(yōu)化。您可能還記得有些人把“RISC”縮寫調(diào)侃為“Relegate the Impossible Stuff to the Compiler”,,即“把不可能完成的任務丟給編譯器”,。然而,在調(diào)試時,一個太過自我聰明的編譯器其問題也是顯而易見的,。比如PIC32 的“C”編譯手冊有提到說,,當調(diào)試經(jīng)過優(yōu)化的代碼時“可能偶爾會碰到令人驚訝的結(jié)果。”
例如,,有些變量和代碼會消失,,如果編譯器認為你其實并不需要它們。舉例說你聲明了一個變量,,然后給它賦值一個常數(shù),,接著在某個計算時調(diào)用了這個變量。不要為找不到那個變量和賦值語句而抓狂,,編譯器只是比你更聰明一點,,它在計算中直接調(diào)用了常數(shù)。
當你在一個條件分支指令處點擊了單步執(zhí)行,,然后看到光標移動到了下一條指令處,,這是否意味該條件分支的條件未被滿足呢?未必,,請注意這是MIPS 架構(gòu)的一個特性,,即分支指令的下一條指令總是會被執(zhí)行,當編譯器找不到合適的指令時會填充一條NOP 指令,。你必須再執(zhí)行一次單步操作,,才能確認分支條件是否被滿足(在這種情況下,你會看到光標跳到分支目標處)或不滿足(光標跳轉(zhuǎn)到下一條順序指令),。更先進的“代碼移動”優(yōu)化能夠?qū)е赂嗟膬?yōu)化干預,。請記住,有時指令可以被挪動很遠的距離,,甚至超出你認為應在的循環(huán)之外,。
不過,調(diào)試優(yōu)化過的代碼也是可能的,,尤其是你喜歡頭腦風暴的話(例如,,在分支指令后跟一個分支指令會發(fā)生什么,?)。通常缺省的編譯器優(yōu)化只生成簡單的代碼,,會完整保留你的意圖即使可能它效率底下,。當調(diào)試時在斷點觸發(fā)處,,,,你可以放心地修改某個變量的值,而不用擔心編譯器會搗什么鬼(比如雖然你從源代碼中看不到,,但一些賦值語句已經(jīng)被挪動并執(zhí)行了),。
需要緊記的是,編譯器優(yōu)化設置(見照片4)能夠產(chǎn)生很大影響,。我試著跑過一個USB主機演示程序,,采用了如表1 所示的不同編譯器設置,你可以看到,,不同設置下(速度/大小取向,、循環(huán)展開,采取MIPS-16 的16 位代碼優(yōu)化選項)生成的代碼大小相差能夠高達2倍,。
保持簡潔
PIC32 在精簡MIPS 架構(gòu)使其服務于嵌入式應用方面做得很好,。比如,全部的活動功耗只有1mA/MHz 水平,,從它提供的性能來看這是非常難得的,。它們的批量價格也比較合理,特別考慮到那些完整的外設和存儲器配備,。
然而競爭也非常激烈,,像Cortex - M3、瑞薩SH(現(xiàn)在叫RX),、愛特梅爾的AVR32 以及飛思卡爾的ColdFire 等,。這些競爭對手在行業(yè)里已經(jīng)有很長的時間,它們的產(chǎn)品也具有很廣的覆蓋面,在高端產(chǎn)品上能提供跟PIC32類似的集成度和性能,,同時還有許多入門級的簡單產(chǎn)品,。