【EventOS Nano】EventOS Nano使用快速入門

来源:https://www.cnblogs.com/Wangzx000/archive/2022/07/18/16491863.html
-Advertisement-
Play Games

MySQL的許可權管理(非重點) mysql用戶分類角度: 1.管理用戶: root,具有最高許可權,具有創建用戶的許可權,可以為其他用戶授權 2.普通用戶: 普通由root用戶創建,許可權由root分配 mysql用戶分類角度(訪問主機不同) 本地用戶-- 只能在安裝mysql的機器上訪問mysql資料庫 ...


快速入門


EventOS Nano非常簡單,除源碼外,只需要實現三個代碼,就可以使用EventOS Nano編寫程式
  • main.c main函數,初始化和啟動EventOS
  • eos_port.c 如EventOS在特定平臺上的介面實現,就是EventOS Nano移植的相關代碼
  • eos_led.c LED的閃爍狀態機。LED燈閃爍,類似於單片機界的hello world

如下對每一個文件進行詳細說明:


1.main.c

EventOS初始化->訂閱表初始化->LED狀態機初始化->EventOS啟動

/* include ------------------------------------------------------------------ */
#include "eventos.h"                                // EventOS Nano頭文件
#include "event_def.h"                              // 事件主題的枚舉
#include "eos_led.h"                                // LED燈閃爍狀態機

/* define ------------------------------------------------------------------- */
static eos_u32_t eos_sub_table[Event_Max];          // 訂閱表數據空間

/* main function ------------------------------------------------------------ */
int main(void)
{
    if (SysTick_Config(SystemCoreClock / 1000) != 0)
        while (1);
    
    eos_init();                                     // EventOS初始化
#if (EOS_USE_PUB_SUB != 0)
    eos_sub_init(eos_sub_table, Event_Max);         // 訂閱表初始化
#endif

#if (EOS_USE_SM_MODE != 0)
    eos_sm_led_init();                              // LED狀態機初始化
#endif
    eos_reactor_led_init();

    eos_run();                                      // EventOS啟動

    return 0;
}

在QP和EventOS Nano中,事件主題的定義是使用枚舉來定義的。但反觀很多事件驅動和消息驅動的應用,如ROS和MQTT的實現,其事件(消息)的定義,是使用字元串的。二者各有利弊,枚舉的好處是節省RAM和ROM,適合資源受限的場合,字元串的好處是,使用方便,不產生耦合,利於實現分散式。


事件主題event_def.h的定義如下:
#include "eventos.h"

enum {
    Event_Test = Event_User,    // 事件主題的定義從Event_User開始,小於Event_User的是系統事件。
    Event_Time_500ms,
    Event_Time_1000ms,

    Event_ActEnd,
    
    Event_Max
};

2.eos_port.c


eos_port.c是硬體或平臺依賴文件

#include "eventos.h"

// 進入臨界區,關閉全局中斷
void eos_port_critical_enter(void)
{
    __disable_irq();   // 當IDE為MDK時,面向ARM Cortex-M系列,可以參考實現
}

// 退出臨界區,開啟全局中斷
void eos_port_critical_exit(void)
{
    __enable_irq();    // 當IDE為MDK時,面向ARM Cortex-M系列,可以參考實現
}

// 斷言介面,EventOS Nano推崇防禦式編程,內部運用了大量的斷言檢查程式運行的合法性
eos_u32_t eos_error_id = 0;
void eos_port_assert(eos_u32_t error_id)
{
    // 斷言信息的列印。
    SEGGER_RTT_printf(0, "------------------------------------\n");
    SEGGER_RTT_printf(0, "ASSERT >>> Module: EventOS Nano, ErrorId: %d.\n", error_id);
    SEGGER_RTT_printf(0, "------------------------------------\n");
    
    eos_error_id = error_id;

    while (1) 
    {
         /* User code */
    }
}

// 空閑回調函數:當EventOS Nano沒有任何事件需要處理的時候,會調用此函數
// 可以實現:硬體設備的輪訓、隨機數的計算等,如果沒有,實現一個空函數即可
void eos_hook_idle(void)
{

}

// 啟動回調函數
// 在EventOS Nano初始化完畢,且狀態機運行之前,會調用這個回調函數。這裡可以對硬體設備進行初始化、對功能模塊或者中間件進行初始化等。
void eos_hook_start(void)
{
   // 硬體初始化
    /* User code */

    // 功能模塊初始化
    /* User code */
}

// 停止回調函數
// 在EventOS Nano進入斷言後,或者用戶調用eventos_stop函數將EventOS停止後,此回調函數會被調用
//  這個函數主要用於有序關閉敏感設備(關閉電機運行),或者向外界提供信息(打開報警器,顯示報警界面,或者列印報警信息等)。
void eos_hook_stop(void)
{
   // 有序關閉敏感設備
    motor_stop(Motor_Left);
    motor_stop(Motor_Right);

    // 顯示必要信息
    led_set_status(LedStatus_Stop);
}

3.eos_led.c和eos_led.h

eos_led.c中描述了狀態機是如何使用的

/* include ------------------------------------------------------------------ */
#include "eos_led.h"                    // 模塊頭文件
#include "eventos.h"                    // EventOS頭文件
#include "event_def.h"                  // 事件定義頭文件
#include <stdio.h>                      // 標準輸入輸出庫

/* data structure ----------------------------------------------------------- */
typedef struct eos_led_tag {            // LED類
    eos_sm_t super;
    eos_bool_t status;
} eos_led_t;

static eos_led_t led;                   // led對象,單例模式

/* static state function ---------------------------------------------------- */
// 初始狀態
static eos_ret_t state_init(eos_led_t * const me, eos_event_t const * const e);
// Led的ON狀態
static eos_ret_t state_on(eos_led_t * const me, eos_event_t const * const e);
// Led的Off狀態
static eos_ret_t state_off(eos_led_t * const me, eos_event_t const * const e);

/* api ---------------------------------------------------- */
void eos_led_init(void)
{
    static eos_u32_t queue[32];                 // 事件隊列
    eos_sm_init(&led.super, 1, queue, 32);      // 狀態機初始化
                                                // 狀態機啟動,以state_init作為初始狀態。
    eos_sm_start(&led.super, EOS_STATE_CAST(state_init));


    led.status = 0;
}

/* static state function ---------------------------------------------------- */
static eos_ret_t state_init(eos_led_t * const me, eos_event_t const * const e)
{
    // 訂閱事件Event_Time_500ms
    EOS_EVENT_SUB(Event_Time_500ms);
    // 使事件Event_Time_500ms,每隔500ms就被髮送一次。
    eos_event_pub_period(Event_Time_500ms, 500);


    // EOS_TRAN是個回調介面
    return EOS_TRAN(state_off);
}


/*每500ms,訂閱的500ms事件會發佈一次,切換on/off狀態,併進入對應函數的Event_Enter狀態執行*/

static eos_ret_t state_on(eos_led_t * const me, eos_event_t const * const e)
{
    switch (e->topic) {
        case Event_Enter:                           // 狀態state_on的進入事件
            printf("State On!\n");
            me->status = 1;
            return EOS_Ret_Handled;

        case Event_Time_500ms:                      // 收到Event_Time_500ms,跳轉到state_off
            return EOS_TRAN(state_off);


        default:
            return EOS_SUPER(eos_state_top);
    }
}

static eos_ret_t state_off(eos_led_t * const me, eos_event_t const * const e)
{
    switch (e->topic) {
        case Event_Enter:                           // 狀態state_off的進入事件
            printf("State Off!\n");
            me->status = 0;
            return EOS_Ret_Handled;


        case Event_Time_500ms:                      // 收到Event_Time_500ms,跳轉到state_on
            return EOS_TRAN(state_on);


        default:
            return EOS_SUPER(eos_state_top);
    }
}






倉庫地址:https://gitee.com/event-os/eventos.git


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 不要在foreach迴圈里進行元素的remove/add操作。 remove元素請使用Iterator方式,如果併發操作,需要對Iterator對象加鎖。 正例 List<String> list = new ArrayList<>(); list.add("1"); list.add("2"); ...
  • 米哈游2023秋季招聘正式開始~ [燈泡]簡歷投遞:7.4-10.31 提前批: 7.22號之前投遞部分崗位有機會免筆試 筆試:7月-10月 面試:7月中旬開始 [燈泡] 成功密碼 內推碼拿好,沖! 校招唯一專屬內推碼EYTUC。 校招崗位鏈接:https://taou.cn/2piRI 選擇好崗位 ...
  • 1.過濾器 1.為什麼要使用過濾器 在Web開發中,常常會有這樣的需求:在所有介面中去除用戶輸入的非法字元,以防止引起業務異常。要實現這個功能,可以有很多方法,如: 在前端參數傳入時進行校驗,先過濾掉非法字元,然後,返回用戶界面提示用戶重新輸入。 後端接收前端沒有過濾的數據,然後過濾非法字元。 利用 ...
  • 有時為了確保數據存儲的唯一性,會選擇數據結構中的字典,但往往在存儲數據之後會對數據進行一系列的操作,比如排序等等,但字典在數據結構中是通過鍵值對進行存儲的,這時我們可以通過將字典轉換成對應的數組或動態數組進行排序,再通過排序後的鍵獲得字典中的值便可獲得想要的數據了。 引用的空間 using Syst ...
  • 我們作為咨詢方進行全廠的調研,最終給用戶交付《業務現狀分析與信息化需求評估報告》、《信息化總體規劃報告》、《應用架構設計報告》和《候選產品和潛在供應商名單》。 ...
  • awk的由來 awk這個工具的名字是由三個發明者的首字母組合而成。 awk是一個文本處理工具。 awk的版本 AWK:最早AWK是在unix上實現的,屬於貝爾實驗室的 NAWK:即NEW AWK,是AWK的升級版,也屬於貝爾實驗室。 GAWK:即GNU AWK,基於GNU重新編譯而來的,相容NAWK ...
  • (文章目錄) 前言 相信大多數人都有自己搭建博客網站的想法,本文就手把手一步一步的進行,最終結果類似如下樣式: 一、網站軟體的選擇 軟體選擇成熟而免費的WordPress,WordPress是一款能讓您建立出色網站、博客或應用程式的開源軟體。 可充分利用超過55,000個插件擴展WordPress, ...
  • LVM管理 lvm管理 部署lvm 格式化邏輯捲(剛剛創建出來的):mkfs.ext4格式、還是xfs_growfs 格式都可以 [root@lnh ~]# lsblk NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT sda 8:0 0 100G 0 disk ├─s ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...