不管做什么或者實(shí)現(xiàn)什么功能,必定會有實(shí)現(xiàn)需求的步驟,簡單理解就是在某個狀態(tài)下做某事,這就很符合C語言面向過程的特點(diǎn),個人認(rèn)為面向?qū)ο笃鋵?shí)是面向過程的封裝,封裝的好處自然就是符合人的思維,以及便于后續(xù)的修改移植工作。
| 簡單的狀態(tài)機(jī)
相信讀者們剛?cè)腴T學(xué)習(xí)單片機(jī)的時(shí)候,應(yīng)該比較常使用標(biāo)志位來觸發(fā)任務(wù)運(yùn)行,這就是簡單的狀態(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ī)
在項(xiàng)目中使用狀態(tài)機(jī)往往需要封裝一下,避免全局變量標(biāo)志到處飛就不好修改和維護(hù)項(xiàng)目,最好的方法就是高內(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)注
6072文章
45273瀏覽量
661623 - 
                                C語言
                                +關(guān)注
關(guān)注
183文章
7636瀏覽量
144292 - 
                                狀態(tài)機(jī)
                                +關(guān)注
關(guān)注
2文章
497瀏覽量
28740 - 
                                單封裝
                                +關(guān)注
關(guān)注
0文章
5瀏覽量
5463 
原文標(biāo)題:C語言|狀態(tài)機(jī)
文章出處:【微信號:玩轉(zhuǎn)單片機(jī),微信公眾號:玩轉(zhuǎn)單片機(jī)】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
基于C語言的狀態(tài)機(jī)實(shí)現(xiàn)方案
    
有限狀態(tài)機(jī)的硬件描述語言設(shè)計(jì)方法
狀態(tài)機(jī)舉例
狀態(tài)機(jī)如何簡化PLC程序的編寫
淺談狀態(tài)機(jī)的要素、分類
FPGA:狀態(tài)機(jī)簡述
    
簡單的狀態(tài)機(jī)入門知識詳解
單片機(jī)C語言 -- 基于條件選擇的狀態(tài)機(jī)編程技巧
    
狀態(tài)模式(狀態(tài)機(jī))
    
C語言狀態(tài)機(jī)編程思想
    
單片機(jī)之狀態(tài)機(jī)淺談
    
          
        
        
c語言|簡單的狀態(tài)機(jī)
                
 
    
           
            
            
                
            
評論