这一两天,我有点小空,抽空看了下LUA的基本语法,也试着自己写一些LUAT的一些简单的代码~
下面说说我的感受:
0、LUA语法结构啥的还是比较简单的,有C基础的,能很快上手~
1、LUAT编程跟普通MCU编程还是有一定的区别的~观看官方的例程代码:它的外设和任务集合在一个模块文件里面。几乎就是每个都是相对独立的存在,然后在main里面包含这些模块文件,然后系统RTOS就可以运行这些任务了。
2、所有的任务都是软任务,及RTOS层面的任务,没有硬件底层中断类似的硬任务。对应于实时性有很高要求的,估计还得考虑考虑这种方式~
3、各模块之间相互独立,我尝试早某一个模块里面调用另一个模块的一些外设的定义,结果并不好使,总是卡在里面。如在1.lua 里面我定义了一个引脚LED,然后在2.lua里面,我先加载1模块(require 1.lua),然后写个任务在里面调用LED。但是总是卡在,具体什么原因,我也不清楚~但是如果我直接在2.LUA里面再次定义LED,然后调用,就没有问题了。总之,我想像MCU里面那样随意调用头文件的方法,来获取一些外设失败了。当然也有可能是我对LUAT编程流程不是很熟悉的原因造成的~
下面我们编写2个任务,1个LED,一个串口接受,且通过指令开关另一个LED的程序:
bsp_led
- --- 模块功能:GPIO功能测试.
- -- [url=home.php?mod=space&uid=40524]@author[/url] openLuat
- -- [url=home.php?mod=space&uid=2811445]@Module[/url] gpio.testGpioSingle
- -- [url=home.php?mod=space&uid=285243]@license[/url] MIT
- -- [url=home.php?mod=space&uid=855824]@copyright[/url] openLuat
- -- [url=home.php?mod=space&uid=1054466]@release[/url] 2018.03.27
- require "pins"
- module(..., package.seeall)
- --[[
- 有些GPIO需要打开对应的ldo电压域才能正常工作,电压域和对应的GPIO关系如下
- pmd.ldoset(x,pmd.LDO_VSIM1) -- GPIO 29、30、31
- pmd.ldoset(x,pmd.LDO_VLCD) -- GPIO 0、1、2、3、4
- pmd.ldoset(x,pmd.LDO_VMMC) -- GPIO 24、25、26、27、28
- x=0时:关闭LDO
- x=1时:LDO输出1.716V
- x=2时:LDO输出1.828V
- x=3时:LDO输出1.939V
- x=4时:LDO输出2.051V
- x=5时:LDO输出2.162V
- x=6时:LDO输出2.271V
- x=7时:LDO输出2.375V
- x=8时:LDO输出2.493V
- x=9时:LDO输出2.607V
- x=10时:LDO输出2.719V
- x=11时:LDO输出2.831V
- x=12时:LDO输出2.942V
- x=13时:LDO输出3.054V
- x=14时:LDO输出3.165V
- x=15时:LDO输出3.177V
- ]]
- --LED0_FLG=0
- pmd.ldoset(15, pmd.LDO_VLCD)
- -- GPIO1配置为输出,默认输出低电平,可通过setGpio1Fnc(0或者1)设置输出电平
- --local LED0 = pins.setup(pio.P0_1, 0)-- 默认输出值为低(0)
- -- GPIO4配置为输出,默认输出低电平,可通过setGpio4Fnc(0或者1)设置输出电平
- local LED1 = pins.setup(pio.P0_4, 0)-- 默认输出值为低(0)
- --LED TAST
- --创建LED0任务
- -- sys.taskInit(function(delay)
- -- local tmpsta = 0
- -- while true do
- -- --tmpsta=1-tmpsta
- -- LED0(LED0_FLG)
- -- sys.wait(delay)
- -- --log.info("LED0 SHINE!rn")
- -- end
- -- end,1000)
- --定义任务
- -- --创建LED1任务
- sys.taskInit(function(delay)
- local tmpsta = 0
- while true do
- tmpsta=1-tmpsta
- LED1(tmpsta)
- sys.wait(delay)
- log.info("LED1 SHINE!rn")
- --uart.write(UART_ID,"LED1 SHINE!rn")
- end
- end,1000)
复制代码
bsp_usart
- require"utils"
- module(...,package.seeall)
- pmd.ldoset(15,pmd.LDO_VLCD)
- require"pm"
- pm.wake("uart")
- local UART_ID = 2
- --[[
- 函数名:write
- 功能 :通过串口发送数据
- 参数 :
- s:要发送的数据
- 返回值:无
- ]]
- function write(s)
- log.info("testUartTask.write",s)
- uart.write(UART_ID,s)
- end
- function writeOk()
- log.info("testUartTask.writeOk")
- end
- --注册串口的数据发送通知函数
- uart.on(UART_ID,"sent",writeOk)
- uart.on(UART_ID,"receive",function() sys.publish("UART_RECEIVE") end)
- --配置并且打开串口
- uart.setup(UART_ID,9600,8,uart.PAR_NONE,uart.STOP_1,0,0,0)
- --需要485通讯时打开下面的语句
- --uart.set_rs485_oe(UART_ID, pio.P0_19)
- --如果需要打开“串口发送数据完成后,通过异步消息通知”的功能,则使用下面的这行setup,注释掉上面的一行setup
- --uart.setup(UART_ID,115200,8,uart.PAR_NONE,uart.STOP_1,nil,1)
- --启动串口数据接收任务
- --sys.taskInit(taskRead2)
- --创建串口接受解析任务
- pmd.ldoset(15, pmd.LDO_VLCD)
- local LED0 = pins.setup(pio.P0_1, 0)-- 默认输出值为低(0)
- sys.taskInit(function (UART_ID)
- local cacheData = ""
- while true do
- sys.wait(20)
- local s = uart.read(UART_ID,"*l")
- if s == "" then
- if not sys.waitUntil("UART_RECEIVE",100) then
- --uart接收数据,如果100毫秒没有收到数据,则打印出来所有已收到的数据,清空数据缓冲区,等待下次数据接收
- --注意:
- --串口帧没有定义结构,仅靠软件延时,无法保证帧的完整性,如果对帧接收的完整性有严格要求,必须自定义帧结构(参考testUart.lua)
- --因为在整个GSM模块软件系统中,软件定时器的精确性无法保证,例如本demo配置的是100毫秒,在系统繁忙时,实际延时可能远远超过100毫秒,达到200毫秒、300毫秒、400毫秒等
- --设置的延时时间越短,误差越大
- if cacheData:len()>0 then
- log.info("testUartTask.taskRead","100ms no data, received length",cacheData:len())
- --数据太多,如果全部打印,可能会引起内存不足的问题,所以此处仅打印前1024字节
- --log.info("testUartTask.taskRead","received data",cacheData:sub(1,1024))
- --打印收到的hex
- --log.info("testUartTask.taskRead","received data",cacheData:sub(1,1024):toHex())
- --write(cacheData)
- uart.write(UART_ID,"You send data is :rn")
- uart.write(UART_ID,cacheData.."rn")
- if string.find (cacheData,"LED0ON",1) then
- LED0(1)
- uart.write(UART_ID,"LED0 ONrn")
- elseif string.find (cacheData,"LED0OFF",1) then
- LED0(0)
- uart.write(UART_ID,"LED0 OFFrn")
- else
- uart.write(UART_ID,"no useful cmdrn")
- end
- --uart.write(UART_ID,"UART INTERRUPTrn")
- --清空数据接受,为下次做准备
- cacheData = ""
- end
- end
- else
- cacheData = cacheData..s
- end
- end
- end,2)
复制代码
main里面包含模块:
- --加载tast
- require "bsp_Led"
- require "bsp_usart"
- --启动系统框架
- sys.init(0, 0)
- sys.run()
复制代码
下载到板上,查看一个LED定时闪烁:
在串口里面发送LED0ON和LED0OFF可以开关另一个LED~
|