返回列表 发新帖我要提问本帖赏金: 10.00元(功能说明)

[活动专区] 【AT-START-F437测评】+Lua移植

[复制链接]
3096|20
 楼主| 夜声 发表于 2023-1-2 10:01 | 显示全部楼层 |阅读模式
本帖最后由 夜声 于 2023-1-2 10:05 编辑

Lua移植

一、前言
本篇文章将Lua在MDK环境移植到AT32F437ZMT7开发板,记录移植过程并通过Lua点亮开发板上的LED灯作为演示。
二、Lua简介
Lua 是一种轻量小巧的脚本语言,用标准C语言编写并以源代码形式开放,其设计目的是为了嵌入应用程序中,从而为应用程序提供灵活的扩展和定制功能。
Lua 是巴西里约热内卢天主教大学(Pontifical Catholic University of Rio de Janeiro)里的一个研究小组于 1993 年开发的,该小组成员有:Roberto Ierusalimschy、Waldemar Celes 和 Luiz Henrique de Figueiredo。
特点:
轻量级: 它用标准C语言编写并以源代码形式开放,编译后仅仅一百余K,可以很方便的嵌入别的程序里。
可扩展: Lua提供了非常易于使用的扩展接口和机制:由宿主语言(通常是C或C++)提供这些功能,Lua可以使用它们,就像是本来就内置的功能一样。
三、AT32F437ZMT7简介
雅特力科技AT32F437系列超高效能微控制器,搭载32位ARM® Cortex®-M4内核,配合先进工艺与整合技术缔造业界Cortex®-M4最高主频效能288MHz的运算速度。内建的单精度浮点运算单元(FPU)、数字信号处理器(DSP)及存储器保护单元(MPU),搭配丰富的外设及灵活的时钟控制机制,能满足多种领域应用。最高可支持超大容量4032KB的闪存(Flash)和高达512KB的SRAM,超越业界同级芯片水平。
3.1芯片资源
定时器:
3个16位带死区控制PWM高级控制定时器
2个32位, 8个16位通用定时器
2个16位基本定时器
2个看门狗定时器(独立和窗口型)
1个系统时间定时器: 24位自减型
3.1通信接口
3 x I²C (支持SMBus/PMBus)
4 x SPI / I²S (SPI可达36MHz)(其中I²S2/I²S3支持全双工)
4 x USART + 4 x UART (支持ISO7816,LIN,IrDA接口和调制解调控制)
2 x SDIO
2 x OTG全速控制器, 设备模式时支持无晶振(Crystal-less)
2 x CAN 2.0B
红外发射器
10/100M以太网MAC:具有专用DMA和4 K字节SRAM,支持IEEE 1588硬件,MII/RMII接口
3.3开发板外观

四、移植准备
4.1 Lua源码下载
官网地址:http://www.lua.org/ftp/
4a4472a5dad01b731983c3d9c8675482
4.2 KEIL工程准备
官网下载AT32F437的BSP,以其中的tamplates为例。
ba666544666dbfdcfa0761b6967562ae
打开工程,是通过按键控制LED快闪和慢闪两种模式,进行简单调整,只需留着GPIO的即可。
09c31dab6603d905953117e07441b420
调整过后如下所示,查看整个工程编译的大小,方便查看Lua移植后所需的内存大小。
5f23407d282c8b7225b8a27ebc324efe
五、移植过程
在KEIL工程中添加Lua源码
0ca0d3222dd41190bfb28e24bad8e5a6
排除“lua.c”、“luac.c”这2个文件,两个是一个Lua Shell,和平台相关,单片机用不上。
添加头文件路径:
eb9c51e9a22393fd73a292fbfa628748
添加头文件
9c0359390f50e50452f47133de290003
添加底层函数处理接口:
typedef int FILEHANDLE;

#pragma import(__use_no_semihosting_swi)

#pragma import(_main_redirection)

const char __stdin_name[150];

const char __stdout_name[150];

const char __stderr_name[150];

FILEHANDLE _sys_open(const char *name, int openmode)

{

return 0;

}

int _sys_close(FILEHANDLE fh)

{

return 0;

}

int _sys_write(FILEHANDLE fh, const unsigned char *buf, unsigned len, int mode)

{

return 0;

}

int _sys_read(FILEHANDLE fh, unsigned char*buf, unsigned len, int mode)

{

return 0;

}

    //检查句柄是否为终端

int _sys_istty(FILEHANDLE fh)

{

return 0;

}

int _sys_seek(FILEHANDLE fh, long pos)

{

return 0;

}

    //刷新句柄关联的缓冲区

int _sys_ensure(FILEHANDLE fh)

{

return 0;

}

    //返回文件当前长度

long _sys_flen(FILEHANDLE fh)

{

return 0;

}

void _sys_exit(int status)

{



}

int _sys_tmpnam(char *name, int fileno, unsigned maxlength)

{

return 0;

}

    //将一个字符写入控制台

void _ttywrch(int ch)

{

}

int remove(const char *filename)

{

return 0;

}

char *_sys_command_string(char *cmd, int len)

{

return NULL;

}

time_t time(time_t * time)
{
        return 0;
}
添加led控制处理:
static int lua_led_on(lua_State *L)
{
    gpio_bits_write(GPIOD,GPIO_PINS_14,TRUE);
    return 1;
}

static int lua_led_off(lua_State *L)
{
    gpio_bits_write(GPIOD,GPIO_PINS_14,FALSE);
    return 1;
}
static int lua_delay(lua_State *L)
{
    uint16_t ms;
    ms = (uint16_t)lua_tointeger(L,1);
    delay_ms(ms);
    return 1;
}

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

const char LUA_GLOBAL[]="\
off = 500    \
on = 500     \
while 1 do   \
    led_on() \
    delay(off)\
    led_off() \
    delay(on) \
end";

static lua_State *luaL;
void lua_run(void)
{
    luaL = luaL_newstate();
    luaopen_base(luaL);
    luaL_setfuncs(luaL,lib,0);
    luaL_dostring(luaL,LUA_GLOBAL);

    while(1);
}
主函数:
int main(void)
{
  system_clock_config();
  at32_board_init();
  uart_print_init(115200);
  lua_run();
}
修改启动文件:
675cece9eb6778290b40718327648235
编译了一下,报了110个错误和36个警告,慢慢的一个一个解决吧!!!
18a3f7b93cd099f4ecc3745936b19968
选择C99Mode模式,编译错误解决
51da2e9347e8a3b4b7928707ef044ce8
再次编译,还有错误,同时需要将工程串口打印例程,或者自己添加串口打印。
80343f505ce33b468d8590553a75f0d7
原因分析:
在luaconfig.h 中有 luai_writestring 和 luai_writeline 两个宏,这两个宏关系到了 lua 中 print 的输出,需要针对平台重定向,一般定向到调试串口就行。所以需要将GPIO工程替换串口打印工程。
我工程中使用了MicroLIB
25e9933a0df4e411db6cc687a9dd81aa
同时在at32f435_437_board.c中已经定义,同时在进行添加底层接口时也进行了定义。
9fe280d61d0ef24daa925737bfe2e339
解决方法:
不使用MicroLIB,同时将at32f435_437_board.c所定义的部分屏蔽掉。
六、结果
Lua已经在板子上正常跑起来了
lua.gif

打赏榜单

ArterySW 打赏了 10.00 元 2023-06-06
理由:作品优秀

评论

感谢分享,MARK一下,学习了  发表于 2023-6-29 13:38
楼主能分享一下代码工程吗?让更多人贴友学习学习。  发表于 2023-6-6 13:18
wangwu1976@ 发表于 2023-4-13 13:57 | 显示全部楼层
第一次接触,先顶一个
phoenixwhite 发表于 2023-6-6 12:38 | 显示全部楼层
将lua移植到单片机可行吗              
claretttt 发表于 2023-6-6 13:04 | 显示全部楼层
lua移植内存分配是语言的对象类型都必须用指针,对象所占的内存是在堆上分配。
lzbf 发表于 2023-6-6 13:41 | 显示全部楼层
主要做的就是移植lua、luat两个文件夹
deliahouse887 发表于 2023-6-6 14:26 | 显示全部楼层
在AT32F437ZMT7开发板上移植lua脚本,实现一些基本功能
sesefadou 发表于 2023-6-6 14:36 | 显示全部楼层
已经成功将lua移植到F437上运行
hearstnorman323 发表于 2023-6-6 17:09 | 显示全部楼层
LUA出现的目的就是为了方便嵌入式
xiaoyaodz 发表于 2023-6-6 17:21 | 显示全部楼层
Lua 是一种轻量小巧的脚本语言
yeates333 发表于 2023-6-6 17:43 | 显示全部楼层
Lua为了嵌入应用程序中,从而为应用程序提供灵活的扩展和定制功能。
sdCAD 发表于 2023-6-8 13:52 | 显示全部楼层
lua移植到F437有什么优势吗
nomomy 发表于 2023-6-8 15:02 | 显示全部楼层
移植Lua不用做任何裁剪。              
bartonalfred 发表于 2023-7-5 21:18 | 显示全部楼层
如果移植的Lua代码依赖于外部库或模块,需要确保目标平台上有这些库或模块的可用版本。
pentruman 发表于 2023-7-5 21:26 | 显示全部楼层
之前移植后的Lua代码会出现许多的错误或异常情况
tabmone 发表于 2023-7-6 10:31 | 显示全部楼层
Lua代码中可能使用了文件路径、系统调用和外部命令等功能。
pentruman 发表于 2023-7-6 10:49 | 显示全部楼层
确保代码与目标版本兼容。               
cemaj 发表于 2023-7-6 11:39 | 显示全部楼层
Lua程序通常会使用一些内存管理机制
mmbs 发表于 2023-7-6 12:04 | 显示全部楼层
需要注意处理字节序、内存对齐等问题吗
caigang13 发表于 2023-7-7 08:41 来自手机 | 显示全部楼层
lua是个操作系统还是啥?
您需要登录后才可以回帖 登录 | 注册

本版积分规则

27

主题

89

帖子

2

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