<var id="fnfpo"><source id="fnfpo"></source></var>
<rp id="fnfpo"></rp>

<em id="fnfpo"><object id="fnfpo"><input id="fnfpo"></input></object></em>
<em id="fnfpo"><acronym id="fnfpo"></acronym></em>
  • <th id="fnfpo"><track id="fnfpo"></track></th>
  • <progress id="fnfpo"><track id="fnfpo"></track></progress>
  • <tbody id="fnfpo"><pre id="fnfpo"></pre></tbody>

  • 合宙LuatOS的個人空間 http://www.portaltwn.com/space-uid-176273.html [收藏] [復制] [RSS]

    博客

    LuatOS實戰教程:sys庫多任務管理

    已有 180 次閱讀2025-5-27 13:41 |個人分類:4G模組| 物聯網, 單片機, 4G模塊, 通訊模組, 嵌入式硬件

    sys庫是LuatOS的核心系統調度庫,它基于Lua協程機制實現了實時多任務調度、定時器管理以及消息通信等功能。

    在詳細介紹sys庫之前,我們先來補充一些關于實時操作系統RTOS的知識,方便大家更好地理解LuatOS的運行機制。

     

    一、 RTOS實時操作系統 
     

    我們用一個簡單的例子來看,對比經典的裸機開發和LuatOS開發的優勢:

    一位母親,她需要同步做兩件事情,一件是喂小孩吃飯,另一件事是回復朋友信息。


     
    1.1 裸機開發

    對裸機開發來說,這是兩件任務,這位母親一段時間內只能做一個任務,任務執行不連貫,等待時間長。

    time1-5 :喂小孩吃飯,就無法回復信息,朋友就受到冷落; 

    time5-10 :回復信息,小孩吃不到飯,就會哭鬧。



    1.2 RTOS處理多任務

    那RTOS是如何處理的呢?在RTOS里,這位母親的大腦非常強大,切換得非常的快,她上一秒喂飯,下一秒回復信息,再下一秒再喂飯。

    因為切換得非?,小孩以為她在專心喂飯,朋友以為她在認真聊天。這兩個任務看起來在同時進行。


    這就是RTOS的本質——把一秒鐘的時間切成多個時間片段,一個時間片段內干一件事情,一秒鐘切換100個時間片就可以做100件事情。 RTOS通過快速切換任務,讓多個任務看似在同時進行,提高了系統的并發處理能力和效率。 

    LuatOS通過Lua虛擬機封裝了底層RTOS的API,向開發者提供高級抽象接口,而無需直接操作RTOS內核。

    基于此LuatOS實現了一套多任務機制,允許開發者創建多個并行運行的任務。這些任務通過Lua語言的協程機制來實現,使得每個任務都可以在自己的執行上下文中運行,而不會相互干擾。

     

    二、 sys庫任務管理API函數 
     

    sys庫是LuatOS的核心系統庫,提供了任務調度、時間管理、消息傳遞等關鍵功能,本文主要介紹其任務管理相關API函數及其運用示例。
     

    2.1 程序框架

    在程序的開頭我們必須調用sys庫;在程序的結尾,我們需要在代碼的最后一行調用sys.run()函數來啟動主程序,讓框架內的任務代碼會在 sys.run()中運行。

    一個Lua程序的框架是這樣的:


    2.2 任務管理

    任務管理包含:創建任務sys.taskInit()、任務等待   sys.wait()和sys.waitUntil() 。


    1)創建任務sys.taskInit() 

    在創建任務時,需要指定一個任務函數,該函數包含了任務要執行的代碼。



    比如,我們創建一個喂飯的任務feed。

    代碼示例:先定義“喂飯”函數,然后創建并啟動“喂飯”任務。



    2)任務等待sys.wait() 

    暫停當前任務的執行一段時間,單位為毫秒。在等待期間,系統會調度其他任務執行,實現多任務并發。



    代碼舉例:

    我們依舊利用上面的程序,我們在代碼第三行后面,加一句sys.wait(1000) 即可。

    每隔一秒,打印一次 I'm feeding.....



    3)任務中斷sys.waitUntil()

    允許當前的Task協程暫停執行,進入等待狀態。在等待過程中,它會監聽指定名稱的事件(即 topic)是否發生,同時會記錄時間。

    如果在指定的時間內,該事件發生了,協程會恢復執行; 如果超過了指定的時間,事件還未發生,協程也同樣會恢復執行。

    一般這里都會設置判斷條件:指定時間內,事件發生執行A,超時未發生執行B。



    一般和sys.waitUntil()配合使用的,是sys.publish():

    sys.publish()它的作用就像是在系統里廣播消息,讓其他關注該消息的任務能夠接收到并做出相應反應——比如,sys.waitUntil()。


     三、多任務實戰演練 

     

    我們利用一個示例來實際感受下這幾個函數的用法:

    一位女主人,在燒水的同時,還要掃地; 水燒開后,停止掃地去關火,并沏茶。

    分析上述例子,女主人共有三個任務:燒水、掃地、沏茶

    這三個任務分別運行如下:



    接下來,我們來對這三個協程單獨分析: 

    1)燒水協程:

    燒水5秒后,sys.publish()發消息:“水燒開了”。

    代碼如下:


     

    2)掃地協程:
     

    掃地持續進行,sys.waitUntil()等待收到了:“水燒開的消息”,停止掃地;同時sys.publish()發送消息:水燒開了,不掃地了,去沏茶。

    代碼如下:


    sys.waitUntil()如果在1s內接收到了水燒開的消息,則返回true給result,繼續執行下面的if程序,打印“水燒開了:我去關火”;

    如果超時1秒沒有接收到,則返回false給result,繼續執行下面的if程序,打印“水還沒燒開,我要繼續掃地”。

     

    3)沏茶協程:

    在燒水的5秒鐘內,一直處于等待狀態,直到水燒開后,sys.waitUntil()收到:“水燒開了,不掃地了去沏茶”這條消息,開始執行沏茶協程。

    代碼如下:


    我們把完整代碼下載到Air780EPM開發板上,看下運行效果:



    這樣,我們就利用sys.publish()和sys.waitUntil()完成了一個多任務協程程序。

    附完整代碼:



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


    路過

    雞蛋

    鮮花

    握手

    雷人

    評論 (0 個評論)

    facelist

    您需要登錄后才可以評論 登錄 | 立即注冊

    關于我們  -  服務條款  -  使用指南  -  站點地圖  -  友情鏈接  -  聯系我們
    電子工程網 © 版權所有   京ICP備16069177號 | 京公網安備11010502021702
    返回頂部
    精品一区二区三区自拍图片区_国产成人亚洲精品_亚洲Va欧美va国产综合888_久久亚洲国产精品五月天婷