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

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

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

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

LuatOS 系統(tǒng)框架的模塊化設(shè)計(jì)原理

青山老竹農(nóng) ? 來(lái)源:jf_82863998 ? 作者:jf_82863998 ? 2026-02-03 15:56 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

LuatOS 的設(shè)計(jì)核心在于高度模塊化與松耦合架構(gòu)。系統(tǒng)將硬件驅(qū)動(dòng)、通信協(xié)議、定時(shí)任務(wù)等封裝為獨(dú)立模塊,通過(guò)統(tǒng)一的注冊(cè)與回調(diào)機(jī)制接入主事件循環(huán)。這種設(shè)計(jì)不僅提升了代碼復(fù)用率,也使得開(kāi)發(fā)者可以按需裁剪功能,適應(yīng)不同規(guī)模的嵌入式項(xiàng)目需求。

一、LuatOS框架中的概念

在LuatOS中,有三個(gè)核心概念和一個(gè)調(diào)度器:

1、三個(gè)核心概念:任務(wù)(task),消息(message),定時(shí)器timer)

2、一個(gè)調(diào)度器:sys.run()函數(shù);

1.1 LuatOS任務(wù)(task)

1.1.1 FreeRTOS task和LuatOS task

wKgZPGmBiY-ARabLAAJsLrutcjQ621.png

從上面這張圖中我們可以看到,有兩種任務(wù):

1、第一種是LuatOS內(nèi)核固件中的任務(wù),也就是FreeRTOS創(chuàng)建的任務(wù);這種任務(wù)我們把它命名為FreeRTOS task;

2、第二種是LuatOS項(xiàng)目應(yīng)用腳本中的任務(wù),也就是用戶(hù)腳本代碼中調(diào)用sys.taskInit和sys.taskInitEx兩個(gè)API創(chuàng)建的任務(wù),這種任務(wù)我們把它命名為L(zhǎng)uatOS task;嚴(yán)格意義上說(shuō),LuatOS task并不是真正的task,而是利用了Lua中的協(xié)程(coroutine)概念,來(lái)等價(jià)實(shí)現(xiàn)的一種task效果,因?yàn)閠ask的受眾面比協(xié)程的受眾面要廣的很多,所以我們?cè)贚uatOS中,將協(xié)程(coroutine)包裝成了task的概念,這樣更容易理解和使用;關(guān)于協(xié)程(coroutine)的知識(shí),在本文接下來(lái)的內(nèi)容中,我們會(huì)接觸到。

在這里我使用一個(gè)形象的比喻,爭(zhēng)取可以讓大家更加直觀的理解這兩種任務(wù)的聯(lián)系和區(qū)別:

1、有一個(gè)森林,這個(gè)森林就是FreeRTOS;

2、森林里生長(zhǎng)了很多棵大樹(shù),每一棵大樹(shù)都是FreeRTOS創(chuàng)建的一個(gè)任務(wù),就是FreeRTOS task;

這些大樹(shù)分成了兩種:

a. 一種是長(zhǎng)出了樹(shù)干,樹(shù)干上還有很多樹(shù)枝,這一種大樹(shù)只有一棵,就是Lua虛擬機(jī)任務(wù)

b. 一種是只長(zhǎng)了光禿禿的樹(shù)干,樹(shù)干上沒(méi)有樹(shù)枝,這種大樹(shù)有很多,除Lua虛擬機(jī)之外,其余所有任務(wù)都是這種大樹(shù)

Lua虛擬機(jī)任務(wù)這棵大樹(shù)的樹(shù)干上長(zhǎng)出的所有樹(shù)枝,就是一個(gè)個(gè)的LuatOS task

根據(jù)以上描述畫(huà)一張簡(jiǎn)圖如下:

wKgZPGmBijyAfUsMAAKeBnk7oEw013.pngwKgZO2mBineAQjPcAAEZAMSbVeY517.png

1.1.2 兩種LuatOS task(基礎(chǔ)task和高級(jí)task)

怎么創(chuàng)建一個(gè)task,在sys核心庫(kù)中提供了兩個(gè)api:

sys.taskInit(task_func, ...)

sys.taskInitEx(task_func, task_name, non_targeted_msg_cbfunc, ...)

這兩個(gè)api分別創(chuàng)建兩種task,首先我們給這兩種task起個(gè)名字,一種叫基礎(chǔ)task,一種叫高級(jí)task;

sys.taskInit(task_func, ...)創(chuàng)建的task是基礎(chǔ)task;

sys.taskInitEx(task_func, task_name, non_targeted_msg_cbfunc, ...)創(chuàng)建的task是高級(jí)task;

從設(shè)計(jì)原理的角度來(lái)看,基礎(chǔ)task和高級(jí)task的區(qū)別是:

(1) 所有的基礎(chǔ)task共享一個(gè)全局消息隊(duì)列;

(2) 每個(gè)高級(jí)task都有自己獨(dú)立的定向消息隊(duì)列,同時(shí)又能使用全局消息隊(duì)列;

wKgZO2mBirOADzFKAAK3Q-jfHMk965.png

1.1.3 LuatOS task內(nèi)部運(yùn)行環(huán)境和外部運(yùn)行環(huán)境

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

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

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

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

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

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

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

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

在這里,大家只要知道有task內(nèi)部運(yùn)行和task外部運(yùn)行兩種環(huán)境即可,接下來(lái)我們下面講解內(nèi)部設(shè)計(jì)原理時(shí),會(huì)進(jìn)一步去學(xué)習(xí)理解;

1.1.4 LuatOS task狀態(tài)切換

wKgZO2mBiyKAZm_cAAFMuQgvdCs338.png

1.2 LuatOS消息(message)

LuatOS 的消息機(jī)制是LuatOS task協(xié)作和事件驅(qū)動(dòng)編程的核心部分,消息機(jī)制包括消息的發(fā)布和訂閱處理、消息的發(fā)送和接收處理;

1.2.1 三種消息隊(duì)列

消息需要存儲(chǔ)到消息隊(duì)列中,消息隊(duì)列中的消息遵循先進(jìn)先出(FIFO)原則;

wKgZPGmBi16AUu_RAAK8X7n7vys045.png

內(nèi)核消息隊(duì)列

FreeRTOS創(chuàng)建的每一個(gè)task都有一個(gè)消息隊(duì)列,這種消息隊(duì)列就叫做內(nèi)核消息隊(duì)列;

內(nèi)核消息隊(duì)列是FreeRTOS直接管理的,存儲(chǔ)每個(gè)FreeRTOS task內(nèi)核消息的隊(duì)列;

LuatOS應(yīng)用全局消息隊(duì)列

所有LuatOS task應(yīng)用共享一個(gè)消息隊(duì)列,這個(gè)消息隊(duì)列就叫做LuatOS應(yīng)用全局消息隊(duì)列;

LuatOS應(yīng)用全局消息隊(duì)列是LuatOS虛擬機(jī)直接管理的;

LuatOS基礎(chǔ)task可以接收處理這個(gè)消息隊(duì)列中的消息,LuatOS高級(jí)task可以接收處理這個(gè)消息隊(duì)列中的消息;

LuatOS外部運(yùn)行環(huán)境中的業(yè)務(wù)也可以接收處理這個(gè)消息隊(duì)列中的消息;

LuatOS應(yīng)用定向消息隊(duì)列

每個(gè)LuatOS 高級(jí)task都有一個(gè)消息隊(duì)列,這個(gè)消息隊(duì)列就叫做LuatOS應(yīng)用定向消息隊(duì)列;

LuatOS應(yīng)用定向消息隊(duì)列是LuatOS虛擬機(jī)直接管理的;

每個(gè)定向消息隊(duì)列和一個(gè)LuatOS高級(jí)task存在唯一的綁定關(guān)系;

只有綁定的LuatOS高級(jí)task才可以接收處理這個(gè)消息隊(duì)列中的消息;(雖然從源碼設(shè)計(jì)上看,所有的LuatOS高級(jí)task都可以接收處理定向消息隊(duì)列中的消息,但是這樣使用的話(huà),理解起來(lái)會(huì)比較混亂)

1.2.2 六種消息

根據(jù)消息存儲(chǔ)使用的消息隊(duì)列類(lèi)型以及消息發(fā)送方的不同,可以把消息劃分為以下六類(lèi):

wKgZO2mBi7aAC-gHAAQWqQSKpEQ989.png

1.3 LuatOS定時(shí)器(timer)

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

定時(shí)器分類(lèi)如下圖所示:

wKgZO2mBi_iASzZZAAO4VMTsOBA005.png

1.4 LuatOS調(diào)度器(sys.run())

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

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

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

所以在這里,我先對(duì)sys.run()內(nèi)部的工作原理做一個(gè)簡(jiǎn)化后的總體介紹,至于更詳細(xì)的原理介紹,我們會(huì)在下面進(jìn)行詳細(xì)講解;

wKgZO2mBjNCARrPYAAH-Ou866mU468.png

我們看上面這張圖:

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

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

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

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

開(kāi)始逐行嵌套解析執(zhí)行main.lua中的腳本代碼(加載必要的擴(kuò)展庫(kù)腳本文件和自己開(kāi)發(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ì)列和LuatOS應(yīng)用消息隊(duì)列中讀取消息,并且分發(fā)消息給接收者進(jìn)行處理。

wKgZPGmBjRaAZ1vUAAK8eZtwn8U761.png

二、sys.lua源碼分析方法

通過(guò)本文前三部分的描述,我們對(duì)LuatOS運(yùn)行框架的基礎(chǔ)理論知識(shí)做了簡(jiǎn)單的回顧;

接下來(lái)我們進(jìn)入本講的重點(diǎn)內(nèi)容:學(xué)習(xí)理解LuatOS運(yùn)行框架的內(nèi)部設(shè)計(jì)源碼;

sys核心庫(kù)是LuatOS運(yùn)行框架庫(kù),是LuatOS應(yīng)用程序運(yùn)行的核心大腦;

我們要深入學(xué)習(xí)LuatOS框架的內(nèi)部設(shè)計(jì)原理,就是要深入學(xué)習(xí)sys核心庫(kù)的內(nèi)部設(shè)計(jì)實(shí)現(xiàn)原理;

sys.lua源文件是sys核心庫(kù)的代碼實(shí)現(xiàn),點(diǎn)擊這里可以看到sys.lua源碼;

所以本講課程中,我們接下來(lái)會(huì)重點(diǎn)分析sys.lua的源碼實(shí)現(xiàn);通過(guò)分析sys.lua源碼,從而來(lái)學(xué)習(xí)理解LuatOS框架的設(shè)計(jì)原理;

sys.lua是sys核心庫(kù)的內(nèi)部實(shí)現(xiàn);

說(shuō)到核心庫(kù),我們?cè)賮?lái)回顧一下LuatOS軟件架構(gòu),如下圖所示:

wKgZO2mBjaWASeQEAAJXLPzmRyg030.png

之前我們講述LuatOS軟件架構(gòu)時(shí),當(dāng)時(shí)有說(shuō),LuatOS核心庫(kù)是用C語(yǔ)言開(kāi)發(fā)的,這個(gè)描述并不準(zhǔn)確,在核心庫(kù)中,有一個(gè)特例,就是sys核心庫(kù),這個(gè)核心庫(kù)是用Lua語(yǔ)言開(kāi)發(fā)的,并且源碼也開(kāi)放了;

雖然sys核心庫(kù)是用Lua語(yǔ)言開(kāi)發(fā)的,但是它還是一個(gè)核心庫(kù),在編譯內(nèi)核固件的時(shí)候,會(huì)把sys.lua源文件集成到編譯好的內(nèi)核固件中對(duì)外發(fā)布;

我們今天采用以下方式來(lái)學(xué)習(xí)sys.lua源碼設(shè)計(jì):

1、在目前的sys.lua源文件中增加詳細(xì)的注釋和運(yùn)行日志,分析代碼設(shè)計(jì)

2、使用LuatOS PC模擬器,運(yùn)行demo代碼+第1步增加運(yùn)行日志的sys.lua,通過(guò)分析運(yùn)行日志,進(jìn)一步理解sys.lua的設(shè)計(jì)原理

在模擬器上運(yùn)行demo代碼的方法,

本講中使用的demo代碼參考luatos_framework;模擬器運(yùn)行時(shí)的命令如下:

wKgZPGmBjhqAWcEDAAA6oomrQzc968.png

要深入理解LuatOS框架的設(shè)計(jì)原理,其實(shí)就是深入學(xué)習(xí)sys.lua中的以下幾個(gè)概念:

1、一個(gè)調(diào)度器:sys.run()

2、三個(gè)概念:任務(wù)(task),消息(message),定時(shí)器(timer)

3、五張表:

高級(jí)task任務(wù)列表(taskList)

全局消息訂閱表(subscribers),全局消息隊(duì)列(messageQueue)

定時(shí)器處理表(timerPool),定時(shí)器回調(diào)函數(shù)參數(shù)表(para)

三、LuatOS 調(diào)度器(sys.run())內(nèi)部設(shè)計(jì)

LuatOS調(diào)度器sys.run函數(shù)的主體處理邏輯參考下圖中黃色背景部分

wKgZO2mBjpWAJZQxAAIq4SJaDGg666.png

從這張圖可以看出,在LuatOS內(nèi)核固件中有一個(gè)FreeRTOS,F(xiàn)reeRTOS運(yùn)行起來(lái)之后,創(chuàng)建了很多任務(wù),有軟件定時(shí)器任務(wù),TCP/IP協(xié)議棧任務(wù),文件系統(tǒng)任務(wù),Lua虛擬機(jī)任務(wù)等。

其中Lua虛擬機(jī)任務(wù)和LuatOS項(xiàng)目的應(yīng)用軟件關(guān)系最為密切;

Lua虛擬機(jī)任務(wù)運(yùn)行起來(lái)之后,經(jīng)過(guò)必要的初始化動(dòng)作,就會(huì)去尋找main.lua腳本文件,找到之后,從main.lua的第一行代碼開(kāi)始解析執(zhí)行,main.lua會(huì)執(zhí)行必要的初始化動(dòng)作并且加載運(yùn)行其他的Lua腳本應(yīng)用功能模塊,main.lua的最后一行代碼為sys.run(),sys.run()是一個(gè)while true的循環(huán)函數(shù),實(shí)際上也是Lua虛擬機(jī)任務(wù)的處理函數(shù);

在這個(gè)while循環(huán)里面,不斷的分發(fā)處理各種消息,調(diào)度LuatOS項(xiàng)目應(yīng)用軟件的正常運(yùn)行。

現(xiàn)在,我們一起看下剛才描述的這個(gè)過(guò)程的源碼,在閱讀源碼之前,我們先看下面這張框圖,描述了主要源碼函數(shù)和代碼段的調(diào)用過(guò)程:

wKgZPGmBjtWAdysXAAGFC8OY5Ec033.png

四、LuatOS 任務(wù)(task)內(nèi)部設(shè)計(jì)

4.1 sys.taskInit(創(chuàng)建并且運(yùn)行基礎(chǔ)task)

wKgZO2mBjxCAWb4MAAAm8ho_JDE448.png

4.1.1 源碼分析

wKgZO2mBj2iAZStyAAEIT2Js2KY315.png


我們接下來(lái)再看sys.coresume(co, ...)的源碼

wKgZPGmBj5eAML1cAAbom9P6ocs010.png

通過(guò)分析sys.taskInit這個(gè)api的源碼,我們可以看出,LuatOS的task概念,實(shí)際上是對(duì)Lua語(yǔ)言的協(xié)程(coroutine)概念的一層封裝,因?yàn)閠ask的受眾面比協(xié)程的受眾面要廣的很多,所以我們?cè)贚uatOS中,將協(xié)程(coroutine)包裝成了task的概念,這樣更容易理解和使用;

4.1.2 Lua語(yǔ)言中協(xié)程(coroutine)概念的理解

在LuatOS的sys.lua中,把Lua中的協(xié)程概念包裝成了task概念,來(lái)實(shí)現(xiàn)多任務(wù)的編程效果;

所以我們要想深入理解sys.lua中的內(nèi)部設(shè)計(jì),勢(shì)必要對(duì)Lua語(yǔ)言中的協(xié)程概念有一個(gè)基本的認(rèn)識(shí);

在 Lua 語(yǔ)言中,協(xié)程(coroutine)是一種用戶(hù)態(tài)的輕量級(jí)線(xiàn)程,它允許程序在執(zhí)行過(guò)程中暫停和恢復(fù),從而實(shí)現(xiàn)協(xié)作式的多任務(wù)處理。與操作系統(tǒng)的線(xiàn)程不同,協(xié)程的調(diào)度完全由程序自身控制,而非由操作系統(tǒng)內(nèi)核調(diào)度;

1、在LuatOS的sys.lua中,僅僅關(guān)注協(xié)程的三種狀態(tài):

掛起(suspended)狀態(tài),以下兩種情況,協(xié)程處于掛起狀態(tài):

coroutine.create(f)創(chuàng)建協(xié)程后,未主動(dòng)運(yùn)行這個(gè)協(xié)程;

協(xié)程運(yùn)行過(guò)程中,被本協(xié)程內(nèi)部調(diào)用coroutine.yield(...)暫停;

運(yùn)行(running)狀態(tài)

處于掛起狀態(tài)的協(xié)程co,在此協(xié)程外執(zhí)行coroutine.resume(co[, ...])則恢復(fù)為運(yùn)行狀態(tài);

死亡(dead)狀態(tài):以下兩種情況,協(xié)程處于死亡狀態(tài):

協(xié)程正常運(yùn)行結(jié)束;

協(xié)程運(yùn)行過(guò)程中出現(xiàn)異常結(jié)束;

2、協(xié)程的核心特點(diǎn)

協(xié)作式:協(xié)程必須主動(dòng)讓出執(zhí)行權(quán)(通過(guò)調(diào)用coroutine.yield(...)),其他協(xié)程才有機(jī)會(huì)運(yùn)行。

狀態(tài)保留:協(xié)程暫停掛起時(shí)會(huì)保存當(dāng)前執(zhí)行狀態(tài)(如變量、棧),恢復(fù)時(shí)從暫停處繼續(xù)。

wKgZO2mBkLKAMXdtAAD-5bYOZ6o893.png


4.1.3 應(yīng)用示例

針對(duì)剛才對(duì)sys.taskInit源碼的分析,接下來(lái)我們一起在模擬上運(yùn)行一個(gè)demo示例,加深一下對(duì)sys.taskInitapi內(nèi)部設(shè)計(jì)的理解;

核心代碼片段如下(重點(diǎn)關(guān)注黃色背景的代碼):

main.lua

wKgZO2mBkPKATbizAABuEHPPQxE635.png

scheduling.lua

wKgZPGmBkRSARY5PAAFPmMVhx-A820.png

首先我們分析一下,在這個(gè)demo示例中,使用sys.taskInit(task1_func)創(chuàng)建的任務(wù),任務(wù)處理函數(shù)的task1_func()的源碼+sys.lua源碼,分析下代碼是如何調(diào)度運(yùn)行的;

接下來(lái)我們使用模擬器,針對(duì)以下幾種場(chǎng)景,實(shí)際跑一下這個(gè)demo示例看看運(yùn)行效果:

模擬器運(yùn)行指令如下:

wKgZPGmBjhqAWcEDAAA6oomrQzc968.png

1、打開(kāi) scheduling.lua中的count = count + "hdjks"

最終運(yùn)行的核心日志為

wKgZPGmBkYiAdgddAALI81AixbA234.png

2、打開(kāi) scheduling.lua中的count = count + "hdjks"

sys.lua中的return wrapper(arg[1], coroutine.resume(...))修改為return coroutine.resume(...)

最終運(yùn)行的核心日志為

wKgZO2mBkceABLB2AAKA9VzUS4M612.png

3、打開(kāi) scheduling.lua中的count = count + "hdjks"

打開(kāi)main.lua中的

_G.COROUTINE_ERROR_ROLL_BACK = false

_G.COROUTINE_ERROR_RESTART = false

最終運(yùn)行的核心日志為

wKgZPGmBkguAYiUYAAQGJk-9I50412.png

4.2 sys.taskInitEx(創(chuàng)建并且運(yùn)行高級(jí)task)

wKgZO2mBknaABM2PAAA2NscA1nI447.png


4.2.1 數(shù)據(jù)結(jié)構(gòu)(taskList)

wKgZO2mBkpCAR_0uAAJC3io3w5M264.png


4.2.2 源碼分析

wKgZO2mBlkWALZvSAAIgTzymLu8480.png


從上面這段代碼可以看到,使用sys.taskInitEx創(chuàng)建一個(gè)高級(jí)task,和使用sys.taskInit創(chuàng)建一個(gè)基礎(chǔ)task相比,最核心的區(qū)別是多申請(qǐng)了一個(gè)高級(jí)task全局信息表{msgQueue={}, To=false, cb=cbFun},這個(gè)全局信息表是高級(jí)task處理定時(shí)器消息和定向消息的關(guān)鍵;下圖中高級(jí)task指向的定向消息隊(duì)列,對(duì)應(yīng)的就是高級(jí)task全局表中的msgQueue={}

wKgZO2mBlmyAadW3AAIvynXarPg150.png

4.2.3 應(yīng)用示例

使用sys.taskInitEx創(chuàng)建一個(gè)高級(jí)task,和使用sys.taskInit創(chuàng)建一個(gè)基礎(chǔ)task相比,最核心的區(qū)別是多申請(qǐng)了一個(gè)高級(jí)task全局信息表{msgQueue={}, To=false, cb=cbFun},其余實(shí)現(xiàn)原理和sys.taskInit完全相同,所以此處不再對(duì)sys.taskInitEx結(jié)合實(shí)際的demo示例來(lái)進(jìn)一步理解了;

在后續(xù)的消息和定時(shí)器章節(jié)會(huì)進(jìn)一步深入演示學(xué)習(xí)。

4.3 sys.taskDel(清除高級(jí)task的內(nèi)存資源)

wKgZPGmBlraAGWKRAAAl2l2B6EQ538.png


4.3.1 源碼分析

wKgZO2mBlwqAM1NHAAPwQAdAMMc936.png


4.3.2 應(yīng)用示例

針對(duì)剛才對(duì)sys.taskDel源碼的分析,接下來(lái)我們一起在模擬上運(yùn)行一個(gè)demo示例,加深一下對(duì)sys.taskDelapi內(nèi)部設(shè)計(jì)的理解;

核心代碼片段如下(重點(diǎn)關(guān)注黃色背景的代碼):

main.lua

wKgZO2mBkPKATbizAABuEHPPQxE635.png

memory_task_delete.lua

wKgZPGmBl3SAZE41AAEnneGfehk404.png

接下來(lái)我們使用模擬器,針對(duì)以下三種場(chǎng)景,實(shí)際跑一下這個(gè)demo示例看看運(yùn)行效果:

1、打開(kāi) memory_task_delete.lua中的sys.taskDel("led_task")

關(guān)閉 memory_task_delete.lua中的dhjsk = las + 2

關(guān)閉main.lua中的

_G.COROUTINE_ERROR_ROLL_BACK = false

_G.COROUTINE_ERROR_RESTART = false

最終運(yùn)行的核心日志為

wKgZPGmBl8WAZ8vcAAGpw_JfXvs640.png

2、關(guān)閉 memory_task_delete.lua中的sys.taskDel("led_task")

關(guān)閉 memory_task_delete.lua中的dhjsk = las + 2

關(guān)閉main.lua中的

_G.COROUTINE_ERROR_ROLL_BACK = false

_G.COROUTINE_ERROR_RESTART = false

最終運(yùn)行的核心日志為

wKgZO2mBl_WAJxDiAAITTmMYS6k902.png

3、打開(kāi) memory_task_delete.lua中的sys.taskDel("led_task")

打開(kāi) memory_task_delete.lua中的dhjsk = las + 2

打開(kāi)main.lua中的

_G.COROUTINE_ERROR_ROLL_BACK = false

_G.COROUTINE_ERROR_RESTART = false

最終運(yùn)行的核心日志為

wKgZPGmBmCmAXw2xAAKKolUdnKQ152.png

4、打開(kāi) memory_task_delete.lua中的sys.taskDel("led_task")

打開(kāi) memory_task_delete.lua中的dhjsk = las + 2

關(guān)閉main.lua中的

_G.COROUTINE_ERROR_ROLL_BACK = false

_G.COROUTINE_ERROR_RESTART = false

最終運(yùn)行的核心日志為

wKgZO2mBmFaAJ0heAAJJhuP9CGM925.png

通過(guò)這個(gè)demo示例,我們可以看出sys.taskDel函數(shù)對(duì)于內(nèi)存釋放的作用,目前的LuatOS設(shè)計(jì),只需要記住一點(diǎn)就行了:

高級(jí)task的任務(wù)處理函數(shù)中,在調(diào)用return語(yǔ)句返回前,或者任務(wù)處理函數(shù)的最后一行代碼,調(diào)用sys.taskDel即可;


五、LuatOS 定時(shí)器(timer)內(nèi)部設(shè)計(jì)

5.1 數(shù)據(jù)結(jié)構(gòu)(timerPool和para)

wKgZO2mBmJiAGCdVAAMXX8wzXUk076.png

5.2 api源碼分析

現(xiàn)在,我在vscode上打開(kāi)已經(jīng)添加了詳細(xì)注釋的sys.lua,對(duì)以下每個(gè)api的源碼進(jìn)行分析(僅分析和定時(shí)器有關(guān)的源碼部分),為了讓大家對(duì)定時(shí)器的使用有一個(gè)更全局的認(rèn)識(shí),所以也會(huì)分析一部分LuatOS倉(cāng)庫(kù)中開(kāi)源的內(nèi)核C代碼:

wKgZO2mBmPKAVr8IAAFoYufKDvI474.png

下面列舉的函數(shù)調(diào)用棧,供分析源碼時(shí)參考使用:

Lua->C:sys.timerStart,sys.timerLoopStart,sys.wait,sys.waitUntil,sys.waitMsg->rtos.timer_start

C: l_rtos_timer_start->luat_timer_start->xTimer接口

C:luat_timer_callback->luat_msgbus_put

Lua->C->Lua:sys.run->rtos.receive->luat_msgbus_get->l_timer_handler(返回rtos.MSG_TIMER,timer_id, repeat三個(gè)參數(shù))

5.3 完整業(yè)務(wù)處理過(guò)程

wKgZO2mBmS6AVzjCAAKikooDprs543.png

5.4 應(yīng)用示例

剛才我們已經(jīng)分析了和定時(shí)器操作有關(guān)的sys.lua源碼,在本講的最后一章,我會(huì)基于一個(gè)實(shí)際的MQTT demo項(xiàng)目,逐行分析項(xiàng)目中應(yīng)用腳本源碼和sys.lua源碼,讓大家在實(shí)際的項(xiàng)目中深刻理解LuatOS運(yùn)行框架中的消息設(shè)計(jì)原理;

六、LuatOS 消息(message)內(nèi)部設(shè)計(jì)

6.1 數(shù)據(jù)結(jié)構(gòu)(subscribers和messageQueue)

wKgZO2mBmZiAaaB9AAHhhLWS8i8240.png

下圖中的全局消息隊(duì)列,對(duì)應(yīng)的就是messageQueue ={}

wKgZO2mBmdyALdtmAAIvpsP02x0833.png

6.2 api源碼分析

現(xiàn)在,我在vscode上打開(kāi)已經(jīng)添加了詳細(xì)注釋的sys.lua,對(duì)以下每個(gè)api的源碼進(jìn)行分析(僅分析和消息處理有關(guān)的源碼部分),為了讓大家對(duì)消息的使用有一個(gè)更全局的認(rèn)識(shí),所以也會(huì)分析一部分LuatOS倉(cāng)庫(kù)中開(kāi)源的內(nèi)核C代碼:

wKgZPGmBmgqAQyrDAAFsKWPZEhw103.png

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

wKgZPGmBmjGAQhP1AABI_NHIh38701.png

下面列舉五種消息應(yīng)用場(chǎng)景的完整業(yè)務(wù)處理過(guò)程:

6.3 內(nèi)核非定時(shí)器消息完整業(yè)務(wù)處理過(guò)程(以 串口接收到新數(shù)據(jù)消息 為例)

wKgZO2mBml2AXuMAAAFj4ybhZWM578.png

1、uart.on(1, "receive", recv_cb)->l_uart_on

2、luat_irq_uart_cb->luat_msgbus_put

3、sys.run()->rtos.receive->luat_msgbus_get->l_uart_handler(在這里執(zhí)行執(zhí)行uart.on注冊(cè)的回調(diào)函數(shù)recv_cb,然后返回空數(shù)據(jù),sys.lua中的rtos.receive返回值為nil)

6.4 系統(tǒng)應(yīng)用全局消息完整處理過(guò)程(以"IP_READY"為例)

wKgZPGmBmpaAb6enAAHDW_dWS24284.png


在用戶(hù)腳本代碼中,根據(jù)具體的業(yè)務(wù)邏輯,訂閱全局消息"IP_READY"

當(dāng)某一種網(wǎng)卡網(wǎng)絡(luò)環(huán)境準(zhǔn)備就緒時(shí),在內(nèi)核固件的netif_ip_event_cb中,主動(dòng)調(diào)用sys.lua中定義的_G.sys_pub = sys.publish,實(shí)際上就是調(diào)用sys.publish發(fā)布一條全局消息"IP_READY",存儲(chǔ)到sys.lua中的全局消息表messageQueue中

在sys.lua中,消息分發(fā)處理:sys.run->dispatch

6.5 用戶(hù)應(yīng)用全局消息完整處理過(guò)程

wKgZO2mBmtyAWh1bAAGlWb1GrBg662.png


在用戶(hù)腳本代碼中,根據(jù)具體的業(yè)務(wù)邏輯,訂閱全局消息

在用戶(hù)腳本的代碼,調(diào)用sys.publish發(fā)布全局消息

在sys.lua中,通過(guò)sys.run調(diào)度器,執(zhí)行dispatch分發(fā)處理全局消息

6.6 系統(tǒng)應(yīng)用定向消息完整處理過(guò)程(以socket.EVENT為例)

wKgZO2mBmweAbfK9AAGwYqfehME736.png


l_socket_callback,當(dāng)內(nèi)核固件中的某一個(gè)socket產(chǎn)生異步事件時(shí)(例如socke接收到新數(shù)據(jù)),主動(dòng)調(diào)用sys.lua中定義的_G.sys_send = sys.sendMsg,實(shí)際上就是調(diào)用sys.sendMsg給指定Lua腳本中的高級(jí)task發(fā)送一條定向消息,存儲(chǔ)到此高級(jí)task對(duì)應(yīng)的定向消息隊(duì)列taskList[task_name].msgQueue中

在用戶(hù)腳本代碼中,通過(guò)sys.waitMsg去處理定向消息

6.7 用戶(hù)應(yīng)用定向消息完整處理過(guò)程

wKgZO2mBmzuAQHguAAHiIkfImGQ786.png

1、在用戶(hù)腳本代碼中,調(diào)用sys.sendMsg發(fā)送定向消息

2、在用戶(hù)腳本代碼中,調(diào)用sys.waitMsg處理定向消息

6.8 應(yīng)用示例

剛才我們已經(jīng)分析了和消息操作有關(guān)的sys.lua源碼,在本講的最后一章,我會(huì)基于一個(gè)實(shí)際的MQTT demo項(xiàng)目,逐行分析項(xiàng)目中應(yīng)用腳本源碼和sys.lua源碼,讓大家在實(shí)際的項(xiàng)目中深刻理解LuatOS運(yùn)行框架中的消息設(shè)計(jì)原理;

七、基于MQTT demo項(xiàng)目,再次全面理解LuatOS框架的內(nèi)部設(shè)計(jì)運(yùn)行原理

講到最后,我會(huì)基于一個(gè)實(shí)際的MQTT demo項(xiàng)目,逐行分析項(xiàng)目中應(yīng)用腳本源碼和sys.lua源碼,讓大家在實(shí)際的項(xiàng)目中深刻理解LuatOS運(yùn)行框架的內(nèi)部設(shè)計(jì)原理;

7.1 demo項(xiàng)目總體設(shè)計(jì)框圖

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

wKgZPGmBm4aAcVzIAAIzRml1dvs627.png

7.2 demo項(xiàng)目源碼+sys.lua源碼綜合分析

這個(gè)mqtt demo代碼中的注釋比較詳細(xì),sys.lua代碼注釋也比較詳細(xì),接下來(lái)我用vscode直接打開(kāi)這份demo項(xiàng)目和sys.lua,和大家一起分析下源碼設(shè)計(jì);

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

審核編輯 黃宇

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

    關(guān)注

    0

    文章

    356

    瀏覽量

    22691
  • LuatOS
    +關(guān)注

    關(guān)注

    0

    文章

    156

    瀏覽量

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

掃碼添加小助手

加入工程師交流群

    評(píng)論

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

    Energy Vault與Crusoe宣布達(dá)成戰(zhàn)略框架協(xié)議,部署Crusoe Spark模塊化AI工廠機(jī)組以交付Crusoe Cloud云服務(wù)

    Crusoe今日宣布達(dá)成戰(zhàn)略框架協(xié)議,將在Energy Vault位于德州斯奈德的技術(shù)中心分階段部署Crusoe Spark模塊化數(shù)據(jù)中心。
    的頭像 發(fā)表于 02-14 16:06 ?1.5w次閱讀

    LuatOS 框架的嵌入式系統(tǒng)架構(gòu)設(shè)計(jì)原理

    LuatOS 重新定義了嵌入式系統(tǒng)的開(kāi)發(fā)范式——將 Lua 腳本作為主程序語(yǔ)言,構(gòu)建起完整的系統(tǒng)架構(gòu)。其設(shè)計(jì)原理圍繞“腳本主導(dǎo)、C 層支撐”展開(kāi),通過(guò)在固件中嵌入 Lua 解釋器,將硬件操作抽象為
    的頭像 發(fā)表于 02-03 15:57 ?94次閱讀
    <b class='flag-5'>LuatOS</b> <b class='flag-5'>框架</b>的嵌入式<b class='flag-5'>系統(tǒng)</b>架構(gòu)設(shè)計(jì)原理

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

    接上一篇 2.3 LuatOS 的定時(shí)器(timer) 對(duì)于 LuatOS 應(yīng)用程序來(lái)說(shuō),定時(shí)器本質(zhì)上也算是一種特殊的消息,因?yàn)槎〞r(shí)器太常用了,所以把他單獨(dú)拎出來(lái),單獨(dú)的一個(gè)章節(jié)進(jìn)行講解
    的頭像 發(fā)表于 01-28 13:18 ?147次閱讀
    解鎖:<b class='flag-5'>LuatOS</b><b class='flag-5'>框架</b>的使用(下篇)

    LuatOS框架的使用(上)

    環(huán)境搭建、模塊調(diào)用到任務(wù)調(diào)度,全面解析其開(kāi)發(fā)流程與最佳實(shí)踐。 本篇文章主要講LuatOS 框架;LuatOS 框架是整個(gè)
    的頭像 發(fā)表于 01-27 19:38 ?151次閱讀
    <b class='flag-5'>LuatOS</b><b class='flag-5'>框架</b>的使用(上)

    模塊化高精度銣原子鐘存在的意義

    ”到“可重構(gòu)系統(tǒng)”的跨越,為現(xiàn)代高精度時(shí)頻應(yīng)用提供了全新模式。 一、模塊化設(shè)計(jì)的本質(zhì)突破:從“整機(jī)”到“模塊” 一般銣原子鐘的功能集成度高且采用整機(jī)形式,而SYN3306的模塊化架構(gòu)可
    的頭像 發(fā)表于 01-21 19:09 ?106次閱讀

    鼎陽(yáng)科技推PXIe模塊化示波器、PXIe模塊化矢量網(wǎng)絡(luò)分析儀產(chǎn)品組合,構(gòu)建新一代模塊化、軟件定義的測(cè)試平臺(tái)

    、卓越性能與靈活的系統(tǒng)集成能力,這三款產(chǎn)品進(jìn)一步豐富了公司的產(chǎn)品矩陣,為通信、新能源、半導(dǎo)體等領(lǐng)域的研發(fā)與生產(chǎn)測(cè)試提供更靈活高效的解決方案。 模塊化數(shù)字示波器 高分辨率模塊化示波器 鼎陽(yáng)MS高分辨率
    的頭像 發(fā)表于 01-14 10:35 ?6.6w次閱讀
    鼎陽(yáng)科技推PXIe<b class='flag-5'>模塊化</b>示波器、PXIe<b class='flag-5'>模塊化</b>矢量網(wǎng)絡(luò)分析儀產(chǎn)品組合,構(gòu)建新一代<b class='flag-5'>模塊化</b>、軟件定義的測(cè)試平臺(tái)

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

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

    精準(zhǔn)維修:安捷倫N6701A模塊化電源系統(tǒng)主機(jī)深度修復(fù)與校準(zhǔn)

    安捷倫(Agilent)模塊化電源系統(tǒng)主機(jī),以其高性能、高精度和可編程性,在電子測(cè)試、研發(fā)、驗(yàn)證等領(lǐng)域發(fā)揮著重要作用。它支持多種電源模塊,可以靈活配置以滿(mǎn)足不同測(cè)試需求。
    的頭像 發(fā)表于 12-09 17:34 ?2638次閱讀
    精準(zhǔn)維修:安捷倫N6701A<b class='flag-5'>模塊化</b>電源<b class='flag-5'>系統(tǒng)</b>主機(jī)深度修復(fù)與校準(zhǔn)

    新品發(fā)布|LRM模塊化高速連接器

    認(rèn)證發(fā)明專(zhuān)利。該款連接器是一種模塊化、高性能高速率的系統(tǒng)連接器產(chǎn)品,多腔體模塊化設(shè)計(jì)可以支持多種信號(hào)類(lèi)型,射頻、高頻高速、光信號(hào)及電源的混合傳輸,不同的腔體可以靈
    的頭像 發(fā)表于 10-20 17:02 ?1954次閱讀
    新品發(fā)布|LRM<b class='flag-5'>模塊化</b>高速連接器

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

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

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

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

    新品推薦|模塊化集成式高速連接器

    是一種模塊化、高性能高速率的系統(tǒng)連接器產(chǎn)品,多腔體模塊化設(shè)計(jì)可以支持多種信號(hào)類(lèi)型,射頻、高頻高速、光信號(hào)及電源的混合傳輸,不同的腔體可以靈活配置不同功能模塊。01
    的頭像 發(fā)表于 07-07 18:15 ?1395次閱讀
    新品推薦|<b class='flag-5'>模塊化</b>集成式高速連接器

    鴻蒙5開(kāi)發(fā)寶藏案例分享---模塊化設(shè)計(jì)案例分享

    鴻蒙模塊化開(kāi)發(fā)大揭秘!官方隱藏案例實(shí)戰(zhàn)指南 大家好呀! 最近在HarmonyOS文檔里挖到一個(gè)寶藏——官方其實(shí)藏了大量模塊化設(shè)計(jì)案例!很多小伙伴可能沒(méi)注意到,今天我就帶大家手把手拆解這些黃金實(shí)踐,附
    發(fā)表于 06-12 16:17

    原理圖模塊化,BOM 物料位號(hào)處理

    原理圖模塊化,把常用的模塊保存成一個(gè)PART(在TOOL 菜單下 選擇 Generate Part)。保存成OLB格式。使用的時(shí)候,就像使用元器件一樣,從庫(kù)里面拖出來(lái)直接放到原理圖上即可。 問(wèn)題是
    發(fā)表于 06-09 19:27

    MCU-40型自動(dòng)測(cè)量是如何實(shí)現(xiàn)分布式模塊化?

    在巖土工程、大型基建和能源設(shè)施的安全監(jiān)測(cè)中,傳統(tǒng)的集中式數(shù)據(jù)采集系統(tǒng)往往面臨布線(xiàn)復(fù)雜、擴(kuò)展性差、容錯(cuò)率低等挑戰(zhàn)。南京峟思工程儀器有限公司推出的MCU-40型自動(dòng)測(cè)量系統(tǒng),憑借其創(chuàng)新的分布式模塊化
    的頭像 發(fā)表于 04-10 14:03 ?796次閱讀
    MCU-40型自動(dòng)測(cè)量是如何實(shí)現(xiàn)分布式<b class='flag-5'>模塊化</b>?