AliOS Things异步事件框架Yloop
摘要: Yloop概要 Yloop是AliOS Things的異步事件框架。Yloop借鑒了,libiuv及嵌入式業(yè)界常見的event loop,綜合考慮使用復(fù)雜性,性能,及footprint,實現(xiàn)了一個適合于MCU的事件調(diào)度機制。
Yloop概要
Yloop是AliOS Things的異步事件框架。Yloop借鑒了,libuv及嵌入式業(yè)界常見的event loop,綜合考慮使用復(fù)雜性,性能,及footprint,實現(xiàn)了一個適合于MCU的事件調(diào)度機制。
Yloop上下文
每個Yloop實例(aos_loop_t)與特定的任務(wù)上下文綁定,AliOS Things的程序入口application_start所在的上下文與系統(tǒng)的主Yloop實例綁定,該上下文也稱為主任務(wù)。主任務(wù)以外的任務(wù)也可以創(chuàng)建自己的Yloop實例。
Yloop調(diào)度
Yloop實現(xiàn)了對IO,timer,callback,event的統(tǒng)一調(diào)度管理:
IO:最常見的是Socket,也可以是AliOS Things的vfs管理的設(shè)備
timer:即常見的定時器
callback:特定的執(zhí)行函數(shù)
event:包括系統(tǒng)事件,用戶自定義事件
當(dāng)調(diào)用aos_loop_run后,當(dāng)前任務(wù)將會等待上述的各類事件發(fā)生。
Yloop實現(xiàn)原理
Yloop利用協(xié)議棧的select接口實現(xiàn)了對IO及timer的調(diào)度。AliOS Things自帶的協(xié)議棧又暴露一個特殊的eventfd接口,Yloop利用此接口把VFS的設(shè)備文件,和eventfd關(guān)聯(lián)起來,實現(xiàn)了對整個系統(tǒng)的事件的統(tǒng)一調(diào)度。
Yloop的使用
從hello world開始
hello world example
里面有這樣一段代碼:
application_start里面做了兩件事情:
調(diào)用aos_post_delayed_action創(chuàng)建了一個1秒的定時器(Yloop里面只有oneshot timer)
調(diào)用aos_loop_run進入事件循環(huán)
1秒后,定時器觸發(fā),app_delayed_action被調(diào)用,而app_delayed_action里面
調(diào)用LOG打印
再次創(chuàng)建一個5秒的定時器,重而實現(xiàn)定期執(zhí)行app_delayed_action
這里注意到,程序并不需要aos_loop_init()去創(chuàng)建Yloop實例,因為系統(tǒng)會默認自動創(chuàng)建主Yloop實例。
和Socket的結(jié)合
以mqtt的framework/connectivity/mqtt/mqtt_client.c作為例子:
在和服務(wù)端建立好socket連接后,調(diào)用aos_poll_read_fd()把mqtt的socket加入到Y(jié)loop的監(jiān)聽對象里。當(dāng)服務(wù)端有數(shù)據(jù)過來時,cb_recv回調(diào)將被調(diào)用,進行數(shù)據(jù)的處理。這樣,mqtt就不需要一個單獨的任務(wù)來處理socket,從而節(jié)省內(nèi)存使用。同時,由于所有處理都是在主任務(wù)進行,不需要復(fù)雜的互斥操作。
系統(tǒng)事件的處理
AliOS Things定義了一系列系統(tǒng)事件,程序可以通過aos_register_event_filter()注冊事件監(jiān)聽函數(shù),進行相應(yīng)的處理,比如WiFi事件。
define EV_USER 0x1000
EV_USER以后的事件ID可以用于用戶自定義的事件。
Yloop回調(diào)
Yloop回調(diào)用于跨任務(wù)的處理。以下面?zhèn)未a為例:
假設(shè)uart_recv_data_cb是IO設(shè)備收到數(shù)據(jù)時的回調(diào),收到數(shù)據(jù)后通過aos_schedule_call把實際處理do_uart_io_in_main_task放到主任務(wù)上下文去執(zhí)行。這樣,數(shù)據(jù)的邏輯處理do_uart_io_in_main_task就不需要考慮并發(fā),而去做復(fù)雜的互斥操作。
注意事項
Yloop的API(include/aos/yloop.h)除了下述API,都必須在Yloop實例所綁定的任務(wù)的上下文執(zhí)行:
aos_schedule_call
aos_loop_schedule_call
aos_loop_schedule_work
aos_cancel_work
aos_post_event
小結(jié)
Yloop作為AliOS Things的事件框架,和VFS,協(xié)議棧深度結(jié)合,在取得較好的footprint的同時,能較好地適應(yīng)于對footprint要求較高只有一個主任務(wù)的系統(tǒng),也可以適用于對處理的并發(fā)性要求較高的系統(tǒng)。
總結(jié)
以上是生活随笔為你收集整理的AliOS Things异步事件框架Yloop的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Gartner发布2022年七大安全和风
- 下一篇: Redis HyperLogLog 是什