輸入事件到狀態(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]);
}
對應(yīng):
(1)條件A:status_index_e(2)條件B:event_index_e(3)switch:
EXECUTE_VOID(select_machine[0][1] );
當(dāng)一個外部事件來的時候(比如按鍵輸入),通過一個全局的結(jié)構(gòu)體變量(C語言中最常用的方法)引入當(dāng)前的實時狀態(tài),由條件導(dǎo)向各種狀態(tài)機。這里的實現(xiàn)是通過二維數(shù)組即兩個下標(biāo)代表兩個條件,兩個條件的交點就是具體的狀態(tài)機。
狀態(tài)機到面向過程
以上實現(xiàn)的是“輸入外部事件>>>>引流到>>>>狀態(tài)機”那如何實現(xiàn)“狀態(tài)機>>>>執(zhí)行>>>>具體地操作”呢?狀態(tài)機有一個固定的執(zhí)行流程(當(dāng)然也有根據(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)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。
舉報投訴
-
嵌入式
+關(guān)注
關(guān)注
5089文章
19161瀏覽量
306668 -
C語言
+關(guān)注
關(guān)注
180文章
7614瀏覽量
137320 -
編程
+關(guān)注
關(guān)注
88文章
3634瀏覽量
93880
原文標(biāo)題:分享一個嵌入式編程模板
文章出處:【微信號:c-stm32,微信公眾號:STM32嵌入式開發(fā)】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
相關(guān)推薦
什么是嵌入式編程
《C嵌入式編程設(shè)計模式》第一章 什么是嵌入式編程嵌入式系統(tǒng)的基本知識面向?qū)ο?/div>
發(fā)表于 11-08 06:15
嵌入式系統(tǒng)編程教學(xué)分析
通過volatile關(guān)鍵字的使用、嵌入式系統(tǒng)工程設(shè)置、嵌入式系統(tǒng)的數(shù)據(jù)結(jié)構(gòu)設(shè)計、嵌入式系統(tǒng)算法設(shè)計四個方面的介紹,分析了嵌入式系統(tǒng)
發(fā)表于 07-01 17:07
?26次下載
基于嵌入式SCADA系統(tǒng)的開關(guān)量信號采集模板設(shè)計
O 引言
本文設(shè)計的開關(guān)量信號采集模板是一款嵌入式SCADA系統(tǒng)的一種插件,稱為智能數(shù)字量采集
發(fā)表于 10-25 14:07
?1259次閱讀
嵌入式c語言編程(由淺入深)
本內(nèi)容詳細(xì)介紹了嵌入式c語言編程的各項知識,包括嵌入式c語言編程,嵌入式C語言開發(fā)、嵌入式C語言
發(fā)表于 11-02 14:37
?0次下載
解析嵌入式軟件開發(fā)語言:嵌入式C編程
解析嵌入式軟件開發(fā)語言:嵌入式C編程在我們初學(xué)嵌入式開發(fā)的時候,總會出現(xiàn)一個問題。那就是C語言和
發(fā)表于 10-20 11:51
?7次下載
嵌入式linux報警,嵌入式Linux下LED報警燈驅(qū)動設(shè)計及編程.doc
設(shè)計及編程一.實驗?zāi)康睦斫怛?qū)動本質(zhì),掌握嵌入式Linux系統(tǒng)下驅(qū)動開發(fā)相關(guān)知識,包括端口寄存器訪問、接口函數(shù)編寫、和文件系統(tǒng)掛接、注冊及相關(guān)應(yīng)用編程等知識點。二.實驗內(nèi)容實驗5.1
發(fā)表于 11-01 17:21
?6次下載
《C嵌入式編程設(shè)計模式》讀書筆記
嵌入式C++編程
特點展示如何使用 C ++ 來構(gòu)建利用可用硬件資源的強大并發(fā)系統(tǒng)。從嵌入式編程入門和 C ++ 17 的最新特性開始,帶您了解優(yōu)秀編程的各個方面您將學(xué)習(xí)如何使用 C ++ 的并發(fā)性、內(nèi)存管理和函數(shù)
發(fā)表于 11-04 10:36
?10次下載
評論