不管做什么或者實現(xiàn)什么功能,必定會有實現(xiàn)需求的步驟,簡單理解就是在某個狀態(tài)下做某事,這就很符合C語言面向過程的特點,個人認為面向?qū)ο笃鋵嵤敲嫦蜻^程的封裝,封裝的好處自然就是符合人的思維,以及便于后續(xù)的修改移植工作。
| 簡單的狀態(tài)機
相信讀者們剛?cè)腴T學習單片機的時候,應該比較常使用標志位來觸發(fā)任務運行,這就是簡單的狀態(tài)機。
//主函數(shù)
intmain()
{
intflag=0;
while(1)
{
if(flag==0)
{
task_A();
}
elseif(flag==1)
{
task_B();
}
elseif(flag==2)
{
task_C();
}
......
}
}
往往判斷語句太多不利于閱讀,那就需要對上面的代碼進行優(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)機
在項目中使用狀態(tài)機往往需要封裝一下,避免全局變量標志到處飛就不好修改和維護項目,最好的方法就是高內(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)機的理解,這些狀態(tài)都是面向有限的狀態(tài)而言。
#include"stdio.h"
#include"stdint.h"
typedefstruct
{
uint8_tflag;
}task_struct;
//觸發(fā)任務
voidtask_open(task_struct*task)
{
if(!task->flag)
{
task->flag=!task->flag;
}
}
//關閉任務
voidtask_close(task_struct*task)
{
if(task->flag)
{
task->flag=!task->flag;
}
}
//任務初始化
voidtask_init(void)
{
/*初始化*/
//printf("testinit
");
}
//任務處理
voidtask_handle(void)
{
printf("testhandle
");
}
//輪訓任務
voidtask_A(task_struct*task,uint8_ttype)
{
if(!task->flag)
{
task_init();
}
else
{
if(!type)
{
/*單次執(zhí)行*/
task_handle();
/*關閉任務*/
task_close(task);
}
else
{
/*循環(huán)執(zhí)行*/
task_handle();
}
}
}
intmain()
{
task_structtaskA;
task_open(&taskA);
while(1)
{
task_A(&taskA,0);
}
}
審核編輯:劉清
聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學習之用,如有內(nèi)容侵權或者其他違規(guī)問題,請聯(lián)系本站處理。
舉報投訴
-
單片機
+關注
關注
6078文章
45591瀏覽量
673962 -
C語言
+關注
關注
183文章
7646瀏覽量
146200 -
狀態(tài)機
+關注
關注
2文章
501瀏覽量
29352 -
單封裝
+關注
關注
0文章
5瀏覽量
5491
原文標題:C語言|狀態(tài)機
文章出處:【微信號:玩轉(zhuǎn)單片機,微信公眾號:玩轉(zhuǎn)單片機】歡迎添加關注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
相關推薦
熱點推薦
基于C語言的狀態(tài)機實現(xiàn)方案
關于狀態(tài)機,基礎的知識點可以自行理解。本文主要講解的是一個有限狀態(tài)機FSM通用的寫法,目的在于更好理解,移植,節(jié)省代碼閱讀與調(diào)試時間,體現(xiàn)出編程之美。
發(fā)表于 09-13 09:28
?1733次閱讀
有限狀態(tài)機的硬件描述語言設計方法
實驗目的
1、 熟悉用硬件描述語言(VHDL)設計一般狀態(tài)機所包含的幾個基本部分;2、 掌握用硬件描述語言(VHDL)設計Moore型和Mealy型有限狀態(tài)機的方法;3、 了解
發(fā)表于 09-03 09:48
?0次下載
狀態(tài)機舉例
狀態(tài)機舉例
你可以指定狀態(tài)寄存器和狀態(tài)機的狀態(tài)。以下是一個有四種狀態(tài)的普通狀態(tài)機。 // Th
發(fā)表于 03-28 15:18
?1233次閱讀
狀態(tài)機如何簡化PLC程序的編寫
在PLC程序的編寫過程中,可以使用狀態(tài)機的控制思路,將一些復雜的控制過程使用狀態(tài)機的方法處理。這里簡單給大家介紹一下什么是狀態(tài)機?如下圖所示,為一個
淺談狀態(tài)機的要素、分類
說到單片機編程,不得不說到狀態(tài)機,狀態(tài)機做為軟件編程的主要架構已經(jīng)在各種語言中應用,當然包括C語言
簡單的狀態(tài)機入門知識詳解
今天的文章只是帶大家入門和了解一下狀態(tài)機,等你真正在工作當中有遇到這個狀態(tài)機作為開發(fā)需要的話,你再去深入研究。
狀態(tài)模式(狀態(tài)機)
以前寫狀態(tài)機,比較常用的方式是用 if-else 或 switch-case,高級的一點是函數(shù)指針列表。最近,看了一文章《c語言設計模式–狀態(tài)模式(
發(fā)表于 12-16 16:53
?9次下載
C語言狀態(tài)機編程思想
關注、星標公眾號,直達精彩內(nèi)容文章來源:頭條-嵌入式在左C語言在右鏈接:https://www.toutiao.com/i6843028812112855564/有限狀態(tài)機概念有限狀態(tài)機
發(fā)表于 01-13 13:32
?15次下載
單片機之狀態(tài)機淺談
說到單片機編程,不得不說到狀態(tài)機,狀態(tài)機做為軟件編程的主要架構已經(jīng)在各種語言中應用,當然包括C語言
發(fā)表于 02-10 10:44
?12次下載
什么是狀態(tài)機?狀態(tài)機的種類與實現(xiàn)
狀態(tài)機,又稱有限狀態(tài)機(Finite State Machine,F(xiàn)SM)或米利狀態(tài)機(Mealy Machine),是一種描述系統(tǒng)狀態(tài)變化的模型。在芯片設計中,
c語言|簡單的狀態(tài)機
評論