伦伦影院久久影视,天天操天天干天天射,ririsao久久精品一区 ,一本大道香蕉大久在红桃,999久久久免费精品国产色夜,色悠悠久久综合88,亚洲国产精品久久无套麻豆,亚洲香蕉毛片久久网站,一本一道久久综合狠狠老

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

LuatOS 系統框架的模塊化設計原理

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

掃碼添加小助手

加入工程師交流群

LuatOS 的設計核心在于高度模塊化與松耦合架構。系統將硬件驅動、通信協議、定時任務等封裝為獨立模塊,通過統一的注冊與回調機制接入主事件循環。這種設計不僅提升了代碼復用率,也使得開發者可以按需裁剪功能,適應不同規模的嵌入式項目需求。

一、LuatOS框架中的概念

在LuatOS中,有三個核心概念和一個調度器:

1、三個核心概念:任務(task),消息(message),定時器timer)

2、一個調度器:sys.run()函數;

1.1 LuatOS任務(task)

1.1.1 FreeRTOS task和LuatOS task

wKgZPGmBiY-ARabLAAJsLrutcjQ621.png

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

1、第一種是LuatOS內核固件中的任務,也就是FreeRTOS創建的任務;這種任務我們把它命名為FreeRTOS task;

2、第二種是LuatOS項目應用腳本中的任務,也就是用戶腳本代碼中調用sys.taskInit和sys.taskInitEx兩個API創建的任務,這種任務我們把它命名為LuatOS task;嚴格意義上說,LuatOS task并不是真正的task,而是利用了Lua中的協程(coroutine)概念,來等價實現的一種task效果,因為task的受眾面比協程的受眾面要廣的很多,所以我們在LuatOS中,將協程(coroutine)包裝成了task的概念,這樣更容易理解和使用;關于協程(coroutine)的知識,在本文接下來的內容中,我們會接觸到。

在這里我使用一個形象的比喻,爭取可以讓大家更加直觀的理解這兩種任務的聯系和區別:

1、有一個森林,這個森林就是FreeRTOS;

2、森林里生長了很多棵大樹,每一棵大樹都是FreeRTOS創建的一個任務,就是FreeRTOS task;

這些大樹分成了兩種:

a. 一種是長出了樹干,樹干上還有很多樹枝,這一種大樹只有一棵,就是Lua虛擬機任務

b. 一種是只長了光禿禿的樹干,樹干上沒有樹枝,這種大樹有很多,除Lua虛擬機之外,其余所有任務都是這種大樹

Lua虛擬機任務這棵大樹的樹干上長出的所有樹枝,就是一個個的LuatOS task

根據以上描述畫一張簡圖如下:

wKgZPGmBijyAfUsMAAKeBnk7oEw013.pngwKgZO2mBineAQjPcAAEZAMSbVeY517.png

1.1.2 兩種LuatOS task(基礎task和高級task)

怎么創建一個task,在sys核心庫中提供了兩個api:

sys.taskInit(task_func, ...)

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

這兩個api分別創建兩種task,首先我們給這兩種task起個名字,一種叫基礎task,一種叫高級task;

sys.taskInit(task_func, ...)創建的task是基礎task;

sys.taskInitEx(task_func, task_name, non_targeted_msg_cbfunc, ...)創建的task是高級task;

從設計原理的角度來看,基礎task和高級task的區別是:

(1) 所有的基礎task共享一個全局消息隊列;

(2) 每個高級task都有自己獨立的定向消息隊列,同時又能使用全局消息隊列;

wKgZO2mBirOADzFKAAK3Q-jfHMk965.png

1.1.3 LuatOS task內部運行環境和外部運行環境

在LuatOS應用腳本開發過程中,我們所編寫的應用腳本代碼,存在兩種業務運行的邏輯環境:

1、一種是在task的任務處理函數內部的業務邏輯環境中運行,我們簡稱為:在task內部運行;

2、一種是在task的任務處理函數外部的業務邏輯環境中運行,我們簡稱為:在task外部運行;

怎么理解這兩種業務邏輯運行環境?我們看下面這張圖

看右邊生長出分支的這棵大樹,這棵大樹就是FreeRTOS創建的Lua虛擬機task,是一個FreeRTOS task;

在這個Lua虛擬機FreeRTOS task上,這棵大樹再分為兩部分:

1、樹干部分:樹干部分運行的業務邏輯環境就是LuatOS task外部運行環境;

2、樹枝部分:每個樹枝都是一個獨立的LuatOS task,樹枝部分運行的業務邏輯環境就是LuatOS task內部運行環境;

在這里,大家只要知道有task內部運行和task外部運行兩種環境即可,接下來我們下面講解內部設計原理時,會進一步去學習理解;

1.1.4 LuatOS task狀態切換

wKgZO2mBiyKAZm_cAAFMuQgvdCs338.png

1.2 LuatOS消息(message)

LuatOS 的消息機制是LuatOS task協作和事件驅動編程的核心部分,消息機制包括消息的發布和訂閱處理、消息的發送和接收處理;

1.2.1 三種消息隊列

消息需要存儲到消息隊列中,消息隊列中的消息遵循先進先出(FIFO)原則;

wKgZPGmBi16AUu_RAAK8X7n7vys045.png

內核消息隊列

FreeRTOS創建的每一個task都有一個消息隊列,這種消息隊列就叫做內核消息隊列;

內核消息隊列是FreeRTOS直接管理的,存儲每個FreeRTOS task內核消息的隊列;

LuatOS應用全局消息隊列

所有LuatOS task應用共享一個消息隊列,這個消息隊列就叫做LuatOS應用全局消息隊列;

LuatOS應用全局消息隊列是LuatOS虛擬機直接管理的;

LuatOS基礎task可以接收處理這個消息隊列中的消息,LuatOS高級task可以接收處理這個消息隊列中的消息;

LuatOS外部運行環境中的業務也可以接收處理這個消息隊列中的消息;

LuatOS應用定向消息隊列

每個LuatOS 高級task都有一個消息隊列,這個消息隊列就叫做LuatOS應用定向消息隊列;

LuatOS應用定向消息隊列是LuatOS虛擬機直接管理的;

每個定向消息隊列和一個LuatOS高級task存在唯一的綁定關系;

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

1.2.2 六種消息

根據消息存儲使用的消息隊列類型以及消息發送方的不同,可以把消息劃分為以下六類:

wKgZO2mBi7aAC-gHAAQWqQSKpEQ989.png

1.3 LuatOS定時器(timer)

對于LuatOS應用程序來說,定時器本質上也算是一種特殊的消息,因為定時器太常用了,所以把他單獨拎出來,單獨的一個章節進行講解;

定時器分類如下圖所示:

wKgZO2mBi_iASzZZAAO4VMTsOBA005.png

1.4 LuatOS調度器(sys.run())

sys核心庫是LuatOS應用程序運行的核心大腦,sys.run()是sys核心庫的大腦,負責整個LuatOS應用腳本程序的調度和管理,是LuatOS應用程序的調度器;

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

雖然sys.run()使用起來非常簡單,但是如果大家對sys.run()的運行原理有一個總體性的理解和認識,對開發LuatOS應用項目來說,幫助很大。

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

wKgZO2mBjNCARrPYAAH-Ou866mU468.png

我們看上面這張圖:

1、LuatOS內核固件中的FreeRTOS會創建一個Lua虛擬機任務;

2、Lua虛擬機任務的處理函數中,首先進行初始化:

在內核固件的C代碼中,加載Lua標準庫和LuatOS核心庫;

從LuatOS的腳本分區找到main.lua

開始逐行嵌套解析執行main.lua中的腳本代碼(加載必要的擴展庫腳本文件和自己開發的應用腳本文件,并且運行這些腳本文件的初始化代碼)

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

4、sys.run()中的實現是一個while true循環,在這個循環內,不斷地從內核消息隊列和LuatOS應用消息隊列中讀取消息,并且分發消息給接收者進行處理。

wKgZPGmBjRaAZ1vUAAK8eZtwn8U761.png

二、sys.lua源碼分析方法

通過本文前三部分的描述,我們對LuatOS運行框架的基礎理論知識做了簡單的回顧;

接下來我們進入本講的重點內容:學習理解LuatOS運行框架的內部設計源碼;

sys核心庫是LuatOS運行框架庫,是LuatOS應用程序運行的核心大腦;

我們要深入學習LuatOS框架的內部設計原理,就是要深入學習sys核心庫的內部設計實現原理;

sys.lua源文件是sys核心庫的代碼實現,點擊這里可以看到sys.lua源碼;

所以本講課程中,我們接下來會重點分析sys.lua的源碼實現;通過分析sys.lua源碼,從而來學習理解LuatOS框架的設計原理;

sys.lua是sys核心庫的內部實現;

說到核心庫,我們再來回顧一下LuatOS軟件架構,如下圖所示:

wKgZO2mBjaWASeQEAAJXLPzmRyg030.png

之前我們講述LuatOS軟件架構時,當時有說,LuatOS核心庫是用C語言開發的,這個描述并不準確,在核心庫中,有一個特例,就是sys核心庫,這個核心庫是用Lua語言開發的,并且源碼也開放了;

雖然sys核心庫是用Lua語言開發的,但是它還是一個核心庫,在編譯內核固件的時候,會把sys.lua源文件集成到編譯好的內核固件中對外發布;

我們今天采用以下方式來學習sys.lua源碼設計:

1、在目前的sys.lua源文件中增加詳細的注釋和運行日志,分析代碼設計

2、使用LuatOS PC模擬器,運行demo代碼+第1步增加運行日志的sys.lua,通過分析運行日志,進一步理解sys.lua的設計原理

在模擬器上運行demo代碼的方法,

本講中使用的demo代碼參考luatos_framework;模擬器運行時的命令如下:

wKgZPGmBjhqAWcEDAAA6oomrQzc968.png

要深入理解LuatOS框架的設計原理,其實就是深入學習sys.lua中的以下幾個概念:

1、一個調度器:sys.run()

2、三個概念:任務(task),消息(message),定時器(timer)

3、五張表:

高級task任務列表(taskList)

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

定時器處理表(timerPool),定時器回調函數參數表(para)

三、LuatOS 調度器(sys.run())內部設計

LuatOS調度器sys.run函數的主體處理邏輯參考下圖中黃色背景部分

wKgZO2mBjpWAJZQxAAIq4SJaDGg666.png

從這張圖可以看出,在LuatOS內核固件中有一個FreeRTOS,FreeRTOS運行起來之后,創建了很多任務,有軟件定時器任務,TCP/IP協議棧任務,文件系統任務,Lua虛擬機任務等。

其中Lua虛擬機任務和LuatOS項目的應用軟件關系最為密切;

Lua虛擬機任務運行起來之后,經過必要的初始化動作,就會去尋找main.lua腳本文件,找到之后,從main.lua的第一行代碼開始解析執行,main.lua會執行必要的初始化動作并且加載運行其他的Lua腳本應用功能模塊,main.lua的最后一行代碼為sys.run(),sys.run()是一個while true的循環函數,實際上也是Lua虛擬機任務的處理函數;

在這個while循環里面,不斷的分發處理各種消息,調度LuatOS項目應用軟件的正常運行。

現在,我們一起看下剛才描述的這個過程的源碼,在閱讀源碼之前,我們先看下面這張框圖,描述了主要源碼函數和代碼段的調用過程:

wKgZPGmBjtWAdysXAAGFC8OY5Ec033.png

四、LuatOS 任務(task)內部設計

4.1 sys.taskInit(創建并且運行基礎task)

wKgZO2mBjxCAWb4MAAAm8ho_JDE448.png

4.1.1 源碼分析

wKgZO2mBj2iAZStyAAEIT2Js2KY315.png


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

wKgZPGmBj5eAML1cAAbom9P6ocs010.png

通過分析sys.taskInit這個api的源碼,我們可以看出,LuatOS的task概念,實際上是對Lua語言的協程(coroutine)概念的一層封裝,因為task的受眾面比協程的受眾面要廣的很多,所以我們在LuatOS中,將協程(coroutine)包裝成了task的概念,這樣更容易理解和使用;

4.1.2 Lua語言中協程(coroutine)概念的理解

在LuatOS的sys.lua中,把Lua中的協程概念包裝成了task概念,來實現多任務的編程效果;

所以我們要想深入理解sys.lua中的內部設計,勢必要對Lua語言中的協程概念有一個基本的認識;

在 Lua 語言中,協程(coroutine)是一種用戶態的輕量級線程,它允許程序在執行過程中暫停和恢復,從而實現協作式的多任務處理。與操作系統的線程不同,協程的調度完全由程序自身控制,而非由操作系統內核調度;

1、在LuatOS的sys.lua中,僅僅關注協程的三種狀態:

掛起(suspended)狀態,以下兩種情況,協程處于掛起狀態:

coroutine.create(f)創建協程后,未主動運行這個協程;

協程運行過程中,被本協程內部調用coroutine.yield(...)暫停;

運行(running)狀態

處于掛起狀態的協程co,在此協程外執行coroutine.resume(co[, ...])則恢復為運行狀態;

死亡(dead)狀態:以下兩種情況,協程處于死亡狀態:

協程正常運行結束;

協程運行過程中出現異常結束;

2、協程的核心特點

協作式:協程必須主動讓出執行權(通過調用coroutine.yield(...)),其他協程才有機會運行。

狀態保留:協程暫停掛起時會保存當前執行狀態(如變量、棧),恢復時從暫停處繼續。

wKgZO2mBkLKAMXdtAAD-5bYOZ6o893.png


4.1.3 應用示例

針對剛才對sys.taskInit源碼的分析,接下來我們一起在模擬上運行一個demo示例,加深一下對sys.taskInitapi內部設計的理解;

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

main.lua

wKgZO2mBkPKATbizAABuEHPPQxE635.png

scheduling.lua

wKgZPGmBkRSARY5PAAFPmMVhx-A820.png

首先我們分析一下,在這個demo示例中,使用sys.taskInit(task1_func)創建的任務,任務處理函數的task1_func()的源碼+sys.lua源碼,分析下代碼是如何調度運行的;

接下來我們使用模擬器,針對以下幾種場景,實際跑一下這個demo示例看看運行效果:

模擬器運行指令如下:

wKgZPGmBjhqAWcEDAAA6oomrQzc968.png

1、打開 scheduling.lua中的count = count + "hdjks"

最終運行的核心日志為

wKgZPGmBkYiAdgddAALI81AixbA234.png

2、打開 scheduling.lua中的count = count + "hdjks"

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

最終運行的核心日志為

wKgZO2mBkceABLB2AAKA9VzUS4M612.png

3、打開 scheduling.lua中的count = count + "hdjks"

打開main.lua中的

_G.COROUTINE_ERROR_ROLL_BACK = false

_G.COROUTINE_ERROR_RESTART = false

最終運行的核心日志為

wKgZPGmBkguAYiUYAAQGJk-9I50412.png

4.2 sys.taskInitEx(創建并且運行高級task)

wKgZO2mBknaABM2PAAA2NscA1nI447.png


4.2.1 數據結構(taskList)

wKgZO2mBkpCAR_0uAAJC3io3w5M264.png


4.2.2 源碼分析

wKgZO2mBlkWALZvSAAIgTzymLu8480.png


從上面這段代碼可以看到,使用sys.taskInitEx創建一個高級task,和使用sys.taskInit創建一個基礎task相比,最核心的區別是多申請了一個高級task全局信息表{msgQueue={}, To=false, cb=cbFun},這個全局信息表是高級task處理定時器消息和定向消息的關鍵;下圖中高級task指向的定向消息隊列,對應的就是高級task全局表中的msgQueue={}

wKgZO2mBlmyAadW3AAIvynXarPg150.png

4.2.3 應用示例

使用sys.taskInitEx創建一個高級task,和使用sys.taskInit創建一個基礎task相比,最核心的區別是多申請了一個高級task全局信息表{msgQueue={}, To=false, cb=cbFun},其余實現原理和sys.taskInit完全相同,所以此處不再對sys.taskInitEx結合實際的demo示例來進一步理解了;

在后續的消息和定時器章節會進一步深入演示學習。

4.3 sys.taskDel(清除高級task的內存資源)

wKgZPGmBlraAGWKRAAAl2l2B6EQ538.png


4.3.1 源碼分析

wKgZO2mBlwqAM1NHAAPwQAdAMMc936.png


4.3.2 應用示例

針對剛才對sys.taskDel源碼的分析,接下來我們一起在模擬上運行一個demo示例,加深一下對sys.taskDelapi內部設計的理解;

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

main.lua

wKgZO2mBkPKATbizAABuEHPPQxE635.png

memory_task_delete.lua

wKgZPGmBl3SAZE41AAEnneGfehk404.png

接下來我們使用模擬器,針對以下三種場景,實際跑一下這個demo示例看看運行效果:

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

關閉 memory_task_delete.lua中的dhjsk = las + 2

關閉main.lua中的

_G.COROUTINE_ERROR_ROLL_BACK = false

_G.COROUTINE_ERROR_RESTART = false

最終運行的核心日志為

wKgZPGmBl8WAZ8vcAAGpw_JfXvs640.png

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

關閉 memory_task_delete.lua中的dhjsk = las + 2

關閉main.lua中的

_G.COROUTINE_ERROR_ROLL_BACK = false

_G.COROUTINE_ERROR_RESTART = false

最終運行的核心日志為

wKgZO2mBl_WAJxDiAAITTmMYS6k902.png

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

打開 memory_task_delete.lua中的dhjsk = las + 2

打開main.lua中的

_G.COROUTINE_ERROR_ROLL_BACK = false

_G.COROUTINE_ERROR_RESTART = false

最終運行的核心日志為

wKgZPGmBmCmAXw2xAAKKolUdnKQ152.png

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

打開 memory_task_delete.lua中的dhjsk = las + 2

關閉main.lua中的

_G.COROUTINE_ERROR_ROLL_BACK = false

_G.COROUTINE_ERROR_RESTART = false

最終運行的核心日志為

wKgZO2mBmFaAJ0heAAJJhuP9CGM925.png

通過這個demo示例,我們可以看出sys.taskDel函數對于內存釋放的作用,目前的LuatOS設計,只需要記住一點就行了:

高級task的任務處理函數中,在調用return語句返回前,或者任務處理函數的最后一行代碼,調用sys.taskDel即可;


五、LuatOS 定時器(timer)內部設計

5.1 數據結構(timerPool和para)

wKgZO2mBmJiAGCdVAAMXX8wzXUk076.png

5.2 api源碼分析

現在,我在vscode上打開已經添加了詳細注釋的sys.lua,對以下每個api的源碼進行分析(僅分析和定時器有關的源碼部分),為了讓大家對定時器的使用有一個更全局的認識,所以也會分析一部分LuatOS倉庫中開源的內核C代碼:

wKgZO2mBmPKAVr8IAAFoYufKDvI474.png

下面列舉的函數調用棧,供分析源碼時參考使用:

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三個參數)

5.3 完整業務處理過程

wKgZO2mBmS6AVzjCAAKikooDprs543.png

5.4 應用示例

剛才我們已經分析了和定時器操作有關的sys.lua源碼,在本講的最后一章,我會基于一個實際的MQTT demo項目,逐行分析項目中應用腳本源碼和sys.lua源碼,讓大家在實際的項目中深刻理解LuatOS運行框架中的消息設計原理;

六、LuatOS 消息(message)內部設計

6.1 數據結構(subscribers和messageQueue)

wKgZO2mBmZiAaaB9AAHhhLWS8i8240.png

下圖中的全局消息隊列,對應的就是messageQueue ={}

wKgZO2mBmdyALdtmAAIvpsP02x0833.png

6.2 api源碼分析

現在,我在vscode上打開已經添加了詳細注釋的sys.lua,對以下每個api的源碼進行分析(僅分析和消息處理有關的源碼部分),為了讓大家對消息的使用有一個更全局的認識,所以也會分析一部分LuatOS倉庫中開源的內核C代碼:

wKgZPGmBmgqAQyrDAAFsKWPZEhw103.png

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

wKgZPGmBmjGAQhP1AABI_NHIh38701.png

下面列舉五種消息應用場景的完整業務處理過程:

6.3 內核非定時器消息完整業務處理過程(以 串口接收到新數據消息 為例)

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(在這里執行執行uart.on注冊的回調函數recv_cb,然后返回空數據,sys.lua中的rtos.receive返回值為nil)

6.4 系統應用全局消息完整處理過程(以"IP_READY"為例)

wKgZPGmBmpaAb6enAAHDW_dWS24284.png


在用戶腳本代碼中,根據具體的業務邏輯,訂閱全局消息"IP_READY"

當某一種網卡網絡環境準備就緒時,在內核固件的netif_ip_event_cb中,主動調用sys.lua中定義的_G.sys_pub = sys.publish,實際上就是調用sys.publish發布一條全局消息"IP_READY",存儲到sys.lua中的全局消息表messageQueue中

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

6.5 用戶應用全局消息完整處理過程

wKgZO2mBmtyAWh1bAAGlWb1GrBg662.png


在用戶腳本代碼中,根據具體的業務邏輯,訂閱全局消息

在用戶腳本的代碼,調用sys.publish發布全局消息

在sys.lua中,通過sys.run調度器,執行dispatch分發處理全局消息

6.6 系統應用定向消息完整處理過程(以socket.EVENT為例)

wKgZO2mBmweAbfK9AAGwYqfehME736.png


l_socket_callback,當內核固件中的某一個socket產生異步事件時(例如socke接收到新數據),主動調用sys.lua中定義的_G.sys_send = sys.sendMsg,實際上就是調用sys.sendMsg給指定Lua腳本中的高級task發送一條定向消息,存儲到此高級task對應的定向消息隊列taskList[task_name].msgQueue中

在用戶腳本代碼中,通過sys.waitMsg去處理定向消息

6.7 用戶應用定向消息完整處理過程

wKgZO2mBmzuAQHguAAHiIkfImGQ786.png

1、在用戶腳本代碼中,調用sys.sendMsg發送定向消息

2、在用戶腳本代碼中,調用sys.waitMsg處理定向消息

6.8 應用示例

剛才我們已經分析了和消息操作有關的sys.lua源碼,在本講的最后一章,我會基于一個實際的MQTT demo項目,逐行分析項目中應用腳本源碼和sys.lua源碼,讓大家在實際的項目中深刻理解LuatOS運行框架中的消息設計原理;

七、基于MQTT demo項目,再次全面理解LuatOS框架的內部設計運行原理

講到最后,我會基于一個實際的MQTT demo項目,逐行分析項目中應用腳本源碼和sys.lua源碼,讓大家在實際的項目中深刻理解LuatOS運行框架的內部設計原理;

7.1 demo項目總體設計框圖

demo項目的總體設計框圖如下:

wKgZPGmBm4aAcVzIAAIzRml1dvs627.png

7.2 demo項目源碼+sys.lua源碼綜合分析

這個mqtt demo代碼中的注釋比較詳細,sys.lua代碼注釋也比較詳細,接下來我用vscode直接打開這份demo項目和sys.lua,和大家一起分析下源碼設計;

今天的內容就分享到這里了~

審核編輯 黃宇

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 模塊化
    +關注

    關注

    0

    文章

    359

    瀏覽量

    22734
  • LuatOS
    +關注

    關注

    0

    文章

    162

    瀏覽量

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

掃碼添加小助手

加入工程師交流群

    評論

    相關推薦
    熱點推薦

    Energy Vault與Crusoe宣布達成戰略框架協議,部署Crusoe Spark模塊化AI工廠機組以交付Crusoe Cloud云服務

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

    LuatOS 框架的嵌入式系統架構設計原理

    LuatOS 重新定義了嵌入式系統的開發范式——將 Lua 腳本作為主程序語言,構建起完整的系統架構。其設計原理圍繞“腳本主導、C 層支撐”展開,通過在固件中嵌入 Lua 解釋器,將硬件操作抽象為
    的頭像 發表于 02-03 15:57 ?161次閱讀
    <b class='flag-5'>LuatOS</b> <b class='flag-5'>框架</b>的嵌入式<b class='flag-5'>系統</b>架構設計原理

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

    接上一篇 2.3 LuatOS 的定時器(timer) 對于 LuatOS 應用程序來說,定時器本質上也算是一種特殊的消息,因為定時器太常用了,所以把他單獨拎出來,單獨的一個章節進行講解
    的頭像 發表于 01-28 13:18 ?209次閱讀
    解鎖:<b class='flag-5'>LuatOS</b><b class='flag-5'>框架</b>的使用(下篇)

    LuatOS框架的使用(上)

    環境搭建、模塊調用到任務調度,全面解析其開發流程與最佳實踐。 本篇文章主要講LuatOS 框架;LuatOS 框架是整個
    的頭像 發表于 01-27 19:38 ?218次閱讀
    <b class='flag-5'>LuatOS</b><b class='flag-5'>框架</b>的使用(上)

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

    ”到“可重構系統”的跨越,為現代高精度時頻應用提供了全新模式。 一、模塊化設計的本質突破:從“整機”到“模塊” 一般銣原子鐘的功能集成度高且采用整機形式,而SYN3306的模塊化架構可
    的頭像 發表于 01-21 19:09 ?157次閱讀

    鼎陽科技推PXIe模塊化示波器、PXIe模塊化矢量網絡分析儀產品組合,構建新一代模塊化、軟件定義的測試平臺

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

    掌握LuatOS系統消息:新手也能看懂的列表詳解

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

    精準維修:安捷倫N6701A模塊化電源系統主機深度修復與校準

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

    新品發布|LRM模塊化高速連接器

    認證發明專利。該款連接器是一種模塊化、高性能高速率的系統連接器產品,多腔體模塊化設計可以支持多種信號類型,射頻、高頻高速、光信號及電源的混合傳輸,不同的腔體可以靈
    的頭像 發表于 10-20 17:02 ?2105次閱讀
    新品發布|LRM<b class='flag-5'>模塊化</b>高速連接器

    LuatOS腳本開發入門:嵌入式運行框架全解析!

    想搞懂LuatOS如何運行Lua腳本?本文深入剖析其嵌入式運行框架,涵蓋虛擬機加載、任務協程、系統初始等關鍵環節,適合初學者。 一、LuatOS
    的頭像 發表于 09-26 17:45 ?552次閱讀
    <b class='flag-5'>LuatOS</b>腳本開發入門:嵌入式運行<b class='flag-5'>框架</b>全解析!

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

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

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

    是一種模塊化、高性能高速率的系統連接器產品,多腔體模塊化設計可以支持多種信號類型,射頻、高頻高速、光信號及電源的混合傳輸,不同的腔體可以靈活配置不同功能模塊。01
    的頭像 發表于 07-07 18:15 ?1519次閱讀
    新品推薦|<b class='flag-5'>模塊化</b>集成式高速連接器

    鴻蒙5開發寶藏案例分享---模塊化設計案例分享

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

    原理圖模塊化,BOM 物料位號處理

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

    MCU-40型自動測量是如何實現分布式模塊化?

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