LiteOS组件尝鲜-玩转Lua

Posted LiteOS物联网操作系统

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了LiteOS组件尝鲜-玩转Lua相关的知识,希望对你有一定的参考价值。


编者按:前两期介绍了LiteOS的新特性,这一期小编给大家介绍一下Lua组件和它的执行过程lua由于语法构造简单易懂,受到很多开发者的青睐,下面就来介绍一下它的过人之处。



LiteOS组件尝鲜-玩转Lua






Lua的介绍




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






Lua的特性




  • 轻量级

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



  • 可扩展

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



  • 自动内存管理

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


  • Lua table(表)

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


  • 面向对象

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





使用介绍




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


LiteOS组件尝鲜-玩转Lua


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;endprint("the max num is ", max(1, 2))print("the max num is "max(43))


以上代码的作用是定义一个function,并执行它。

编译运行后,Lua Demo执行结果如下:


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




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

-- 初始化table1table1 = {}
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 = nilprint("table1 is ", table1)


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


key value1 "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 tabletable1 index OS is LiteOStable1 index language is Luatable1 is nilRun lua file finished.Lua demo task finished.




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

-- 通过table创建一个基类:圆、有半径、周长、面积三个属性。Circle = {radius = 0, circumference = 0, area = 0}-- 派生类方法newfunction 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 oend
function Circle:printCircumference() print("circumference of circle is ", self.circumference)end
function Circle:printArea() print("area of circle is ", self.area)end
-- 创建对象circle1circle1 = 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 10circumference of circle is 62.8area of circle is 314.0Run 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”到自己账号下,如下图。



LiteOS组件尝鲜-玩转Lua




- End -


以上是关于LiteOS组件尝鲜-玩转Lua的主要内容,如果未能解决你的问题,请参考以下文章

带你尝鲜LiteOS 组件EasyFlash

玩转LiteOS组件:Openexif

一起玩转玩转LiteOS组件:TinyFrame

一起玩转LiteOS组件:Opus

一起玩转玩转LiteOS组件:Opus

一起玩转LiteOS组件:Pixman