lua移植到STM32F4全过程
基于之前了解到的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全过程相关推荐
- Lua移植到arm上 并实现在arm上 可以让lua脚本调c语言,C语言调用lua脚本
Lua移植到arm上 并实现在arm上 可以让lua脚本调c语言,C语言调用lua脚本 首先参考http://wiki.chumby.com/index.php?title=Lua&print ...
- Mobile Lua 6.5 发布,MoSync 的 Lua 移植版本
MobileLua 是 MoSync 的 Lua 移植版本,MoSync 是移动设备上的跨平台开发系统.该项目的目的就是为了在大多数移动身边上运行 Lua 编写的程序. Mobile Lua 6.5 ...
- lua脚本移植到linux平台,如何将lua移植到arm平台的linux内核
将脚本移植到内核是一件很酷的事情,lua已经被移植到NetBSD的内核中,也有一个叫lunatik的项目把lua移植到了linux内核,只可惜只支持x86,不支持arm,在网上搜索了下,没有找到现成的 ...
- wifi无线网卡(zd1211b芯片)移植到mini2440全过程(一)
声明:本文参考自博文:http://www.360doc.com/content/11/0616/16/4591140_127391820.shtml# 本文参考上面博文实验过程发现原文有一些问题, ...
- stm32 移植java_把Lua移植到stm32上,效果不错! (amoBBS 阿莫电子论坛)
因为我们产品的需要满足不同行业需求,所以一直在寻找一个脚本语言,以便灵活配置. 前段时间还自己花时间去实现一个C语言解释器,看了一堆编译原理的东西,以及虚拟机等,头都搞大了,把基本功能实现了,但总是不 ...
- linux madplay运行完成,Madplay移植到mini2440全过程详解
madplay交叉编译 交叉编译器:arm-linux-gcc 3.4.1 PC环境:Ubuntu 8.10 注意:最好在root权限下执行以下移植,否则在make install时可能权限不够. 一 ...
- LVGL V0.01版本移植到STM32F4
目录 LVGL简介 LVGL特点 LVGL运行的硬件要求 LVGL相关网址 LVGL源码下载 LVGL移植需求 LVGL移植过程 添加源码 添加源码头文件路径 修改堆栈大小 C99的支持 修改工程 编 ...
- 基于STM32F4的CANOpen移植教程(超级详细)
CANopen移植到STM32F4平台 前言 1 物品准备 2 相关软件安装 2.1 CAN上位机 2.2 对象字典生成工具objdictedit环境配置 3 将CANopen移植到STM32F407 ...
- stm32f407wet6安装linux,elua移植到STM32F407VET6流程
elua 移植到STM32F407VE76平台流程 1. 环境搭建 1.1 必要前提 1.1.1 软件 ubuntu操作系统,用于作为交叉编译的环境 git(没有的话apt-get install g ...
最新文章
- linux x window system下载,linux的x window system
- ios开发Base64编码以及加密相关学习
- Little Sub and Counting
- 洛谷——P1002 过河卒||codevs——T1010 过河卒
- JDK 14的新特性:更加好用的NullPointerExceptions
- 【转】什么是 Azure 资源管理器
- mysql常用内置函数_mysql常见内置函数
- python解析html xml最好的模块_python中处理xml的模块哪个好?
- oauth2.0 学习案例demo_Vue3教程:用 Vue3 开发小程序,这里有一份实际的代码案例!...
- 3-37Pytorch与torchvision
- Oracle Enterprise Manager打不开的解决方法
- 【题解】洛谷P4158 [SCOI2009] 粉刷匠(DP)
- [小改进]给链接增加了描述属性
- win10安装Visual Stdio2010教程及问题解决办法
- Filenet 周报(2019.12.23-2020.01.05)
- crt计算机图形系统是什么东西,计算机图形系统功能.PPT
- [面试问答] 面试常问的40个问题 附带经典答案!
- 阿里java面试流程_阿里巴巴JAVA开发工程师面试经验
- Django数据映射 一对一 一对多 多对多
- php eot,PHP EOT定界符的使用详解
热门文章
- 【解决The package java.awt is not accessible】
- [admin]-02
- tensorflow2 auto mpg汽车油耗预测实践(3.5节)
- Revit2020以及Revit2019安装以及激活配置教程
- 开源安全审计系统漏洞扫描工具lynis
- Pixelmator Pro For Mac图像处理软件V2.0.6下载地址
- springCache注解详解
- 笔记本通过hdmi连接显示器分辨率设置
- Windows server2016离线安装.NET Farmwork3.5
- Java使用DOM和DOM4J分别解析XML文件步骤以及代码