因为我们产品的需要满足不同行业需求,所以一直在寻找一个脚本语言,以便灵活配置。
前段时间还自己花时间去实现一个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
count=count+1; Lmyputs0(a1[(count%3)+1],6); Lsleep(300);
end;
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在十一名)
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
-----------------------------------------------------------------------
对,不用print,用自己的串口输出函数就可以。
至于Lua在哪方面提高单片机的威力。这个要看自己如何运用了。
最简单的用法:
实现配置参数,比如我们原来的产品要有些参数来控制产品运行方式,一般要实现一个参数配置协议,然后呢,还要提供一个参数配置软件等。用Lua脚本就直接搞定(para1=... ; para2=...., para3=.... ),c里面很容易就得到脚本里面的值(tonumber,tosring),而且一目了然,可以让用户直接修改脚本,就实现了参数修改了。是不是比ini,xml文件更简单,更方便?用户现场他想改就改。
更深入点的用法:
我们的产品,有个计算公式,是根据用户的应用变化的,并且鬼知道用户想用个什么公式来计算,那么很简单,把这个公式用lua脚本实现一个公式计算函数,就可以了,我们的c可以调用lua里面定义的函数,这个公式可以有多复杂?想想愤怒的小鸟里面那么精确的重力抛物线计算都可以实现,就知道了。并且可以得到函数返回值。用户现场他想改就改。
更深入点的用法:
我们的产品,有个控制过程,是根据用户的应用变化的,并且鬼知道用户想用个什么过程来控制,那么很简单,把这个公司用lua脚本实现一个过程函数,就可以了,我们的c可以调用lua里面定义的过程函数。实现用户希望的过程控制,用户现场他想改就改。
更深入的用法:
我们的用户很牛X,他想控制连整个运行方式,那么好,我们提供c api,提供后台任务,用户前台控制任务他自己用Lua去编写.用户现场他想改就改。
更深入的用法:
我们的一些用户更牛X,他想直接控制整个硬件,只是自己不实现硬件,那么好,我们提供c api,把单片机的AD, DA ,PWM,Timer,中断全部都注_册成lua函数,他想怎么玩就怎么玩。 参见:elua, www.eluaproject.net
更深入的用法:
除了这些,lua提供文件系统,提供web server,提供socket,提供线程.....,提供shell,提供操作系统的很多东东,但又不是操作系统。参见:elua, www.eluaproject.net
就看你怎么用了。
一周热门 更多>