日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

AliOS Things异步事件框架Yloop

發布時間:2024/8/23 编程问答 41 豆豆
生活随笔 收集整理的這篇文章主要介紹了 AliOS Things异步事件框架Yloop 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

摘要: Yloop概要 Yloop是AliOS Things的異步事件框架。Yloop借鑒了,libiuv及嵌入式業界常見的event loop,綜合考慮使用復雜性,性能,及footprint,實現了一個適合于MCU的事件調度機制。

Yloop概要
Yloop是AliOS Things的異步事件框架。Yloop借鑒了,libuv及嵌入式業界常見的event loop,綜合考慮使用復雜性,性能,及footprint,實現了一個適合于MCU的事件調度機制。

Yloop上下文
每個Yloop實例(aos_loop_t)與特定的任務上下文綁定,AliOS Things的程序入口application_start所在的上下文與系統的主Yloop實例綁定,該上下文也稱為主任務。主任務以外的任務也可以創建自己的Yloop實例。

Yloop調度
Yloop實現了對IO,timer,callback,event的統一調度管理:

IO:最常見的是Socket,也可以是AliOS Things的vfs管理的設備
timer:即常見的定時器
callback:特定的執行函數
event:包括系統事件,用戶自定義事件
當調用aos_loop_run后,當前任務將會等待上述的各類事件發生。

Yloop實現原理
Yloop利用協議棧的select接口實現了對IO及timer的調度。AliOS Things自帶的協議棧又暴露一個特殊的eventfd接口,Yloop利用此接口把VFS的設備文件,和eventfd關聯起來,實現了對整個系統的事件的統一調度。

Yloop的使用
從hello world開始
hello world example
里面有這樣一段代碼:

static void app_delayed_action(void *arg) {LOG("%s:%d %s\r\n", __func__, __LINE__, aos_task_name());aos_post_delayed_action(5000, app_delayed_action, NULL); }int application_start(int argc, char *argv[]) {aos_post_delayed_action(1000, app_delayed_action, NULL);aos_loop_run();return 0; }

application_start里面做了兩件事情:

調用aos_post_delayed_action創建了一個1秒的定時器(Yloop里面只有oneshot timer)
調用aos_loop_run進入事件循環
1秒后,定時器觸發,app_delayed_action被調用,而app_delayed_action里面

調用LOG打印
再次創建一個5秒的定時器,重而實現定期執行app_delayed_action
這里注意到,程序并不需要aos_loop_init()去創建Yloop實例,因為系統會默認自動創建主Yloop實例。

和Socket的結合
以mqtt的framework/connectivity/mqtt/mqtt_client.c作為例子:

static int iotx_mc_connect(iotx_mc_client_t *pClient) {<snip>rc = MQTTConnect(pClient);<snip>aos_poll_read_fd(get_ssl_fd(), cb_recv, pClient);<snip> }

在和服務端建立好socket連接后,調用aos_poll_read_fd()把mqtt的socket加入到Yloop的監聽對象里。當服務端有數據過來時,cb_recv回調將被調用,進行數據的處理。這樣,mqtt就不需要一個單獨的任務來處理socket,從而節省內存使用。同時,由于所有處理都是在主任務進行,不需要復雜的互斥操作。

系統事件的處理
AliOS Things定義了一系列系統事件,程序可以通過aos_register_event_filter()注冊事件監聽函數,進行相應的處理,比如WiFi事件。

static void netmgr_events_executor(input_event_t *eventinfo, void *priv_data) {switch ((eventinfo->code) {case CODE_WIFI_ON_CONNECTED:<do somthing><snip>} }aos_register_event_filter(EV_WIFI, event_cb, NULL);

define EV_USER 0x1000

EV_USER以后的事件ID可以用于用戶自定義的事件。

Yloop回調
Yloop回調用于跨任務的處理。以下面偽代碼為例:

void do_uart_io_in_main_task(void *arg) {<do something> }void io_recv_data_cb(char c) {aos_schedule_call(do_uart_io_in_main_task, (void *)(long)c); }

假設uart_recv_data_cb是IO設備收到數據時的回調,收到數據后通過aos_schedule_call把實際處理do_uart_io_in_main_task放到主任務上下文去執行。這樣,數據的邏輯處理do_uart_io_in_main_task就不需要考慮并發,而去做復雜的互斥操作。

注意事項
Yloop的API(include/aos/yloop.h)除了下述API,都必須在Yloop實例所綁定的任務的上下文執行:

aos_schedule_call
aos_loop_schedule_call
aos_loop_schedule_work
aos_cancel_work
aos_post_event
小結
Yloop作為AliOS Things的事件框架,和VFS,協議棧深度結合,在取得較好的footprint的同時,能較好地適應于對footprint要求較高只有一個主任務的系統,也可以適用于對處理的并發性要求較高的系統。

創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎

總結

以上是生活随笔為你收集整理的AliOS Things异步事件框架Yloop的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。