基于之前了解到的Lua脚本开发功能,尝试过多次都没有很认真的做到底。之前的尝试都没能很好的应用到自己的工程里。

elua东西太多并且是在linux下编译的,我很不适应,当然liunx涉及的不深。

本次移植的条件及目标:

本次的目标是能精简移植最纯洁版的lua框架,能够实现多文件(.lua)的联合调用 require / dofile。

开发工具:Keil V5.29

硬件平台:STM32F4探索者开发版

移植下来发现lua和平台真的关系不大,就内存上面我还没搞懂他需要多少合适。

单纯加入了一个测试lua-lib,具体编译空间MAP如下:

Total RO  Size (Code + RO Data)               157208 ( 153.52kB)
    Total RW  Size (RW Data + ZI Data)             36904 (  36.04kB)
    Total ROM Size (Code + RO Data + RW Data)     157256 ( 153.57kB)

工作内容有:

1、lua库移植

2、FatFs文件系统的移植

3、多文件.lua的相互调用测试测试

这次捣鼓花了3天的时间,对lua语言和和lua库的函数库有初步了解。整个过程就不是很顺利,几经自闭。

程序源码会附件提供大家学习,以免大家多走弯路。欢迎下载。

下载链接:https://download.csdn.net/download/ai5945fei/12630346

整体参考博客,在此感谢给了很多的帮助

https://blog.csdn.net/zlm_space/article/details/50379980

工程整体内容:

移植步骤:

到gethub下载lua源码,当前使用版本 This is Lua 5.4.0, released on 18 Jun 2020.

解压并添加到自己的工程里,除lua.c和luac.c外全部添加。

添加后编译会出现几个未定义的函数,可以找到并全是实现成空函数,实际用到的时候再补充。

不用文件的话不出意外都能跑起来。

大概描述一下几个地方,方便以后快速上手。

1、添加预编译LUA_32BITS

2、注意此处不打勾

文件系统重定向

3、这里坑我比较久

#pragma import(__use_no_semihosting)

不加入这一句会出现一个很郁闷的问题。程序进入DEBUG模式时能正常运行,真机运行就崩溃起不来。

4、lua搜索路径

根据自己挂载的路径修改lua搜索路径,主要提供 require查找文件。dofile默认可以查找到当前路径,可以不需要设置该路径。reuqire不行,需要指定。

5、在此处添加自己的驱动

6、文件系统配置

文件系统我使用的是系统RAM,分配了10k空间。自己可随意调整为内部FLASH或者存储卡等存储介质。

#define FF_MIN_SS        1024 // 扇区大小

7、注意屏蔽掉fputc的实现

int fputc(int ch, FILE *f)该函数就不需要在外部实现,会造成发送混乱。重定向的功能已经在stdio.c里面实现了。

8、这几个实现文件系统的必要文件

收尾

至此,没有什么要特别注意的了。附上main.c文件,是不是你需要的东西,自行评估。

#include "sys.h"
#include "delay.h"
#include "usart.h"
#include "led.h"
#include "beep.h"
#include "key.h"
#include "string.h"
//ALIENTEK 探索者STM32F407开发板 实验4
//串口通信实验 -库函数版本
//技术支持:www.openedv.com
//淘宝店铺:http://eboard.taobao.com
//广州市星翼电子科技有限公司
//作者:正点原子 @ALIENTEK#include "lua.h"#include "lauxlib.h"
#include "lualib.h"#include <ff.h>
static FATFS fatfs;//文件系统挂
static int file_system_init(void)
{char buffer[FF_MIN_SS];FRESULT fr;fr = f_mount(&fatfs, "0:/", 1); // 挂载磁盘if (fr == FR_OK){printf("f_mount OK!\n");return 1;}if (fr == FR_NO_FILESYSTEM){// 若磁盘没有格式化, 则格式化磁盘fr = f_mkfs("0:/", FM_FAT, 0, buffer, sizeof(buffer));if (fr == FR_OK){printf("Disk is formatted!\n");return 1;}else{printf("Disk cannot be formatted! fr=%d\n", fr);return 0;}}else{printf("f_mount error! fr=%d\n", fr);return 0;}
}const char LUA_SCRIPT_HELLO[] = " \
print('this is hello.lua')\
gloabl_param = 'this is gloabl param' \
function say_hello()\print('this is function:say hello')\
end \
";const char LUA_SCRIPT_GLOBAL[] = "  \
print('this is main.lua') \
off = 500     \
on = 500       \
require('module')\
print(module.constant)\
print('into while')\
while true do \led.led_on() \led.delay(off)    \led.led_off()        \led.delay(on)      \
end";const char LUA_SCRIPT_GLOBAL_STR[] = "  \
print('this is main.lua') \
off = 500     \
on = 500       \
print('into while')\
while true do \led.led_on() \led.delay(off)    \led.led_off()        \led.delay(on)      \
end";const char LUA_SCRIPT_MODULE[] = " \
module ={}  \
module.constant='这是一个模块常量'\
return module";void file_write_string(const char *filename,const char *strdata)
{FILE *fp = NULL;fp = fopen(filename, "w");if(fp){fputs(strdata, fp);fclose(fp);printf("file %s create success\r\n",filename);}else{printf("file %s create err\r\n",filename);}
}static void file_create_test(void)
{file_write_string("main.lua",LUA_SCRIPT_GLOBAL);file_write_string("hello.lua",LUA_SCRIPT_HELLO);file_write_string("module.lua",LUA_SCRIPT_MODULE);
}FRESULT scan_files(char *path)
{FRESULT res; //定义结果对象DIR dir; //定义目录对象UINT i; //定义变量static FILINFO fno; //定义静态文件信息结构对象res = f_opendir(&dir, path); //打开目录,返回状态 和 目录对象的指针char pathBuff[256]; //定义路径数组if (res == FR_OK) //打开成功{for (;;) //遍历{res = f_readdir(&dir, &fno); //读取目录,返回状态 和 文件信息的指针if (res != FR_OK || fno.fname[0] == 0)break; //若打开失败 或 到结尾,则退出if (fno.fattrib & AM_DIR) //是目录{i = strlen(path); //获取原目录长度sprintf(&path[i], "/%s", fno.fname); //将新目录添加在原目录后面printf("是目录::%s\r\n", path);res = scan_files(path); //将新目录进行递归调用if (res != FR_OK)break; //打开失败则退出path[i] = 0;}else{printf("是文件:%s/%s\r\n", path, fno.fname); //是文件//strcpy(pathBuff, fno.fname); //将文件目录存储起来}}}else{printf("失败 - %s", &res); //打开失败}f_closedir(&dir); //关闭目录return res; //返回状态
}int main(void)
{uart_init(115200);delay_init(168);                                //延时初始化LED_Init();                                     //初始化与LED连接的硬件接口file_system_init();//加载文件系统file_create_test();//创建lua脚本文件scan_files("0:");lua_State *L  = luaL_newstate();if (L == NULL){printf("LUA ERR\r\n");}else{printf("Lua init ok\r\n");luaL_openlibs(L);//加载Lua库//重复写文件测试file_write_string("autorun.lua","print('autorun file <1>  2')");luaL_dofile(L,"autorun.lua");file_write_string("autorun.lua","print('autorun file <2> s ')");luaL_dofile(L,"autorun.lua");luaL_dofile(L, "main.lua");}printf("exit\r\n");
}

运行结果:

led灯正产闪烁

其他:

启动文件再执行 __main 和 mian()函数之间会执行 __rt_entry函数,该函数会加载和执行

_sys_open 函数,配置STDIN  STDOUT STDERR等相关初始化工作。

lua移植到STM32F4全过程相关推荐

  1. Lua移植到arm上 并实现在arm上 可以让lua脚本调c语言,C语言调用lua脚本

    Lua移植到arm上 并实现在arm上 可以让lua脚本调c语言,C语言调用lua脚本 首先参考http://wiki.chumby.com/index.php?title=Lua&print ...

  2. Mobile Lua 6.5 发布,MoSync 的 Lua 移植版本

    MobileLua 是 MoSync 的 Lua 移植版本,MoSync 是移动设备上的跨平台开发系统.该项目的目的就是为了在大多数移动身边上运行 Lua 编写的程序. Mobile Lua 6.5 ...

  3. lua脚本移植到linux平台,如何将lua移植到arm平台的linux内核

    将脚本移植到内核是一件很酷的事情,lua已经被移植到NetBSD的内核中,也有一个叫lunatik的项目把lua移植到了linux内核,只可惜只支持x86,不支持arm,在网上搜索了下,没有找到现成的 ...

  4. wifi无线网卡(zd1211b芯片)移植到mini2440全过程(一)

    声明:本文参考自博文:http://www.360doc.com/content/11/0616/16/4591140_127391820.shtml# 本文参考上面博文实验过程发现原文有一些问题, ...

  5. stm32 移植java_把Lua移植到stm32上,效果不错! (amoBBS 阿莫电子论坛)

    因为我们产品的需要满足不同行业需求,所以一直在寻找一个脚本语言,以便灵活配置. 前段时间还自己花时间去实现一个C语言解释器,看了一堆编译原理的东西,以及虚拟机等,头都搞大了,把基本功能实现了,但总是不 ...

  6. linux madplay运行完成,Madplay移植到mini2440全过程详解

    madplay交叉编译 交叉编译器:arm-linux-gcc 3.4.1 PC环境:Ubuntu 8.10 注意:最好在root权限下执行以下移植,否则在make install时可能权限不够. 一 ...

  7. LVGL V0.01版本移植到STM32F4

    目录 LVGL简介 LVGL特点 LVGL运行的硬件要求 LVGL相关网址 LVGL源码下载 LVGL移植需求 LVGL移植过程 添加源码 添加源码头文件路径 修改堆栈大小 C99的支持 修改工程 编 ...

  8. 基于STM32F4的CANOpen移植教程(超级详细)

    CANopen移植到STM32F4平台 前言 1 物品准备 2 相关软件安装 2.1 CAN上位机 2.2 对象字典生成工具objdictedit环境配置 3 将CANopen移植到STM32F407 ...

  9. stm32f407wet6安装linux,elua移植到STM32F407VET6流程

    elua 移植到STM32F407VE76平台流程 1. 环境搭建 1.1 必要前提 1.1.1 软件 ubuntu操作系统,用于作为交叉编译的环境 git(没有的话apt-get install g ...

最新文章

  1. linux x window system下载,linux的x window system
  2. ios开发Base64编码以及加密相关学习
  3. Little Sub and Counting
  4. 洛谷——P1002 过河卒||codevs——T1010 过河卒
  5. JDK 14的新特性:更加好用的NullPointerExceptions
  6. 【转】什么是 Azure 资源管理器
  7. mysql常用内置函数_mysql常见内置函数
  8. python解析html xml最好的模块_python中处理xml的模块哪个好?
  9. oauth2.0 学习案例demo_Vue3教程:用 Vue3 开发小程序,这里有一份实际的代码案例!...
  10. 3-37Pytorch与torchvision
  11. Oracle Enterprise Manager打不开的解决方法
  12. 【题解】洛谷P4158 [SCOI2009] 粉刷匠(DP)
  13. [小改进]给链接增加了描述属性
  14. win10安装Visual Stdio2010教程及问题解决办法
  15. Filenet 周报(2019.12.23-2020.01.05)
  16. crt计算机图形系统是什么东西,计算机图形系统功能.PPT
  17. [面试问答] 面试常问的40个问题 附带经典答案!
  18. 阿里java面试流程_阿里巴巴JAVA开发工程师面试经验
  19. Django数据映射 一对一 一对多 多对多
  20. php eot,PHP EOT定界符的使用详解

热门文章

  1. 【解决The package java.awt is not accessible】
  2. [admin]-02
  3. tensorflow2 auto mpg汽车油耗预测实践(3.5节)
  4. Revit2020以及Revit2019安装以及激活配置教程
  5. 开源安全审计系统漏洞扫描工具lynis
  6. Pixelmator Pro For Mac图像处理软件V2.0.6下载地址
  7. springCache注解详解
  8. 笔记本通过hdmi连接显示器分辨率设置
  9. Windows server2016离线安装.NET Farmwork3.5
  10. Java使用DOM和DOM4J分别解析XML文件步骤以及代码