LUA学习

发布时间 2023-10-27 11:01:06作者: __Zed

SDK架构

  1. 展锐8910平台底层是基于FreeRTOS写的,所以会在main中创建许多task,比如音频协议栈串口等等,LUA用到的是Lua virtual task任务,

  2. 脚本运行流程是,底层core通过启动Lua task运行Lua虚拟机,虚拟机会找到对应的main.lua逐行嵌套开始解析执行。main.lua最末尾一行代码为sys.run()来处理内部或外部的消息。

基础语法

不用写分号,不用写类型

  1. a = 1 默认定义是全局变量,如果要取消,需要写local a = 1

  2. 没有声明过的值都是nil,nil是一个类型,这个类型只有nil一个值

  3. 所有数值都是number型
    a, b ,c = 0xfe, 2e5, 8
    所有的print都是以十进制打印

  4. 数值型可以加减乘除左右移

string

  1. 单引号双引号都是表示string的 支持转义字符 [[ ]] 这里括住的会被原原本本输出
  2. c = a..b 相当于连接两个字符串
  3. c = tostring(10) n = tonumer("10") 失败成nil
  4. a表示字符串a的长度

函数

  1. 写法
function xxx(a,b)
...
end

也可以

xxx = function(a,b)
...
end
  1. 函数返回值默认nil,也可以return主动设置,可以返回多个值

table

  1. 默认数字下标,第一个是1!!!
a = {1, "abc", function() end, {}}
table.insert(a, "b") //尾插
table.insert(a, 2, "b") //自选位置
b = table.remove(a, 5) //b返回移除的值
a[8] = 1
print(#a) //长度,比如a[8]有,但是a[7]等照样没有
  1. 字符串下标
a = {
	a = 1,
	b = "1234",
	c = function() end,
	["d"] = 123
}
print(a["a"])
print(a.d)
  1. 全局表_G
a = 1
print(_G["a"])  // 1
print(_G["table"]["insert"]) //function

分支判断

  1. 布尔型 true false
  2. ~= ≥ ≤
  3. a and b a or b 会直接返回a或者b的值 not a 只会返回true/false
  4. nil false才是假 0都是真
  5. print(b>10 and "yes" or "no")
  6. 写法
if 1 > 10 then
XXX
elseif 2>10 then
XXX
else
xxx
end

循环

for i=1,10,2 do
    print(i)
	if i==5 then break end
end

步长也可以是负值

while n > 1 do
xxx
end

不支持自增自减 += -= 这些