首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

FlexLua低代码单片机定时器中断功能一行代码实现

Timer

本教程的实现基于 FlexLua 低代码单片机技术,脱离复杂单片机C语言开发正逐渐成为一种快速高效的 IoT 硬件开发方式。即使新手不懂单片机开发也可很快很容易用FlexLua零门槛开发各种 IoT 硬件,更多教程请参考 FlexLua 官网。

一、Timer的介绍

ShineBlink Core提供一个10毫秒的Timer定时器,即每10毫秒Timer会触发一次回调函数的调用。做过单片机开发的同学应该知道这种机制就相当于10毫秒中断一次,程序会跳往中断函数执行相应的代码。

二、Timer存在的意义

Core提供的Timer是基于Lua语言,它的意义在于能够保证定时器在每个10毫秒间隔会立即执行我们在Lua代码中定义的 LIB_10msTimerCallback() 回调函数。这样就保证了一些任务的执行时间精度能够达到10毫秒。虽然和底层单片机的微秒级别定时器无法比拟,但对于Lua这种面向应用层的高级语言开发而言已经足矣。

三、用定时器Timer来保证代码执行时间的精确性

当我们编程中涉及到时间问题时,我们可以有两种选择:

使用延时函数LIB_DelayMs(),简单直接,但在有些情况下使用并不能达到期望的延时目的。

使用系统自带的10毫秒定时器及其回调函数LIB_10msTimerCallback(),相比较延时函数更精确。

1. 延时函数LIB_DelayMs()及其弊端

我们看下面的代码:

--开始大循环

while(GC(1) == true)

do

--延时1秒

LIB_DelayMs(1000)

--每隔1秒打印输出"hello world!"

print("hello world!")

end

上面的代码由于print(“hello world”)并不会阻塞很长时间,所以整个大循环能保证1秒执行一次“hello world”的打印工作,但假如在这个大循环里还有很多其他代码需要执行,那么整个大循环实际循环一次的时间是大于1秒的,这样也就无法使用LIB_DelayMs(1000)这个函数来保证1秒1次的大循环了,当然我们可以把1000降低一些,但是这个值是多少,得取决于您的实际代码。

2. 使用系统10毫秒定时器

从名字可以看出,定时器能保证代码执行时间的精确性达到10毫秒,10毫秒的精确性对用高级语言开发应用程序来说已经能够满足大多数应用了。由于这个10毫秒定时器是基于硬件底层中断所实现的,每10毫秒硬件会产生一次中断并自动调用您在代码中定义的LIB_10msTimerCallback()回调函数,所以能够保证实时性。

使用方法举例(一):基本用法

--定义10毫秒定时器的回调函数,函数名字必须是LIB_10msTimerCallback

function LIB_10msTimerCallback()

--执行一些实时性要求更高的代码,但代码一定不是阻塞型的

--建议在这里只做一些关键变量赋值的任务或一些非阻塞的任务

end

--使能系统10毫秒定时器开始工作

LIB_10msTimerConfig("ENABLE")

--开始大循环

while(GC(1) == true)

do

--do something

end

使用方法举例(二):编程技巧 -- 实现分时执行多种任务

--初始化变量

cnt1 = 0

cnt2 = 0

cnt3 = 0

--定义10毫秒定时器的回调函数,函数名字必须是LIB_10msTimerCallback

function LIB_10msTimerCallback()

cnt1 = cnt1 + 10

cnt2 = cnt2 + 10

cnt3 = cnt3 + 10

end

--使能系统10毫秒定时器开始工作

LIB_10msTimerConfig("ENABLE")

--开始大循环

while(GC(1) == true)

do

--每隔1秒打印一次 "hello world 1"

if cnt1 >= 1000 then

cnt1 = 0

print("hello world 1")

end

--每隔2秒打印一次 "hello world 2"

if cnt2 >= 2000 then

cnt2 = 0

print("hello world 2")

end

--每隔3秒打印一次 "hello world 3"

if cnt3 >= 3000 then

cnt3 = 0

print("hello world 3")

end

end

  • 发表于:
  • 原文链接https://page.om.qq.com/page/OO8lDSRqq5MD3ABwD7YG1-kw0
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券