分享一個嵌入式編程模板
關(guān)注「Linux大陸」,一起進(jìn)步!
輸入事件到狀態(tài)機(jī)
#include?"stdio.h"
#define?EXECUTE_VOID(func)??{if((func)!=NULL)?(func());}
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\r\n");
}
void?machine_2(void)
{
?printf("machine_2\r\n");
}
void?machine_3(void)
{
?printf("machine_3\r\n");
}
void?machine_4(void)
{
?printf("machine_4\r\n");
}
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)前的實(shí)時狀態(tài),由條件導(dǎo)向各種狀態(tài)機(jī)。這里的實(shí)現(xiàn)是通過二維數(shù)組即兩個下標(biāo)代表兩個條件,兩個條件的交點(diǎn)就是具體的狀態(tài)機(jī)。狀態(tài)機(jī)到面向過程
以上實(shí)現(xiàn)的是“輸入外部事件>>>>引流到>>>>狀態(tài)機(jī)”那如何實(shí)現(xiàn)“狀態(tài)機(jī)>>>>執(zhí)行>>>>具體地操作”呢?狀態(tài)機(jī)有一個固定的執(zhí)行流程(當(dāng)然也有根據(jù)條件執(zhí)行不同的運(yùn)行流程的分支),其實(shí)這些個流程都是非常確定的執(zhí)行過程。在開發(fā)過程中的經(jīng)驗(yàn)體現(xiàn):就是對所有執(zhí)行流程的精確完整的分析,然后將其全部羅列出來?!叭苛_列出來”這個執(zhí)行流程在程序中有兩種體現(xiàn)方式:1、把所有的執(zhí)行流程以“空函數(shù)”的形式羅列出來。2、把所有的執(zhí)行流程以“函數(shù)指針”的形式羅列出來:好處一:可以把軟件框架寫出來,具體邏輯流程已經(jīng)做好好處二:具體的函數(shù)的接口可以先空著(NULL),待寫好了函數(shù)就把函數(shù)名賦值給它(sys_api_func* = you_func ;)好處三:通用性更高,邏輯性更強(qiáng)void?(sys_api_func1)(void);
void?(sys_api_func2)(void);
void?(sys_api_func3)(void);
...
void?sys_api_init(void)
{
?sys_api_func1?=?NULL;???//?還沒有寫好實(shí)現(xiàn)函數(shù)就先賦為NULL
?sys_api_func2?=?NULL;
?sys_api_func3?=?NULL;
?...
}
//?狀態(tài)機(jī)1
void?machine_1(void)
{
?execute_api_void(sys_api_func1);??//?狀態(tài)機(jī):步驟一
?execute_api_void(sys_api_func2);??//?狀態(tài)機(jī):步驟二
?...???????????????????????????????//?狀態(tài)機(jī):步驟....
}
版權(quán)聲明:本文轉(zhuǎn)自網(wǎng)絡(luò)。版權(quán)歸原作者所有,如有侵權(quán),請聯(lián)系我們刪除!
往期推薦:嵌入式編程:由 C語言到 C
LCD接口類型多種多樣,如何區(qū)分?
點(diǎn)擊閱讀原文,查看更多分享