chinese直男口爆体育生外卖, 99久久er热在这里只有精品99, 又色又爽又黄18禁美女裸身无遮挡, gogogo高清免费观看日本电视,私密按摩师高清版在线,人妻视频毛茸茸,91论坛 兴趣闲谈,欧美 亚洲 精品 8区,国产精品久久久久精品免费

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

解鎖:LuatOS框架的使用(下篇)

合宙LuatOS ? 來源:合宙LuatOS ? 作者:合宙LuatOS ? 2026-01-28 13:18 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

接上一篇

2.3 LuatOS定時(shí)器timer)

對(duì)于 LuatOS 應(yīng)用程序來說,定時(shí)器本質(zhì)上也算是一種特殊的消息,因?yàn)槎〞r(shí)器太常用了,所以把他單獨(dú)拎出來,單獨(dú)的一個(gè)章節(jié)進(jìn)行講解;

2.3.1 基本概念

LuatOS 定時(shí)器的分類如下:

wKgZPGl4kkSAKY5BAAQq2_3lukg008.png

LuatOS 定時(shí)器管理的 API 列表如下:

(1) 單次定時(shí)器創(chuàng)建并且啟動(dòng):sys.timerStart(cbfunc, timeout, ...)

(2) 循環(huán)定時(shí)器創(chuàng)建并且啟動(dòng):sys.timerLoopStart(cbfunc, timeout, ...)

(3) 單個(gè)定時(shí)器停止并且刪除:sys.timerStop(timer_id)

(4) 單個(gè)定時(shí)器停止并且刪除:sys.timerStop(cbfunc, ...)

(5) 多個(gè)定時(shí)器停止并且刪除:sys.timerStopAll(cbfunc)

(6) 阻塞等待一段時(shí)間(只能在 task 中使用):sys.wait(timeout)

(7) 阻塞等待全局消息或者阻塞等待一段時(shí)間(只能在 task 中使用):sys.waitUntil(msg, timeout)

(8) 阻塞等待定向消息或者阻塞等待一段時(shí)間(只能在 task 中使用):sys.waitMsg(task_name, msg, timeout)

2.3.2 定時(shí)器消息處理的完整周期

wKgZPGl5iMiAF_lXAAIElVSjPsQ069.png

2.3.3 sys.timerStart(cbfunc, timeout, ...)

功能

創(chuàng)建并且運(yùn)行一個(gè)單次定時(shí)器;

注意事項(xiàng)

可以在能夠執(zhí)行到的任意代碼位置使用此函數(shù);

有兩種方式可以唯一標(biāo)識(shí)一個(gè)定時(shí)器:

1、定時(shí)器 id;如果使用 sys.timerStart(cbfunc, timeout, ...)創(chuàng)建定時(shí)器成功,會(huì)返回定時(shí)器 id

2、定時(shí)器回調(diào)函數(shù) cbfunc 和可變參數(shù)...,此種方式的說明如下:

如果 cbfunc 和...相同,重復(fù)調(diào)用 sys.timerStart(cbfunc, timeout, ...)接口創(chuàng)建并且運(yùn)行定時(shí)器;

在 sys.timerStart 內(nèi)部會(huì)自動(dòng)停止并且刪除已經(jīng)存在的重復(fù)定時(shí)器;

例如執(zhí)行如下三行代碼后:

sys.timerStart(led_on_timer_cbfunc, 1000, "red")

sys.timerStart(led_on_timer_cbfunc, 2000, "red")

sys.timerStart(led_on_timer_cbfunc, 3000, "red")

最后只有 sys.timerStart(led_on_timer_cbfunc, 3000, "red") 這個(gè)定時(shí)器在運(yùn)行,前面創(chuàng)建的兩個(gè)定時(shí)器都被自動(dòng)刪除了,沒有完整運(yùn)行;

參數(shù)

cbfunc

wKgZPGl5iWmAe8oJAAPseoBLxbs548.png

timeout

wKgZO2l5iayACiXlAALsEkIIc_Y795.png

關(guān)于定時(shí)器精度的問題,我們?cè)賮砜聪旅孢@張圖來理解:

1、FreeRTOS中的一些任務(wù)優(yōu)先級(jí)比Lua虛擬機(jī)任務(wù)優(yōu)先級(jí)高,尤其是4G網(wǎng)絡(luò)中斷的任務(wù)優(yōu)先級(jí)最高,這些高優(yōu)先級(jí)的任務(wù)的搶占執(zhí)行,會(huì)直接影響Lua虛擬機(jī)任務(wù)執(zhí)行的實(shí)時(shí)性,進(jìn)而導(dǎo)致sys.run()調(diào)度器的運(yùn)行實(shí)時(shí)性也不會(huì)很高;

2、在Lua虛擬機(jī)任務(wù)內(nèi)部的sys.run()調(diào)度器中,首先是遍歷并且分發(fā)處理用戶全局消息隊(duì)列中的所有消息,這些消息全部處理完,才會(huì)去執(zhí)行內(nèi)核消息隊(duì)列中的第一條消息,定時(shí)器事件到達(dá)的消息是存儲(chǔ)在內(nèi)核消息隊(duì)列中的,如果用戶全局消息隊(duì)列中的消息處理耗時(shí)較長(zhǎng),或者內(nèi)核消息隊(duì)列中在定時(shí)器消息之前還有其他消息(例如串口消息,mqtt消息等),定時(shí)器消息都要排隊(duì)才能執(zhí)行,所以整個(gè)項(xiàng)目的業(yè)務(wù)越復(fù)雜,系統(tǒng)負(fù)載就越重,消息數(shù)量就越多,定時(shí)器消息處理的實(shí)時(shí)性就越低;

wKgZO2l5ifmABS5kAAH6MFes2Iw393.pngwKgZPGl5ihqAZJVMAAGAlnCBXRk834.png


返回值

local timer_id = sys.timerStart(cbfunc, timeout, ...)

有一個(gè)返回值為 timer_id

timer_id

wKgZPGl5ikeADv-sAAClwSd4-m4181.png

示例

wKgZO2l5inuAdUnlAANr_qigtoI384.png

2.3.4 sys.timerLoopStart(cbfunc, timeout, ...)

功能

創(chuàng)建并且運(yùn)行一個(gè)循環(huán)定時(shí)器;

注意事項(xiàng)

可以在能夠執(zhí)行到的任意代碼位置使用此函數(shù);

有兩種方式可以唯一標(biāo)識(shí)一個(gè)定時(shí)器:

1、定時(shí)器 id;如果使用 sys.timerLoopStart(cbfunc, timeout, ...)創(chuàng)建定時(shí)器成功,會(huì)返回定時(shí)器 id

2、定時(shí)器回調(diào)函數(shù) cbfunc 和可變參數(shù)...,此種方式的說明如下:

如果 cbfunc 和...相同,重復(fù)調(diào)用 sys.timerLoopStart(cbfunc, timeout, ...)接口創(chuàng)建并且運(yùn)行定時(shí)器;

在 sys.timerLoopStart 內(nèi)部會(huì)自動(dòng)停止并且刪除已經(jīng)存在的重復(fù)定時(shí)器;

例如執(zhí)行如下三行代碼后:

sys.timerLoopStart(led_on_timer_cbfunc, 1000, "red")

sys.timerLoopStart(led_on_timer_cbfunc, 2000, "red")

sys.timerLoopStart(led_on_timer_cbfunc, 3000, "red")

最后只有 sys.timerLoopStart(led_on_timer_cbfunc, 3000, "red") 這個(gè)定時(shí)器在運(yùn)行,前面創(chuàng)建的兩個(gè)定時(shí)器都被自動(dòng)刪除了,沒有完整運(yùn)行;

參數(shù)

cbfunc

wKgZO2l5irWAE9AYAAPlzZ-Khbk623.png

timeout

wKgZO2l5it6ABWDTAAK8O1bGW8U715.png

...

wKgZPGl5ihqAZJVMAAGAlnCBXRk834.png

返回值

local timer_id = sys.timerLoopStart(cbfunc, timeout, ...)

有一個(gè)返回值為 timer_id

timer_id

wKgZPGl5ikeADv-sAAClwSd4-m4181.png

示例

wKgZPGl5i3mATNC9AAOua9L2Zfg360.png

2.3.5 sys.timerStop(timer_id)

功能

根據(jù)定時(shí)器 id 停止運(yùn)行并且刪除一個(gè)定時(shí)器;

注意事項(xiàng)

可以在能夠執(zhí)行到的任意代碼位置使用此函數(shù);

有兩種方式可以唯一標(biāo)識(shí)一個(gè)定時(shí)器:

1、定時(shí)器 id;如果使用 sys.timerStart(cbfunc, timeout, ...)或者 sys.timerLoopStart(cbfunc, timeout, ...)創(chuàng)建定時(shí)器成功,會(huì)返回定時(shí)器 id

2、定時(shí)器回調(diào)函數(shù) cbfunc 和可變參數(shù)...;

參數(shù)

timer_id

wKgZPGl5i66AUwuJAAGx8Kkwvto177.png

返回值

nil

示例

wKgZO2l5i9uADSDBAAJqA3LuyXw638.png

2.3.6 sys.timerStop(cbfunc, ...)

功能

根據(jù)定時(shí)器的回調(diào)函數(shù) cbfunc 和可變參數(shù)...停止運(yùn)行并且刪除一個(gè)定時(shí)器;

注意事項(xiàng)

可以在能夠執(zhí)行到的任意代碼位置使用此函數(shù);

有兩種方式可以唯一標(biāo)識(shí)一個(gè)定時(shí)器:

1、定時(shí)器 id;如果使用 sys.timerStart(cbfunc, timeout, ...)或者 sys.timerLoopStart(cbfunc, timeout, ...)創(chuàng)建定時(shí)器成功,會(huì)返回定時(shí)器 id;

2、定時(shí)器回調(diào)函數(shù) cbfunc 和可變參數(shù)...;

參數(shù)

cbfunc

wKgZPGl5jBaAdxHGAAHYVn8Evfo984.png

返回值

nil

示例

wKgZO2l5jD-AORGnAAKDJqKLMZ4883.png

2.3.7 sys.timerStopAll(cbfunc)

功能

停止運(yùn)行并且刪除回調(diào)函數(shù)為 cbfunc 的所有定時(shí)器;

注意事項(xiàng)

可以在能夠執(zhí)行到的任意代碼位置使用此函數(shù);

參數(shù)

cbfunc

wKgZPGl5jJGAJlhFAAHV8UC37Ms927.png


返回值

nil

示例

wKgZPGl5jMCARM5fAAJHA0zHVkA257.png

2.3.8 sys.wait(timeout)

功能

在 task 中阻塞等待一段時(shí)間;

注意事項(xiàng)

只能在基礎(chǔ) task 和高級(jí) task 處理函數(shù)的業(yè)務(wù)邏輯中使用此函數(shù);

參數(shù)

timeout

wKgZPGl5jP6AbCEuAALj4_dAryo003.png

返回值

nil

示例

wKgZO2l5jSKASzhtAAGW3SMDL94365.png

sys.waitUntil(msg, timeout)

功能

在 task 中阻塞等待一個(gè)全局消息;

注意事項(xiàng)

只能在基礎(chǔ) task 和高級(jí) task 處理函數(shù)的業(yè)務(wù)邏輯中使用此函數(shù);

sys.publish(msg, ...) 和 sys.waitUntil(msg, timeout)配合使用時(shí):

在 sys.publish(msg, ...)之前,必須保證 task 正在 sys.waitUntil(msg, timeout)代碼處,處于阻塞等待狀態(tài);

這樣才能保證發(fā)布的 msg 消息可以被 task 處理;

同一個(gè)全局消息 msg,可以被多個(gè)正在 sys.waitUntil(msg, timeout)代碼處阻塞等待的 task 處理;

參數(shù)

msg

wKgZO2l5jXKAOKtKAAELGtZTi4Q635.png

timeout

wKgZO2l5jb-ATELSAALfu9AnAS8899.png

返回值

local result, arg1, arg2, arg3, argN = sys.waitUntil(msg, timeout)

有數(shù)量不固定的返回值:

第一個(gè)返回值為 result

剩余的返回值 arg1, arg2, arg3, argN,表示可變數(shù)量的返回值,只有當(dāng)?shù)谝粋€(gè)返回值 result 為 true 時(shí),這些可變數(shù)量的返回值才有意義,和 sys.publish(msg, ...)中...表示的可變參數(shù)一一對(duì)應(yīng)

result

wKgZPGl5jeqAZuwoAACMNT6uuF0973.png

arg1, arg2, arg3, argN

wKgZO2l5jg-ABU9jAAFLkl6IQRs577.png

正確示例

wKgZO2l5jjSAS44QAAJ8y9jsS8w832.png

錯(cuò)誤示例

wKgZPGl5jmWAB1yIAAS26S7PyW4542.png

2.3.9 sys.waitUntil(msg, timeout)

功能

在 task 中阻塞等待一個(gè)全局消息;

注意事項(xiàng)

只能在基礎(chǔ) task 和高級(jí) task 處理函數(shù)的業(yè)務(wù)邏輯中使用此函數(shù);

sys.publish(msg, ...) 和 sys.waitUntil(msg, timeout)配合使用時(shí):

在 sys.publish(msg, ...)之前,必須保證 task 正在 sys.waitUntil(msg, timeout)代碼處,處于阻塞等待狀態(tài);

這樣才能保證發(fā)布的 msg 消息可以被 task 處理;

同一個(gè)全局消息 msg,可以被多個(gè)正在 sys.waitUntil(msg, timeout)代碼處阻塞等待的 task 處理;

參數(shù)

msg

wKgZO2l5jvWABEqBAAEEvForwx8734.png

timeout

wKgZPGl5j0WAPtOIAAM3M-ODO78549.png

返回值

local result, arg1, arg2, arg3, argN = sys.waitUntil(msg, timeout)

有數(shù)量不固定的返回值:

第一個(gè)返回值為 result

剩余的返回值 arg1, arg2, arg3, argN,表示可變數(shù)量的返回值,只有當(dāng)?shù)谝粋€(gè)返回值 result 為 true 時(shí),這些可變數(shù)量的返回值才有意義,和 sys.publish(msg, ...)中...表示的可變參數(shù)一一對(duì)應(yīng)

result

wKgZO2l5j6KAPkznAACYZ0rjEDM375.png

arg1, arg2, arg3, argN

wKgZO2l5j8SAE5ciAAFeinrIO_Y715.png

正確示例

wKgZO2l5j-6Af4_OAAK-Iqwh464720.png

錯(cuò)誤示例

wKgZPGl5kBiAUnyCAAU_iZyCDCk829.png

2.3.10 sys.waitMsg(task_name, msg, timeout)

功能

在 task 中阻塞等待名稱為 task_name 的 task 的定向消息;

注意事項(xiàng)

只能在高級(jí) task 處理函數(shù)的業(yè)務(wù)邏輯中使用此函數(shù);

sys.sendMsg(task_name, msg, arg2, arg3, arg4)是定向消息的生產(chǎn)者,定向消息有生產(chǎn)就會(huì)有消費(fèi),不然消息就沒有存在的意義了;

sys.waitMsg(task_name, msg, timeout)所在的 task 是定向消息的消費(fèi)者;

sys.sendMsg(task_name, msg, arg2, arg3, arg4) 和 sys.waitMsg(task_name, msg, timeout)配合使用;

在 sys.sendMsg(task_name, msg, arg2, arg3, arg4)之前,需要保證名稱為 task_name 的 task 已經(jīng)被創(chuàng)建,否則定向消息也會(huì)丟失;

參數(shù)

task_name

wKgZO2l5kF6AEPGlAAFI5TmTkqo339.png

msg

wKgZO2l5kJeAD2wQAAE6EKR7DIE871.png

timeout

wKgZO2l5kMqAFXZuAAOiq9SWfbY254.png

返回值

local message = sys.waitMsg(task_name, msg, timeout)

有一個(gè)返回值為 message

message

wKgZO2l5kPiAJ8S8AAFgJIfaSik771.png

示例

wKgZPGl5kR-ABCziAAPFneV50Js273.png

2.3.11 定時(shí)器代碼示例

在了解了定時(shí)器的 api 之后,我們?cè)倏聪聢D回顧一下定時(shí)器消息處理的完整周期

wKgZPGl5kU-ATtEXAAIDT-6tBxU419.png


下面這個(gè)例子用來說明定時(shí)器的使用方法;

這個(gè)例子的完整代碼鏈接:timer.lua

核心代碼片段如下,我們首先分析下這段代碼的業(yè)務(wù)邏輯

wKgZPGl5kYeACPgoAAjR6l_S81o706.png

我們?cè)?a href="http://www.brongaenegriffin.com/analog/" target="_blank">模擬器上實(shí)際運(yùn)行一下看看,輸入命令

luatos --llt=H:Luatoolsprojectluatos_framework_luatos_task_Air8000.ini

運(yùn)行日志如下:

wKgZO2l5kbWAAgBvAAIsw0j1eww356.png

我們結(jié)合運(yùn)行日志分析一下代碼的業(yè)務(wù)邏輯是否執(zhí)行正常;

2.4 task 內(nèi)部運(yùn)行環(huán)境 vs task 外部運(yùn)行環(huán)境

在前文內(nèi)容中,我們提到了應(yīng)用腳本代碼的兩種運(yùn)行環(huán)境;當(dāng)時(shí)僅僅對(duì)這兩種概念做了一個(gè)初步的介紹,并沒有結(jié)合示例來講解,現(xiàn)在我們已經(jīng)學(xué)習(xí)了 task,msg,timer,可以結(jié)合 task,msg,timer 來舉一些實(shí)際的例子,來進(jìn)一步理解這兩種運(yùn)行環(huán)境;

2.4.1 基本概念

首先復(fù)現(xiàn)一下這兩種運(yùn)行環(huán)境的概念:

在 LuatOS 應(yīng)用腳本開發(fā)過程中,我們所編寫的應(yīng)用腳本代碼,存在兩種業(yè)務(wù)邏輯的運(yùn)行環(huán)境:

1、一種是在 task 的任務(wù)處理函數(shù)內(nèi)部的業(yè)務(wù)環(huán)境中運(yùn)行,我們簡(jiǎn)稱為:在 task 內(nèi)部運(yùn)行;

2、一種是在 task 的任務(wù)處理函數(shù)外部的業(yè)務(wù)環(huán)境中運(yùn)行,我們簡(jiǎn)稱為:在 task 外部運(yùn)行;

怎么理解這兩種業(yè)務(wù)邏輯運(yùn)行環(huán)境?我們看下面這張圖

看右邊生長(zhǎng)出分支的這棵大樹,這棵大樹就是 FreeRTOS 創(chuàng)建的 Lua 虛擬機(jī) task,是一個(gè) FreeRTOS task;

在這個(gè) Lua 虛擬機(jī) FreeRTOS task 上,這棵大樹再分為兩部分:

1、樹干部分:樹干部分運(yùn)行的業(yè)務(wù)邏輯環(huán)境就是 LuatOS task 外部運(yùn)行環(huán)境;

2、樹枝部分:每個(gè)樹枝都是一個(gè)獨(dú)立的 LuatOS task,樹枝部分運(yùn)行的業(yè)務(wù)邏輯環(huán)境就是 LuatOS task 內(nèi)部運(yùn)行環(huán)境;

wKgZO2l5kkKAambYAAK7rRi06EA025.pngwKgZO2l5kliAJofzAAH6iI_JlcI964.png

2.4.2 sys api 需要的運(yùn)行環(huán)境

接下來對(duì) task、msg、timer 的 api 需要的運(yùn)行環(huán)境做一個(gè)說明

wKgZO2l5ksCAaA0WAAD7BUIQ0IA277.png

從以上表格可以看出,sys 核心庫中的 api,從需要的運(yùn)行環(huán)境來看,分為以下三類:

1、大部分的 api,既可以在 task 內(nèi)部運(yùn)行,也可以在 task 外部運(yùn)行;

2、sys.waitUntil,sys.waitMsg,sys.wait,這三個(gè) spi,只能在 task 內(nèi)部運(yùn)行;

3、sys.run,只能在 task 外部運(yùn)行;

2.4.3 sys api 的回調(diào)函數(shù)提供的運(yùn)行環(huán)境

wKgZO2l5kv-AS1WqAABYajvo7d0125.png

從以上表格可以看出,sys 核心庫中的 api,如果支持回調(diào)函數(shù),這些回調(diào)函數(shù)內(nèi)部提供的運(yùn)行環(huán)境,分為以下兩類:

sys.taskInitEx(task_func, task_name,non_targeted_msg_cbfunc, ...)中的回調(diào)函數(shù)non_targeted_msg_cbfunc,提供的是 task 內(nèi)部運(yùn)行環(huán)境;

sys.subscribe(msg,msg_cbfunc),sys.timerStart(cbfunc, timeout, ...),sys.timerLoopStart(cbfunc, timeout, ...)中的回調(diào)函數(shù),提供的是 task 外部運(yùn)行環(huán)境;所以這些回調(diào)函數(shù)內(nèi)部不能調(diào)用“只能在 task 內(nèi)部運(yùn)行”的 api,例如在 sys.subscribe(msg,msg_cbfunc)的msg_cbfunc內(nèi)部不能調(diào)用 sys.waitUntil,sys.waitMsg,sys.wait;

2.4.4 常犯的錯(cuò)誤

新接觸 LuatOS 開發(fā)的用戶,經(jīng)常會(huì)犯上面黃色背景標(biāo)注的這個(gè)錯(cuò)誤;

下面這個(gè)例子用來說明常犯的這種錯(cuò)誤;

這個(gè)例子的完整代碼鏈接:task_inout_env_err.lua

核心代碼片段如下,我們首先分析下這段代碼的業(yè)務(wù)邏輯(實(shí)際運(yùn)行演示時(shí),每次打開三段黃色背景代碼中的其中一段)

wKgZPGl5kzqAGCQHAAY3mfQXB6I297.png

我們?cè)谀M器上實(shí)際運(yùn)行一下看看,輸入命令

luatos --llt=H:Luatoolsprojectluatos_framework_luatos_task_Air8000.ini

運(yùn)行日志如下:

wKgZO2l5k3GAWcSnAAHQEv7xslw824.pngwKgZPGl5k5OAHaaBAAGcNkYN32U892.pngwKgZO2l5k6mADmNeAACfWDndLks108.png

2.5 sys 核心庫 api 的組合使用關(guān)系

我們已經(jīng)學(xué)習(xí)過了 sys 核心庫中的 task,msg,timer 的 api,在這些 api 中:

1、有些 api 必須在一起組合使用,才能實(shí)現(xiàn)完整的業(yè)務(wù)流程;

2、有些 api 禁止在一起組合使用,否則會(huì)導(dǎo)致業(yè)務(wù)出錯(cuò);

在這些 api 中,主要是消息的發(fā)送和接收 api 容易混用,組合使用關(guān)系參考下表(每一行的兩個(gè)單元格所表示的 api 必須組合使用):

wKgZPGl5k-GAWbG7AABD2MLwXII992.png

2.6 LuatOS 應(yīng)用軟件調(diào)度機(jī)制(sys.run()函數(shù))

1、sys 核心庫是 LuatOS 運(yùn)行框架庫,是 LuatOS 應(yīng)用程序運(yùn)行的核心大腦,所有 LuatOS 應(yīng)用項(xiàng)目都會(huì)使用到 sys 核心庫;

2、截止到目前,我們已經(jīng)學(xué)習(xí)了 sys 核心庫提供的 task,msg,timer 功能;

3、sys 核心庫還剩最后一個(gè)功能 api,sys.run();

4、sys 核心庫是 LuatOS 應(yīng)用程序運(yùn)行的核心大腦,sys.run()是 sys 核心庫的大腦,負(fù)責(zé)整個(gè) LuatOS 應(yīng)用腳本程序的調(diào)度和管理,是 LuatOS 應(yīng)用程序的調(diào)度器;

sys.run()非常重要,但是 sys.run()使用起來非常簡(jiǎn)單,僅僅在 main.lua 的最后一行調(diào)用 sys.run()即可。

雖然 sys.run()使用起來非常簡(jiǎn)單,但是如果大家對(duì) sys.run()的運(yùn)行原理有一個(gè)總體性的理解和認(rèn)識(shí),對(duì)開發(fā) LuatOS 應(yīng)用項(xiàng)目來說,幫助很大。

所以在這里,我先對(duì) sys.run()內(nèi)部的工作原理做一個(gè)簡(jiǎn)化后的總體介紹,至于更詳細(xì)的原理介紹,我們會(huì)在后續(xù)的 LuatOS 直播課程中講解;

wKgZO2l5lD6AV3HoAAIPE04WXQk095.png

我們看上面這張圖:

1、LuatOS 內(nèi)核固件中的 FreeRTOS 會(huì)創(chuàng)建一個(gè) Lua 虛擬機(jī)任務(wù);

2、Lua 虛擬機(jī)任務(wù)的處理函數(shù)中,首先進(jìn)行初始化:

(1) 在內(nèi)核固件的 C 代碼中,加載 Lua 標(biāo)準(zhǔn)庫和 LuatOS 核心庫;

(2) 從 LuatOS 的腳本分區(qū)找到 main.lua

(3) 開始逐行嵌套解析執(zhí)行 main.lua 中的腳本代碼(加載必要的擴(kuò)展庫腳本文件和自己開發(fā)的應(yīng)用腳本文件,并且運(yùn)行這些腳本文件的初始化代碼)

3、運(yùn)行 main.lua 的最后一行代碼 sys.run()

4、sys.run()中的實(shí)現(xiàn)是一個(gè) while true 循環(huán),在這個(gè)循環(huán)內(nèi),不斷地從內(nèi)核消息隊(duì)列和用戶全局消息隊(duì)列中讀取消息,并且分發(fā)消息給接收者進(jìn)行處理。

wKgZO2l5lLCAE3R9AAI3YwJuOEs956.png

2.7 分析 mqtt demo 中的 task,msg,timer,run 的使用案例

現(xiàn)在,LuatOS 框架的使用,基本上講完了,接下來,我們來實(shí)際看一個(gè)完整 mqtt demo 項(xiàng)目代碼,重點(diǎn)分析下這份 demo 項(xiàng)目代碼中,使用到的本章節(jié)講解的知識(shí)點(diǎn);

mqtt demo 代碼路徑:Air8000 mqtt demo;

Mqtt demo 項(xiàng)目的總體設(shè)計(jì)框圖如下:

wKgZO2l5lRKAeusiAAJo4mDA38M507.png

這份mqtt demo中的readme文件,以及代碼中的注釋都比較詳細(xì),接下來我用vscode直接打開這份demo項(xiàng)目代碼,從以下幾方面講解一下:

1、先總體看一下mqtt demo的readme文件,讓大家對(duì)這個(gè)demo項(xiàng)目的業(yè)務(wù)邏輯有一個(gè)總體的認(rèn)識(shí);

2、從以下幾方面來詳細(xì)分析mqtt demo項(xiàng)目代碼:

mqtt demo項(xiàng)目腳本的整體運(yùn)行邏輯;

mqtt demo項(xiàng)目腳本中使用到的LuatOS task,message,timer,調(diào)度器代碼解讀;

通過分析和本篇文章有關(guān)的代碼,讓大家對(duì)本節(jié)理解更加深刻;

現(xiàn)在我們開始進(jìn)入mqtt demo項(xiàng)目中去分析;

三、課后作業(yè)

至少二選一

3.1 開發(fā)代碼,在 LuatOS 模擬器 上驗(yàn)證可以同時(shí)運(yùn)行的定時(shí)器數(shù)量

作業(yè)提交內(nèi)容:

1、 6 個(gè) Lua 文件

(1) main.lua:初始化,加載下面的 5 個(gè) lua 文件功能模塊(每次只打開其中的 1 個(gè)進(jìn)行驗(yàn)證),執(zhí)行 sys.run;(可以參考本講課程中的 demo)

(2) timer_start.lua:使用 sys.timerStart 接口來驗(yàn)證可以同時(shí)運(yùn)行的定時(shí)器數(shù)量;

(3) timer_loop_start.lua:使用 sys.timerLoopStart 接口來驗(yàn)證可以同時(shí)運(yùn)行的定時(shí)器數(shù)量;

(4) wait.lua:使用 sys.wait 接口來驗(yàn)證可以同時(shí)運(yùn)行的定時(shí)器數(shù)量;

(5) wait_until.lua:使用 sys.waitUntil 接口來驗(yàn)證可以同時(shí)運(yùn)行的定時(shí)器數(shù)量;

(6) wait_msg.lua:使用 sys.waitMsg 接口來驗(yàn)證可以同時(shí)運(yùn)行的定時(shí)器數(shù)量;

2、1 個(gè)運(yùn)行日志文件

3、1 個(gè)分析文件,給出可以同時(shí)運(yùn)行多少個(gè)定時(shí)器的結(jié)論,然后結(jié)合代碼和日志分析出來為什么可以同時(shí)運(yùn)行這么多的定時(shí)器;

3.2 開發(fā)代碼,在 Air 系列模組的開發(fā)板或者核心板 上驗(yàn)證可以同時(shí)運(yùn)行的定時(shí)器數(shù)量

作業(yè)提交內(nèi)容:

1、 6 個(gè) Lua 文件

(1) main.lua:初始化,加載下面的 5 個(gè) lua 文件功能模塊(每次只打開其中的 1 個(gè)進(jìn)行驗(yàn)證),執(zhí)行 sys.run;(可以參考本講課程中的 demo)

(2) timer_start.lua:使用 sys.timerStart 接口來驗(yàn)證可以同時(shí)運(yùn)行的定時(shí)器數(shù)量;

(3) timer_loop_start.lua:使用 sys.timerLoopStart 接口來驗(yàn)證可以同時(shí)運(yùn)行的定時(shí)器數(shù)量;

(4) wait.lua:使用 sys.wait 接口來驗(yàn)證可以同時(shí)運(yùn)行的定時(shí)器數(shù)量;

(5) wait_until.lua:使用 sys.waitUntil 接口來驗(yàn)證可以同時(shí)運(yùn)行的定時(shí)器數(shù)量;

(6) wait_msg.lua:使用 sys.waitMsg 接口來驗(yàn)證可以同時(shí)運(yùn)行的定時(shí)器數(shù)量;


2、 1 個(gè)運(yùn)行日志文件

3、 1 個(gè)分析文件,給出可以同時(shí)運(yùn)行多少個(gè)定時(shí)器的結(jié)論,然后結(jié)合代碼和日志分析出來為什么可以同時(shí)運(yùn)行這么多的定時(shí)器;

今天的內(nèi)容就分享到這里了~


審核編輯 黃宇

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 定時(shí)器
    +關(guān)注

    關(guān)注

    23

    文章

    3367

    瀏覽量

    122606
  • LuatOS
    +關(guān)注

    關(guān)注

    0

    文章

    146

    瀏覽量

    2646
收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評(píng)論

    相關(guān)推薦
    熱點(diǎn)推薦

    基于LuatOS的MQTT物聯(lián)網(wǎng)通信全解

    在構(gòu)建物聯(lián)網(wǎng)終端設(shè)備時(shí),通信協(xié)議的選擇直接決定系統(tǒng)的穩(wěn)定性與擴(kuò)展性。LuatOS通過內(nèi)置MQTT客戶端支持,使開發(fā)者能以極少代碼實(shí)現(xiàn)設(shè)備上云。本文將從協(xié)議原理到代碼實(shí)現(xiàn),全面解析基于LuatOS
    的頭像 發(fā)表于 01-29 19:42 ?21次閱讀
    基于<b class='flag-5'>LuatOS</b>的MQTT物聯(lián)網(wǎng)通信全解

    輕松掌握——LuatOS socket基礎(chǔ)知識(shí)和應(yīng)用開發(fā)

    對(duì)于剛接觸LuatOS開發(fā)的工程師而言,實(shí)現(xiàn)設(shè)備聯(lián)網(wǎng)往往是第一個(gè)重要目標(biāo),而Socket編程正是實(shí)現(xiàn)這一目標(biāo)的核心技術(shù)路徑。本文以循序漸進(jìn)的方式,帶領(lǐng)讀者從最基礎(chǔ)的Socket概念入手,逐步掌握在
    的頭像 發(fā)表于 01-28 20:07 ?37次閱讀
    輕松掌握——<b class='flag-5'>LuatOS</b>  socket基礎(chǔ)知識(shí)和應(yīng)用開發(fā)

    LuatOS框架的使用(上)

    在資源受限的物聯(lián)網(wǎng)終端設(shè)備中,如何實(shí)現(xiàn)快速開發(fā)與穩(wěn)定運(yùn)行是關(guān)鍵挑戰(zhàn)。LuatOS框架通過將Lua語言與底層硬件抽象層深度融合,提供了一套簡(jiǎn)潔高效的開發(fā)范式。本文將圍繞LuatOS框架
    的頭像 發(fā)表于 01-27 19:38 ?56次閱讀
    <b class='flag-5'>LuatOS</b><b class='flag-5'>框架</b>的使用(上)

    LuatOS-Air腳本移植到LuatOS版本注意事項(xiàng)

    一、lua版本不一樣 LuatOS-Air使用的是lua5.1版本,本身不支持位移運(yùn)算符。 LuatOS使用的是lua5.3版本,取消了module(..., package.seeall)這種形式
    的頭像 發(fā)表于 01-17 14:48 ?1085次閱讀
    <b class='flag-5'>LuatOS</b>-Air腳本移植到<b class='flag-5'>LuatOS</b>版本注意事項(xiàng)

    LuatOS-Air轉(zhuǎn)LuatOS常見故障排查手冊(cè)

    當(dāng)LuatOS-Air腳本在LuatOS環(huán)境中運(yùn)行失敗,問題往往集中在幾個(gè)關(guān)鍵模塊:任務(wù)調(diào)度、外設(shè)驅(qū)動(dòng)、網(wǎng)絡(luò)配置和固件版本匹配。本文以故障排查的邏輯為主線,列出常見報(bào)錯(cuò)現(xiàn)象、可能原因及快速修復(fù)
    的頭像 發(fā)表于 01-13 19:20 ?57次閱讀
    <b class='flag-5'>LuatOS</b>-Air轉(zhuǎn)<b class='flag-5'>LuatOS</b>常見故障排查手冊(cè)

    警惕兼容性陷阱:LuatOS-Air腳本在LuatOS中的運(yùn)行異常分析

    即使語法正確的LuatOS-Air腳本,在LuatOS環(huán)境中也可能出現(xiàn)“靜默失敗”——程序無報(bào)錯(cuò)但功能未執(zhí)行。這類問題多與系統(tǒng)事件循環(huán)、模塊加載時(shí)機(jī)或硬件抽象層調(diào)用方式有關(guān)。本文通過多個(gè)真實(shí)
    的頭像 發(fā)表于 01-13 19:20 ?85次閱讀
    警惕兼容性陷阱:<b class='flag-5'>LuatOS</b>-Air腳本在<b class='flag-5'>LuatOS</b>中的運(yùn)行異常分析

    掌握LuatOS系統(tǒng)消息:新手也能看懂的列表詳解

    視角出發(fā),用通俗語言解析其工作原理與配置方法。此處列舉了LuatOS框架中自帶的系統(tǒng)消息列表。 ? 一、sys ? 文檔鏈接:https://docs.openluat.com/osapi/core
    的頭像 發(fā)表于 01-13 18:12 ?51次閱讀
    掌握<b class='flag-5'>LuatOS</b>系統(tǒng)消息:新手也能看懂的列表詳解

    教程來啦!LuatOS中的消息通信機(jī)制詳解及其應(yīng)用場(chǎng)景

    在資源受限的嵌入式環(huán)境中,LuatOS采用消息機(jī)制實(shí)現(xiàn)模塊間解耦與高效通信。通過預(yù)定義消息名稱(如“new_msg”),開發(fā)者可輕松構(gòu)建響應(yīng)式程序結(jié)構(gòu)。接下來我們將深入剖析其實(shí)現(xiàn)原理與典型使用方法
    的頭像 發(fā)表于 09-26 18:59 ?353次閱讀
    教程來啦!<b class='flag-5'>LuatOS</b>中的消息通信機(jī)制詳解及其應(yīng)用場(chǎng)景

    LuatOS腳本開發(fā)入門:嵌入式運(yùn)行框架全解析!

    想搞懂LuatOS如何運(yùn)行Lua腳本?本文深入剖析其嵌入式運(yùn)行框架,涵蓋虛擬機(jī)加載、任務(wù)協(xié)程、系統(tǒng)初始化等關(guān)鍵環(huán)節(jié),適合初學(xué)者。 一、LuatOS 編程起步 1.1 底層固件怎么啟動(dòng) Luat
    的頭像 發(fā)表于 09-26 17:45 ?424次閱讀
    <b class='flag-5'>LuatOS</b>腳本開發(fā)入門:嵌入式運(yùn)行<b class='flag-5'>框架</b>全解析!

    嵌入式開發(fā)新選擇:LuatOS腳本框架入門教程

    LuatOS正成為嵌入式開發(fā)的新趨勢(shì)!本教程帶你從基礎(chǔ)入手,全面了解其基于Lua的腳本開發(fā)模式與輕量級(jí)運(yùn)行框架。 一、LuatOS 編程起步 1.1 底層固件怎么啟動(dòng) LuatOS
    的頭像 發(fā)表于 09-26 17:34 ?496次閱讀
    嵌入式開發(fā)新選擇:<b class='flag-5'>LuatOS</b>腳本<b class='flag-5'>框架</b>入門教程

    Task任務(wù):LuatOS實(shí)現(xiàn)“任務(wù)級(jí)并發(fā)”的核心引擎

    Task任務(wù)通過其強(qiáng)大的并發(fā)處理能力,使LuatOS能夠在單線程環(huán)境中模擬多線程執(zhí)行,通過協(xié)程的掛起與恢復(fù)機(jī)制,實(shí)現(xiàn)任務(wù)級(jí)的并行操作,顯著提升系統(tǒng)效能。 sys核心庫是LuatOS運(yùn)行框架庫,也是
    的頭像 發(fā)表于 08-28 13:49 ?452次閱讀
    Task任務(wù):<b class='flag-5'>LuatOS</b>實(shí)現(xiàn)“任務(wù)級(jí)并發(fā)”的核心引擎

    揭秘LuatOS Task:多任務(wù)管理的“智能中樞”

    Task任務(wù)作為LuatOS的核心組成部分,通過智能化的任務(wù)管理機(jī)制,實(shí)現(xiàn)任務(wù)的創(chuàng)建、調(diào)度與協(xié)同運(yùn)行,讓復(fù)雜應(yīng)用得以高效并行處理,滿足實(shí)時(shí)場(chǎng)景下的嚴(yán)苛需求。 sys核心庫是LuatOS運(yùn)行框架
    的頭像 發(fā)表于 08-28 13:48 ?561次閱讀
    揭秘<b class='flag-5'>LuatOS</b> Task:多任務(wù)管理的“智能中樞”

    解碼LuatOS:短信功能的底層運(yùn)作機(jī)制

    短信功能在LuatOS中的運(yùn)行并非表面所見那么簡(jiǎn)單。本文將深入系統(tǒng)底層,解碼其通信協(xié)議、數(shù)據(jù)處理與系統(tǒng)交互,呈現(xiàn)完整的運(yùn)作圖譜。 我們這期主要拆解airsms.lua文件,講清楚,短信功能
    的頭像 發(fā)表于 06-27 18:05 ?564次閱讀
    解碼<b class='flag-5'>LuatOS</b>:短信功能的底層運(yùn)作機(jī)制

    解鎖LuatOS新世界:二次開發(fā)必備的3個(gè)核心常識(shí)

    踏入LuatOS的二次開發(fā)領(lǐng)域,掌握關(guān)鍵常識(shí)是開啟高效編程之旅的第一步。本文將揭示三個(gè)不可或缺的核心要點(diǎn),助你快速突破技術(shù)壁壘,深度挖掘系統(tǒng)潛力,讓開發(fā)效率與創(chuàng)造力同步飆升。 本期一起
    的頭像 發(fā)表于 06-23 16:08 ?335次閱讀
    <b class='flag-5'>解鎖</b><b class='flag-5'>LuatOS</b>新世界:二次開發(fā)必備的3個(gè)核心常識(shí)

    解鎖LuatOS-log庫:全棧工程師的日志管理實(shí)戰(zhàn)課!

    針對(duì)全棧開發(fā)者設(shè)計(jì)的實(shí)戰(zhàn)教程,本文聚焦LuatOS平臺(tái)log庫的高效使用,從基礎(chǔ)配置到高級(jí)調(diào)試策略,手把手教你搭建可擴(kuò)展的日志系統(tǒng),提升項(xiàng)目維護(hù)效率。 今天,我們一起來認(rèn)識(shí)LuatOS的log庫
    的頭像 發(fā)表于 05-12 15:23 ?1439次閱讀
    <b class='flag-5'>解鎖</b><b class='flag-5'>LuatOS</b>-log庫:全棧工程師的日志管理實(shí)戰(zhàn)課!