如何執行韌體更新,而不會中斷韌體執行

作者:Bill Giovino

資料提供者:DigiKey 北美編輯群

如今物聯網 (IoT) 中以感測器為基礎的應用逐漸增加,物聯網端點中的微控制器韌體尺寸和複雜度也隨之增加。這類韌體必須提升效率以加快執行速度,這也是必須實現快閃記憶體韌體現場即時更新的原因之一。不過,要在現場安全地即時更新韌體,通常需要在更新進行時暫停韌體執行。這項作業的時間可能快至一分鐘,慢至一小時,具體視架構、更新檔大小以及網路速度而定。對關鍵的應用來說,這樣的延遲是無法接受的。

本文將解釋在現場更新中斷驅動型韌體時需要考量的因素,以及在更新過程中保持應用韌體執行的要求。接著會介紹 Microchip TechnologyPIC32MZ2048EFH144T-I/PH 微控制器,並說明此元件如何用來執行韌體,同時透過網路接收更新的韌體。

韌體更新的重要性

韌體更新有四個主要原因:更正程式碼中的錯誤、增加或改善功能、調整系統安全性,以及提升韌體效率。編碼效能的衡量標準是:執行特定工作或執行緒所需的時脈週期數。執行某項工作所需的時脈週期越少,程式碼就越有效率,這通常會加速程式的執行,而且通常會縮短程式碼的大小 (但並非總是這樣)。對於物聯網中以感測器為基礎的端點來說,尤其如此。這是因為這些應用屬於中斷驅動型,因此在感測器或周邊裝置產生中斷時,就必須快速進行本文切換。

兩個因素會影響中斷驅動型 IoT 應用的效率,亦即基礎架構效率及程式碼效率。儘管在現場變更微控制器架構的作法不切實際,但為了提升效率而更新微控制器韌體,仍然是實際且正常的做法。

感測器型韌體幾乎都是屬於中斷驅動型元件。微控制器序列埠所連接的智慧型感測器,能夠對微控制器發出中斷命令以暫停正常執行,讓韌體能夠將此特定感測器導向至中斷服務常式。相較於必須定期進行輪詢,來判斷感測器讀數是否有新資料需要傳送的感測器,上述做法會更有效率。對於中斷驅動型感測器,其策略的優點在於,微控制器只需要在接收有用資料時,將時脈週期用於讀取感測器即可。當韌體必須存取感測器,以讀取因未更新感測器讀數而丟棄的資料時,輪詢的做法會浪費時脈週期。

當有多個感測器和工作時,就需要多個小常式和中斷常式來管理,進而導致程式碼的大小增加。複雜的程式碼需要透過某種即時作業系統 (RTOS) 來管理彼此無關的各項工作。RTOS 可以是軟體工程師撰寫的簡單韌體應用程式,或者市面上現有的產品。RTOS 會對不同的韌體工作進行管理,確保每一項個別的工作,都會在應用程式正常運作所需的時間內開始並完成。若是 RTOS 需要管理許多工作,則對應用程式來說,讓各項工作儘可能在最少的時脈週期內完成相當有幫助。這樣的特性能夠避免各項工作互相拖累。

收到中斷時,完成中斷服務常式所需的時間,多數會受到三個因素合併的影響:

  1. 辨識中斷並開始導向至中斷服務常式所需的時脈週期。若某項工作的優先度低於正在執行的工作,這項工作要等到目前的工作完成後才開始,具體視應用而定。
  2. 儲存目前 CPU 狀態的本文並導向至中斷服務常式所需的時脈週期,具體視架構而定,並且不受軟體工程師的控制。
  3. 執行中斷服務常式所需的時脈週期,具體視軟體工程師所撰寫之程式碼的複雜度及效率而定。

韌體的效率越高,在特定時間內需要完成的工作之間就越不可能發生衝突。

快閃記憶體韌體更新的記憶體要求

對於需要在現場進行可靠更新的系統,本身所需的快閃程式記憶體必須是應用所需的預估大小之兩倍。原因在於快閃記憶體必須足夠大,才能同時容納現有的快閃記憶體韌體以及更新的韌體。不過,對運作時僅使用內部快閃程式記憶體的小型系統來說,透過網路接收韌體更新檔時,通常會需要暫停程式碼執行。這對關鍵任務應用來說是無法接受的,而且無法達成高效率韌體的目標;換言之,停止執行的程式碼是完全沒有效率可言。

更新快閃記憶體時執行韌體

Microchip Technology 的 PIC32MZ2048EFH144T-I/PH 微控制器是一款高效能微控制器,可在更新晶片上快閃記憶體時,還能執行韌體 (圖 1)。PIC32MZ2048EFH144T-I/PH 是以 MIPS32 M-Class 核心架構為基礎,具有專供中斷驅動型複雜 IoT 端點使用的浮點單元 (FPU)。此元件具有 2 MB 的快閃程式記憶體和 512 KB 的 SRAM,以及 160 KB 的開機快閃記憶體。在 -40°C 至 +85°C 的溫度範圍內,PIC32MZ2048EFH144T-I/PH 的核心速度可達 252 MHz,而在 -40°C 至 +125°C 的範圍內為 180 MHz。工作電壓相當低,介於 2.1 V 至 3.6 V 之間。

此元件具有 9 個 32 位元捕捉/比較計時器,可支援複雜的韌體與外部訊號測量。

Microchip Technology 的 PIC32MZ2048EFH144T-I/PH 示意圖圖 1:Microchip Technology 的這款 252 MHz PIC32MZ2048EFH144T-I/PH 是以 MIPS32 M-Class 架構為基礎,並具有相當多樣的序列埠,可與外部感測器連接。(圖片來源:Microchip Technology)

外部序列埠包含 9 個 UART 埠以及 5 個 I2C 埠,還有 6 個 SPI 埠,同樣可支援音訊 I2S 介面。此外,12 位元類比數位轉換器 (ADC) 具有 48 個輸入,能夠用來測量精密類比感測器的電壓。有了這麼多的序列埠和 ADC 輸入,PIC32MZ2048EFH144T-I/PH 便能與許多外部感測器連接,相當適合用於複雜的感測器型 IoT 端點。此微控制器具有 2 個 CAN 2.0b 埠,能連線採用通用 CAN 通訊協定的工業和車用網路。

乙太網路埠可支援 10/100Base-T 網路連線。USB 2.0 高速控制器可支援外部介面,以連接其他週邊裝置或進行除錯之用,並且也可支援 USB On-The-Go (OTG)。

這些週邊裝置的每一個都能夠產生一個或多個中斷。由於感測器和中斷來源這麼多,維持程式碼效率就相當有必要。

為了提升效率,MIPS32 M-Class CPU 核心具有 32 個 32 位元一般用途暫存器 (GPR)。這項特性能夠減少對外部記憶體的存取,以此提升效率。除了常見的位元設定與清除指令之外,M-Class 也支援單一週期位元反轉指令。這項特性能夠提升旗號的處理效率,進而改善 RTOS 效率。核心也具備五階段的指令管線,能夠將記憶體存取衝突減到最低,產生更多的單一週期指令,藉以提升效率。

此外,MIPS32 M-Class 也具有 7 個 GPR 影子暫存器組。這項特性使得無需許多時脈週期就能將 GPR 儲存在堆疊上,明顯提升中斷效能與本文切換速度。藉助 7 個影子暫存器組,核心便能夠嵌套中斷和本文切換達 7 次,而無需先使用時脈週期將 GPR 儲存在堆疊上。

PIC32MZ2048EFH144T-I/PH 具有兩排 1 MB 程式快閃記憶體 (PFM),分別指定為 PFM Bank 1 和 PFM Bank 2。每個 PFM 都具有專用的開機快閃記憶體 (BFM),分別指定為 BFM Bank 1 和 BFM Bank 2。在更新 PFM 時,BFM 無需進行更新。這兩排不同的記憶體會帶來許多好處。例如,微控制器能夠支援雙重開機,因此在電源啟動時,可以設定從任何一排快閃記憶體開機。這可讓微控制器能夠支援兩組不同的裝置設定。

這兩排快閃記憶體還有另一個優點,亦即能夠在一排快閃記憶體上執行韌體,同時在另一排快閃記憶體上更新韌體。Microchip 將這項特性稱為「即時更新」,又稱作執行時間自我編程 (RTSP)。若作用中 IoT 端點在 PFM Bank 1 上執行韌體,且 RTSP 是在此端點啟用,便會透過網路以區塊形式接收韌體。在透過網路管理韌體更新時,建議做法是將新韌體區塊儲存在 SRAM 中。在收到完整的區塊之後,在 PFM Bank 1 上執行的韌體便能夠啟動編程順序,將 SRAM 上的資料寫入 PFM Bank 2。在對此韌體進行編程時,仍可以在 PFM Bank 1 上繼續執行韌體。

在區塊編程完成之後,韌體便可以要求透過網路接收下一個程式碼區塊,然後重複執行編程順序。這樣的步驟會持續進行,直到 PFM Bank 2 的程式碼區塊全部完成為止。一旦編程完成,韌體便可以將 PIC32MZ2048EFH144T-I/PH 設定為下次重置時從 BFM Bank 2 開機,然後清除 NVMCON 設定暫存器中的 SWAP 位元,以執行 PFM Bank 2 中的新韌體 (圖 2)。若 SWAP=0,PIC32MZ2048EFH144T-I/PH 韌體必須再次進行更新,則韌體可以從 PFM Bank 2 中執行,同時更新 PFM Bank 1。

Microchip 的 PIC32MZ2048EFH144T-I/PH 微控制器示意圖圖 2:PIC32MZ2048EFH144T-I/PH 微控制器具有兩排各自獨立的 PFM。若 SWAP=1,當 PFM Bank 2 正在更新時,韌體可以從 PFM Bank 1 中執行。若清除 SWAP=0,則可讓微控制器從 PFM Bank 2 開機。(圖片來源:Microchip Technology)

SWAP 位元的狀態可從 BFM 或 PFM 變更為其他狀態,具體視韌體的需求而定。

開發雙重開機韌體

針對使用 PIC32MZ2048EFH144T-I/PH 微控制器進行開發的作業,Microchip Technology 提供了 DM320007 PIC32MZ 入門套件 (圖 3)。這款機板使用專用的連接器及排針座連接器,可支援多個序列埠。USB 主機埠可用於除錯,而 USB OTG 埠可供應用使用。當 USB 到 UART/I2C 連接器連接到電腦的 USB 埠時,在連接的主機電腦上會產生虛擬的 COM 埠。這麼一來,主機電腦便能夠與 PIC32MZ 上的 I2C 埠通訊。

Microchip Technology 的 DM320007 小型入門套件圖片圖 3:Microchip Technology 的 DM320007 小型入門套件支援使用 PIC32MZ2048EFH144T-I/PH 微控制器,來開發和測試 USB 和乙太網路應用。其中包含適用於 USB OTG、USB 主機、10/100 乙太網路以及 UART/I2C 的連接器。(圖片來源:Microchip Technology)

藉助 40 引腳的擴充排針座連接器,可存取 PIC32MZ EF 上的額外 I2C、SPI 及 UART 連接埠,以及一般用途 I/O (GPIO) 引腳。此外,還有三個按鈕和三個 LED,可透過韌體進行設定。

結論

由於程式碼的複雜度增大,關鍵系統中的 IoT 感測器端點對記憶體的要求越來越高。程式碼越複雜,就更需要提升韌體效率,以改善韌體中本文切換的反應時間。透過選擇能夠高效執行中斷驅動型程式碼,並且可以同時擷取並更新韌體的微控制器,開發人員便能夠改善關鍵 IoT 應用的可靠性,同時不會影響效能。

DigiKey logo

聲明:各作者及/或論壇參與者於本網站所發表之意見、理念和觀點,概不反映 DigiKey 的意見、理念和觀點,亦非 DigiKey 的正式原則。

關於作者

Image of Bill Giovino

Bill Giovino

Bill Giovino 是電子工程師,擁有美國雪城大學的電機工程學士學位,也是少數從設計工程師跨足現場應用工程師,再到技術行銷領域的成功典範之一。

Bill 過去 25 年來熱衷於向科技和非科技業的對象推廣新技術,包括 STMicroelectronics、Intel 和 Maxim Integrated 等多家企業。Bill 在 STMicroelectronics 任職期間,曾協助領導該公司順利進軍微控制器領域。在 Infineon 任職時,則策劃出該公司首款在美國汽車業大受歡迎的微控制器設計。Bill 目前是他個人公司 CPU Technologies 的行銷顧問,曾協助諸多企業讓表現不佳的產品重獲市場青睞。

Bill 更是採用物聯網的先驅,包括在微控制器中首次納入完整的 TCP/IP 堆疊。Bill 致力於推廣「用教育促成銷售」的理念,也認可在線上推銷產品時有清楚完整文字說明的重要性。他在 LikedIn 熱門的半導體銷售和行銷群組中擔任管理員,也擁有深厚的 B2E 知識。

關於出版者

DigiKey 北美編輯群