陳文斌,黃明鑫,劉根利,楊 志,翟 淵
(重慶科技學院 智能技術與工程學院,重慶 401331)
隨著物聯網技術的快速發展,程序的遠程升級成了剛需。目前,多數單片機程序遠程升級都是基于單片機的 IAP 技術[1]。然而,物聯網設備往往數量較多,升級所有設備對服務器開銷大,基于差分原理的升級方式對硬件要求又高,在硬件資源有限的微控制器MCU上使用差分算法存在局限性。因此,本文提出了一種應用在MCU上的新型增量升級方法,將后期不需要升級和需要升級的代碼獨立開來,形成固件工程和應用工程。通過這種方法,實現了固件代碼和升級代碼的解耦,同時不需要復雜的差分算法支持,能降低硬件對資源的要求,提高升級效率,降低升級成本。
分散加載(scatter)文件是一種文本文件,可以用來描述連接器生成映像文件時需要的信息。通過編寫一個分散加載文件來指定ARM連接器在生成映像文件時如何分配 Code,RO-Data,RW-Data,ZI-Data等數據的存放地址[2]。有時候用戶希望將不同代碼放在不同存儲空間,也就是通過編譯器生成的映像文件需要包含多個域,每個域在加載和運行時可以有不同的地址。要生成這樣的映像文件,必須通過某種方式告知編譯器相關的地址映射關系[3]。
MCU編譯后的代碼在執行文件中是按照一定區域進行排列的,并且函數在執行文件中的首地址就是其函數的入口地址,因此通過地址能直接調用函數。參考單片機中斷函數向量表的形式,劃分一部分空間出來專門存放函數的入口地址,其他工程則利用這一地址,偏移之后,就可以得到函數的地址,實現不同工程之間函數的調用。其不同工程在單片機FLASH的存儲空間分配原理,如圖1所示。在每個工程中再分配一定的空間用于存儲函數地址,即圖中應用程序接口(Application Programming Interface,API)部分。
圖1 存儲空間分配示意
為了實現Firmware固件層代碼與APP應用層代碼的解耦,APP應用層工程中不能含有Firmware固件工程中的代碼。Firmware固件層代碼應該在正常完成調試之后,將APP應用層會用到的函數的地址集中存放在單片機FLASH固定位置,以便APP應用層能夠通過這一固定的位置來定位函數地址,實現對Firmware固件層函數的調用。根據以上原理和設計要求的考慮,軟件框架設計如圖2所示,整個框架一共包括以下3個部分:固件工程模塊、程序升級模塊、應用工程模塊。
圖2 總體軟件框架結構
(1)固件工程模塊。固件工程是存儲設備中不需要升級的代碼,例如輪椅傳感器驅動程序、內核程序、操作系統程序、輪椅控制程序等。這部分程序代碼量是最大的,且基本不需要升級,因此只需要在設備投入使用之前寫入程序。同時,這個模塊還為升級模塊和應用層模塊提供必要的API接口。
(2)應用層模塊。應用層模塊用于存儲后期升級會用到的程序,如面部識別算法等。其中固件工程模塊與應用層模塊之間函數能夠相互調用;設備投入使用后,需要對代碼進行小修改,就可以將這些代碼放到應用層工程中,以后修改這些函數代碼時,只需要重新編譯,再通過OTA進行升級。
(3)程序升級模塊。用于更新應用層的代碼。這里的升級模塊可以使用固件工程中的函數,例如校驗函數、無線通信函數等,同時也可以單獨設計成一個Bootloder程序。這樣不但可以升級應用層程序,還可以升級固件層的程序。
采用新的增量升級方法需要將代碼分為后期需要升級的部分作為應用層工程,將后期不需要升級的部分作為固件工程。其程序的調整可以以一個函數為單位進行調整,并根據需要為添加到應用層工程的函數單獨創建一個或多個c文件和h文件,再將這些代碼添加到一個新的工程中;應用層可以根據升級需要再分成多個工程。
程序的正常運行需要一定的ROM和RAM空間,多個工程相互結合實現最終的功能,需要為每個工程劃分一片空間來保證程序的正常運行。
現在雖然將原始代碼分成了多個工程,但是多個工程之間缺少相應的函數名,是無法編譯的,接下來就需要實現不同工程之間的關聯,保證函數能在不同工程之間實現相互調用。
(1)函數對外接口設計。在C語言函數的調用是通過函數地址進行的,圖1中每個工程中的函數地址存儲在固定的地址,其他工程通過訪問這一固定的地址來實現不同工程之間的函數調用。
函數對外接口的設計有多個方法。方法一:創建一個指針型結構體,并將其值賦值為函數的地址,再使用編譯器的__attribute__指令,將該結構體變量存放在固定地址;方法二:可以將變量在啟動文件中使用DCD指令申請4字節的空間用于存儲函數指針結構體變量。
(2)函數訪問接口設計。其他工程需要訪問這些函數時,通過創建一個函數指針結構體變量,并將其首地址指向這一固定地址。其他工程通過訪問函數指針結構體變量,進而訪問不同工程的函數,實現不同工程之間的函數調用。
本論文通過介紹目前增量升級技術的應用和目前基于差分原理的增量升級方式在低成本MCU上應用的局限性,提出了一種新的增量升級方法。根據增量升級需求,希望能夠實現對單個函數升級的要求,增量升級的設計過程。采用新的增量升級方法在低成本MCU上應用具有一定的優勢。