1. 程式人生 > >AliOS Things 異步事件框架Yloop

AliOS Things 異步事件框架Yloop

nbsp 有一個 cat framework XA 上下文 int 特定 嵌入式

本文為轉載,原文地址:https://blog.csdn.net/zhoushuntian/article/details/78852247

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
裏面有這樣一段代碼:

技術分享圖片

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作為例子:

技術分享圖片

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

系統事件的處理

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

技術分享圖片

#define EV_USER 0x1000
EV_USER以後的事件ID可以用於用戶自定義的事件。

Yloop回調

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

技術分享圖片

假設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