Lua移植到标准ANSI C环境

本文目录

  • 1、引言
  • 2、环境准备
    • 2.1 源码下载
    • 2.2 项目构建环境准备
  • 3、项目编译
    • 3.1 添加main.c
    • 3.2 Kconfig选择模块
    • 3.3 项目构建
    • 3.4 项目编译
  • 4、运行


文章对应视频教程:

在下方喔 ~~~ 欢迎关注


点击图片或链接访问我的B站主页~~~

lau解释器移植与功能验证


1、引言

本文将介绍如何将Lua解释器移植到标准的ANSI C环境。
实现ANSI C的移植,就可以实现在嵌入式各类板卡的移植。
当然,你的板卡得具备ANSI C环境,一般情况keil、GCC都会有C库实现。
关于Lua解释器的重要性,或者有何特殊指出,可以看看我得上篇文章:
《可用于嵌入式的解释器调研对比,及lua解释器介绍》


2、环境准备

2.1 源码下载

您可以在Lua官方网站上下载Lua解释器的源代码。以下是Lua官方网站的链接:

Lua解释器下载

在该网页上,点击的Lua解释器源代码的下载链接(图中红色框部分),进行源代码下载,可能有点慢。

在这里插入图片描述
下载完成后,进行接下,得到下图的文件,提取其中的src文件夹,将src中的makefilelua.cluac.c文件删除,待用。
在这里插入图片描述

2.2 项目构建环境准备

参考往期博客《Cmake+Kconfig项目构建》,搭建一个空的项目框架,用来测试Lua是否移植成功。

复制项目构建模板,修改名字,修改CMakeLists.txt和kconfig文件,方便后续模块化移植到自己的项目中,目录结构如下。

在这里插入图片描述
这里也可以直接复制到keil工程中,只要你的环境具有ANSI C接口即可。

将前面准备好的源码复制到source/lua文件夹下,注意是将src中的makefilelua.cluac.c文件删除后,剩下的代码。


3、项目编译

3.1 添加main.c

我们需要在main.c中实现对lua代码的解释功能。
由于我在window环境下,我可以很轻松的打开文件,所以直接采用的文件读取的方式执行。
大家也可以直接将代码写在内存中,类似与下面这种方式:

char buff[] = "printf(123)";

我这边的代码比较复杂,还是用读取文件实现。

main.c内容如下:

#include "stdio.h"
#include <stdlib.h>#include "lua.h"
#include "lauxlib.h"
#include "lualib.h"
#include "string.h"#define BUFFER_SIZE 1024*1024*1static lua_State *L = NULL ;int lua_deal_line(const char *str)
{int ret = luaL_dostring(L,str);if(ret != LUA_OK){printf("%s\r\n",lua_tostring(L ,-1));return -1;}	return 0;
}int main(void)
{L = luaL_newstate();luaL_openlibs(L);FILE *file;char buffer[BUFFER_SIZE] = {0};size_t read_size;// 打开文件file = fopen("test.lua", "rb"); // 使用"rb"模式以二进制方式读取文件if (file == NULL) {perror("无法打开文件");return 1;}// 读取文件内容到缓冲区read_size = fread(buffer, 1, BUFFER_SIZE - 1, file); // 保留一个字节给'\0'if (read_size == 0 && ferror(file)) {perror("read file error\r\n");fclose(file);return 1;}// 添加字符串末尾的空字符buffer[read_size] = '\0';// 关闭文件fclose(file);lua_deal_line(buffer);lua_close(L);return 1;
}

创建test.lua文件放在当前路径下。

-- Lua 基本语法
print("Running basic syntax test...")
assert(true)  -- 如果代码运行到这里,没有错误发生,那么基本语法测试通过-- Lua 数据类型
print("Running data type test...")
local num = 10          -- number
local str = "Hello"     -- string
local bool = true       -- boolean
local tbl = {1, 2, 3}   -- table
local func = function() return "I am a function" end  -- function
assert(type(num) == "number")
assert(type(str) == "string")
assert(type(bool) == "boolean")
assert(type(tbl) == "table")
assert(type(func) == "function")-- Lua 变量
print("Running variable test...")
local localVar = "I am local"
_G.globalVar = "I am global"
assert(localVar == "I am local")
assert(_G.globalVar == "I am global")-- Lua 循环
print("Running loop test...")
local sum = 0
for i = 1, 5 dosum = sum + i
end
assert(sum == 15)sum = 0
local i = 1
while i <= 5 dosum = sum + ii = i + 1
end
assert(sum == 15)-- Lua 流程控制
print("Running control flow test...")
local x = 10
local result
if x > 5 thenresult = "greater"
elseif x == 5 thenresult = "equal"
elseresult = "less"
end
assert(result == "greater")-- Lua 函数
print("Running function test...")
function add(a, b)return a + b
end
assert(add(5, 3) == 8)-- Lua 运算符
print("Running operator test...")
local a, b = 10, 20
assert(a + b == 30)
assert(a - b == -10)
assert(a * b == 200)
assert(a / b == 0.5)
assert(a % b == 10)
assert(a ^ 2 == 100)-- Lua 字符串
print("Running string test...")
local s = "Lua"
assert(#s == 3)
assert(s .. " programming" == "Lua programming")-- Lua 数组
print("Running array test...")
local arr = {10, 20, 30, 40, 50}
assert(arr[1] == 10)
assert(#arr == 5)-- Lua 迭代器
print("Running iterator test...")
local function squareIterator(max, current)current = current + 1if current <= max thenreturn current, current * currentend
end
local results = {}
for i, n in squareIterator, 5, 0 dotable.insert(results, n)
end
assert(#results == 5)
assert(results[1] == 1)
assert(results[5] == 25)-- Lua table(表)
print("Running table test...")
local person = {name = "John", age = 30}
assert(person.name == "John")
assert(person.age == 30)-- Lua 模块与包
print("Running module test...")
-- 假设有一个 module_name.lua 文件,内容如下:
-- local M = {}
-- function M.hello() return "Hello, module!" end
-- return M
-- local module = require("module_name")
-- assert(module.hello() == "Hello, module!")-- Lua 元表(Metatable)
print("Running metatable test...")
local mt = {__add = function(table1, table2)local sum = {}for k, v in pairs(table1) dosum[k] = v + table2[k]endreturn sumend
}
local t1 = {1, 2, 3}
local t2 = {4, 5, 6}
setmetatable(t1, mt)
local t3 = t1 + t2
assert(t3[1] == 5)
assert(t3[2] == 7)
assert(t3[3] == 9)-- Lua 协同程序(coroutine)
-- print("Running coroutine test...")
-- local co = coroutine.create(function()
--     for i = 1, 5 do
--         coroutine.yield(i)
--     end
-- end)
-- local _, first = coroutine.resume(co)
-- assert(first == 1)
-- local _, second = coroutine.resume(co)
-- assert(second == 2)-- Lua 文件 I/O
-- print("Running file I/O test...")
-- local file = io.open("test.txt", "w")
-- file:write("Hello, file!")
-- file:close()
-- file = io.open("test.txt", "r")
-- local content = file:read("*all")
-- file:close()
-- assert(content == "Hello, file!")-- Lua 错误处理
print("Running error handling test...")
local status, err = pcall(function()error("An error occurred")
end)
assert(not status)
assert(string.find(err, "An error occurred"))-- Lua 调试(Debug)
-- print("Running debug test...")
-- local debug = require("debug")
-- local traceback
-- local function myfunc()
--     traceback = debug.traceback("Stack trace")
-- end
-- myfunc()
-- assert(string.find(traceback, "Stack trace"))-- Lua 垃圾回收
print("Running garbage collection test...")
local tbl = {1, 2, 3}
setmetatable(tbl, {__gc = function() print("Garbage collected") end})
tbl = nil
collectgarbage()  -- 在控制台中应能看到 "Garbage collected"-- Lua 面向对象
print("Running object-oriented test...")
local Animal = {name = "", age = 0}
function Animal:new(o, name, age)o = o or {}setmetatable(o, self)self.__index = selfself.name = name or ""self.age = age or 0return o
end
function Animal:speak()return "I am " .. self.name .. ", " .. self.age .. " years old."
endlocal dog = Animal:new(nil, "Dog", 5)
assert(dog:speak() == "I am Dog, 5 years old.")print("All tests passed!")

3.2 Kconfig选择模块

project\pro1目录下,打开powershell,输入python .\ck_script.py cn进入到图形配置界面。

在这里插入图片描述

确保回车选中该模块,再按Q Y按键退出。


3.3 项目构建

在powershell,输入python .\ck_script.py b进行项目构建,构建完成后,对文件的编译规则就已经生成。
在这里插入图片描述


3.4 项目编译

在powershell,输入python .\ck_script.py m进行项目编译,结果如下。

在这里插入图片描述


4、运行

在powershell,输入.\lua.exe运行程序,结果如下。
在这里插入图片描述
这个Lua脚本验证了我们需要的基本语法、数据类型、变量、循环、流程控制、函数、运算符、字符串、数组、迭代器、table(表)、元表(Metatable)、错误处理、垃圾回收、面向对象等功能。


时间流逝、年龄增长,是自己的磨炼、对知识技术的应用,还有那不变的一颗对嵌入式热爱的心!

到这里就结束了!希望大家给我的文章和B站视频
点赞o( ̄▽ ̄)d、关注(o)/~、评论(▽)!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/849959.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

01Linux的安装,时区,固定IP的配置

Linux系统的简介与安装 Linux简介 计算机是由硬件和软件所组成 硬件&#xff1a;计算机系统中由电子,机械和光电元件等组成的各种物理装置的总称软件&#xff1a;是用户和计算机硬件之间的接口和桥梁&#xff0c;用户通过软件与计算机进行交流(操作系统) 操作系统作为用户和…

java-集合使用 2

Vector 类 Vector 类是基于动态数组的数据结构实现的&#xff0c;与 ArrayList 类似&#xff0c;但它是线程安全的。Vector 类的主要特点如下&#xff1a; - 允许包含重复元素&#xff1b; - 允许使用 null 值&#xff1b; - 线程安全&#xff1b; - 查询速度快&#xff0c;但插…

Visual 怎么编程:一场视觉与逻辑的奇妙旅程

Visual 怎么编程&#xff1a;一场视觉与逻辑的奇妙旅程 编程&#xff0c;这一曾经看似高不可攀的技术领域&#xff0c;如今随着可视化编程工具的普及&#xff0c;已逐渐走入寻常百姓家。那么&#xff0c;Visual 怎么编程&#xff1f;本文将从四个方面、五个方面、六个方面和七…

WEB漏洞服务能提供哪些帮助

在数字化浪潮的推动下&#xff0c;Web应用程序已成为企业展示形象、提供服务、与用户进行交互的重要平台。然而&#xff0c;随着技术的飞速发展&#xff0c;Web应用程序中的安全漏洞也日益显现&#xff0c;成为网络安全的重大隐患。这些漏洞一旦被恶意攻击者利用&#xff0c;可…

【Vue】面经基础版-首页请求渲染

步骤分析 1.安装axios 2.看接口文档&#xff0c;确认请求方式&#xff0c;请求地址&#xff0c;请求参数 3.created中发送请求&#xff0c;获取数据&#xff0c;存储到data中 4.页面动态渲染 代码实现 1.安装axios yarn add axios npm i axios 2.接口文档 请求地址: …

Java 数据库连接(JDBC)的使用,包括连接数据库、执行SQL语句等

一、简介 Java Database Connectivity&#xff08;JDBC&#xff09;是Java应用程序与关系数据库进行交互的一种API。它提供了一组用于访问和操作数据库的标准接口&#xff0c;使开发人员能够使用Java代码执行数据库操作&#xff0c;如查询、插入、更新和删除等。 二、JDBC架构…

除留取余法构造散列表--c++【做题记录】

【题目描述】 用除留取余法构造散列表&#xff0c;输入序列并实现查找操作。 【算法】 哈希函数使用除留余数法 若已知整个哈希表的最大长度 m&#xff0c;可以取一个不大于 m 的数 p&#xff0c;然后对该关键字 key 做取余运算&#xff0c;即&#xff1a;H&#xff08;key&a…

gbase 扩容 集群数据同步 主备切换

问题&#xff1a; 问题1磁盘满 1.原本是100G的大小&#xff0c;我们实际还没接入真正业务&#xff0c;昨日空间满了&#xff0c;需要帮忙看下是什么原因导致磁盘满的吗 数据库是每天备份一次&#xff0c;是不是备份的太频繁&#xff0c;还是数据量的问题导致&#xff0c;需要…

[工具探索]富士mini90拍立得使用指南

文章目录 1. 基本功能介绍1.1 相机外观1.2 电池与胶片 2. 设置相机2.1 装入电池2.2 装入胶片 3. 拍摄模式3.1 标准模式3.2 儿童模式3.3 远景模式3.4 双重曝光模式3.5 Bulb&#xff08;B&#xff09;模式3.6 **派对模式**3.7 微距模式3.8 **亮度模式**3.9 **定时拍摄模式**3.10 …

Elastic Search(ES)Java 入门实操(2)搜索代码

上篇解释了 ES 的基本概念和分词器。Elastic Search &#xff08;ES&#xff09;Java 入门实操&#xff08;1&#xff09;下载安装、概念-CSDN博客 Elastic Search&#xff08;ES&#xff09;Java 入门实操&#xff08;3&#xff09;数据同步-CSDN博客 这篇主要演示 Java 整合…

React Hooks 封装可粘贴图片的输入框组件(wangeditor)

需求是需要一个文本框 但是可以支持右键或者ctrlv粘贴图片&#xff0c;原生js很麻烦&#xff0c;那不如用插件来实现吧~我这里用的wangeditor插件&#xff0c;初次写初次用&#xff0c;可能不太好&#xff0c;但目前是可以达到实现需求的一个效果啦&#xff01;后面再改进吧~ …

个位为0的数字-第13届蓝桥杯省赛Python真题精选

[导读]&#xff1a;超平老师的Scratch蓝桥杯真题解读系列在推出之后&#xff0c;受到了广大老师和家长的好评&#xff0c;非常感谢各位的认可和厚爱。作为回馈&#xff0c;超平老师计划推出《Python蓝桥杯真题解析100讲》&#xff0c;这是解读系列的第81讲。 个位为0的数字&am…

秋招突击——算法打卡——6/6——复习{三数之和、考试最大困扰度}——快速新作{环形链表}

文章目录 复习最大考试困扰度三数之和——做的不好 新作环形链表实现代码 明天面试拼多多&#xff0c;因为今天面华为遇到了一个做过的题目&#xff0c;没做出来&#xff0c;关键是这个题目第一次做出来了&#xff0c;这次居然没有做出来&#xff0c;比较烦&#xff0c;所以今天…

光通信技术路线

自从1947年Bell实验室诞生第一支晶体管以来&#xff0c;芯片的尺寸大小和晶体管的集成度都遵循着“摩尔定律”进行飞速的发展。然而摩尔定律随着芯片尺寸的减小&#xff0c;进入到深亚微米或纳米量级之后&#xff0c;其发展也面临越来越严峻的挑战。近几年来虽然芯片上的晶体管…

标准发布实施 |《新能源电池工业废水处理技术指南磷酸铁锂电池》

T/ACEF 130&#xff0d;2024《新能源电池工业废水处理技术指南磷酸铁锂电池》欢迎各单位引用执行&#xff01;有课题也可联合立项&#xff01; 发布日期&#xff1a;2024年02月04日 实施日期&#xff1a;2024年03月01日 主要起草人&#xff1a;刘愿军、孙冬、丁炜鹏、何小芬…

【HarmonyOS】代码规范参考

【HarmonyOS】代码规范参考 一、通用原则 直白简单的逻辑代码比起注释来的更有意义&#xff1b; 空格、换行相关的规范&#xff0c;需使用IDE自带的格式化&#xff0c;快捷键是 CtrlAltL &#xff0c; 快速对代码进行格式化&#xff1b; 开发者不能为了快速开发而牺牲了代码…

whistle手机抓包

环境&#xff1a;whistle&#xff1a;2.9.59 whistle手机抓包&#xff08;ios可以抓小程序的包&#xff1b;安卓机不能抓小程序的包&#xff0c;但是小程序的有开发者工具就够用了&#xff09; 以安卓手机为例&#xff08;手机跟电脑要连同一个wifi&#xff09; 1.电脑安装w…

Django项目上线-报错汇总

Django项目上线-报错汇总 下列报错基本都是Python环境相关 pip install 报错 WARNING: pip is configured with locations that require TLS/SSL, however the ssl module in Python is not available. debian运行pip报错ssl module in Python is not available - z417 - 博…

4.00003 postgresql的内存管理 - 我是怎么获得可用内存的?

文章目录 从一个例子开始何时设置分配内存的函数?分配函数是何时生效的?分配函数的详细动作是什么?从一个例子开始 Breakpoint 1, MemoryContextCreate (node=0x1008940, tag=T_AllocSetContext, method_id=MCTX_ASET_ID, parent=0x1000fe0, name=0xe21351 "dynahash&…

计算机专业本科论文起稿咋写

举例基于SpringBoot的Java基础的旅游管理系统 摘要 随着旅游业的快速发展&#xff0c;传统的旅游管理方式已经难以满足现代企业的需求。为了提高旅游企业的管理水平和服务质量&#xff0c;本文设计并实现了一个基于SpringBoot框架的旅游管理系统。本文首先介绍了旅游管理系统的…