高 政,葉樂清,鄭小芳,肖 柳
(1.杭州義益鈦迪信息技術(shù)有限公司,浙江 杭州 310019;2.杭州騰熠科技有限公司,浙江 杭州 310051;3.浙江大華技術(shù)股份有限公司,浙江 杭州 310051)
基于MCU的硬件終端成本低且功耗小,被廣泛應(yīng)用于物聯(lián)網(wǎng)領(lǐng)域。在傳統(tǒng)應(yīng)用場(chǎng)景中,MCU由于受到存儲(chǔ)、主頻以及外設(shè)等資源的限制,無法完成較復(fù)雜的操作和計(jì)算。傳統(tǒng)終端的系統(tǒng)服務(wù)和應(yīng)用軟件集成在一套程序中,更新應(yīng)用軟件時(shí)整套軟件都需修改,操作風(fēng)險(xiǎn)較高。隨著物聯(lián)網(wǎng)場(chǎng)景應(yīng)用要求的不斷提高,客戶對(duì)MCU的軟件靈活性和開發(fā)效率提出了更高的要求。當(dāng)大規(guī)模定制應(yīng)用時(shí),服務(wù)商無法高效滿足需求。另外,終端在實(shí)時(shí)性要求較高的場(chǎng)景中需承擔(dān)更多的邊緣計(jì)算任務(wù)。
IC行業(yè)快速發(fā)展,MCU性能不斷提高,提供服務(wù)的能力越來越強(qiáng),需用新的思路來設(shè)計(jì)MCU軟件。文獻(xiàn)[1]設(shè)計(jì)和研究了嵌入式Linux系統(tǒng)的可重用組件,提出了一個(gè)基于XML的原型數(shù)據(jù)庫(kù),減少了存儲(chǔ)所需的時(shí)間,提高了系統(tǒng)的整體效率。文獻(xiàn)[2]提出采用一種基于組件的輕量級(jí)方法來工程化嵌入式,以中間件方式實(shí)時(shí)控制軟件。文獻(xiàn)[3]提出了一種基于微控制器的軟件架構(gòu),主要應(yīng)用于物聯(lián)網(wǎng)(IoT)捕獲數(shù)據(jù)卡。文獻(xiàn)[4]利用Docker容器化技術(shù)設(shè)計(jì)了在線實(shí)驗(yàn)系統(tǒng),為用戶提供了良好的實(shí)驗(yàn)靈活性。文獻(xiàn)[5]提出以軟件構(gòu)件的形式封裝系統(tǒng)軟件,以標(biāo)準(zhǔn)的接口形式呈現(xiàn)給應(yīng)用軟件,方便了系統(tǒng)的集成和維護(hù)?;谝陨衔墨I(xiàn)基礎(chǔ),提出了一種基于MCU的物聯(lián)網(wǎng)關(guān)容器化軟件設(shè)計(jì)方法。該方法中,MCU利用分散加載技術(shù)分離系統(tǒng)服務(wù)和應(yīng)用軟件,以容器化方式將應(yīng)用軟件劃分為多個(gè)應(yīng)用模塊,且各模塊間可獨(dú)立開發(fā)和升級(jí)。由于系統(tǒng)服務(wù)和應(yīng)用軟件的解耦,開發(fā)者可集中精力于各應(yīng)用模塊的開發(fā)而無需關(guān)注系統(tǒng)支持,因此可縮短應(yīng)用軟件開發(fā)周期,提高測(cè)試和部署效率。
基于MCU的物聯(lián)網(wǎng)終端系統(tǒng)包括硬件、硬件控制層、內(nèi)核層以及應(yīng)用層,具體結(jié)構(gòu)如圖1所示[6]。其中,內(nèi)核層和硬件控制層統(tǒng)稱系統(tǒng)服務(wù),應(yīng)用層統(tǒng)稱應(yīng)用軟件。
如圖1所示,傳統(tǒng)模式中,系統(tǒng)服務(wù)和應(yīng)用軟件共同組成了物聯(lián)網(wǎng)終端內(nèi)部MCU的整套程序。當(dāng)更新MCU應(yīng)用軟件時(shí),需在整套程序基礎(chǔ)上修改應(yīng)用軟件,編譯鏈接生成可執(zhí)行代碼并下載到MCU中。
圖1 傳統(tǒng)物聯(lián)網(wǎng)終端軟件構(gòu)成圖
利用所提方法分離系統(tǒng)服務(wù)和應(yīng)用軟件,應(yīng)用軟件以容器化方式劃分為多個(gè)模塊,且彼此之間可獨(dú)立開發(fā)和升級(jí),具體如圖2所示。在系統(tǒng)服務(wù)基礎(chǔ)上搭建資源中臺(tái),屏蔽硬件差異,為應(yīng)用軟件提供資源。以容器化方式將應(yīng)用軟件劃分為多個(gè)應(yīng)用模塊,每個(gè)應(yīng)用模塊可放在容器中獨(dú)立運(yùn)行。每個(gè)應(yīng)用模塊可從資源中臺(tái)獲取資源和數(shù)據(jù),如讀操作、寫操作以及數(shù)據(jù)等[7]。MCU啟動(dòng)后,以分散加載方式先啟動(dòng)系統(tǒng)服務(wù),逐步啟動(dòng)容器中的應(yīng)用模塊。應(yīng)用軟件需更新時(shí),只需在開發(fā)環(huán)境中修改應(yīng)用模塊,借助編譯環(huán)境生成可執(zhí)行文件下載到原有容器即可。
圖2 系統(tǒng)服務(wù)和應(yīng)用軟件分離
MCU軟件的設(shè)計(jì)分離了系統(tǒng)服務(wù)和應(yīng)用軟件。其中,系統(tǒng)服務(wù)負(fù)責(zé)系統(tǒng)框架、執(zhí)行邏輯以及資源控制,應(yīng)用軟件在以容器化方式劃分為多個(gè)模塊,每個(gè)獨(dú)立開發(fā),負(fù)責(zé)邊緣計(jì)算服務(wù)。
在充分理解MCU運(yùn)行機(jī)制的基礎(chǔ)上,搭建系統(tǒng)服務(wù)框架,定義資源中臺(tái)。系統(tǒng)服務(wù)包括程序存儲(chǔ)區(qū)域、資源中臺(tái)、外設(shè)驅(qū)動(dòng)、運(yùn)行庫(kù)、外設(shè)資源、啟動(dòng)和加載配置描述等[8]。軟件設(shè)計(jì)框架和執(zhí)行流程如圖3所示。
圖3 軟件設(shè)計(jì)框架和執(zhí)行流程
程序存儲(chǔ)區(qū)為系統(tǒng)服務(wù)和各個(gè)應(yīng)用模塊分配程序存儲(chǔ)區(qū)域,每個(gè)存儲(chǔ)區(qū)域有固定大小和起始地址,升級(jí)時(shí)可按存儲(chǔ)區(qū)域升級(jí)。資源中臺(tái)用于定義所有的函數(shù)地址、變量以及數(shù)據(jù)索引,便于使用系統(tǒng)服務(wù)和應(yīng)用軟件。外設(shè)驅(qū)動(dòng)可屏蔽硬件差異,操作MCU資源,包括IO和通信等。運(yùn)行庫(kù)是MCU運(yùn)行時(shí)所需的驅(qū)動(dòng)庫(kù)、業(yè)務(wù)庫(kù)以及協(xié)議庫(kù)等。外設(shè)資源是MCU的固有資源,包括內(nèi)存、存儲(chǔ)、中斷、定時(shí)、通信以及IO等[9]。啟動(dòng)和加載配置描述應(yīng)用程序存儲(chǔ)區(qū)、資源中臺(tái)配置以及系統(tǒng)分散加載項(xiàng)等相關(guān)參數(shù),保證系統(tǒng)服務(wù)和應(yīng)用軟件獨(dú)立開發(fā),統(tǒng)一運(yùn)行。
系統(tǒng)服務(wù)包括輪詢應(yīng)用和定時(shí)應(yīng)用。輪詢應(yīng)用在主循環(huán)中執(zhí)行,定時(shí)應(yīng)用在中斷服務(wù)中執(zhí)行。開發(fā)系統(tǒng)服務(wù)時(shí),需用加載配置項(xiàng)描述服務(wù)在應(yīng)用程序存儲(chǔ)區(qū)的位置和資源中臺(tái)配置,保證系統(tǒng)服務(wù)可獨(dú)立更新,且可調(diào)用系統(tǒng)資源。應(yīng)用軟件開發(fā)所用的資源中臺(tái)配置需與此配置相同。
以輪詢應(yīng)用為例,介紹MCU軟件執(zhí)行流程。首先,在系統(tǒng)服務(wù)編譯時(shí)確定資源中臺(tái)在內(nèi)存中的位置及各種資源在中臺(tái)中的位置,MCU根據(jù)加載項(xiàng)啟動(dòng),執(zhí)行初始化工作,包括定義各類應(yīng)用程序存儲(chǔ)區(qū)等。其次,MCU根據(jù)資源中臺(tái)中定義的輪詢應(yīng)用地址和定時(shí)應(yīng)用地址,在主循環(huán)中以指針方式執(zhí)行多個(gè)輪詢應(yīng)用,在中斷服務(wù)中以指針方式執(zhí)行定時(shí)應(yīng)用。最后,執(zhí)行到某個(gè)應(yīng)用模塊時(shí),MCU運(yùn)行指針從資源中臺(tái)跳轉(zhuǎn)到應(yīng)用模塊存儲(chǔ)區(qū)執(zhí)行應(yīng)用模塊函數(shù)體,完成應(yīng)用軟件的業(yè)務(wù)功能[10]。
不同的應(yīng)用軟件類型需要不同的開發(fā)模板。以輪詢應(yīng)用為例,當(dāng)某個(gè)應(yīng)用模塊需更新時(shí),使用具備與系統(tǒng)服務(wù)相同資源中臺(tái)配置的開發(fā)環(huán)境修改模塊代碼,編譯生成可執(zhí)行目標(biāo)文件,并將其下載到指定程序存儲(chǔ)區(qū),MCU按已有機(jī)制執(zhí)行更新后的應(yīng)用模塊。
為驗(yàn)證方法的可行性,設(shè)計(jì)了MCU作為STM32F207的最小系統(tǒng),啟動(dòng)模式設(shè)置為BOOT0。在MCU中內(nèi)置app_fuc1和app_fuc2兩個(gè)應(yīng)用模塊,開發(fā)環(huán)境為keil,描述如何實(shí)現(xiàn)應(yīng)用軟件app_fuc與系統(tǒng)服務(wù)的獨(dú)立開發(fā)和升級(jí)。
在MCU系統(tǒng)服務(wù)開發(fā)環(huán)境中,分散加載包括系統(tǒng)服務(wù)程序存儲(chǔ)地址描述和資源中臺(tái)配置描述,描述如下:
以上描述中,定義了系統(tǒng)服務(wù)在程序存儲(chǔ)區(qū)的存儲(chǔ)位置和運(yùn)行時(shí)在內(nèi)存中的位置,規(guī)定了資源中臺(tái)的起始地址和長(zhǎng)度。
在啟動(dòng)文件中描述資源中臺(tái)的內(nèi)部定義,保證系統(tǒng)服務(wù)和應(yīng)用程序的全局使用,描述如下:
app_fuc1_adr占用4個(gè)字節(jié),為app_fuc1函數(shù)的執(zhí)行地址,即app_fuc1應(yīng)用模塊的存儲(chǔ)地址;app_fuc2_adr占用4個(gè)字節(jié),為app_fuc2函數(shù)的執(zhí)行地址,即app_fuc2應(yīng)用模塊的存儲(chǔ)地址。系統(tǒng)服務(wù)初始化時(shí),為app_fuc1和app_fuc2分配起始地址的描述如下:
app_fuc1_adr=fuc1應(yīng)用程序存儲(chǔ)地址;
app_fuc2_adr=fuc2應(yīng)用程序存儲(chǔ)地址;
在系統(tǒng)服務(wù)的循環(huán)執(zhí)行中,以函數(shù)指針方式執(zhí)行兩個(gè)應(yīng)用,描述如下:
((void (*)())app_fuc1_adr)();/*執(zhí)行應(yīng)用程序1*/
((void (*)())app_fuc2_adr)();/*執(zhí)行應(yīng)用程序2*/
此處系統(tǒng)服務(wù)已完成對(duì)應(yīng)用模塊app_fuc1和應(yīng)用模塊app_fuc2的執(zhí)行。
在應(yīng)用模塊開發(fā)環(huán)境中,分散加載包括應(yīng)用模塊程序存儲(chǔ)地址描述和資源中臺(tái)配置描述。為保證資源中臺(tái)使用的標(biāo)準(zhǔn)性和統(tǒng)一性,其所使用資源中臺(tái)描述與系統(tǒng)服務(wù)中的保持一致,描述如下:
在啟動(dòng)文件中對(duì)資源中臺(tái)的內(nèi)部定義與系統(tǒng)服務(wù)中的保持一致,描述如下:
在應(yīng)用模塊開發(fā)環(huán)境中,應(yīng)用程序存儲(chǔ)地址和資源中臺(tái)內(nèi)部定義等配置完畢后,只需開發(fā)服務(wù)應(yīng)用函數(shù)app_fuc。main函數(shù)無實(shí)質(zhì)性操作,開發(fā)主體描述如下:
按照上述實(shí)現(xiàn)方法,設(shè)計(jì)了基于MCU的物聯(lián)網(wǎng)關(guān)并應(yīng)用在動(dòng)力環(huán)境監(jiān)控場(chǎng)景中。該網(wǎng)關(guān)具備4個(gè)串口、8路數(shù)字量輸入接口、4路模擬量輸入接口以及1路網(wǎng)口。每個(gè)端口可升級(jí)配置為任意應(yīng)用模塊,從而完成每個(gè)端口的功能。選取4個(gè)端口進(jìn)行驗(yàn)證,端口接入信息如表1所示。
表1 物聯(lián)網(wǎng)關(guān)端口接入設(shè)備列表
開關(guān)電源為標(biāo)準(zhǔn)電總協(xié)議,應(yīng)用模塊為app_com1;智能電表為標(biāo)準(zhǔn)MODBUS協(xié)議,應(yīng)用模塊為app_com2,煙霧傳感器為標(biāo)準(zhǔn)高低電平信號(hào),應(yīng)用模塊為app_DI1;溫度傳感器為標(biāo)準(zhǔn)0~5V電壓信號(hào),應(yīng)用模塊為app_AI1。各個(gè)應(yīng)用模塊以輪詢方式實(shí)現(xiàn)對(duì)端口數(shù)據(jù)的采集和解析,并將其封裝為上行數(shù)據(jù),產(chǎn)品應(yīng)用場(chǎng)景如圖4所示。
文中基于MCU的物聯(lián)網(wǎng)關(guān)容器化軟件設(shè)計(jì)方法,利用分散加載技術(shù),分離系統(tǒng)服務(wù)和應(yīng)用軟件,將應(yīng)用軟件以容器化方式劃分為多個(gè)應(yīng)用模塊,且模塊間可獨(dú)立開發(fā)和升級(jí),提高了應(yīng)用程序定制化開發(fā)效率。該方法在運(yùn)營(yíng)商通信機(jī)房的動(dòng)力環(huán)境監(jiān)控領(lǐng)域中廣泛使用,設(shè)備維護(hù)效率較高,且可在其他領(lǐng)域進(jìn)行推廣應(yīng)用。
圖4 物聯(lián)網(wǎng)關(guān)應(yīng)用場(chǎng)景