LiteOS组件尝鲜-玩转Lua

举报
Lionlace 发表于 2021/08/02 14:54:22 2021/08/02
【摘要】 这一期小编给大家介绍一下Lua组件和它的执行过程。lua由于语法构造简单易懂,受到很多开发者的青睐,下面就来介绍一下它的过人之处。


Lua的介绍

Lua是由巴西里约热内卢天主教大学里的一个研究小组于1993年用标准C语言开发的一种开源、轻量、小巧的脚本语言。可以方便的嵌入到应用程序中,为其提供灵活的扩展和丰富的定制功能。它语法构造简单易懂,受到很多开发者的青睐。

Lua的特性

轻量级:Lua使用标准C语言编写,编译后仅有100多k,可以轻松的嵌入到其他程序里。

可扩展:Lua没有提供很多功能,如网络,文件系统等,但它提供了丰富的扩展接口,可以直接调用C实现的接口来实现这些功能。

自动内存管理:Lua采用自动内存管理,自动运行垃圾回收器,在使用中不用考虑内存分配和使用后资源释放的问题。

Lua table(表):Lua只提供了一种通用类型的表,可以实现数组、哈希表、集合、对象等,可以用任意类型的值来作为数组的索引,但不能用nil作为索引。Lua table大小不固定,可以根据需要进行扩容。

面向对象:Lua的基本数据结构是table,可以通过table来表示对象的属性,通过function来表示对象的方法,以此来实现面向对象编程。


使用介绍

LiteOS组件化的方案,可以支持组件自动下载及部署,用户可以方便地通过make menuconfig配置方式从github下载Lua源码包,并将已调试好的patch包打入源码包中。

图片

Lua组件的源代码路径为https://gitee.com/LiteOS/LiteOS/tree/master/demos/language/lua。

在lua_demo.c中,实现将lua代码写入到/ramfs/test.lua文件中,并运行LuaMain()来执行lua脚本。(LuaMain()函数的位置在LiteOS/components/language/lua/lua-5.4.2/lua.c中。)

以下是lua_demo.c中提供的一个示例:

function max(a, b)
    if (a > b) then
        c = a;
    else
        c = b;
    end
    return c;
end
print("the max num is ", max(1, 2))
print("the max num is ", max(4, 3))

以上代码的作用是定义一个function,并执行它。编译运行后,Lua Demo执行结果如下:

app init!
Hello, welcome to liteos demo!
Lua demo task start to run.
Run lua file.
the max num is   2
the max num is   4
Run lua file finished.
Lua demo task finished.


以下是Lua table使用的一个示例:

-- 初始化table1
table1 = {}

table1[1] = "table"
table1["OS"] = "LiteOS"
table1["language"] = "Lua"

print("table1 index 1 is ", table1[1])
print("table1 index OS is ", table1["OS"])
print("table1 index language is ", table1["language"])
-- lua 垃圾回收会释放内存
table1 = nil
print("table1 is ", table1)

以上代码的内容是创建一个名为table1table,里面的keyvalue对应关系如下:

key         value
1           "table"
"OS"        "LiteOS"
"language"  "Lua"

修改lua_demo.c中的g_luaData,替换为以上lua代码,修改后,Lua Demo会将以上内容写入/ramfs/test.lua文件中,并运行LuaMain()来执行lua脚本。

编译运行后结果如下所示:

app init!
Hello, welcome to liteos demo!
Lua demo task start to run.
Run lua file.
table1 index 1 is   table
table1 index OS is   LiteOS
table1 index language is   Lua
table1 is   nil
Run lua file finished.
Lua demo task finished.

以下是Lua面向对象的一个示例:

-- 通过table创建一个基类:圆、有半径、周长、面积三个属性。
Circle = {radius = 0, circumference = 0, area = 0}
-- 派生类方法new
function Circle:new(o, radius)
    o = o or {}
    setmetatable(o, self)
    self.__index = self
    self.radius = radius or 0
    self.circumference = radius*2*3.14
    self.area = radius*radius*3.14
    return o
end

function Circle:printCircumference()
    print("circumference of circle is ", self.circumference)
end

function Circle:printArea()
    print("area of circle is ", self.area)
end

-- 创建对象circle1
circle1 = Circle:new(nil, 10)

-- 访问属性
print("circle1's radius is ", circle1.radius)

-- 访问成员函数
circle1:printCircumference()
circle1:printArea()

以上代码作用是定义一个Circle(圆)类,有radius(半径),circumference(周长)和are(面积)三个属性。构造方法为Circle:new(),并有两个成员函数Circle:printCircumference()和Circle:printArea()。修改lua_demo.c中的g_luaData为以上lua代码,修改后,Lua Demo会将以上内容写入/ramfs/test.lua文件中,并运行LuaMain()来执行lua脚本。编译运行后结果如下所示:

app init!
Hello, welcome to liteos demo!
Lua demo task start to run.
Run lua file.
circle1's radius is   10
circumference of circle is   62.8
area of circle is   314.0
Run lua file finished.
Lua demo task finished.


结语

以上就是Lua运行的全部过程啦,如果想更深入地学习lua运行机制,请参考lua源码路径:LiteOS/components/language/lua/lua-5.4.2

感谢您的阅读,有任何问题、建议,都可以留言给我们,让我们一起进步:  https://gitee.com/LiteOS/LiteOS/issues

为了更容易找到“LiteOS”代码仓建议访问https://gitee.com/LiteOS/LiteOS关注“ Watch”、点赞“Star”、并“Fork”到自己账号下,如下图。

图片


- End -

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。