楊蕾蕾1,,慕福奇2,張文明2,,呂欣巖2
(1.中國科學(xué)院大學(xué) 微電子學(xué)院,,北京 100049;2.江蘇中科羿鏈通信技術(shù)有限公司,,江蘇 無錫 214135) 摘要:針對嵌入式設(shè)備的配置管理需求,,利用Lua腳本語言設(shè)計(jì)了一種靈活的嵌入式設(shè)備配置管理方法。實(shí)現(xiàn)了通過串口服務(wù),、Telnet服務(wù)和Web服務(wù)對嵌入式設(shè)備進(jìn)行配置管理,。該方法通過在QiLINK(Queue Information LINK)鏈狀網(wǎng)節(jié)點(diǎn)(使用TMS320C6670芯片開發(fā))上實(shí)際驗(yàn)證,證明了其可行性,,符合預(yù)期效果,。為嵌入式設(shè)備提供了一種移植性強(qiáng)、多方式的配置管理方法,。
關(guān)鍵詞:嵌入式,;配置管理;Lua語言,;Web,;Telnet;串口,;MVC框架
中圖分類號(hào):TP311文獻(xiàn)標(biāo)識(shí)碼:ADOI: 10.19358/j.issn.1674-7720.2017.03.026
引用格式:楊蕾蕾,,慕福奇,張文明,,等.一種靈活的嵌入式設(shè)備配置管理方法[J].微型機(jī)與應(yīng)用,,2017,36(3):88-92.
0引言
隨著計(jì)算機(jī)技術(shù)和集成電路的發(fā)展,嵌入式技術(shù)日漸普及,。嵌入式設(shè)備由于體積小,、功耗低、成本低廉的特點(diǎn)在通信,、家電,、醫(yī)療以及軍事等領(lǐng)域中的應(yīng)用越來越廣泛,。
無論是以單片機(jī)為主的中低端嵌入式應(yīng)用,還是以ARM,、DSP,、MIPS為主的高端嵌入式設(shè)備,都需要提供一種或幾種方式供開發(fā)人員或其他使用者對其進(jìn)行配置和管理,。常用的方式可以分為以下3種:利用串口通信或Telnet遠(yuǎn)程登錄服務(wù)直接輸入指令[1],;通過發(fā)送指定格式的UDP包 [2];使用Web可視化界面[3],。目前嵌入式設(shè)備的配置管理方法多采用以上3種方式中的一種,,不夠全面。此外,,實(shí)現(xiàn)方式也不夠理想,,如自定義的命令格式以及自定義的配置數(shù)據(jù)文件容易出現(xiàn)解析錯(cuò)誤等[4]。綜上,,沒有一個(gè)移植性較強(qiáng)的、比較完備的配置管理方法可以應(yīng)用在不同的嵌入式設(shè)備中,。
Lua語言是一種輕量級(jí)的語言,,適用于多種操作系統(tǒng)以及用ANSI C開發(fā)的平臺(tái),它在嵌入式設(shè)備中的應(yīng)用已經(jīng)屢見不鮮[57],。此外,,Lua腳本可以直接用來存儲(chǔ)配置數(shù)據(jù),占用空間小并且容易解析,,不易出錯(cuò),。在這種前提下,本文考慮依托Lua語言,,實(shí)現(xiàn)一套集Web服務(wù),、Telnet服務(wù)和串口服務(wù)為一體的嵌入式設(shè)備配置管理方法。
1整體結(jié)構(gòu)設(shè)計(jì)
本嵌入式設(shè)備配置管理方法的系統(tǒng)結(jié)構(gòu)如圖1所示,,嵌入式設(shè)備提供網(wǎng)口和串口供PC管理機(jī)可以通過遠(yuǎn)程登錄,、訪問Web頁面以及輸入串口命令的方式對嵌入式設(shè)備進(jìn)行配置管理。
本方法的實(shí)現(xiàn)依賴于Lua源碼,,它提供解釋Lua腳本的解釋器,,同時(shí)還可以靈活地修改以滿足不同接口的需求。在系統(tǒng)結(jié)構(gòu)中,,Lua源碼的下層是底層驅(qū)動(dòng)函數(shù),,它們可以注冊到Lua中,供Lua腳本調(diào)用,。Lua源碼的上層是本方法實(shí)現(xiàn)所依賴的三大服務(wù):串口服務(wù),、Telnet服務(wù)以及Web服務(wù),。串口服務(wù)直接由Lua串口處理程序?qū)崿F(xiàn),而其他兩種服務(wù)均依賴于嵌入式TCP/IP協(xié)議棧,。NDK(Network Developer’s Kit)是德州儀器公司(Texas Instruments,,TI)開發(fā)的TCP/IP協(xié)議棧,它在提供Telnet服務(wù)的基礎(chǔ)上,,增加了解釋Lua指令的功能,。而Web服務(wù)利用Lua社區(qū)提供的相關(guān)Http模塊實(shí)現(xiàn),它們由純Lua腳本實(shí)現(xiàn),,修改十分簡單,,避免了傳統(tǒng)的C語言編寫的CGI(Common Gateway Interface)程序每次修改都需要重新編譯代碼的問題。這些模塊又依賴于Luasocket,,Luasocket是將NDK的Socket函數(shù)封裝給Lua使用的一個(gè)接口層,。系統(tǒng)的最上層即是配置管理操作的對象、配置數(shù)據(jù)以及代碼文件等,。在系統(tǒng)實(shí)現(xiàn)過程中還移植了Fatfs文件系統(tǒng),,用來更好地存放和管理這些文件。
2具體方法及實(shí)現(xiàn)
2.1文件系統(tǒng)移植及IO操作實(shí)現(xiàn)
嵌入式文件系統(tǒng)選擇Fatfs,。它使用ANSI C編寫,,不依賴于硬件平臺(tái),并且代碼量小,、移植簡單[89],,適用于小型的嵌入式設(shè)備。Lua源碼中的io庫的實(shí)現(xiàn)依賴于標(biāo)準(zhǔn)C的文件操作函數(shù),,與Fatfs提供的函數(shù)不同,,因此需要將Fatfs提供的相關(guān)API函數(shù)封裝成一套新的Lua io庫。
2.1.1Fatfs文件系統(tǒng)的移植
以MX25U25635F SPI FLASH為例闡述Fatfs在嵌入式存儲(chǔ)設(shè)備中的移植過程,。
MX25U25635擦除的最小單位是4 K,,所以將Fatfs的簇(最小文件單位)大小設(shè)置為4 K。一個(gè)扇區(qū)大小為512 B,,一個(gè)簇8個(gè)扇區(qū),。移植Fatfs需要修改的是diskio.c文件,其中,,需要特別注意的是磁盤寫函數(shù),。
如圖2所示,寫一個(gè)文件時(shí)會(huì)將這個(gè)文件分成兩部分:整扇區(qū)和最后不足一個(gè)扇區(qū)的部分,。整扇區(qū)的寫操作是由用戶緩沖區(qū)直接寫入物理磁盤,,最后不足一扇區(qū)的部分,先從磁盤讀取相應(yīng)扇區(qū)的內(nèi)容到文件緩沖區(qū),,修改緩沖區(qū)內(nèi)容,,并設(shè)置回寫標(biāo)記,,最終在調(diào)用文件關(guān)閉函數(shù)或再一次寫文件時(shí),再將文件緩沖區(qū)的內(nèi)容回寫到物理磁盤中,。這樣就一共調(diào)用了兩次磁盤寫函數(shù),,磁盤寫函數(shù)調(diào)用SPI寫函數(shù),而每次調(diào)用SPI寫函數(shù)時(shí)都會(huì)根據(jù)寫入數(shù)據(jù)的長度擦除所在的整個(gè)簇,。如果文件緩沖區(qū)寫入的扇區(qū)和之前已經(jīng)寫好的整扇區(qū)在一個(gè)簇內(nèi),,則第二次調(diào)用SPI寫函數(shù)時(shí)會(huì)再一次把整個(gè)簇擦掉,因此之前寫入的整扇區(qū)內(nèi)容也被擦掉了,。為了避免這種情況,,在SPI寫函數(shù)中加了一個(gè)判斷,在擦之前判斷擦除的地址是否是一個(gè)簇的起始地址,,如果是則進(jìn)行擦除操作,,否則直接寫入。
2.1.2IO庫的封裝及本地文件到Flash的映射
IO庫主要實(shí)現(xiàn)對文件的打開,、關(guān)閉以及讀,、寫這幾個(gè)函數(shù)。其中需要注意的是,,F(xiàn)atfs對外提供的每一個(gè)文件操作函數(shù)的第一個(gè)參數(shù)都是一個(gè)文件指針,,以此來確定操作對象。但是Lua中并沒有指針變量,,因此封裝時(shí)在文件打開函數(shù)的末尾返回所打開的文件的指針,此后調(diào)用讀,、寫,、關(guān)閉函數(shù)時(shí)都直接將得到的這個(gè)文件指針作為第一個(gè)參數(shù)使用。
當(dāng)寫入Flash的文件數(shù)量較多時(shí),,逐個(gè)寫入太過麻煩,,因此用一個(gè)簡單的Lua腳本實(shí)現(xiàn)文件從PC端指定路徑到Flash指定路徑的映射。它完成的操作有:定義一個(gè)目錄查找函數(shù),,將PC端指定目錄下的指定格式文件的絕對路徑全部存入到table變量input_table{}中,;使用字符串匹配替換函數(shù)string.gsub()將input_table{}中的文件路徑替換為Flash文件系統(tǒng)中的指定路徑,存入另一個(gè)table變量save_table{}中,;利用Lua原有的io庫從input_table{}中依次讀取文件,,利用封裝Fatfs函數(shù)的io庫按照save_table{}中的路徑依次創(chuàng)建文件并將讀到的內(nèi)容寫入。
2.2Web服務(wù)器設(shè)計(jì)
嵌入式Web服務(wù)器的實(shí)現(xiàn)借助于Lua社區(qū)提供的相關(guān)模塊,,包括Xavante,、Wsapi、Copas,、Cgilua,、Sailor,。Xavante是基于URI模塊化架構(gòu)的HTTP1.1 Web服務(wù)器映射處理程序,提供文件處理,、重定向處理和Wsapi處理,。Wsapi將抽象的Lua程序映射為具體的Web應(yīng)用,解決了Lua代碼的平臺(tái)依賴性,,使之可以應(yīng)用于主流的平臺(tái),。Copas是一個(gè)基于協(xié)程的調(diào)度器,可以用于調(diào)度TCP或UDP服務(wù),。Cgilua是一個(gè)用于創(chuàng)建動(dòng)態(tài)Web頁面和Web表單的工具,,支持界面和數(shù)據(jù)分離。Sailor是一個(gè)MVC框架,,用于組織Web界面和數(shù)據(jù),。這些模塊依賴于Luasocket,它是用C封裝的提供給Lua使用的Socket函數(shù),。
2.2.1Web服務(wù)器結(jié)構(gòu)及處理流程
Web服務(wù)器的結(jié)構(gòu)如圖3所示,。
Copas模塊完成Tcp Socket的調(diào)度工作,負(fù)責(zé)接收請求,、建立連接,,并監(jiān)視Socket套接字的狀態(tài)變化,當(dāng)監(jiān)聽到有數(shù)據(jù)后,,交給Xavante模塊處理,。Xavante模塊將接收到的數(shù)據(jù)包進(jìn)行解析,得到包頭信息,,并根據(jù)解析出來的Url請求使用不同的處理函數(shù)進(jìn)行處理,,包括Index頁面處理函數(shù)、文件處理函數(shù)以及Cgi處理函數(shù),。Cgi處理函數(shù)調(diào)用Cgilua模塊進(jìn)行處理,。處理完畢后將處理結(jié)果交給Wsapi模塊,它將抽象的Lua語句轉(zhuǎn)換為規(guī)范的html語句,。最后Xavante模塊將處理結(jié)果加上包頭信息發(fā)送給客戶端,。其中,Web頁面的組織方式使用Sailor MVC框架,。具體處理流程如圖4所示,。
2.2.2Socket接口層
Lua的Http服務(wù)模塊依賴于Luasocket提供的tcp socket函數(shù)。Lua官網(wǎng)提供的Luasocket是以動(dòng)態(tài)庫的格式供用戶使用,,并且依賴于Linux/Windows操作系統(tǒng),,不適用于所有的嵌入式設(shè)備(例如TMS320C6670所依賴的CCS開發(fā)平臺(tái))。因此需要將所使用的TCP/IP協(xié)議棧提供的Socket函數(shù)封裝成Luasocket的tcp socket格式,并注冊到Lua源碼中供Lua Http相關(guān)模塊使用,。在封裝Luasocket庫時(shí),,盡量保持函數(shù)結(jié)構(gòu)和依賴關(guān)系不變,只替換內(nèi)部實(shí)現(xiàn)函數(shù),,減少使用Luasocket的Http模塊的改動(dòng),。
2.2.3MVC框架
為了更好地組織Web,使用了Sailor MVC框架,。MVC指的是Model,、View、Controller三部分,。MVC框架可擴(kuò)展性強(qiáng),、易于維護(hù)[10]。
Sailor的視圖是lp文件,,它與Html文件的區(qū)別是可以直接插入Lua代碼(Wsapi模塊將解釋處理這些Lua代碼),。Lua代碼的插入方法有兩種:<?lua chunk?>和<?lua=expression?>。如果是連續(xù)的一段Lua代碼,,則按代碼塊的格式插入,,如果是單獨(dú)的一句Lua語句,則按Lua表達(dá)式的格式插入,。
Sailor通過定義一些頁面操作函數(shù)來實(shí)現(xiàn)Controller對視圖的控制,,如視圖加載函數(shù)、輸出函數(shù)以及重定向操作函數(shù)等,。
Sailor同樣定義了模型操作函數(shù),。Controller對模型的控制從新建模型開始,Sailor提供的模型新建函數(shù)將用戶定義的模型NewObj作為參數(shù),,在繼承模型通用函數(shù)的同時(shí),,引入用戶在NewObj中自定義的函數(shù)及數(shù)據(jù)格式規(guī)范。Model部分通常采用數(shù)據(jù)庫存儲(chǔ),,但由于本系統(tǒng)數(shù)據(jù)量不是很大,也為了盡量減少不必要的模塊,,所以配置數(shù)據(jù)直接以Lua的table數(shù)據(jù)類型存儲(chǔ)在Lua腳本中,,因?yàn)镃和Lua極強(qiáng)的交互性,所以在C代碼中解析Lua配置腳本也很容易,。
2.3Telnet串口服務(wù)設(shè)計(jì)
Telnet服務(wù)和串口服務(wù)均是通過直接輸入Lua命令來對嵌入式設(shè)備進(jìn)行配置管理,,它們共用一套配置管理接口。Telnet實(shí)現(xiàn)了對嵌入式設(shè)備的遠(yuǎn)程控制,,并且操作簡單,,只要PC管理機(jī)與嵌入式設(shè)備在同一網(wǎng)段即可。同時(shí),對一個(gè)完整的嵌入式設(shè)備配置管理方法而言,,不可缺少的配置方式是通過串口服務(wù)進(jìn)行配置,。它在嵌入式設(shè)備沒有入網(wǎng)、默認(rèn)IP也沒有生效的情況下仍然可以使用,,保證了本配置方法的完備性,。串口處理程序與Lua結(jié)合還可以避免不同格式的串口數(shù)據(jù)幀給嵌入式設(shè)備軟件帶來的解析困難[11],提高了交互的靈活性,。
2.3.1配置管理接口
Telnet服務(wù)和串口服務(wù)除了可使用規(guī)范的Lua語句直接對Lua配置腳本進(jìn)行修改外,,本方法還增添了快捷配置方式以及直接調(diào)用某些管理函數(shù)的功能,將它們統(tǒng)稱為配置管理接口,。配置管理接口是由相關(guān)C函數(shù)注冊到Lua源碼中實(shí)現(xiàn)的,。調(diào)用格式與普通的Lua函數(shù)一樣:庫名.函數(shù)名(參數(shù)1,參數(shù)2,參數(shù)3…)。
2.3.2Telnet服務(wù)
NDK協(xié)議棧提供的Telnet服務(wù)的用戶指令包含多個(gè)關(guān)鍵字,,它們被存放在大小為10的字符指針數(shù)組tok中,,各命令需要匹配多少個(gè)關(guān)鍵字,就從tok數(shù)組中依次取出相應(yīng)的元素進(jìn)行匹配,。Lua命令只需輸入“Lua”一個(gè)關(guān)鍵字,,因此將tok[0]指向的字符串和“Lua”比較,如果相同,,則進(jìn)入Lua命令輸入模式(即調(diào)用Lua解釋器),,等待用戶輸入Lua指令,以回車鍵作為一次輸入的截止標(biāo)志,。Lua解釋器將輸入的字符串作為一段Lua代碼載入并編譯,,然后作為一個(gè)代碼塊(稱為chunk)壓入棧中。此后,,調(diào)用Lua的異常處理函數(shù)去執(zhí)行這個(gè)代碼塊,。圖5為Telnet解析Lua指令流程圖。
2.3.3串口服務(wù)
串口命令的解析過程與Telnet不同,,Telnet是通過直接調(diào)用Lua解釋器來執(zhí)行Lua命令,,而串口服務(wù)的解析過程經(jīng)過了一個(gè)中間函數(shù)即串口數(shù)據(jù)收發(fā)函數(shù),它被注冊到Lua中,。設(shè)備初始化時(shí)完成對串口的配置并啟動(dòng)加載Lua串口處理腳本,。當(dāng)PC管理機(jī)通過串口調(diào)試助手給嵌入式設(shè)備發(fā)來Lua命令時(shí),串口處理程序?qū)邮盏降臄?shù)據(jù)進(jìn)行處理,,然后將其傳給串口數(shù)據(jù)接收函數(shù),。Lua串口處理腳本檢測到串口數(shù)據(jù)接收函數(shù)接收到數(shù)據(jù)后,將這些接收到的內(nèi)容作為Lua代碼執(zhí)行,。執(zhí)行完畢后,,通過調(diào)用串口數(shù)據(jù)發(fā)送函數(shù)將執(zhí)行結(jié)果發(fā)送給串口處理程序,串口處理程序?qū)⒅幚硗戤吅笸ㄟ^串口線發(fā)送給PC管理機(jī),反饋給用戶,。其中,,串口配置數(shù)據(jù)也被存放在一個(gè)Lua腳本中,初始化時(shí)由C解析這個(gè)配置腳本完成對串口的配置,。
3實(shí)驗(yàn)結(jié)果
使用本方法在QiLINK鏈狀網(wǎng)其中一個(gè)節(jié)點(diǎn)(使用TMS320C6670芯片開發(fā))上進(jìn)行測試,,測試拓?fù)鋱D如圖6所示。所有節(jié)點(diǎn)的默認(rèn)IP為192.168.1.3,,入網(wǎng)后的IP為10.9.X.2,,其中X為節(jié)點(diǎn)號(hào)乘以9,比如節(jié)點(diǎn)4的IP為10.9.36.2,。
圖7是將PC管理機(jī)與節(jié)點(diǎn)4用串口線相連,,使用串口調(diào)試助手對INTCof文件成功進(jìn)行配置的結(jié)果圖。
4結(jié)束語
本文提出了一種靈活的嵌入式設(shè)備配置管理方法,,實(shí)現(xiàn)了利用串口服務(wù),、Telnet服務(wù)、Web服務(wù)3種方式對嵌入式設(shè)備進(jìn)行配置及管理,。本方法適用于用ANSI C開發(fā)的嵌入式設(shè)備,,并提供對外網(wǎng)口或串口。本方法與傳統(tǒng)的嵌入式設(shè)備配置管理方法相比,,提高了靈活性,,對配置數(shù)據(jù)或Web界面的修改只需修改相關(guān)腳本文件,無需重新修改編譯軟件代碼,;此外,,提高了完備性,無論嵌入式設(shè)備是否入網(wǎng)都可以對它進(jìn)行配置管理,;更為重要的一點(diǎn)是,,本方法通用性強(qiáng),不依賴開發(fā)平臺(tái)和操作系統(tǒng),,為各式各樣的嵌入式設(shè)備的配置管理提供了很好的解決方案,。
參考文獻(xiàn)
[1] 周家緒, 鄢萍, 張研. 一種嵌入式系統(tǒng)BootLoader參數(shù)自動(dòng)配置方法[J/OL].[2016-09-25].http://www.docin.com/p390606777.html.
?。?] 王曉東. 基于以太網(wǎng)和Uboot遠(yuǎn)程配置嵌入式系統(tǒng)啟動(dòng)參數(shù)[J]. 現(xiàn)代科學(xué)儀器, 2010(2):6770.
?。?] 譚海, 潘紹明. 嵌入式系統(tǒng)中配置參數(shù)修改研究及其實(shí)現(xiàn)[J/OL]. (20060829)[2016-09-25].http://www.paper.edu.com.
[4] 李長春, 張磊. 基于嵌入式Web門禁控制器的網(wǎng)絡(luò)配置實(shí)現(xiàn)[J]. 工業(yè)控制計(jì)算機(jī), 2009, 22(4):58-59.
?。?] 汪君鵬, 李宥謀. 基于Lua腳本技術(shù)的網(wǎng)絡(luò)化測控系統(tǒng)設(shè)計(jì)[J]. 西安郵電大學(xué)學(xué)報(bào), 2013, 18(1):90-94.
[6] 段鑫, 陳宇, 孫偉力. Lua遠(yuǎn)程調(diào)試協(xié)議研究與實(shí)現(xiàn)[J]. 自動(dòng)化應(yīng)用, 2011,25(6):3-5.
?。?] 沙俊星. 在嵌入式環(huán)境中使用Lua和SQLite擴(kuò)展NetSNMP代理[J]. 北京聯(lián)合大學(xué)學(xué)報(bào):自然科學(xué)版, 2011,25(1):9-13.
?。?] 秦偉. STM32的FatFS在數(shù)據(jù)采集系統(tǒng)中的應(yīng)用[J]. 單片機(jī)與嵌入式系統(tǒng)應(yīng)用, 2015,15(6):55-58.
[9] 洪岳煒, 王百鳴, 謝超英. 一種易于移植和使用的文件系統(tǒng)FatFs Module[J]. 單片機(jī)與嵌入式系統(tǒng)應(yīng)用, 2008,,8(5):29-31.
?。?0] 閆志貴, 孟操. MVC模式在嵌入式調(diào)試工具開發(fā)中的研究與實(shí)現(xiàn)[J]. 電子設(shè)計(jì)工程, 2010, 18(4):85-87.
[11] 李英明, 閆志輝, 周水斌. 基于Lua腳本語言的嵌入式UART通信方案設(shè)計(jì)[J]. 單片機(jī)與嵌入式系統(tǒng)應(yīng)用, 2012, 12(4):29-32.