搜索
bottom↓
回复: 398

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

  [复制链接]

出0入0汤圆

发表于 2011-9-21 18:09:42 | 显示全部楼层 |阅读模式
因为我们产品的需要满足不同行业需求,所以一直在寻找一个脚本语言,以便灵活配置。

前段时间还自己花时间去实现一个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在十一名)

阿莫论坛20周年了!感谢大家的支持与爱护!!

月入3000的是反美的。收入3万是亲美的。收入30万是移民美国的。收入300万是取得绿卡后回国,教唆那些3000来反美的!

出0入0汤圆

发表于 2011-9-21 18:36:24 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-9-21 18:37:22 | 显示全部楼层
mark下

出0入0汤圆

发表于 2011-9-21 18:46:39 | 显示全部楼层
Mark,有用的东西。

出0入0汤圆

发表于 2011-9-21 18:48:54 | 显示全部楼层
mark

出0入0汤圆

 楼主| 发表于 2011-9-21 18:57:36 | 显示全部楼层
lua 支持面向对象编程,支持多线程并发。

stm32平台上有了lua,这些都有了,有的应用连操作系统都可以不用移植,用lua就可以了。

出0入0汤圆

发表于 2011-9-21 19:11:17 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-9-21 19:19:03 | 显示全部楼层
mark 孤陋寡闻了
以后看看

出0入0汤圆

发表于 2011-9-21 19:21:07 | 显示全部楼层
此物牛
第一次听说,查查资料看看

出0入0汤圆

发表于 2011-9-21 19:22:07 | 显示全部楼层
噢?还不太明白。过后看看。楼主多讲解,给我们扫盲。

出0入9汤圆

发表于 2011-9-21 19:28:43 | 显示全部楼层
LZ有详细的手册吗?

出0入0汤圆

发表于 2011-9-21 19:30:26 | 显示全部楼层
不懂

出0入0汤圆

发表于 2011-9-21 19:31:30 | 显示全部楼层
ethernut 的 Nut/OS 很早就有LUA的支持了,只是最近一直没有啥进展,仍然是第一次发布的东西。。

在单片机上移植LUA,需要裁减很多东西。。STM32不知道是否需要裁减不。。

IBM的 deleloperworks 上有相关的文章:
http://www.ibm.com/developerworks/cn/linux/l-lua.html

出0入0汤圆

发表于 2011-9-21 19:32:01 | 显示全部楼层
mark  
有空也搞搞,再加一段解压代码

出0入0汤圆

发表于 2011-9-21 19:42:15 | 显示全部楼层
好东西

出0入0汤圆

发表于 2011-9-21 19:53:14 | 显示全部楼层
32位单片机可以看看elua,专门针对单片机的lua版本,支持stm32,ram极省,硬件资源都封装好了http://www.eluaproject.net/

出0入0汤圆

发表于 2011-9-21 20:56:40 | 显示全部楼层
lua默认用浮点来表示数字,可以改成整型,在不支持硬件浮点运算的cpu上效率会更高

出0入0汤圆

发表于 2011-9-21 20:59:50 | 显示全部楼层
不过lua默认不支持位运算,有点麻烦,需扩展一下

出0入0汤圆

发表于 2011-9-21 20:59:56 | 显示全部楼层
此贴必须MARK

出0入0汤圆

发表于 2011-9-21 21:04:31 | 显示全部楼层
第一次听说,扫盲了。

出0入0汤圆

发表于 2011-9-21 21:05:18 | 显示全部楼层
真的  没听说我lua   有时间得了解了解

出0入0汤圆

发表于 2011-9-21 21:13:36 | 显示全部楼层
这个要看看

出0入0汤圆

发表于 2011-9-21 21:15:13 | 显示全部楼层
曾经用过一段时间的lua,真的很好用的一个脚本语言。

出0入22汤圆

发表于 2011-9-21 21:21:10 | 显示全部楼层
mark!!!
LZ能分享例子代码不?

出0入0汤圆

发表于 2011-9-21 21:33:28 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-9-21 21:48:17 | 显示全部楼层
mark

出0入12汤圆

发表于 2011-9-21 21:54:36 | 显示全部楼层
关注

出0入0汤圆

发表于 2011-9-21 22:15:25 | 显示全部楼层
mark 关注

出0入0汤圆

发表于 2011-9-21 23:40:06 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-9-22 00:40:38 | 显示全部楼层
用过lua ~

stm32的话可能应用复杂点了以后还是会稍显吃力吧?
毕竟是在C的基础上多包出来的一层

等楼主实测结果了,呵呵~

出0入0汤圆

发表于 2011-9-22 07:23:20 | 显示全部楼层
第一次听说

出0入0汤圆

发表于 2011-9-22 09:16:06 | 显示全部楼层
mark,期待楼主扫盲。

出0入0汤圆

 楼主| 发表于 2011-9-22 09:39:01 | 显示全部楼层
在stm32上移植Lua不用做任何裁剪。

下载Lua源码,(我用的是5.1.4,很新的版本),把c文件添加到工程(lua.c,luac.c两个文件不用加),然后编译即可通过,无需修改一个字符。(选择lib为full),

接下来,就可以开始享受stm32上的Lua之旅!


Lua全编译也只有48k字节左右,所以不裁剪都是可以的。本身的Ram需求则在26K字节左右,Stm32应该是可以承受的。


在main 里面,或者其他函数里面:

     L   = lua_open();      
     luaopen_base(L);   

     //buf里面就是lua脚本了 ,自己写好;
     luaL_dostring(L, buf);

就可以了。就这么简单!


Lua可以和c无缝集成,c结合Lua后,则是如虎添翼。不要仅仅是把Lua当做是一门新的语言,这个世界优秀的语言已经很多了,不差Lua一个,虽然Lua语言也极其优秀。

Lua是一种新的开发方式,它带来的改变甚至是革_命性的!它可以让整个应用的逻辑以Lua脚本和原生语言的方式进行混合实现,而且比例任意切分。它可以让产品中相对不变的硬件代码和变化不定的用户业务逻辑充分结合起来。它可以让产品随时更新功能而无需重新编译!它甚至可以让用户和你一起来分工实现一个应用代码,同时又很好的保护了你的核心技术。

Java高调提倡的一次编写,到处运行的思想,在单片机里是行不通的,
而Lua则悄无声息的实现了,而且是那么易如反掌!而且是这么彻底,不受限于一次编写,还可以随时改写。

所以Lua才真正是做到了一次编写,到处运行,并可随意再次改写,所以她横跨了PC,服务器,苹果,安卓,PSP,以及单片机!  她横跨了windows,linux,ios,ucos,以及裸奔的单片机代码!

感谢Lua的开创者,感谢他们为这个世界创造了如此美妙的Lua !

出0入0汤圆

发表于 2011-9-22 09:50:03 | 显示全部楼层
学习了! 这下又要折腾起来喽...

出0入0汤圆

发表于 2011-9-22 09:53:34 | 显示全部楼层
Lua移植到stm32  意义何在?

出0入0汤圆

发表于 2011-9-22 09:55:44 | 显示全部楼层
Lua移植到stm32  意义何在?

出0入0汤圆

发表于 2011-9-22 10:02:01 | 显示全部楼层
楼主多解释解释吧?比如用lua好处,还有使用的注意事项??

出0入0汤圆

发表于 2011-9-22 10:11:06 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-9-22 10:14:09 | 显示全部楼层
想问下,脚本语言是干嘛用的,单片机程序里用它可以做什么呢?

出0入0汤圆

发表于 2011-9-22 10:14:48 | 显示全部楼层
谢谢楼主。

1,请教一下,把LUA所有的源码都包括进去(除了lua.c,luac.c)?
2,LUA的PRINT函数是对窗口的,而STM32是不是应该修改成对串口输出?
3,用了LUA主要在哪方面提高单片机的威力?

谢谢。

出0入0汤圆

发表于 2011-9-22 10:16:34 | 显示全部楼层
另:昨天看了一晚上LUA,感觉LUA是个不错的语言。

有很多ARM7,CORTEX-M3移植了LUA语言。

出0入0汤圆

发表于 2011-9-22 10:17:04 | 显示全部楼层
听LZ如此说,觉得挺感兴趣的,
LZ能不能讲讲LUA的用处,及移植的难度!

出0入0汤圆

发表于 2011-9-22 10:27:13 | 显示全部楼层
确实有意思,有空玩一下

出0入0汤圆

 楼主| 发表于 2011-9-22 10:27:24 | 显示全部楼层
回复【39楼】Excellence 精益求精
-----------------------------------------------------------------------

对,不用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


就看你怎么用了。

出0入0汤圆

发表于 2011-9-22 10:40:02 | 显示全部楼层
强大,第一次听说

出0入0汤圆

发表于 2011-9-22 10:41:27 | 显示全部楼层
不懂脚本语言,LZ介绍下脚本语言的真正实用价值吧?方便了什么?

出0入0汤圆

发表于 2011-9-22 11:02:08 | 显示全部楼层
确实不错。
谢谢楼主。

出0入0汤圆

发表于 2011-9-22 11:03:01 | 显示全部楼层
能做到开发灵活又能兼顾最终用户的再应用,一直使我们需要的,谢

出0入0汤圆

发表于 2011-9-22 11:23:11 | 显示全部楼层
关于移植,各位懂的也来讲讲,俺也想玩玩!
看了下里面好多文件操作的函数fprintf fopen fcolse
等等,请问这些移植是如何处理!

出0入0汤圆

 楼主| 发表于 2011-9-22 11:36:49 | 显示全部楼层
嗯,实际上我开始移植也遇到了fprintf, stdin stdout等,本来以为要动刀改写,但是查了查资料,fprintf,stdin等都是ansi c标准,按道理编译器都应该支持,于是想了一下,可能是IAR库不全,结果果然是这个原因:


选择

Options->General Options->Library Configuration   :  Full
就可以了。

去掉lua.c ,luac.c ,这是shell,我们不需要。

保证一次编译通过,呵呵。

出0入0汤圆

发表于 2011-9-22 11:45:27 | 显示全部楼层
是啊,这些函数编译器支持,
但是目标环境不支持啊!
如果下载下独立的运行MCU中,这个功能实现不了
而且还占用了程序空间。

出0入0汤圆

 楼主| 发表于 2011-9-22 11:59:43 | 显示全部楼层
回复【50楼】clingos
-----------------------------------------------------------------------

实际上是可以裁剪去掉这部分代码的,稍微花点时间就可以了。这样代码就更小了。

出0入0汤圆

发表于 2011-9-22 12:11:55 | 显示全部楼层
好东西. lua 灵活配置

出0入0汤圆

发表于 2011-9-22 12:22:01 | 显示全部楼层
强帖mark!

出0入0汤圆

发表于 2011-9-22 14:04:25 | 显示全部楼层
按照楼主方法不成功!
KEIL 的重错误:
.\out\MyWork.axf: Error: L6218E: Undefined symbol getenv (referred from loadlib.o).
.\out\MyWork.axf: Error: L6218E: Undefined symbol clock (referred from loslib.o).
.\out\MyWork.axf: Error: L6218E: Undefined symbol exit (referred from loslib.o).
.\out\MyWork.axf: Error: L6218E: Undefined symbol system (referred from loslib.o).
.\out\MyWork.axf: Error: L6218E: Undefined symbol time (referred from loslib.o).
///////////////////
头文件:
#include "stm32f10x.h"
#include <stdio.h>
#include <math.h>
#include <stdlib.h>
#include "USART.h"
#include "stm32f10x_it.h"


#include "lua.h"
#include "lauxlib.h"
#include "lualib.h"
///////////////////////
主函数:
int main(void)
{

         lua_State *L ;

        RCC_Configuration();       
        NVIC_Configuration();
        GPIO_Configuration();
        USART1_Configuration();

        DMA_Configuration();
        AD1_Configuration();
        TIM_Configuration();

        L = lua_open();

        luaL_openlibs(L);

          
        while(1) ;


}


请高手帮忙看看那里出问题了

出0入0汤圆

 楼主| 发表于 2011-9-22 14:09:05 | 显示全部楼层
无需openlibs这句函数啊。

出0入0汤圆

 楼主| 发表于 2011-9-22 14:10:07 | 显示全部楼层
L   = lua_open();        
     luaopen_base(L);     

     //buf里面就是lua脚本了 ,自己写好;
     luaL_dostring(L, buf);

出0入0汤圆

发表于 2011-9-22 14:10:21 | 显示全部楼层
Mark,PSP上也有Lua解释器

出0入22汤圆

发表于 2011-9-22 14:15:25 | 显示全部楼层

(原文件名:QQ截图未命名.jpg)

我什么都没干,呵呵

应该有搞头!

出0入0汤圆

 楼主| 发表于 2011-9-22 14:24:20 | 显示全部楼层
回复【59楼】jiaowoxiaolu 呀咩爹!
-----------------------------------------------------------------------

我什么都没干,呵呵

应该有搞头!

--------嘻嘻,简单吧-------------

出0入0汤圆

发表于 2011-9-22 14:27:46 | 显示全部楼层
再请教楼主:
1,你把LUA用到STM32,是不是还得有个上位机软件?和STM32通讯,方便修改LUA的一下源代码?
2,把LUA编译成BIN烧到STM32中,如果要修改,是不是还得烧写,我看你上面说的还像是不用,不太理解。
   你上面说可以现场修改。能否举了例子?

谢谢。

出0入0汤圆

 楼主| 发表于 2011-9-22 14:32:34 | 显示全部楼层
回复【61楼】Excellence 精益求精
-----------------------------------------------------------------------
当然你得想个办法把Lua脚本文件内容下载到stm32中去。

就是你的代码得支持通过串口下载Lua脚本到Flash或EEprom里面保存,以及通过串口可以读出。

LUA是编译成Bin了,但Lua脚本完全不用编译成bin啊。

现场修改当然得在你实现了串口下载Lua脚本之后了,呵呵。当然如果你的板子支持SD卡,用SD卡拷贝脚本就更简单了。

出0入0汤圆

发表于 2011-9-22 14:45:04 | 显示全部楼层
我找了一个KEIL STM32的例程,编译报错:


Build target 'Target 1'
compiling lapi.c...
..\HARDWARE\LED\lapi.c(975): error:  #268: declaration may not appear after executable statement in block
..\HARDWARE\LED\lapi.c:         lu_mem a = (cast(lu_mem, data) << 10);
..\HARDWARE\LED\lapi.c:         ^
..\HARDWARE\LED\lapi.c: ..\HARDWARE\LED\lapi.c: 0 warnings, 1 error
compiling lbaselib.c...
..\HARDWARE\LED\lbaselib.c(495): error:  #268: declaration may not appear after executable statement in block
..\HARDWARE\LED\lbaselib.c:     void *res = luaR_findglobal(keyname, strlen(keyname));
..\HARDWARE\LED\lbaselib.c:     ^
..\HARDWARE\LED\lbaselib.c: ..\HARDWARE\LED\lbaselib.c: 0 warnings, 1 error
compiling ldump.c...
..\HARDWARE\LED\ldump.c(8): error:  #5: cannot open source input file "sys/types.h": No such file or directory
..\HARDWARE\LED\ldump.c:   #include <sys/types.h>
..\HARDWARE\LED\ldump.c:                         ^
..\HARDWARE\LED\ldump.c: ..\HARDWARE\LED\ldump.c: 0 warnings, 1 error
compiling lgc.c...
..\HARDWARE\LED\lgc.c(618): error:  #268: declaration may not appear after executable statement in block
..\HARDWARE\LED\lgc.c:     l_mem lim = (GCSTEPSIZE/100) * g->gcstepmul;
..\HARDWARE\LED\lgc.c:     ^
..\HARDWARE\LED\lgc.c: ..\HARDWARE\LED\lgc.c: 0 warnings, 1 error
compiling linit.c...
..\HARDWARE\LED\linit.c(17): error:  #5: cannot open source input file "platform_conf.h": No such file or directory
..\HARDWARE\LED\linit.c:   #include "platform_conf.h"
..\HARDWARE\LED\linit.c:                             ^
..\HARDWARE\LED\linit.c: ..\HARDWARE\LED\linit.c: 0 warnings, 1 error
compiling loadlib.c...
..\HARDWARE\LED\loadlib.c(463): error:  #268: declaration may not appear after executable statement in block
..\HARDWARE\LED\loadlib.c:     void *res = luaR_findglobal(name, strlen(name));
..\HARDWARE\LED\loadlib.c:     ^
..\HARDWARE\LED\loadlib.c(554): error:  #268: declaration may not appear after executable statement in block
..\HARDWARE\LED\loadlib.c:     int loaded = lua_gettop(L) + 1;  /* index of _LOADED table */
..\HARDWARE\LED\loadlib.c:     ^
..\HARDWARE\LED\loadlib.c: ..\HARDWARE\LED\loadlib.c: 0 warnings, 2 errors
compiling lstate.c...
..\HARDWARE\LED\lstate.c(25): error:  #5: cannot open source input file "platform_conf.h": No such file or directory
..\HARDWARE\LED\lstate.c:   #include "platform_conf.h"
..\HARDWARE\LED\lstate.c:                             ^
..\HARDWARE\LED\lstate.c: ..\HARDWARE\LED\lstate.c: 0 warnings, 1 error
Target not created

出0入22汤圆

发表于 2011-9-22 14:59:50 | 显示全部楼层
LS能否把网上找到的东西放上来看看

出0入22汤圆

发表于 2011-9-22 15:04:42 | 显示全部楼层
想了想,这个LUA是不是前阵子坛里讨论的一个OS和APP分离的概念有点类似,lua解析器就像win7,然后lua脚本就像qq一样在运行,如果stm32加个TFT然后弄个FAT文件系统,把lua脚本放在sd卡里面,tft显示脚本列表,然后想运行哪个就运行哪个,是不是可以这样?

出0入0汤圆

发表于 2011-9-22 15:09:01 | 显示全部楼层
楼主放一个编译好的列子吧! 我的老是编译不过

出0入0汤圆

发表于 2011-9-22 15:16:39 | 显示全部楼层
刚才发现下载的源代码不全。居然结构图里缺两个变量。

看版本完全一样,而且刚下了一个5.1.4的缺变量。

ttislightfunction没定义。

下面的结构图缺两个变量。

typedef struct global_State {
  stringtable strt;  /* hash table for strings */
  lua_Alloc frealloc;  /* function to reallocate memory */
  void *ud;         /* auxiliary data to `frealloc' */
  lu_byte currentwhite;
  lu_byte gcstate;  /* state of garbage collector */
  int sweepstrgc;  /* position of sweep in `strt' */
  GCObject *rootgc;  /* list of all collectable objects */
  GCObject **sweepgc;  /* position of sweep in `rootgc' */
  GCObject *gray;  /* list of gray objects */
  GCObject *grayagain;  /* list of objects to be traversed atomically */
  GCObject *weak;  /* list of weak tables (to be cleared) */
  GCObject *tmudata;  /* last element of list of userdata to be GC */
  Mbuffer buff;  /* temporary buffer for string concatentation */
  lu_mem GCthreshold;
  lu_mem totalbytes;  /* number of bytes currently allocated */
  lu_mem estimate;  /* an estimate of number of bytes actually in use */
  lu_mem gcdept;  /* how much GC is `behind schedule' */
  int gcpause;  /* size of pause between successive GCs */
  int gcstepmul;  /* GC `granularity' */
  lua_CFunction panic;  /* to be called in unprotected errors */
  TValue l_registry;
  struct lua_State *mainthread;
  UpVal uvhead;  /* head of double-linked list of all open upvalues */
  struct Table *mt[NUM_TAGS];  /* metatables for basic types */
  TString *tmname[TM_N];  /* array with tag-method names */
} global_State;

出0入0汤圆

 楼主| 发表于 2011-9-22 15:16:58 | 显示全部楼层
回复【65楼】jiaowoxiaolu 呀咩爹!
-----------------------------------------------------------------------

嗯,应该是这个概念。


如果有Lua+FAT文件系统+ SD卡+ 再加一个shell接口, 通过串口超级终端进行交互, 就可以打造一个"LuaDOS"系统出来。

这么一个“LuaDOS”系统,运行在一个STM32上,感觉不错哈。

出0入0汤圆

发表于 2011-9-22 15:20:32 | 显示全部楼层
哈哈!编译过了,运来是 选了KEIL中设置一下

(原文件名:11211.JPG)

出0入0汤圆

 楼主| 发表于 2011-9-22 15:21:17 | 显示全部楼层
回复【67楼】Excellence 精益求精
-----------------------------------------------------------------------

你用IAR编译的吗?我编译5.1.3, 5.1.4都没有问题啊。

出0入0汤圆

发表于 2011-9-22 15:21:40 | 显示全部楼层
哈哈!编译过了,运来是 选了KEIL中设置一下

(原文件名:11211.JPG)

出0入0汤圆

发表于 2011-9-22 15:22:20 | 显示全部楼层
哈哈!编译过了,运来是 选了KEIL中设置一下
(原文件名:11211.JPG)

出0入0汤圆

 楼主| 发表于 2011-9-22 15:31:09 | 显示全部楼层

(原文件名:luaset.GIF)

IAR里面是这样的哈。

出0入0汤圆

发表于 2011-9-22 15:37:47 | 显示全部楼层
回复【73楼】smset 众山科技

(原文件名:luaset.gif)
引用图片
iar里面是这样的哈。
-----------------------------------------------------------------------

smset 有具体点得列子嘛?

出0入0汤圆

发表于 2011-9-22 15:38:24 | 显示全部楼层
IAR EWARM5.3编译通过。但有35警告。

KEIL MDK 4.12编译不过。报警如下:

Build target 'STM3210E-EVAL'
linking...
.\Obj\STM3210E-EVAL.axf: Error: L6218E: Undefined symbol abort (referred from ldo.o).
.\Obj\STM3210E-EVAL.axf: Error: L6218E: Undefined symbol getenv (referred from loadlib.o).
.\Obj\STM3210E-EVAL.axf: Error: L6218E: Undefined symbol clock (referred from loslib.o).
.\Obj\STM3210E-EVAL.axf: Error: L6218E: Undefined symbol exit (referred from loslib.o).
.\Obj\STM3210E-EVAL.axf: Error: L6218E: Undefined symbol system (referred from loslib.o).
.\Obj\STM3210E-EVAL.axf: Error: L6218E: Undefined symbol time (referred from loslib.o).
.\Obj\STM3210E-EVAL.axf: Error: L6218E: Undefined symbol __vfscanf_char_file (referred from __0fscanf.o).
.\Obj\STM3210E-EVAL.axf: Not enough information to list image symbols.
.\Obj\STM3210E-EVAL.axf: Finished: 1 information, 0 warning and 7 error messages.
Target not created

出0入0汤圆

发表于 2011-9-22 15:47:12 | 显示全部楼层
MDK 看72楼

出0入0汤圆

 楼主| 发表于 2011-9-22 15:48:13 | 显示全部楼层
回复【75楼】Excellence 精益求精
-----------------------------------------------------------------------

那应该是你的库不全。

出0入0汤圆

发表于 2011-9-22 15:50:43 | 显示全部楼层
IAR EWARM和KEIL MDK 都设置了。

我下的源代码lua-5.1.4.tar.gz,直接解压,
发现代码缺东西。重新找了一个,也不行。

能否把5.1.4的源码上传一下。

谢谢。

出0入0汤圆

 楼主| 发表于 2011-9-22 15:55:57 | 显示全部楼层
就是从官网上下载的啊。
http://www.lua.org/download.html

出0入0汤圆

发表于 2011-9-22 15:57:04 | 显示全部楼层
我刚刚移植成功的。lua 5.1.4ourdev_678601WBE0II.rar(文件大小:234K) (原文件名:lua-5.1.4.rar)

出0入0汤圆

发表于 2011-9-22 16:06:05 | 显示全部楼层
LUA源代码。ourdev_678604ZOXEJF.rar(文件大小:234K) (原文件名:lua-5.1.4.rar)


网上下的。在LUA主页,有问题。

出0入0汤圆

发表于 2011-9-22 16:08:06 | 显示全部楼层
不顺利。看来的烧香。呵呵。

出0入0汤圆

发表于 2011-9-22 16:10:24 | 显示全部楼层
各位测试下直接用C编译成BIN的程序跟用LUA执行的程序性能差别多少呢?运算速度和实时性。

出0入0汤圆

发表于 2011-9-22 16:10:31 | 显示全部楼层
去搬凳子过来

出0入0汤圆

 楼主| 发表于 2011-9-22 16:12:17 | 显示全部楼层
点击此处下载 ourdev_678606HZC8F7.rar(文件大小:700K) (原文件名:lua-5.1.4.rar)

我用的src,不好意思,里面还有一个cbuider的测试lua的目录,所以比较大。

出0入0汤圆

发表于 2011-9-22 16:13:23 | 显示全部楼层
http://www.eluaproject.net/

这里有很不错的一个lua移植。连驱动都做好了。

出0入0汤圆

发表于 2011-9-22 16:17:17 | 显示全部楼层
lua确实不错,wavecom的q26系列就支持了

出0入0汤圆

发表于 2011-9-22 16:20:19 | 显示全部楼层
回复【80楼】luozhongchao
我刚刚移植成功的。lua 5.1.4 (原文件名:lua-5.1.4.rar)  

-----------------------------------------------------------------------

1,加入C文件,编译没问题。

2,加入LUA函数,编译报错。

#include "lua.h"
#include "lauxlib.h"
#include "lualib.h"
///////////////////////
主函数:
int main(void)
{

lua_State *L ;
     L   = lua_open();         
     luaopen_base(L);

......

错误如下:
TEST.axf: Error: L6915E: Library reports error: __use_no_semihosting was requested, but _sys_open was referenced
TEST.axf: Error: L6915E: Library reports error: __use_no_semihosting was requested, but _sys_tmpnam was referenced
TEST.axf: Error: L6915E: Library reports error: __use_no_semihosting was requested, but _ttywrch was referenced
TEST.axf: Error: L6915E: Library reports error: __use_no_semihosting was requested, but remove was referenced
TEST.axf: Finished: 0 information, 0 warning and 4 error messages.

KEIL MDK 4.12工程文件ourdev_678611Z4PZN2.rar(文件大小:642K) (原文件名:led.rar)

出0入0汤圆

发表于 2011-9-22 16:21:44 | 显示全部楼层
回复【85楼】smset 众山科技
点击此处下载  (原文件名:lua-5.1.4.rar)  
我用的src,不好意思,里面还有一个cbuider的测试lua的目录,所以比较大。
-----------------------------------------------------------------------

谢谢,我试试。。。
可能是我哪儿设置不对。

但你说的地方,我设置了。

出0入0汤圆

发表于 2011-9-22 16:26:41 | 显示全部楼层
看来和源代码没关系。

用了楼主的,也报错。可能是我的工程文件和LUA源码有冲突。

TEST.axf: Error: L6915E: Library reports error: __use_no_semihosting was requested, but _sys_open was referenced
TEST.axf: Error: L6915E: Library reports error: __use_no_semihosting was requested, but _sys_tmpnam was referenced
TEST.axf: Error: L6915E: Library reports error: __use_no_semihosting was requested, but _ttywrch was referenced
TEST.axf: Error: L6915E: Library reports error: __use_no_semihosting was requested, but remove was referenced
TEST.axf: Finished: 0 information, 0 warning and 4 error messages.
Target not created

出0入0汤圆

发表于 2011-9-22 16:26:44 | 显示全部楼层
第一次听说,了解一下。

出0入0汤圆

发表于 2011-9-22 16:28:59 | 显示全部楼层
看上去很不错,看是否有必要移植到我的系统上.

出0入0汤圆

发表于 2011-9-22 16:30:13 | 显示全部楼层
//#pragma import(__use_no_semihosting)   

解决了,谢谢楼主和luozhongchao。

出0入0汤圆

发表于 2011-9-22 16:32:47 | 显示全部楼层
上传一个简单的工程文件。

点击此处下载 ourdev_678612HENVPB.rar(文件大小:643K) (原文件名:led.rar)

出0入0汤圆

 楼主| 发表于 2011-9-22 16:53:05 | 显示全部楼层
在stm32上,对比了一下速度,纯粹的Lua脚本函数运算的速度,大致是编译的C函数的10分之一~~~30分之一之间。

但是实际系统里面是脚本和c混合运行的,所以混合了Lua的系统总体速度会更快些。

出0入0汤圆

发表于 2011-9-22 17:07:49 | 显示全部楼层
关注

出0入0汤圆

发表于 2011-9-22 17:14:28 | 显示全部楼层
强力mark

出0入0汤圆

发表于 2011-9-22 17:17:54 | 显示全部楼层
中文LUA编程。ourdev_678620NAOL8J.pdf(文件大小:1.71M) (原文件名:Luaer.cn.pdf)

出0入0汤圆

发表于 2011-9-22 17:18:05 | 显示全部楼层
mark~

出0入0汤圆

发表于 2011-9-22 17:20:04 | 显示全部楼层
LUA例程,可以做GUI.ourdev_678621G5XF49.rar(文件大小:527K) (原文件名:wxlua-samples[1].rar)
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-4-27 10:32

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表