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