因爲我們產品的需要滿足不同行業需求,所以一直在尋找一個腳本語言,以便靈活配置。
前段時間還自己花時間去實現一個C語言解釋器,看了一堆編譯原理的東西,以及虛擬機等,頭都搞大了,把基本功能實現了,但總是不滿意。
後來看到lua,網上一搜:
才知道 魔獸世界 的插件就是lua寫的....
,憤怒的小鳥也是lua寫的,lua在蘋果和android都支持lua語言開發,lua已經成爲移動平臺開發的新貴...
lua是純c寫的最高效的腳本語言...
恍然大悟,原來lua就是我要找的東西啊!正所謂:夢裏尋他千百度,驀然回首,那人卻在燈火闌珊處!於是立即產生了把lua移植到stm32的想法。
到網上查了半天stm32移植lua的資料,居然一篇都沒有找到,失望啊。
難道我是第一個幹這事的蠢人?沒辦法,只好硬着頭皮上了!
lua果然名不虛傳,代碼極其簡略,移植性極高,由標準ansi c寫成。移植過程非常順利,在IAR下編譯後只有幾十K字節。
編譯了一個bin下載到stm32後,立馬就順利運行起來。
爲了測試lua的內存的需求,我把ram設置到48k字節,結果運行很順利。看來lua對內存的需求確實很小。
在STM32處於24M的頻率下,測試了一下lua腳本的運行效率,大致爲每秒2萬次浮點計算。 (在我的電腦上測試lua是每秒1千萬次運算)。
如果stm32設置到72M的話,大致應該是每秒6萬次浮點運算。
花了幾分鐘時間,通過lua c api實現了幾個api函數讓lua調用,感覺lua和c的交互調用確實極其方便。
int main(){
.....
Sys_TimerInit();
SerialPort_Init();
IWDG_Configuration();
WWDG_Configuration();
__set_PRIMASK(0);
Sys_TimerRequest(OTimerID7,50,1);
// 這是main裏面的調用lua
L = lua_open();
luaopen_base(L);
//注_冊自己的c函數到lua中
lua_register(L, "average", average);
lua_register(L, "Lsleep", Lsleep);
lua_register(L, "Lmyputs0", Lmyputs0);
InitTasks();
AddTask(facetask,1);
AddTask(uart0task,1);
float a,c2;
char buf[100];
//這裏是lua腳本, 腳本里面又調用了自己定義得c函數, Lmyputs0---串口輸出函數 average --平均值函數, Lsleep--延時函數
strcpy(buf," Lmyputs0(\"start!\",6); c2=2; a1 = {\"one\",\"two\",\"three\"} a=average(10, 20, 30, 40, 50); count=0; while 1>0 do \r\n count=count+1; Lmyputs0(a1[(count%3)+1],6); Lsleep(300);
\r\n end; \r\n Lmyputs0(\"end!\",4)");
//讓lua運行腳本!
luaL_dostring(L, buf);
...
}
//下面是幾定義的函數
static int average(lua_State *L)
{
/* 得到參數個數 */
int n = lua_gettop(L);
double sum = 0;
int i;
/* 循環求參數之和 */
for (i = 1; i <= n; i++)
{
/* 求和 */
sum += lua_tonumber(L, i);
}
/* 壓入平均值 */
lua_pushnumber(L, sum / n);
/* 壓入和 */
lua_pushnumber(L, sum);
/* 返回返回值的個數 */
return 2;
}
static int Lsleep(lua_State *L){
int d;
PT_Timer_t tmr0;
d=lua_tonumber(L, 1);
PT_TimerSet(&tmr0,d);
while(PT_TimerExpired(&tmr0)==false){
WDT_FLAG = 0;
RunTaskList();
}
lua_pushnumber(L, 1);
return 1;
}
static int Lmyputs0(lua_State *L)
{
char *buf;
int len;
buf=(char *)lua_tostring(L,1);
len=lua_tonumber(L, 2);
myputs0(buf,len);
lua_pushnumber(L, 1);
return 1;
}
//---------------附lua的說明------------------------
Lua 是一個小巧的腳本語言。作者是巴西人。該語言的設計目的是爲了嵌入應用程序中,從而爲應用程序提供靈活的擴展和定製功能。
Lua腳本可以很容易的被C/C++代碼調用,也可以反過來調用C/C++的函數,這使得Lua在應用程序中可以被廣泛應用。不僅僅作爲擴展腳本,也可以作爲普通的配置文件,代替XML,Ini等文件格式,並且更容易理解和維護。
Lua由標準C編寫而成,代碼簡潔優美,幾乎在所有操作系統和平臺上都可以編譯,運行。
一個完整的Lua解釋器不過200k,在目前所有腳本引擎中,Lua的速度是最快的。這一切都決定了Lua是作爲嵌入式腳本的最佳選擇。
-----------------------------------------------------------------------------
lua語言已經成爲排名第十名的語言,(javascript在十一名)
LUA在單片機中移植
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章
使用LUA開發WOW插件 ACE3庫的理解(一)
dotboy
2018-08-27 15:40:26
windows+mingw+lua 編譯
dotboy
2018-08-27 15:40:26
format not a string literal and no format arguments [-Werror=format-security]
辛子未
2018-08-27 03:54:53
lua QUICK-COCOS2D-X
辛子未
2018-08-27 03:54:29
luaplus windows環境下 VC6編譯
poorb
2018-08-26 23:49:44
LUA 元表與元方法
南城繁星
2018-08-26 17:36:18
獲取網絡遊戲中所有導出到LUA的函數
Icer
2018-08-26 12:43:12
VS2005編譯LUA
Icer
2018-08-26 12:43:08
熱更新中的lua與c#
如鹿切慕溪水
2018-08-26 12:07:39
爲LUA封裝C/C++函數(不涉及結構體等參數形式)
beaumontwang
2018-08-26 10:10:47
C/C++函數調用LUA函數
beaumontwang
2018-08-26 10:10:44
在LUA腳本中調用C/C++函數
beaumontwang
2018-08-26 10:10:41