[应用相关] 把Lua移植到stm32上,效果不错!

[复制链接]
5563|13
 楼主| dongnanxibei 发表于 2018-11-19 21:35 | 显示全部楼层 |阅读模式
因为我们产品的需要满足不同行业需求,所以一直在寻找一个脚本语言,以便灵活配置。

前段时间还自己花时间去实现一个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万次浮点运算。
 楼主| dongnanxibei 发表于 2018-11-19 21:36 | 显示全部楼层
花了几分钟时间,通过lua c api实现了几个api函数让lua调用,感觉lua和c的交互调用确实极其方便。
  1. int main(){
  2.     .....
  3.      Sys_TimerInit();
  4.      SerialPort_Init();
  5.      IWDG_Configuration();
  6.      WWDG_Configuration();
  7.      __set_PRIMASK(0);
  8.      
  9.      Sys_TimerRequest(OTimerID7,50,1);

  10.     // 这是main里面的调用lua
  11.      
  12.      L   = lua_open();      
  13.      luaopen_base(L);   
  14.      //注_册自己的c函数到lua中
  15.      lua_register(L, "average", average);     
  16.      lua_register(L, "Lsleep", Lsleep);
  17.      lua_register(L, "Lmyputs0", Lmyputs0);     
  18.      
  19.      InitTasks();
  20.      AddTask(facetask,1);
  21.      AddTask(uart0task,1);     
  22.      
  23.      float a,c2;
  24.      char buf[100];

  25.     //这里是lua脚本, 脚本里面又调用了自己定义得c函数, Lmyputs0---串口输出函数   average --平均值函数,  Lsleep--延时函数

  26.     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)");
  27.    
  28.     //让lua运行脚本!
  29.      luaL_dostring(L, buf);
  30.       ...
  31. }

  32. //下面是几定义的函数

  33. static int average(lua_State *L)
  34. {
  35. /* 得到参数个数 */
  36. int n = lua_gettop(L);
  37. double sum = 0;
  38. int i;
  39. /* 循环求参数之和 */
  40. for (i = 1; i <= n; i++)
  41. {
  42. /* 求和 */
  43. sum += lua_tonumber(L, i);
  44. }
  45. /* 压入平均值 */
  46. lua_pushnumber(L, sum / n);
  47. /* 压入和 */
  48. lua_pushnumber(L, sum);
  49. /* 返回返回值的个数 */
  50. return 2;
  51. }

  52. static int Lsleep(lua_State *L){
  53.   int d;
  54.   PT_Timer_t tmr0;
  55.   
  56.   d=lua_tonumber(L, 1);  
  57.   PT_TimerSet(&tmr0,d);
  58.   while(PT_TimerExpired(&tmr0)==false){
  59.     WDT_FLAG = 0;
  60.     RunTaskList();
  61.   }
  62.   lua_pushnumber(L, 1);
  63.   return 1;
  64. }
  65.   
  66. static int Lmyputs0(lua_State *L)
  67. {
  68.    char *buf;
  69.    int len;

  70.    buf=(char *)lua_tostring(L,1);
  71.    len=lua_tonumber(L, 2);
  72.    myputs0(buf,len);
  73.    
  74.    lua_pushnumber(L, 1);
  75.    return 1;
  76. }
 楼主| dongnanxibei 发表于 2018-11-19 21:37 | 显示全部楼层
Lua 是一个小巧的脚本语言。作者是巴西人。该语言的设计目的是为了嵌入应用程序中,从而为应用程序提供灵活的扩展和定制功能。

Lua脚本可以很容易的被C/C++代码调用,也可以反过来调用C/C++的函数,这使得Lua在应用程序中可以被广泛应用。不仅仅作为扩展脚本,也可以作为普通的配置文件,代替XML,Ini等文件格式,并且更容易理解和维护。

Lua由标准C编写而成,代码简洁优美,几乎在所有操作系统和平台上都可以编译,运行。

一个完整的Lua解释器不过200k,在目前所有脚本引擎中,Lua的速度是最快的。这一切都决定了Lua是作为嵌入式脚本的最佳选择
yongwong9901 发表于 2018-11-21 08:38 | 显示全部楼层
mark!也想学学
晓伍 发表于 2018-11-21 10:08 | 显示全部楼层
亲 lua是什么呀
观海 发表于 2018-11-21 12:49 | 显示全部楼层
lua好学习吗 适合干嘛?
paotangsan 发表于 2018-11-21 13:42 | 显示全部楼层
长知识了 第一次听说
wakayi 发表于 2018-11-21 15:35 | 显示全部楼层
看来我的知识面太窄了呀
123tt 发表于 2018-11-21 21:11 | 显示全部楼层
楼主真无懒,这是7年前某论坛的旧文呢.....

https://www.amobbs.com/thread-5065290-1-1.html

评论

哥们,还是你厉害  发表于 2018-11-22 09:49
还真是呢,点赞  发表于 2018-11-22 09:05
740071911 发表于 2018-11-22 09:04 | 显示全部楼层
这么高端,看不懂,到底能实现什么功能呢,举个例子能否
 楼主| dongnanxibei 发表于 2018-11-22 11:16 | 显示全部楼层
740071911 发表于 2018-11-22 09:04
这么高端,看不懂,到底能实现什么功能呢,举个例子能否

能执行Lua程序啊。
 楼主| dongnanxibei 发表于 2018-11-22 11:17 | 显示全部楼层
740071911 发表于 2018-11-22 09:04
这么高端,看不懂,到底能实现什么功能呢,举个例子能否

听说过esp8266的nodeMCU固件没?就是执行Lua的。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

225

主题

3848

帖子

18

粉丝
快速回复 在线客服 返回列表 返回顶部