輸入事件到狀態(tài)機
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語言中最常用的方法)引入當前的實時狀態(tài),由條件導向各種狀態(tài)機。這里的實現(xiàn)是通過二維數(shù)組即兩個下標代表兩個條件,兩個條件的交點就是具體的狀態(tài)機。
狀態(tài)機到面向過程
以上實現(xiàn)的是“輸入外部事件>>>>引流到>>>>狀態(tài)機”那如何實現(xiàn)“狀態(tài)機>>>>執(zhí)行>>>>具體地操作”呢?狀態(tài)機有一個固定的執(zhí)行流程(當然也有根據(jù)條件執(zhí)行不同的運行流程的分支),其實這些個流程都是非常確定的執(zhí)行過程。在開發(fā)過程中的經(jīng)驗體現(xiàn):就是對所有執(zhí)行流程的精確完整的分析,然后將其全部羅列出來。“全部羅列出來”這個執(zhí)行流程在程序中有兩種體現(xiàn)方式:1、把所有的執(zhí)行流程以“空函數(shù)”的形式羅列出來。2、把所有的執(zhí)行流程以“函數(shù)指針”的形式羅列出來:好處一:可以把軟件框架寫出來,具體邏輯流程已經(jīng)做好。好處二:具體的函數(shù)的接口可以先空著(NULL),待寫好了函數(shù)就把函數(shù)名賦值給它(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; // 還沒有寫好實現(xiàn)函數(shù)就先賦為NULL
sys_api_func2 = NULL;
sys_api_func3 = NULL;
...
}
// 狀態(tài)機1
void machine_1(void)
{
execute_api_void(sys_api_func1); // 狀態(tài)機:步驟一
execute_api_void(sys_api_func2); // 狀態(tài)機:步驟二
... // 狀態(tài)機:步驟....
}
聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學習之用,如有內(nèi)容侵權或者其他違規(guī)問題,請聯(lián)系本站處理。
舉報投訴
-
嵌入式
+關注
關注
5060文章
18980瀏覽量
302252 -
C語言
+關注
關注
180文章
7595瀏覽量
135931 -
編程
+關注
關注
88文章
3574瀏覽量
93545
原文標題:分享一個嵌入式編程模板
文章出處:【微信號:c-stm32,微信公眾號:STM32嵌入式開發(fā)】歡迎添加關注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
相關推薦
什么是嵌入式編程
《C嵌入式編程設計模式》第一章 什么是嵌入式編程嵌入式系統(tǒng)的基本知識面向?qū)ο?/div>
發(fā)表于 11-08 06:15
嵌入式系統(tǒng)編程教學分析
通過volatile關鍵字的使用、嵌入式系統(tǒng)工程設置、嵌入式系統(tǒng)的數(shù)據(jù)結構設計、嵌入式系統(tǒng)算法設計四個方面的介紹,分析了嵌入式系統(tǒng)
發(fā)表于 07-01 17:07
?26次下載
基于嵌入式SCADA系統(tǒng)的開關量信號采集模板設計
O 引言
本文設計的開關量信號采集模板是一款嵌入式SCADA系統(tǒng)的一種插件,稱為智能數(shù)字量采集
發(fā)表于 10-25 14:07
?1216次閱讀
解析嵌入式軟件開發(fā)語言:嵌入式C編程
解析嵌入式軟件開發(fā)語言:嵌入式C編程在我們初學嵌入式開發(fā)的時候,總會出現(xiàn)一個問題。那就是C語言和
發(fā)表于 10-20 11:51
?7次下載
嵌入式linux報警,嵌入式Linux下LED報警燈驅(qū)動設計及編程.doc
設計及編程一.實驗目的理解驅(qū)動本質(zhì),掌握嵌入式Linux系統(tǒng)下驅(qū)動開發(fā)相關知識,包括端口寄存器訪問、接口函數(shù)編寫、和文件系統(tǒng)掛接、注冊及相關應用編程等知識點。二.實驗內(nèi)容實驗5.1
發(fā)表于 11-01 17:21
?5次下載
《C嵌入式編程設計模式》讀書筆記
嵌入式C++編程
特點展示如何使用 C ++ 來構建利用可用硬件資源的強大并發(fā)系統(tǒng)。從嵌入式編程入門和 C ++ 17 的最新特性開始,帶您了解優(yōu)秀編程的各個方面您將學習如何使用 C ++ 的并發(fā)性、內(nèi)存管理和函數(shù)
發(fā)表于 11-04 10:36
?10次下載
評論