把Lua移植到stm32上,效果不错!

  • Post author:
  • Post category:其他



因为我们产品的需要满足不同行业需求,所以一直在寻找一个脚本语言,以便灵活配置。






前段时间还自己花时间去实现一个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是作为嵌入式脚本的最佳选择