美文网首页我爱编程
将Lua解释器移植到STM32

将Lua解释器移植到STM32

作者: IOTTS | 来源:发表于2018-07-25 00:58 被阅读0次

最近在一个在做一个PLC项目,对于PLC需要根据不同场景实现不同的功能,因此为了保持系统的稳定性决定做一个脚本配置的方案。开始的时候自己写了一个脚本解析程序,系统运行不错,就是脚本有点长,易读性比较差,今天突然想到Lua,决定把Lua移植到STM32上去,网上查了一下相关资料,说实话,关于STM32Lua的工程应用还是比较少的,决定自己移植一下

前期准备

Lua源码包:

目前最新版本是5.3.4 ,下载链接:http://www.lua.org/ftp/lua-5.3.4.tar.gz

Stm32f103工程模板:

我已经做好的工程模板,主要有一个LED驱动,串口驱动

下载链接 密码:o2x5

开始移植

我用的KEIL 5.17,板子用的STM32f103板子

1.Lua源码解压会得到一个src文件夹,把src下的源码添加到STM32的工程里,设置好包含路径,注意lua.c 和 luac.c 这两个文件是不包含的(它们包含PC上Lua解释器和编译器的main函数),将这两个文件删除。

2.Lua硬件要求

l RAM >= 7.5Kb,建议16KB以上

l ROM >= 65kb,建议128kb以上

改动堆栈大小:堆最小为5.5kb,栈最小是1.5kb。在启动文件里把堆(Heap_Size)设置的足够大,我设置的0x00008000(32KB)是没问题的,其实要不了这么多。建议把栈设置的大一点(1KB足够)

把MicroLib的勾打上了,如下图:

然后我写了一个简单的函数来实现解释器:

/* 测试的Lua代码字符串 */

const char lua_test[] = {

    "print(\"Hello,I am lua!\\n--this is newline printf\")\n"

    "function foo()\n"

    "  local i = 0\n"

    "  local sum = 1\n"

    "  while i <= 10 do\n"

    "    sum = sum * 2\n"

    "    i = i + 1\n"

    "  end\n"

    "return sum\n"

    "end\n"

    "print(\"sum =\", foo())\n"

    "print(\"and sum = 2^11 =\", 2 ^ 11)\n"

    "print(\"exp(200) =\", math.exp(200))\n"

};

/* 运行Lua */

static int do_file_script(void)

{

    lua_State *L;

    L = luaL_newstate(); /* 建立Lua运行环境 */

    luaL_openlibs(L);

    luaopen_base(L);

    luaL_dostring(L, lua_test); /* 运行Lua脚本 */

    lua_close(L);

    return 0;

}

#include "stm32_config.h"

#include "stdio.h"

#include "lua.h"

#include "lauxlib.h"

#include "lualib.h"

#include "stdlib.h"

#include "bsp_led.h"

#include "time.h"

#include "usart.h"

/**********************************************************

* 函数名 : main

* 输入  :none

* 输出  :none

* 功能  :

**********************************************************/

int main(void)

{

    delay_init(72);

    LED_Init();

    USARTx_Init(115200);

    do_file_script();

    while(1)

    {

//      GPIO_SetBits(GPIOE,GPIO_Pin_5);

//      delay_ms(200);

//    GPIO_ResetBits(GPIOE,GPIO_Pin_5);

//      delay_ms(200);

    }

}

编译之后报错说time(), exit(), system()这三个标准库函数没有定义,我们需要自己定义

/* 定义MicroLib没有的函数 */

time_t time(time_t * time)

{

    return 0;

}

void exit(int status)

{   

}

int system(const char * string)

{

    return 0;

}

好,现在终于可以运行了,

运行结果:

相关文章

  • 将Lua解释器移植到STM32

    最近在一个在做一个PLC项目,对于PLC需要根据不同场景实现不同的功能,因此为了保持系统的稳定性决定做一个脚本配置...

  • Redis Lua编程与调试工具使用

    前言 Redis自2.6.0版本开始内置Lua解释器。 Lua,轻量级脚本语言,号称最快的脚本语言。 两者结合将爆...

  • 构建Lua解释器:虚拟机的基础

    前言 在本篇,我们正式进入到Lua解释器的开发阶段(这是一个遵循Lua 5.3标准的项目)。本篇并不直接接入到设计...

  • Redis 脚本

    Redis 脚本 Redis 脚本使用 Lua 解释器来执行脚本。 Reids 2.6 版本通过内嵌支持 Lua ...

  • 基础: Lua引擎组成

    Lua引擎组成 1.Lua核心模块:虚拟机、编译器/解释器、GC、标准库、内嵌辅助库、C Api。 1).虚拟机核...

  • Redis学习之路(8)命令 -Redis 脚本

    Redis 脚本使用 Lua 解释器来执行脚本。 Redis 2.6 版本通过内嵌支持 Lua 环境。执行脚本的常...

  • 17 Redis脚本

    Redis 脚本使用 Lua 解释器来执行脚本。 Reids 2.6 版本通过内嵌支持 Lua 环境。执行脚本的常...

  • Lua和Luajit的区别

    LuaJIT是采用C语言写的Lua的解释器。LuaJIT被设计成全兼容标准Lua 5.1, 因此LuaJIT代码的...

  • nginx_lua 跳转验证码

    一 Nginx加载Lua环境 默认情况下Nginx不支持Lua模块, 需要安装LuaJIT解释器, 并且需要重新...

  • redis 脚本介绍

    redis脚本简介   脚本使用 Lua 解释器来执行脚本。 Redis 从2.6版本开始,通过内嵌支持 Lua ...

网友评论

    本文标题:将Lua解释器移植到STM32

    本文链接:https://www.haomeiwen.com/subject/tmeumftx.html