基于Lua腳本語言的嵌入式UART通信方案設計
本系統(tǒng)的程序流程如圖2所示。其中,串口通信芯片采用T1公司的帶64字節(jié)FIFO的4通道可編程UART芯片TL16C754B來實現(xiàn)。它的4個通道可分別獨立編程,在3.3 V的操作電壓下,數(shù)據傳輸速率可高達2 Mbps,適合多種UART通信環(huán)境中的應用。基于裝置的應用環(huán)境,本文采用RS485的問答機制并結合查詢方式來對該串口通信方案進行設計。在方案實現(xiàn)中,裝置將每隔一定時間通過串口芯片發(fā)送一次查詢報文,當查詢到外圍沒備發(fā)送的正確響應報文后,再進行相關業(yè)務處理。
3 功能實現(xiàn)
在嵌入式應用領域,串口通信的應用比較成熟,因此,本文將著重介紹Lua是如何服務于這一應用的。從圖2可以看出,Lua的使用主要體現(xiàn)在如下幾個方面:
◆Lua與C交互環(huán)境的建立;
◆提取腳本中的串口配置數(shù)據;
◆調用Lua函數(shù)設置發(fā)送緩沖區(qū);
◆通過Lua函數(shù)處理接收緩沖區(qū)數(shù)據。
3.1 Lua與C交互環(huán)境的建立
要建立交互環(huán)境,首先要啟動Lua腳本引擎,并創(chuàng)建虛擬機。其機制雖然相對復雜,但對應用來說卻比較簡單,通過“L=lua_opcn(NUL L);”即可實現(xiàn)。其中,L是一個指向結構類型為lua_State的指針變量,該結構將負責對Lua的運行狀態(tài)進行維護。
為了實現(xiàn)Lua腳本函數(shù)對系統(tǒng)程序中串口發(fā)送和接收緩存區(qū)的數(shù)據進行訪問,定義了幾個C函數(shù)供腳本調用,即用于設置串口發(fā)送緩沖區(qū)的函數(shù)set_tx_buf、讀取串口接收緩沖區(qū)的函數(shù)get_rx_buf,以及在Lua腳本中判斷串口數(shù)據交互正常時調用的結果處理函數(shù)uart_ok_del。
在Lua腳本中,要成功調用以上函數(shù),必須將其加載到Lua虛擬機中去,本文采用Lua提供的一種注冊C函數(shù)庫的方法來實現(xiàn)。具體加載過程如下:
①按以下格式定義調用函數(shù):
static int set tx buf(lua State *L);
static int get rx_buf(lua State *L);
static int uart_ok_del(lua State*L);
②聲明一個結構數(shù)組,每個數(shù)組元素分別為C函數(shù)在Lua腳本中的淵用名字及對應的C函數(shù),即以“namefunction”對的形式出現(xiàn),如下所示:
static const struct luaL_reg uartLib[]={
{“set_tx_buf”,set_tx_buf},
{“get_tx_buf”,get_tx_buf),
{“uart_ok_del”,uart_ok_de},
{NULL,NULL}
};
③調用以下函數(shù)對C函數(shù)庫進行注冊:
luaL register(L.“ied”,uartLib);
其中,參數(shù)L即為創(chuàng)建虛擬機時的函數(shù)返回值(以下同),字符串“ied”為注冊到虛擬機中的庫名稱。第3個參數(shù)uartLib即為前面聲明的結構數(shù)組,對應需要注冊的庫函數(shù)表。
通過以上步驟,即可完成Lua腳本中需要調用的3個C函數(shù)的注冊過程,從而就可以在Lua腳本中通過“庫名稱,庫函數(shù)”的形式來對其進行調用,如“ied.set_tx_buf(函數(shù)參數(shù))”。
腳本文件本身的加載則相對簡單,只需通過如下函數(shù)調用即可:
luaL_dofile(L,“uart script.lua”);
其中,參數(shù)L和以上的函數(shù)調用相同,第2個參數(shù)則為腳本文件在Flash中的具體存儲路徑。
至此,就成功建立了一個Lua與C的交互環(huán)境。
3.2 提取腳本中的串口配置數(shù)據
要正確地進行Lua和C的交互過程,首先必須對Lua和C交互時所采用虛擬棧的作用和操作有比較深入的了解。在Lua和C的交互中,它們彼此之間函數(shù)參數(shù)以及返回值都將由該棧來負責傳遞。Lua和C在棧的操作方式上稍有不同,在Lua中采用嚴格的LIFO方式,而C則還可以通過索引的方式進行。以3個參數(shù)為例,參數(shù)1首先入棧,參數(shù)2、3隨后順次入棧,Lua虛擬棧存儲結構及索引對應關系如圖3所示。本文引用地址:http://www.ex-cimer.com/article/155041.htm linux操作系統(tǒng)文章專題:linux操作系統(tǒng)詳解(linux不再難懂)
評論