单片机移植Lua(STM32H743移植Lua-5.4.6)

这篇具有很好参考价值的文章主要介绍了单片机移植Lua(STM32H743移植Lua-5.4.6)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目的

通常单片机都是使用C/C++来开发的,任何修改都需要重新编译固件然后下载运行。在一些需要灵活性更强的场合中可以内嵌Lua解释器实现动态更新应用程序的功能。这篇文章将对相关内容做个简单说明。

移植演示

Lua本身就是纯C实现的,不管是移植到上位机程序还是单片机程序中本质上没有多大区别,单就移植以及Lua脚本和C代码交互等参考我之前的文章即可:
《Lua和C语言交互入门》https://blog.csdn.net/Naisu_kun/article/details/134000058

这里进行简单演示,使用NUCLEO-H743ZI2开发板,启用默认使能的串口,用来打印输出信息:
单片机移植Lua(STM32H743移植Lua-5.4.6),RTOS与单片机相关,单片机,lua,stm32,脚本语言,虚拟机

修改最小堆栈大小,生成初始化项目代码。

然后参考上面文章,直接引入Lua源码(排除 lua.cluac.c),接着改写 main.c 代码如下:

#include "main.h"

#include <stdio.h> // 引入该库为了可以使用 printf 函数

#include "src/lua.h"     // Lua数据类型与函数接口
#include "src/lauxlib.h" // Lua与C交互辅助函数接口
#include "src/lualib.h"  // Lua标准库打开接口

UART_HandleTypeDef huart3;
void SystemClock_Config(void);
static void MX_GPIO_Init(void);
static void MX_USART3_UART_Init(void);

/* 以下代码用来实现putchar操作,以此可实现printf功能 */
/* With GCC, small printf (option LD Linker->Libraries->Small printf set to 'Yes') calls __io_putchar() */
#ifdef __GNUC__
#define PUTCHAR_PROTOTYPE int __io_putchar(int ch) // 实现__io_putchar函数
#else
#define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f)
#endif /* __GNUC__ */

PUTCHAR_PROTOTYPE
{
	// 实际发送操作,这里可以改成自己真实需要操作的端口
    HAL_UART_Transmit(&huart3, (uint8_t *)&ch, 1, 0xFFFF);
    return ch;
}
/* 以上代码用来实现putchar操作,以此可实现printf功能 */

int main(void)
{
  HAL_Init();
  SystemClock_Config();
  MX_GPIO_Init();
  MX_USART3_UART_Init();

  lua_State* L = luaL_newstate(); // 创建Lua线程
  luaL_openlibs(L); // 打开标准库

  while (1)
  {
	 HAL_Delay(1000);
	luaL_dostring(L, "print('Naisu, Lua!')"); // 解析并执行Lua脚本字符串
  }

  lua_close(L); // 关闭Lua线程(虽然代码并不会运行到这里)
}

void SystemClock_Config(void)
{
  // some code ...
}

static void MX_USART3_UART_Init(void)
{
  // some code ...
}

static void MX_GPIO_Init(void)
{
  // some code ...
}

void Error_Handler(void)
{
  // some code ...
}

上面代码主要就两方面内容:

  • 实现了 putchar 操作,这样在 Lua 中就可以使用 print 函数了;
  • 创建Lua虚拟机初始化标准库,然后循环执行Lua脚本;

将上述代码编译后下载到开发板可以看到相关输出:
单片机移植Lua(STM32H743移植Lua-5.4.6),RTOS与单片机相关,单片机,lua,stm32,脚本语言,虚拟机

示例链接

仓库地址: https://github.com/NaisuXu/STM32_MCU_Examples

本文中的示例位于仓库中 Lua_H743

更多说明

从上面演示可以看到,移植本身很简单,不过相比在上位机上移植,在单片机中移植还有些需要注意的地方。

合理设置内存大小

单片机相比上位机一个比较大的问题是内存比较小,所以需要合理设计内存使用。

单片机本身设置合适的堆栈空间:
单片机移植Lua(STM32H743移植Lua-5.4.6),RTOS与单片机相关,单片机,lua,stm32,脚本语言,虚拟机

Lua源码 luaconf.h 文件中 #define LUAI_MAXSTACK 宏定义用于设置Lua使用的最大栈大小:

/*
@@ LUAI_MAXSTACK limits the size of the Lua stack.
** CHANGE it if you need a different limit. This limit is arbitrary;
** its only purpose is to stop Lua from consuming unlimited stack
** space (and to reserve some numbers for pseudo-indices).
** (It must fit into max(size_t)/32 and max(int)/2.)
*/
#if LUAI_IS32INT
#define LUAI_MAXSTACK		1000000
#else
#define LUAI_MAXSTACK		15000
#endif

按需加载标准库

上面演示中使用 luaL_openlibs(L); 方式加载了所有的Lua标准库,实际使用中完全可以按需加载。

在Lua源码 linit.c 中注释掉不需要的库即可:

/*
** these libs are loaded by lua.c and are readily available to any Lua
** program
*/
static const luaL_Reg loadedlibs[] = {
  {LUA_GNAME, luaopen_base},
  {LUA_LOADLIBNAME, luaopen_package},
  {LUA_COLIBNAME, luaopen_coroutine},
  {LUA_TABLIBNAME, luaopen_table},
  {LUA_IOLIBNAME, luaopen_io},
  {LUA_OSLIBNAME, luaopen_os},
  {LUA_STRLIBNAME, luaopen_string},
  {LUA_MATHLIBNAME, luaopen_math},
  {LUA_UTF8LIBNAME, luaopen_utf8},
  {LUA_DBLIBNAME, luaopen_debug},
  {NULL, NULL}
};

实现系统和IO接口

Lua中很多操作都是调用了操作系统相关的接口,这些接口单片机是不带的,如果需要用到相关功能的话要不就去实现相关接口(比如演示中的print函数就需要实现相关接口才可以使用),要不就直接改写Lua标准库相关函数。

特别的,在创建Lua虚拟机时会需要动态申请内存,这个内存申请函数可以自己指定,也可以使用默认的。默认会使用 lauxlib.cl_alloc 函数,该函数中调用了系统的 freerealloc 函数。如果对内存操作有更加细致的需求,那就需要注意处理这些方面。

设置引用路径

如果单片机上跑了文件系统,将Lua脚本以文件的形式放到文件系统中,那么在执行这些文件的时候可能需要合理设置Lua相关路径。比如在Lua源码 luaconf.h 文件中 LUA_PATH_DEFAULT 宏定义就可以设置默认的路径。

总结

总体来说在单片机上移植Lua并不复杂,更多的是对内存的限制以及没有操作系统自带的各种接口问题上花时间去调试处理。文章来源地址https://www.toymoban.com/news/detail-832721.html

到了这里,关于单片机移植Lua(STM32H743移植Lua-5.4.6)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 单片机移植freemodbus主机(STM32、GD32、瑞萨、国民技术等)

    从github下载:https://github.com/armink/FreeModbus_Slave-Master-RTT-STM32 无法下载或者下载太慢可以用资源下载,无需积分。freeModbus主机源码下载 示例代码 参考从机代码创建 将FreeModbus主机源代码拷贝到工程中间件-第三方库-freemodbus源码库:即MiddlewaresThird_PartyFreeModbusMaster文件夹中。

    2024年02月11日
    浏览(31)
  • FreeRTOS_Stm32F103系列单片机标准库移植

    链接:FreeRTOS 下面的教程是基于从github下载压缩包进行的,最好下载这个或者直接看3.1,从我百度网盘下载。如果是别的下载源也问题不大,大同小异。 此时我们需要下载以下两个仓库, 点进去按下面的步骤下载就行了,另一个也是这样下。 链接: FreeRTOS官网 打开链接我们

    2024年01月22日
    浏览(37)
  • POWERLINK协议在stm32单片机+w5500移植成功经验分享

    连续折腾了多个晚上,又趁周末又花了一天时间,终于把powerlink协议移植成功到单片机上啦。本想放弃,但想了下不管我能不能用上,结个尾吧,分享给有需要的人。放弃并不难,但坚持一定很酷。为了移植测试这个协议花了不少血本。stm32开发板就买了两套,其中第一套板

    2024年02月09日
    浏览(44)
  • 单片机中移植lua解释器

    一、基本开发环境 开发环境基于野火STM32开发板。 前测试的 Lua 解释器版本为 5.4.2。 官网下载lua资源包,下载地址如下: https://www.lua.org/ https://github.com/rjpcomputing/luaforwindows/releases lua: Lua 国内镜像 (gitee.com)‍ 二、移植Lua解释器 1.下载的Lua解压,删除源文件中的的 lua.c 和 lua

    2024年02月09日
    浏览(83)
  • STM32 -- 实现按键的长按与短按检测(其他单片机可移植)

    目录 资源获取 一 前言 二 思路  三 实现代码 1.主要代码 四 完整代码 Key.h Key.c 该改进版本(1ms太繁琐了,我改成了25ms检测一次)   1.定时器部分 2.按键检测部分  五、参考 欢迎关注微信公众号--星之援工作室 发送(长短按检测) 今天在逛博客的时候,偶然看到了一

    2024年02月12日
    浏览(26)
  • 单片机开发---ESP32S3移植NES模拟器(一)

    《单片机开发—ESP32-S3模块上手》 《单片机开发—ESP32S3移植lvgl+触摸屏》 依旧是参考韦东山老师的作品来移植的 《ESP32|爷青回!ESP32(单片机) NES模拟器_NES游戏机掌机教程(开源+详细讲解实现代码!)》 韦老师已经将代码开源,喜欢的朋友当然是可以去支持一波。 另外还有gi

    2023年04月16日
    浏览(33)
  • 单片机开发---ESP32S3移植NES模拟器(二)

    《单片机开发—ESP32-S3模块上手》 《单片机开发—ESP32S3移植lvgl+触摸屏》 《单片机开发—ESP32S3移植NES模拟器(一)》 暖场视频,小时候称这个为—超级曲线射门!!!!!!!!!! ESP32上天使之翼游戏 看门狗 源码中有两处看门狗的喂狗操作,前期都被注释掉了。 因为开

    2023年04月09日
    浏览(114)
  • GD32单片机和STM32单片机的对比分析

    GD32单片机和STM32单片机都是基于Arm Cortex-M3/M4内核的32位通用微控制器,广泛应用于各种嵌入式系统和物联网领域。两者之间有很多相似之处,但也有一些不同之处,本文将从以下几个方面对比分析两者的特点、优势和开发成本。 GD32单片机采用的是二代的M3/M4内核,而STM32单片

    2024年02月16日
    浏览(46)
  • STM32单片机(一)STM32简介

    ❤️ 专栏简介:本专栏记录了从零学习单片机的过程,其中包括51单片机和STM32单片机两部分;建议先学习51单片机,其是STM32等高级单片机的基础;这样再学习STM32时才能融会贯通。 ☀️ 专栏适用人群 :适用于想要从零基础开始学习入门单片机,且有一定C语言基础的的童鞋

    2024年02月10日
    浏览(44)
  • STM32单片机开发-01 STM32介绍

    通过野火开发板学习单片机 从内核上分有Cortex-M0、M3、M4 和M7 F1 代表了基础型,基于Cortex-M3 内核,主频为72MHZ F4 代表了高性能,基于Cortex-M4 内核,主频180M。 数据手册:用于芯片选型和设计原理图 参考手册:用于编程时查阅 Icode总线 – 该总线讲M3内核的指令总线与闪存指令

    2024年01月21日
    浏览(44)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包