搜索
bottom↓
回复: 40

lua调试分享:[增加硬件]

[复制链接]

出0入0汤圆

发表于 2011-11-1 19:22:12 | 显示全部楼层 |阅读模式
看了这篇帖子
http://www.ourdev.cn/bbs/bbs_content_all.jsp?bbs_sn=5065290

觉得lua确实是个牛x的东西,本着无知者无谓的态度,决定开始折腾lua..

同时也要向楼主致敬!之前不知道有这个玩意..


先说说目前为止我对于lua的一些理解
如果有误请大伙拍砖

【lua对于嵌入式系统的意义】
对于嵌入式系统来讲,lua的主要优势是其可扩展性(Extension Language)

扩展的办法是:在lua中扩展"C代码库"。
这样做的目的,是在编写lua脚本的时候可以通过lua语句“调用C函数”,从而实现对于C语言的“动态调用”,或者叫做“解释执行”。

一个直观的场景:
存储设备中存放N个LUA脚本
系统加载并罗列这些脚本
选择任意一个即可运行
实现相应的功能
<font color="#FF0000">
关键的是这些脚本是可以更换的
只要加入新的lua脚本
就相当于加入了新的应用!

如果再给每个脚本加个图标
这不就是windows桌面吗...
</font>



【开贴目的】
开这个帖子主要目的是打算向lua中陆续加入一些硬件,使其变成一个可以用脚本写应用的平台


基于上述目的,我也只是在luaFowWindows里面简单熟悉了一下lua语言(《Lua程序设计》的前两三章)
直接就试图引入到嵌入式系统中了
边用边学吧
这样还有点乐趣
另一方面,由于LUA的设计主要是“强调灵活性和简单性,因此有时它们的使用会略显复杂”(书中原话)
语法确实比较灵活(或者说复杂吧...)

后面陆续、不定期更新一些调试进展及其学习经验,希望跟大家分享,共同研究
初步接触,肯定问题错误多多,大家共同讨论吧


修改原因:加入了【lua对于嵌入式系统的意义】部分的描述。之前看书的时候随手写的,感觉放在楼主为比较合适。

出0入0汤圆

 楼主| 发表于 2011-11-1 19:22:27 | 显示全部楼层
一楼先说说编译吧

首先描述一下平台:


【硬件平台】
神舟III开发板

【软件平台】
IAR5.30
lua-5.1.4

【调试工具】
J-LINK V8(寨版..没事就TM得刷固件..)


移植确实比较简单,把lua的源代码加入工程直接编译就可以了

不过编译的时候有几个个地方需要注意, 都是引用楼主位中提到的帖子里面楼主“smset 众山科技”的描述,这里算是帮忙总结吧:)

1)IAR的系统库设置,需要设置成full:Options->General Options->Library Configuration   :  Full
2)不要包含lua.c ,luac.c ,这是shell,不需要。
3)堆栈设置:
   
  stm32f10x_flash.icf:

  define symbol __ICFEDIT_region_ROM_start__   = 0x08004000;
  define symbol __ICFEDIT_region_ROM_end__     = 0x08020000;
  define symbol __ICFEDIT_region_RAM_start__   = 0x20000000;
  define symbol __ICFEDIT_region_RAM_end__     = 0x2000BFFF;

  define symbol __ICFEDIT_size_cstack__   = 0x2000;
  define symbol __ICFEDIT_size_heap__     = 0x5000;


全部按照 “smset 众山科技”的描述,确实比较容易就编译成功了

先保证能体验,才有乐趣嘛~

出0入0汤圆

 楼主| 发表于 2011-11-1 19:22:40 | 显示全部楼层
第一部体验:注_册一个C函数  

【相关介绍】
----------------------------------------------------------------------------------------------------
想通过lua调用C函数,必须把C函数注_册到lua中,需要调用lua_register进行注_册,然后调用就OK了
这里面的C函数只是实现了简单的串口打印功能
----------------------------------------------------------------------------------------------------

细节的东西还不是很清楚,先从体验开始吧,串口终端上蹦出字母的时候,还是很兴奋滴~

为了方便,直接贴上相关代码

--------------------------------------------------------------------------------------
static int USART_Send1(lua_State *L)
{
  printf("lua come on!1\r\n");
}
static int USART_Send2(lua_State *L)
{
  printf("lua come on!2\r\n");
}
static int USART_Send3(lua_State *L)
{
  printf("lua come on!3\r\n");
}

int main(void)
{
    GPIO_InitTypeDef GPIO_InitStructure;
    lua_State *L ;       
    u8 buf[100] = {"USART_Send1(L);USART_Send2(L);USART_Send3(L);"};
   
    RCC_Configuration();
    NVIC_Configuration();
    SysTick_Init();
    uart_init(72,9600);
   
    /* Enable the FSMC Clock */
    RCC_AHBPeriphClockCmd(RCC_AHBPeriph_FSMC, ENABLE);
   
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
    GPIO_Init(GPIOA, &GPIO_InitStructure);
    GPIO_SetBits(GPIOA,GPIO_Pin_1);
   
    ili9320_Initializtion();
    ili9320_Clear(Black);
    ili9320_Clear(Blue);
   
    ili9320_DisplayStringLine(Line0,"Lua Start...",Red,Blue);
   
    printf("Lua Start...\r\n");
   
    L   = lua_open();
    luaopen_base(L);  
   
    //注_册C函数
    lua_register(L, "USART_Send1", USART_Send1);
    lua_register(L, "USART_Send2", USART_Send2);
    lua_register(L, "USART_Send3", USART_Send3);
   
    //调用脚本
    luaL_dostring(L, buf);
   
    /* Infinite loop */
    while (1)
    {
    }
}
--------------------------------------------------------------------------------------
   
共享整个工程:
ourdev_690786L0Y99Y.rar(文件大小:1.47M)


修改原因:本来是说操作一个硬件,后来想想,这充其量是注_册一个C函数..

出0入0汤圆

发表于 2011-11-1 20:12:34 | 显示全部楼层
好。。。
顶楼主。。

辛苦。

出0入0汤圆

发表于 2011-11-1 20:25:19 | 显示全部楼层
支持LZ,关注一下

出0入0汤圆

发表于 2011-11-2 16:37:01 | 显示全部楼层
等待更强大的功能。

出0入12汤圆

发表于 2011-11-2 16:45:48 | 显示全部楼层
支持!

出0入0汤圆

 楼主| 发表于 2011-11-2 17:47:36 | 显示全部楼层
回复【5楼】Excellence  精益求精
等待更强大的功能。
-----------------------------------------------------------------------

Excellence  精益求精 也来啦
刚开始研究,后面还得多多请教呢~

出0入0汤圆

发表于 2011-11-2 19:03:38 | 显示全部楼层
不错,我跟定你了。
问一下,按楼主位说的,是不是可以把LUA的使用看做是一个单任务系统?这个系统有一些底层的、基础程序,比如时钟、显示、键盘,然后调用LUA脚本执行具体的任务,一次只能一个,除了可以现场编程外和操作系统比还有什么优势?

出0入0汤圆

 楼主| 发表于 2011-11-2 19:36:45 | 显示全部楼层
回复【8楼】silence sky  静空
不错,我跟定你了。
问一下,按楼主位说的,是不是可以把lua的使用看做是一个单任务系统?这个系统有一些底层的、基础程序,比如时钟、显示、键盘,然后调用lua脚本执行具体的任务,一次只能一个,除了可以现场编程外和操作系统比还有什么优势?
-----------------------------------------------------------------------

关于单任务
《Lua程序设计_第二版》中的第30章讲的"线程和状态" 。
之前也试图看了一点lua的实现,感觉上应该是支持多任务的
不过实在是刚开始学习,就连语法还没完全熟悉呢~
所以不敢妄下定论


关于系统
我觉得lua最大的意义是就是你所说的“现场编程”,这是我最看重的
脚本的目的不就是不用编译就可以运行在各个平台上嘛
当然必要的语法检查还是需要的~

目前我也就理解到这
至于和操作系统的比较,毕竟目前我自己的理解还很有限,就先不多说了


期待你加入一起研究吧~

出0入0汤圆

 楼主| 发表于 2011-11-2 19:49:27 | 显示全部楼层
第二步体验:为注_册的函数加个参数吧  

【相关介绍】
----------------------------------------------------------------------------------------------------
第一步试验中,成功的注_册了一个函数
不过这远远不够,还需要参数
参考了《Lua程序设计-第二版》的第24、25、26章
成功的为注_册的函数增加了参数!
----------------------------------------------------------------------------------------------------
工程还是2楼的工程,为方便,只是直接提出相关代码:

--------------------------------------------------------------------------------------
static int USART_Show(lua_State *L)
{
    //获取参数
    int d1 = lua_tonumber(L,1);
    int d2 = lua_tonumber(L,1);
    if(d1 == 1)
    {
      printf("d1=1!\r\n");
    }
    else if(d1==2)
    {
      printf("d1=2!\r\n");
    }
    else
    {
      printf("err!\r\n");
    }

    if(d2 == 1)
    {
      printf("d2=1!\r\n");
    }
    else if(d2==2)
    {
      printf("d2=2!\r\n");
    }
    else
    {
      printf("err!\r\n");
    }
}

int main(void)
{
    GPIO_InitTypeDef GPIO_InitStructure;
    lua_State *L ;       
   
    //没有参数的话,直接用USART_Show(L)调用
    //u8 buf[100] = {"USART_Show(L)"};
   
    //如果有参数,则按实际参数调用
    u8 buf[100] = {"USART_Show(1,1)USART_Show(2,2)USART_Show(3,3)"};
   
    RCC_Configuration();
    NVIC_Configuration();
    SysTick_Init();
    uart_init(72,9600);

    //液晶显示
    ili9320_Initializtion();
    ili9320_Clear(Blue);
    ili9320_DisplayStringLine(Line0,"Lua Start...",Red,Blue);
   
    printf("Lua Start...\r\n");
   
    //打开lua
    L   = lua_open();
    luaopen_base(L);  
   
    //注_册C函数
    lua_register(L, "USART_Show", USART_Show);

    //调用脚本
    luaL_dostring(L, buf);
   
    /* Infinite loop */
    while (1)
    {
    }
}
--------------------------------------------------------------------------------------


上面提到的三章内容,感觉非常有助于理解lua的实现思路,强烈推荐逐句仔细揣摩

出0入0汤圆

发表于 2011-11-2 20:26:01 | 显示全部楼层
好东西啊!

出10入0汤圆

发表于 2011-11-2 22:11:49 | 显示全部楼层
mark!

出0入0汤圆

 楼主| 发表于 2011-11-3 14:34:09 | 显示全部楼层
分享几个学习lua的网站、社区

http://bbs.luaer.cn/
http://manual.luaer.cn/
http://book.luaer.cn/
http://www.luaer.cn/

出0入0汤圆

发表于 2011-11-3 16:12:16 | 显示全部楼层
回复【楼主位】Bati-Gol
-----------------------------------------------------------------------

呵呵,很高兴大家都有兴趣来研究。

"如果再给每个脚本加个图标  这不就是windows桌面吗..."

是可能的哈,

elua就已经类似实现一个DOS了,你这个带液晶的就相当于Windows版本,哈哈。

现在面临一个现实问题:STM32自带的RAM确实有点不够用,运行小脚本没问题,但运行大脚本是个问题,

我现在想法解决运行大脚本的问题。

出0入0汤圆

 楼主| 发表于 2011-11-3 18:29:55 | 显示全部楼层
回复【14楼】smset  众山科技
回复【楼主位】bati-gol&#160;
-----------------------------------------------------------------------

呵呵,很高兴大家都有兴趣来研究。

"如果再给每个脚本加个图标&#160;&#160;这不就是windows桌面吗..."

是可能的哈,

elua就已经类似实现一个dos了,你这个带液晶的就相当于windows版本,哈哈。

现在面临一个现实问题:stm32自带的ram确实有点不够用,运行小脚本没问题,但运行大脚本是个问题,

我现在想法解决运行大脚本的问题。
-----------------------------------------------------------------------

对深入的还不是很了解,打算是边玩边学了
后面还得多多指教啊~

elua是lua针对嵌入式系统剪裁的吧
内存开销是否会小一些呢?
我的想法是是先学习“原版”,吃透了,再去看“剪裁”的

出0入0汤圆

发表于 2011-11-3 18:46:13 | 显示全部楼层
mark, Lua,
关注

出0入0汤圆

发表于 2011-11-3 19:09:48 | 显示全部楼层
关注一下

出0入0汤圆

发表于 2011-11-3 19:18:35 | 显示全部楼层
哈哈!都在玩这个啊。

出0入0汤圆

发表于 2011-11-3 19:44:18 | 显示全部楼层
过几天玩。。。

基本模版有了。

呵呵。

出0入0汤圆

发表于 2011-11-12 11:27:40 | 显示全部楼层
这个得MARK啊,期待高手的KEIL版本的工程模板

出0入0汤圆

发表于 2011-11-18 10:28:50 | 显示全部楼层
已关注,已买书。

出0入0汤圆

发表于 2012-2-16 09:17:29 | 显示全部楼层
关注中
不知道 适合什么样的 产品开发
还是纯学些目的的

出0入30汤圆

发表于 2012-2-16 10:20:05 | 显示全部楼层
MARK.

出0入0汤圆

发表于 2012-2-16 11:36:30 | 显示全部楼层
mark

出0入0汤圆

发表于 2012-2-16 11:51:38 | 显示全部楼层
标记

出0入0汤圆

发表于 2012-2-16 13:30:26 | 显示全部楼层
嘿嘿我 也刚刚开始看 lua

出0入0汤圆

发表于 2012-7-4 22:16:43 | 显示全部楼层
MARK

出0入0汤圆

发表于 2012-7-5 10:03:38 | 显示全部楼层
mark!!!!!!!!!!!!!!!!

出0入0汤圆

发表于 2012-7-6 07:18:40 | 显示全部楼层
这个不错 顶楼主

出0入0汤圆

发表于 2012-7-6 17:03:47 | 显示全部楼层
用MDK编译通过,,运行的时候就会跑飞。。。这是什么原因呢??仿真单步调试正常运行。。。全速的时候也是跑飞。。

出0入0汤圆

发表于 2012-7-19 08:13:37 | 显示全部楼层
先收藏,再马认可。

出0入0汤圆

发表于 2014-11-2 18:18:52 | 显示全部楼层
好不错的文章啊,一定要学习lua才行

出0入0汤圆

发表于 2014-11-2 18:23:06 | 显示全部楼层
的确不错  学习下

出0入0汤圆

发表于 2014-11-2 18:35:21 | 显示全部楼层
学习学习。。

出0入0汤圆

发表于 2014-11-3 15:02:29 | 显示全部楼层
支持!!!!

出0入0汤圆

发表于 2014-11-6 08:19:38 | 显示全部楼层
第一次看到这个东东,研究研究,多谢分享

出0入0汤圆

发表于 2014-11-6 08:27:17 | 显示全部楼层
终于找到了用lua搞硬件的坛友了

出0入0汤圆

发表于 2014-11-6 08:32:07 | 显示全部楼层
这个东西,我折腾过,不太适用MCU行业, 主要是太大;

出0入0汤圆

发表于 2015-4-22 11:24:19 | 显示全部楼层
能运行,但是过一段时间就死机了。

出0入0汤圆

发表于 2015-4-28 22:12:28 | 显示全部楼层
可以毫不客气的告诉大家火星探测车上就有LUA的模块,所以不要小瞧这个。。。。。。。。。
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-5-5 14:48

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

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