14.2. 出貨應用程式

在工作檯上能運作的指令碼,與一件出貨的產品並不是同一回事。進入現場的相機必須在產品安裝的整段期間——數個月、數年——自行運作,控制檯前沒有操作員、沒有連接 IDE,當某些東西停止運作時身邊也沒有 Python 專家。本節各頁說明當目標是 出貨產品 而非 桌上展示 時,應用程式有哪些地方會改變。

14.2.1. 起飛前檢查清單

在相機離開工作檯之前,以下是應該為真的簡短事項清單:

  • 應用程式碼位於建置中,而非檔案系統上。 凍結模組與一份 ROMFS 映像涵蓋了程式碼與資產。flash 與 SD 卡儲存空間僅供執行階段狀態與日誌檔使用。終端使用者若不重新燒錄,就無法編輯、刪除或替換應用程式。

  • 看門狗持續運作。 machine.WDTmain.py 的開頭啟動,並在主迴圈的每一次迭代中餵食一次。任何超過所設定逾時時間的卡死,都會引發一次硬體重置,相機隨即重新啟動。

  • 應用程式將日誌寫往可復原的目的地。 logging 函式庫所寫下的記錄帶有等級、時間戳,以及一個能讓現場從 SD 卡復原的目的地。print() 只供開發階段使用——其預設目的地是 USB stdout,而沒有任何出貨產品會去讀取它。

  • flash 與 SD 都被視為可能失敗。 內部 flash 存放小型固定大小的記錄(設定、最近一次的已知校正);SD 存放龐大的可變檔案(影像擷取、日誌檔);對兩者的操作都包裹在錯誤處理中,並且在任一者不可用時,應用程式都有明確的後備方案。

14.2.2. 將應用程式烘焙進建置

有兩種互補的機制可將檔案放進韌體映像中: