通常可藉由變更在微控制器上執(zhí)行的軟件擴增新功能,,或為裝置出貨前沒發(fā)現到的問題除錯,,例如血糖計,僅須修改軟件就能使用新型試紙,;某些顧客桌面上無法使用的光學鼠標,,修改軟件能重新設定影像傳感器采集到的數據特征。這類的設計變更不須重新設計硬件的配置,,已成為相當常見的作法,,能在產品還未出廠時,即迅速對硅組件更新編程,,在顧客方面,,直接編程是不切實際的方法,因為需要特殊的硬件連結微控制器上的專屬接腳,,若裝置已需USB作為通訊機制,,把一個簡單的開機管理應用程序加到原始韌體,就能使用標準計算機下載新版與后續(xù)更新的韌體,,并可由制造商或終端使用者執(zhí)行更新動作,。
幾乎無所不在的通用序列總線(USB)通訊媒介,原用來把鼠標或鍵盤連結至計算機,,后來已擴展至喇叭,、攝影機、打印機及其它各種裝置,,如今像吉他到轎車都已配備USB接口,。在這類裝置中,利用現有的USB聯機變更在嵌入式控制器上執(zhí)行的軟件,,就能擴增新功能或解決效能故障方面的問題,,且研發(fā)業(yè)者不但可充分發(fā)揮本身具備的好處,并可提供產品重新編程的彈性,。
在嵌入式微控制器中,,開機管理程序是一個位于程序內存內的小程序。當重新啟動或開機時,,開機管理程序會率先執(zhí)行,,并讓處理器執(zhí)行使用者的程序或下載新版程序,在這種組態(tài)下,直接編程僅須把開機管理程序插入至程序內存,。開機管理程序可使用不同的通訊技術采集新程序,,包括USB、I2C,、SPI,、UART,甚至可建置專屬的通訊協(xié)議以下載新程序,,也可使用不同的方法儲存下載的程序,。根據內存的需求,程序可儲存在微控制器內部的閃存,,或是各種外部儲存媒體,,由于大多數開機管理程序僅需少量的程序空間即可建置,因此通常和使用者的程序裝在同一片閃存中,,在并存時,,開機管理程序須負責把程序代碼下載到同一片內存時,防止覆蓋本身的程序代碼,,在內存空間的開機管理程序,,可設定成不可覆寫,以避免意外的毀損,。
開機管理程序扮演重要角色
圖1 USB開機管理程序的數據流程
圖1顯示USB開機管理程序的數據流,。在開機重新啟動時,開機管理程序會計算使用者程序的檢查碼,,并和儲存在內存中的檢查碼進行比對,。這個檢查碼是現場可編程開機管理程序的檢查碼模塊,若兩個數值相符,,開機管理程序就會讓處理器開始執(zhí)行使用者的程序,,但若檢查碼不一致,開機管理程序就會讓主機等候分送新的使用者程序代碼,。在準備階段,開機管理程序會關閉任何可能干擾下載流程的岔斷,,在某些系統(tǒng)中,,微控制器可能須處理一些重要作業(yè),然后再開始下載,,如可能必須啟動散熱風扇或讓某些發(fā)光二極管(LED)燈號閃動,,由于應用程序的空間是被刪除的目標,因此如散熱風扇或LED燈號的控制例程等這類關鍵作業(yè)須寫入開機管理程序,。
為了開始通訊,,開機管理程序會設定USB接口,然后等待計算機連結裝置。計算機透過交握程序了解何種裝置插入連結端口,,此程序稱為裝置列舉,,可確保裝置和正確的主控端軟件進行通訊,在這個例子中,,主控端是個人計算機(PC)應用程序,,程序中含須下載的內容,為避免意外下載,,并確保安全,,開機管理程序會在交易過程中尋找主控端的金鑰。
檢查金鑰后,,開機管理程序會對主控端做出響應,,并要求取得Flash映像,由于閃存不支持單一地址寫入,,故須使用完整分頁寫入,。在找出整個分頁的地址前,會先把傳入的數據儲存在隨機存取內存(RAM),,由于處理器在此刻正忙著下載新韌體,,因此幾乎所有RAM資源都可使用,系統(tǒng)必須在較低的溫度把內容穩(wěn)定寫入至閃存,,為增加內存保存數據時間及寫入周期的次數,,了解現場溫度及使用合適的編程算法相當重要。
在快閃編程過程中,,電源的穩(wěn)定度也是一項重要因素,,任何電源噪聲、故障,、斷電,、電位緩升、接觸不良等狀況,,都會造成難以偵測的問題,。若真的發(fā)生電力瞬時問題,開機管理程序就會再次啟動,,并因檢查碼核對失敗而重新開始下載程序,,當所有Flash分頁都含有檢查碼并成功寫入,開機管理程序就會檢查閃存并開始重新啟動,,此時當系統(tǒng)重新啟動后,,開機管理程序會搜尋正確的檢查碼,并開始執(zhí)行使用者程序代碼,。
圖2 通用型開機管理程序架構
當檢查碼有效時,,所有后續(xù)的開機管理程序作業(yè)都必須從執(zhí)行中的使用者程序代碼呼叫,。透過正確的應用程序接口呼叫,PC程序能直接指揮使用者程序關閉所有岔斷,、重置USB硬件及開始扮演開機管理程序,。另一方面,裝置設定完成后,,藉由如開關等某些硬件狀態(tài)變更事件,,便進入開機管理程序的裝置列舉程序。
內存管理可避免
無法使用USB下載數據問題
開機管理程序被意外刪除會導致系統(tǒng)無法透過USB下載數據,。系統(tǒng)化的內存配置,,能減少或消弭這種意外的風險,圖2所示為一個可行的配置,,可由各種Flash架構運用,,圖中由上而下第一組模塊含有重置與USB岔斷向量,第二組則含有開機管理程序設定的內存區(qū)域,,含有用來搜尋開機管理程序檢查碼的啟動指令,,用以下載新映像的程序代碼,以及用來儲存檢查碼的空間,,這組程序代碼可重設位置,,不同的區(qū)塊可置入專屬的內存區(qū)域,然而,,當項目設計準備開始建置,,除檢查碼外,這區(qū)域的所有空間都不可升級,。
第三組則是供使用者程序使用,,這個部分含有使用者程序代碼、所有相關的岔斷向量及呼叫開機管理程序的例程,,這個區(qū)域可重新編程與重新尋址,,但在開機管理程序下載程序代碼時無法被存取。任何指向此區(qū)域的岔斷,,在呼叫任何開機管理程序函式之前都應關閉,,若在執(zhí)行時程序內容會變更,則應考慮可能發(fā)生的各種問題,。
在個人計算機方面,,應用程序須和裝置進行通訊,以及傳送新的使用者程序代碼,。研發(fā)業(yè)者會透過網站或光盤獲得所需軟件,軟件須能要求裝置進入開機狀態(tài),,并提供正確的驗證金鑰,,當裝置準備好時,主控端應傳送新的內容,以便寫入至閃存,,并啟動下載程序的使用者程序,,且應記住開機管理程序的內存配置,這方面須知道使用者程序代碼的開始與結束位置及檢查碼等數據,。在正常的運作模式下,,開機管理程序會連結至正確的地址,找到使用者程序代碼的開端,,使用者程序代碼發(fā)出的任何開機呼叫,,都會指向開機管理程序例程的正確地址。
計算機可使用各種不同的機制,,把內容透過USB傳送到開機管理程序,,根據裝置內開機管理程序的需求,可利用控制,、岔斷或批次傳輸以傳送數據,,裝置內的USB描述亦可決定程序須支持的驅動程序類型,并可設定讓程序使用操作系統(tǒng)的人機接口裝置驅動程序,,或使用特定廠商的驅動程序,。
簡化啟動程序
開機啟動其實是一個常見的程序,個人計算機使用相同的原理把操作系統(tǒng)從硬盤加載到計算機,,許多參考設計方案與網絡上的項目設計范例,,能協(xié)助在嵌入式設計中建置開機管理程序,如廠商推出的PSoC Designer工具能用來建立一個USB或I2C開機管理程序,,并能搭配各種可編程系統(tǒng)單芯片或PSoC,。USB開機管理程序的使用者模塊會產生所有必要的開機管理程序代碼,能和使用者程序并存運作,,此工具讓業(yè)者設計出全速,、符合Chapter 9標準規(guī)范、人機接口裝置或原生USB裝置,,引導精靈會協(xié)助產生精確的USB描述,,并利用岔斷或控制傳輸類型支持開機管理程序的轉換。
使用者模塊會根據設計時預測的需求產生開機管理程序代碼(表1),,其會搜尋各種可供選擇的參數,,如使用者程序第一個和最后一個模塊、開機管理程序第一個與最后一個區(qū)塊及檢查碼的地址,,開機管理程序的大小也可自行調整,,以便插入任何必須和下載程序一起進行的特殊程序代碼,USB交易需要的金鑰也可自行設定,,而了解未來開機管理程序可能面臨的環(huán)境溫度,,可讓工具能產生適合的編程例程,,最后,使用者可產生像void BootLdrUSB_EnterBootloader(void)例程,,讓使用者程序代碼能從軟件程序啟動開機程序,。
表1 USB開機管理程序搜尋各種可選擇參數
用戶模塊參數
參數值
TW0_Block_Relocatable_Interrupt_Table
4C
ApplicationCode_Start_Block
4E
Last_Application_Block FE
FE
Application_Checksum_Block
FF
Bootloader_Start_Block 2
2
Bootloader_Size
4B
BootloaderKey
0001020304050607
Flash_Program_Temperature_deg_C
-40C
ICE_Debug_FLASH_DISABLE
DISABLE_FLASH_WRITE
BootLdrUSBFS_ver
1000
模塊會產生一個有效的內容檢查碼,內容是透過開機管理程序下載而來,,另一個工具從編譯器的輸出端提供下載檔案,,這個*.dld檔案含有hex編碼格式的內容,和新的檢查碼一起編排成Flash模塊,,且可透過由Visual Basic或C#語言撰寫的個人計算機程序分析讀取,。本文列舉之上述方式,可把新的使用者程序透過USB接口下載到裝置中,,讓最終使用者升級其產品,、除錯或改進功能,不但不須使用任何特殊硬件進行升級,,且毋需成本昂貴的產品召回或更換作業(yè),。