你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

STM32L562E-DK移植lua脚本语言

[复制链接]
STMWoodData 发布时间:2025-2-11 23:10

一直对脚本语言挺感兴趣的,本次就来研究一下移植lua脚本语言到MCU上。lua脚本语言以前还是很火的,在python出来之前,

它广泛应用于游戏、嵌入式系统和应用程序扩展。

首先介绍一下Lua脚本语言。Lua 是一种轻量级、高效的脚本语言,设计初衷是为了嵌入应用程序中,提供灵活的扩展和定制功能。

它主要有以下几个特点:

1,轻量级:

Lua 的核心非常小巧,编译后的解释器仅约 200KB,适合资源受限的环境。

2,高效:

Lua 的执行速度接近 C 语言,得益于其基于寄存器的虚拟机。

3,可嵌入性:

Lua 易于嵌入到 C/C++ 等宿主语言中,常用于游戏引擎、嵌入式系统等。

4,动态类型:

Lua 是动态类型语言,变量无需声明类型,类型与值绑定。

5,自动内存管理:

Lua 使用垃圾回收机制,自动管理内存。

6,简单语法:

Lua 语法简洁,学习曲线平缓。

下面介绍一下如何移植lua脚本语言到mcu上运行。

先在官网下载lua源码包,每个版本的lua源码包都有小幅度的函数更改,下载最新源码包即可。 下载地址:https://www.lua.org/download.html

image.png

解压下载的lua源码,将src文件夹复制粘贴到已有的项目工程中,新建分组LUA,并将.c添加到该分组中。

工程中要去掉lua.c和luac.c这两个文件。

image.png

接下来添加lua头文件路径。

image.png

添加 time(time_t time)和 system(const char string)。这里简单添加函数即可。主要用于实现时间获取函数。在Lua中主要用于获取时间和随机数种子。这里简单添加函数实现用于测试。

time_t time(time_t *time)
{
    return 0;
}

int system(const char * string)
{
    return 0;
}

再就是修改堆栈大小,尽可能加大一点,要不然容易HardFault。因为Lua中用到了动态内存分配。

image.png

至此实现lua移植,下面来测试lua库是否移植成功。


下面实现lua字符串控制led闪烁,在main.c中加入头文件。

#include "lua.h"
#include "lualib.h"
#include "lauxlib.h"

//自定义C函数

static int lua_led_on(lua_State *L)
{
    HAL_GPIO_WritePin(LED_GREEN_GPIO_Port,LED_GREEN_Pin,GPIO_PIN_RESET);
    return 0;
}
static int lua_led_off(lua_State *L)
{
    HAL_GPIO_WritePin(LED_GREEN_GPIO_Port,LED_GREEN_Pin,GPIO_PIN_SET);
    return 0;
}
static int lua_delay(lua_State *L)
{
    int num;
    num= lua_tointeger(L, 1);
    delay_ms(num);
    return 0;
}

定义一个luaL_Reg结构数组,把上面的C函数列入,并以字符串的方式命名。

static const struct luaL_Reg mylib[]=
{
  {"led_on",lua_led_on},
  {"led_off",lua_led_off},
  {"delay",lua_delay},
  {NULL,NULL}
};

编写脚本字符串,实现led闪烁10次。

const char LUA_SCRIPT_GLOBAL[] ={
    "  \
        off = 500   \
        on = 500    \
        while i=1,10  do  \
        led_on()    \
        delay(on)   \
        led_off()   \
        delay(off)  \
    end "
};
   //主函数初始化lua,并运行。

int main(void)
{
    //初始化部分

    //Lua初始化
    lua_State *L;        /* 创建Lua编译器*/
    L = luaL_newstate(); /* 建立Lua运行环境 */
    luaopen_base(L);     /* 注册基本函数 */

    luaL_setfuncs(L, mylib, 0);
    luaL_dostring(L, LUA_SCRIPT_GLOBAL); /* 运行Lua脚本 */
    while(1)
    {
    }
}

编译无错误后,将代码下载到开发板中,就可以实现led的闪烁。

下面是实现通过串口shell运行lua脚本代码:

lua_State *L;        /* 创建Lua编译器*/
uint8_t lua_buffer[256];
void Lua_Execute(lua_State *L, const char *script)
{
    if (luaL_dostring(L, script) != LUA_OK)
    {
        const char *error = lua_tostring(L, -1);
        printf("%s",error);
    }
}
void shell_lua_cmd(char argc, char *argv)
{
    uint8_t ch=0;
    uint8_t i;
    while(1)
    {
        printf(">>>");
        i=0;
        ch = 0;
        while((0x0d != ch) && (0x0a != ch))
        {
            ch = USART_GetChar();
            if(0x0d != ch)
            {
                if(0x0a != ch) lua_buffer[i++]=ch;
                else break;
            }else
            {
                lua_buffer[i++]=0;
                Lua_Execute(L,(const char *)lua_buffer);
                ch = 0;
            }
        }
    }
}
NR_SHELL_CMD_EXPORT(lua,   shell_lua_cmd,     "lua script");

通过串口简单运行lua效果:

image.png

image.png
收藏 评论0 发布时间:2025-2-11 23:10

举报

0个回答
关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版