輸入事件到狀態機
typedef void (*select_machine_t)(void);
typedef enum _event_index
{
event_index_1 = 0,
event_index_2,
event_index_3,
event_index_end
} event_index_e;
typedef enum _status_index
{
status_index_1 = 0,
status_index_2,
status_index_end
} status_index_e;
void machine_1(void);
void machine_2(void);
void machine_3(void);
void machine_4(void);
select_machine_t select_machine[event_index_end][status_index_end] =
{
{machine_1, machine_2},
{NULL, machine_3},
{machine_4, NULL}
};
void machine_1(void)
{
printf("machine_1
");
}
void machine_2(void)
{
printf("machine_2
");
}
void machine_3(void)
{
printf("machine_3
");
}
void machine_4(void)
{
printf("machine_4
");
}
int main(void)
{
EXECUTE_VOID(select_machine[0][1]);
}
對應:
(1)條件A:status_index_e(2)條件B:event_index_e(3)switch:
EXECUTE_VOID(select_machine[0][1] );
當一個外部事件來的時候(比如按鍵輸入),通過一個全局的結構體變量(C語言中最常用的方法)引入當前的實時狀態,由條件導向各種狀態機。這里的實現是通過二維數組即兩個下標代表兩個條件,兩個條件的交點就是具體的狀態機。
狀態機到面向過程
以上實現的是“輸入外部事件>>>>引流到>>>>狀態機”那如何實現“狀態機>>>>執行>>>>具體地操作”呢?狀態機有一個固定的執行流程(當然也有根據條件執行不同的運行流程的分支),其實這些個流程都是非常確定的執行過程。在開發過程中的經驗體現:就是對所有執行流程的精確完整的分析,然后將其全部羅列出來。“全部羅列出來”這個執行流程在程序中有兩種體現方式:1、把所有的執行流程以“空函數”的形式羅列出來。2、把所有的執行流程以“函數指針”的形式羅列出來:好處一:可以把軟件框架寫出來,具體邏輯流程已經做好。好處二:具體的函數的接口可以先空著(NULL),待寫好了函數就把函數名賦值給它(sys_api_func* = you_func ;)。好處三:通用性更高,邏輯性更強。
void (sys_api_func1)(void);
void (sys_api_func2)(void);
void (sys_api_func3)(void);
...
void sys_api_init(void)
{
sys_api_func1 = NULL; // 還沒有寫好實現函數就先賦為NULL
sys_api_func2 = NULL;
sys_api_func3 = NULL;
...
}
// 狀態機1
void machine_1(void)
{
execute_api_void(sys_api_func1); // 狀態機:步驟一
execute_api_void(sys_api_func2); // 狀態機:步驟二
... // 狀態機:步驟....
}
聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。
舉報投訴
-
嵌入式
+關注
關注
5087文章
19158瀏覽量
306450 -
C語言
+關注
關注
180文章
7614瀏覽量
137252 -
編程
+關注
關注
88文章
3634瀏覽量
93857
原文標題:分享一個嵌入式編程模板
文章出處:【微信號:c-stm32,微信公眾號:STM32嵌入式開發】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
嵌入式系統編程教學分析
通過volatile關鍵字的使用、嵌入式系統工程設置、嵌入式系統的數據結構設計、嵌入式系統算法設計四個方面的介紹,分析了嵌入式系統
發表于 07-01 17:07
?26次下載
嵌入式linux報警,嵌入式Linux下LED報警燈驅動設計及編程.doc
設計及編程一.實驗目的理解驅動本質,掌握嵌入式Linux系統下驅動開發相關知識,包括端口寄存器訪問、接口函數編寫、和文件系統掛接、注冊及相關應用編程等知識點。二.實驗內容實驗5.1
發表于 11-01 17:21
?6次下載
嵌入式C++編程
特點展示如何使用 C ++ 來構建利用可用硬件資源的強大并發系統。從嵌入式編程入門和 C ++ 17 的最新特性開始,帶您了解優秀編程的各個方面您將學習如何使用 C ++ 的并發性、內存管理和函數
發表于 11-04 10:36
?10次下載
評論