【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
  • 示例項目結構 在 Visual Studio 中創建一個 WinForms 應用程式後,項目結構如下所示: MyWinFormsApp/ │ ├───Properties/ │ └───Settings.settings │ ├───bin/ │ ├───Debug/ │ └───Release/ ...
  • [STAThread] 特性用於需要與 COM 組件交互的應用程式,尤其是依賴單線程模型(如 Windows Forms 應用程式)的組件。在 STA 模式下,線程擁有自己的消息迴圈,這對於處理用戶界面和某些 COM 組件是必要的。 [STAThread] static void Main(stri ...
  • 在WinForm中使用全局異常捕獲處理 在WinForm應用程式中,全局異常捕獲是確保程式穩定性的關鍵。通過在Program類的Main方法中設置全局異常處理,可以有效地捕獲並處理未預見的異常,從而避免程式崩潰。 註冊全局異常事件 [STAThread] static void Main() { / ...
  • 前言 給大家推薦一款開源的 Winform 控制項庫,可以幫助我們開發更加美觀、漂亮的 WinForm 界面。 項目介紹 SunnyUI.NET 是一個基於 .NET Framework 4.0+、.NET 6、.NET 7 和 .NET 8 的 WinForm 開源控制項庫,同時也提供了工具類庫、擴展 ...
  • 說明 該文章是屬於OverallAuth2.0系列文章,每周更新一篇該系列文章(從0到1完成系統開發)。 該系統文章,我會儘量說的非常詳細,做到不管新手、老手都能看懂。 說明:OverallAuth2.0 是一個簡單、易懂、功能強大的許可權+可視化流程管理系統。 有興趣的朋友,請關註我吧(*^▽^*) ...
  • 一、下載安裝 1.下載git 必須先下載並安裝git,再TortoiseGit下載安裝 git安裝參考教程:https://blog.csdn.net/mukes/article/details/115693833 2.TortoiseGit下載與安裝 TortoiseGit,Git客戶端,32/6 ...
  • 前言 在項目開發過程中,理解數據結構和演算法如同掌握蓋房子的秘訣。演算法不僅能幫助我們編寫高效、優質的代碼,還能解決項目中遇到的各種難題。 給大家推薦一個支持C#的開源免費、新手友好的數據結構與演算法入門教程:Hello演算法。 項目介紹 《Hello Algo》是一本開源免費、新手友好的數據結構與演算法入門 ...
  • 1.生成單個Proto.bat內容 @rem Copyright 2016, Google Inc. @rem All rights reserved. @rem @rem Redistribution and use in source and binary forms, with or with ...
  • 一:背景 1. 講故事 前段時間有位朋友找到我,說他的窗體程式在客戶這邊出現了卡死,讓我幫忙看下怎麼回事?dump也生成了,既然有dump了那就上 windbg 分析吧。 二:WinDbg 分析 1. 為什麼會卡死 窗體程式的卡死,入口門檻很低,後續往下分析就不一定了,不管怎麼說先用 !clrsta ...
  • 前言 人工智慧時代,人臉識別技術已成為安全驗證、身份識別和用戶交互的關鍵工具。 給大家推薦一款.NET 開源提供了強大的人臉識別 API,工具不僅易於集成,還具備高效處理能力。 本文將介紹一款如何利用這些API,為我們的項目添加智能識別的亮點。 項目介紹 GitHub 上擁有 1.2k 星標的 C# ...