如果 NodeMCU 计时器中的代码在我设置的计时器间隔内执行,会发生什么情况?
What will happen if codes inside a NodeMCU timer execute over the timer interval I set?
借助NodeMCU,我们可以轻松在esp8266芯片中创建定时器功能。
但是,我想知道如果定时器中的代码在我设置的定时器间隔内执行会发生什么情况?
请看下面的代码。
如果我设置一个间隔为 2 秒的计时器,并且这个计时器中的 "Something to do" 执行超过 2 秒,那么会发生什么?
tmr.alarm(0, 2000, 1, function ()
--Something to do
end)
a) "Something to do" 是否会在间隔达到 2 秒后终止?
b) 或者"Something to do"会一直执行到结束,下一个"Something to do"会延迟吗?
c) 或者这个计时器的每一轮都会等待 "Something to do" 完成而不考虑 2 秒的间隔? (区间自动扩大)
d) 否则?
该函数的行为与您想象的不同。通常当你需要提供一个回调函数时,回调会在事件发生时执行;这就是这里发生的事情。回调函数在定时器到期后执行。
tmr.alarm()
says that the function is a combination of tmr.register()
和 tmr.start()
的文档。 tmr.register()
文档说
Configures a timer and registers the callback function to call on expiry.
因此,您的答案是 "Something to do" 将 运行,直到它完成,在 2 秒后 tmr.alarm()
函数被调用。
tmr.alarm()
(以及它所基于的 tmr.register()
)可以采用 mode
参数。我将描述它们的行为以及回调函数的执行时间如何影响它们。
tmr.ALARM_SINGLE
: 运行 回调函数 仅在调用 tmr.alarm()
完成后 n 秒执行一次。完全独立于回调函数的执行时间。
tmr.ALARM_AUTO
: 运行 回调函数在调用 tmr.alarm()
完成后每 n 秒重复一次。重要的是要注意,下一个间隔在前一个间隔结束后立即开始,而不管回调的执行时间。所以如果回调需要0.5s执行完毕,定时器为2s,那么下一次调用会在回调函数执行完成后1.5s发生。
tmr.ALARM_SEMI
: 运行 调用 tmr.alarm()
完成 n 秒后的回调函数。不像tmr.ALARM_AUTO
下一个间隔不会自动开始,而是在你调用tmr.start()
之后才会开始;您可能应该在回调函数中执行此操作。这意味着您可以将计时器设置为依赖于回调函数的执行时间。如果计时器是 2 秒,并且您在回调函数结束时重新启动计时器,那么下一次回调将 运行 从那时起 2 秒。
您可能会说,您不希望回调函数的执行时间大于计时器周期,回调将不断堆叠在一起,永远不会结束。回调应该简单快速地执行,或许可以将额外的工作安排为另一项任务。
我相信大家对NodeMCU是什么类型的固件或者它需要什么样的编程模型存在误解。
The NodeMCU programming model is similar to that of Node.js, only in Lua. It is asynchronous and event-driven. Many functions, therefore, have parameters for callback functions.
来源:NodeMCU README, "Programming Model"
The Lua libraries provide a set of functions for declaring application functions (written in Lua) as callbacks (which are stored in the Lua registry) to associate application tasks with specific hardware and timer events. These are non-preemptive at an applications level* The Lua libraries work in consort with the SDK to queue pending events and invoke any registered Lua callback routines, which then run to completion uninterrupted.
来源:NodeMCU Lua 开发者常见问题
中的 "event tasking system" 章节
你是说
and "Something to do" inside this timer executes over 2 seconds
但事实是它永远不会 运行 持续 2 秒。事实上,任何 运行s 不间断超过几毫秒的任务都可能导致 Wifi 和 TCP 堆栈失败。如果您编写的代码违反了这一原则,那么看门狗可能会随时重置您的设备。您的代码触发的事件只需添加到队列中并按顺序执行。
因此,在大多数情况下,正确答案是 b)。
借助NodeMCU,我们可以轻松在esp8266芯片中创建定时器功能。 但是,我想知道如果定时器中的代码在我设置的定时器间隔内执行会发生什么情况?
请看下面的代码。 如果我设置一个间隔为 2 秒的计时器,并且这个计时器中的 "Something to do" 执行超过 2 秒,那么会发生什么?
tmr.alarm(0, 2000, 1, function ()
--Something to do
end)
a) "Something to do" 是否会在间隔达到 2 秒后终止?
b) 或者"Something to do"会一直执行到结束,下一个"Something to do"会延迟吗?
c) 或者这个计时器的每一轮都会等待 "Something to do" 完成而不考虑 2 秒的间隔? (区间自动扩大)
d) 否则?
该函数的行为与您想象的不同。通常当你需要提供一个回调函数时,回调会在事件发生时执行;这就是这里发生的事情。回调函数在定时器到期后执行。
tmr.alarm()
says that the function is a combination of tmr.register()
和 tmr.start()
的文档。 tmr.register()
文档说
Configures a timer and registers the callback function to call on expiry.
因此,您的答案是 "Something to do" 将 运行,直到它完成,在 2 秒后 tmr.alarm()
函数被调用。
tmr.alarm()
(以及它所基于的 tmr.register()
)可以采用 mode
参数。我将描述它们的行为以及回调函数的执行时间如何影响它们。
tmr.ALARM_SINGLE
: 运行 回调函数 仅在调用tmr.alarm()
完成后 n 秒执行一次。完全独立于回调函数的执行时间。tmr.ALARM_AUTO
: 运行 回调函数在调用tmr.alarm()
完成后每 n 秒重复一次。重要的是要注意,下一个间隔在前一个间隔结束后立即开始,而不管回调的执行时间。所以如果回调需要0.5s执行完毕,定时器为2s,那么下一次调用会在回调函数执行完成后1.5s发生。tmr.ALARM_SEMI
: 运行 调用tmr.alarm()
完成 n 秒后的回调函数。不像tmr.ALARM_AUTO
下一个间隔不会自动开始,而是在你调用tmr.start()
之后才会开始;您可能应该在回调函数中执行此操作。这意味着您可以将计时器设置为依赖于回调函数的执行时间。如果计时器是 2 秒,并且您在回调函数结束时重新启动计时器,那么下一次回调将 运行 从那时起 2 秒。
您可能会说,您不希望回调函数的执行时间大于计时器周期,回调将不断堆叠在一起,永远不会结束。回调应该简单快速地执行,或许可以将额外的工作安排为另一项任务。
我相信大家对NodeMCU是什么类型的固件或者它需要什么样的编程模型存在误解。
The NodeMCU programming model is similar to that of Node.js, only in Lua. It is asynchronous and event-driven. Many functions, therefore, have parameters for callback functions.
来源:NodeMCU README, "Programming Model"
The Lua libraries provide a set of functions for declaring application functions (written in Lua) as callbacks (which are stored in the Lua registry) to associate application tasks with specific hardware and timer events. These are non-preemptive at an applications level* The Lua libraries work in consort with the SDK to queue pending events and invoke any registered Lua callback routines, which then run to completion uninterrupted.
来源:NodeMCU Lua 开发者常见问题
中的 "event tasking system" 章节你是说
and "Something to do" inside this timer executes over 2 seconds
但事实是它永远不会 运行 持续 2 秒。事实上,任何 运行s 不间断超过几毫秒的任务都可能导致 Wifi 和 TCP 堆栈失败。如果您编写的代码违反了这一原则,那么看门狗可能会随时重置您的设备。您的代码触发的事件只需添加到队列中并按顺序执行。
因此,在大多数情况下,正确答案是 b)。