不管做什么或者實現(xiàn)什么功能,必定會有實現(xiàn)需求的步驟,簡單理解就是在某個狀態(tài)下做某事,這就很符合C語言面向過程的特點,個人認(rèn)為面向?qū)ο笃鋵嵤敲嫦蜻^程的封裝,封裝的好處自然就是符合人的思維,以及便于后續(xù)的修改移植工作。
| 簡單的狀態(tài)機(jī)
相信讀者們剛?cè)腴T學(xué)習(xí)單片機(jī)的時候,應(yīng)該比較常使用標(biāo)志位來觸發(fā)任務(wù)運行,這就是簡單的狀態(tài)機(jī)。
//主函數(shù) intmain() { intflag=0; while(1) { if(flag==0) { task_A(); } elseif(flag==1) { task_B(); } elseif(flag==2) { task_C(); } ...... } }
往往判斷語句太多不利于閱讀,那就需要對上面的代碼進(jìn)行優(yōu)化:
//主函數(shù) intmain() { intflag=0; while(1) { switch(flag) { case0x00: task_A(); break; case0x01: task_B(); break; case0x02: task_C(); break; ...... default: break; } } }
|封裝狀態(tài)機(jī)
在項目中使用狀態(tài)機(jī)往往需要封裝一下,避免全局變量標(biāo)志到處飛就不好修改和維護(hù)項目,最好的方法就是高內(nèi)聚低耦合。
voidtest(void) { staticstate; if(state==0) { if(!task_A()) { state=1; } } elseif(state==1) { if(!task_B()) { state=2; } } elseif(state==2) { if(!task_C()) { state=0; } } } intmain() { while(1) { test(); } }
|附件
簡單寫個小demo,加深一下對狀態(tài)機(jī)的理解,這些狀態(tài)都是面向有限的狀態(tài)而言。
#include"stdio.h" #include"stdint.h" typedefstruct { uint8_tflag; }task_struct; //觸發(fā)任務(wù) voidtask_open(task_struct*task) { if(!task->flag) { task->flag=!task->flag; } } //關(guān)閉任務(wù) voidtask_close(task_struct*task) { if(task->flag) { task->flag=!task->flag; } } //任務(wù)初始化 voidtask_init(void) { /*初始化*/ //printf("testinit "); } //任務(wù)處理 voidtask_handle(void) { printf("testhandle "); } //輪訓(xùn)任務(wù) voidtask_A(task_struct*task,uint8_ttype) { if(!task->flag) { task_init(); } else { if(!type) { /*單次執(zhí)行*/ task_handle(); /*關(guān)閉任務(wù)*/ task_close(task); } else { /*循環(huán)執(zhí)行*/ task_handle(); } } } intmain() { task_structtaskA; task_open(&taskA); while(1) { task_A(&taskA,0); } }
審核編輯:劉清
-
單片機(jī)
+關(guān)注
關(guān)注
6035文章
44553瀏覽量
634709 -
C語言
+關(guān)注
關(guān)注
180文章
7604瀏覽量
136709 -
狀態(tài)機(jī)
+關(guān)注
關(guān)注
2文章
492瀏覽量
27530 -
單封裝
+關(guān)注
關(guān)注
0文章
5瀏覽量
5339
原文標(biāo)題:C語言|狀態(tài)機(jī)
文章出處:【微信號:玩轉(zhuǎn)單片機(jī),微信公眾號:玩轉(zhuǎn)單片機(jī)】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
相關(guān)推薦
評論