LUA在單片機中移植

因爲我們產品的需要滿足不同行業需求,所以一直在尋找一個腳本語言,以便靈活配置。

前段時間還自己花時間去實現一個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在十一名)
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章