|核心機制
狀態機是非常常用的框架之一,本質就是通過記錄狀態值來執行對應動作,但是有個問題就是每個對應的狀態值都有對應的動作,如果碰到需要等待信號量再觸發的情況下需要特定處理,有沒更好的方法處理這種情況呢,答案很多是有的。要解決這需求就要保證代碼退出時和下次進入時的位置是不變的,怎么實現呢?
實現這個需求的方式有很多,這里就使用純C來實現:
#includeintfunction(void) { staticintstate; switch(state) { case0: do { printf("state:%d ",state); state=1; return0; case1:; printf("state:%d ",state); }while(0); } } intmain() { function();//輸出state:0 function();//輸出state:1 function();//輸出state:1 while(1) { } }
這里還是采用狀態機來實現,由于狀態值沒有發生改變,函數調用時觸發的動作不變,這就保證了函數退出時和再次進入的“入口”相同。
|優化代碼
在介紹優化前,先介紹一下C相關的宏:
intmain()
{
printf("%d
",__LINE__);//顯示所在行號
printf("%s
",__func__);//顯示所在函數
printf("%s
",__TIME__);//顯示當前時間
printf("%s
",__DATE__);//顯示當前日期
printf("%s
",__FILE__);//顯示所處文件名,在源代碼中插入當前源代碼文件名
printf("%d
",__STDC__);//編譯器遵循ANSI C標準時該標識被賦值為1;
return0;
}
簡單優化一下:
#includeintstate=0; voidfunction_init(void) { state=0; } intfunction_handle(intcondition) { switch(state) { case0: do { state=__LINE__; case__LINE__: if(!condition) return0; else return1; }while(0); } } intmain() { //等待 intcondition=1; function_init(); if(!function_handle(condition)) { printf("pass "); } else { printf("obsolete "); } //觸發 condition=0; function_init(); if(!function_handle(condition)) { printf("pass "); } else { printf("obsolete "); } //等待 condition=1; function_init(); if(!function_handle(condition)) { printf("pass "); } else { printf("obsolete "); } //觸發 condition=0; function_init(); if(!function_handle(condition)) { printf("pass "); } else { printf("obsolete "); } while(1) { } }
簡單封裝一下:
#include#defineBegin() switch(state) { case0: #defineWAIT(condition) do { state=__LINE__; case__LINE__: if(!condition) return0; else return1; }while(0) #defineEnd()} intstate=0; voidfunction_init(void) { state=0; } intfunction_handle(intcondition) { Begin(); WAIT(condition); End(); } intmain() { //等待 intcondition=1; function_init(); if(!function_handle(condition)) { printf("pass "); } else { printf("obsolete "); } //觸發 condition=0; function_init(); if(!function_handle(condition)) { printf("pass "); } else { printf("obsolete "); } //等待 condition=1; function_init(); if(!function_handle(condition)) { printf("pass "); } else { printf("obsolete "); } //觸發 condition=0; function_init(); if(!function_handle(condition)) { printf("pass "); } else { printf("obsolete "); } while(1) { } }
| 最后優化
源碼:
#include#include #include #include #definePT_BEGIN() switch(pt->state) { case0: #definePT_END() pt->state=0; return0; } #definePT_WAIT_UNTIL(condition) do { pt->state=__LINE__; case__LINE__: if(!(condition)) return0; }while(0) typedefstruct { uint8_tstate; }pt_t; voidpt_init(pt_t*pt) { pt->state=0; } boolpt_run(pt_t*pt) { returnpt->state!=0; } intthread_fun(pt_t*pt) { staticuint32_tcounter=0; PT_BEGIN(); while(1) { printf("counter=%lu ",counter++); PT_WAIT_UNTIL(counter%10==0); } PT_END(); } intmain() { pt_tpt_a; pt_tpt_b; pt_init(&pt_a); pt_init(&pt_b); while(true) { if(!pt_run(&pt_a)) { thread_fun(&pt_a); } if(!pt_run(&pt_b)) { thread_fun(&pt_b); } } return0; }
最后就完成了一個簡單的線程,純C編寫非常方便移植和改寫!
審核編輯:劉清
聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。
舉報投訴
-
封裝技術
+關注
關注
12文章
599瀏覽量
69303 -
C語言
+關注
關注
183文章
7644瀏覽量
145596 -
狀態機
+關注
關注
2文章
499瀏覽量
29145
原文標題:C語言|特殊狀態機
文章出處:【微信號:玩轉單片機,微信公眾號:玩轉單片機】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
熱點推薦
基于C語言的狀態機實現方案
關于狀態機,基礎的知識點可以自行理解。本文主要講解的是一個有限狀態機FSM通用的寫法,目的在于更好理解,移植,節省代碼閱讀與調試時間,體現出編程之美。
發表于 09-13 09:28
?1674次閱讀
如何設計自動駕駛系統的狀態機
狀態機模塊在自動駕駛系統中扮演著關鍵的角色,它負責管理和控制各個功能的狀態轉換和行為執行。今天我們來聊聊如何設計自動駕駛系統的狀態機 。
發表于 09-19 15:07
?4220次閱讀
有限狀態機的硬件描述語言設計方法
實驗目的
1、 熟悉用硬件描述語言(VHDL)設計一般狀態機所包含的幾個基本部分;2、 掌握用硬件描述語言(VHDL)設計Moore型和Mealy型有限狀態機的方法;3、 了解
發表于 09-03 09:48
?0次下載
什么是狀態機?狀態機5要素
玩單片機還可以,各個外設也都會驅動,但是如果讓你完整的寫一套代碼時,卻無邏輯與框架可言。這說明編程還處于比較低的水平,你需要學會一種好的編程框架或者一種編程思想!比如模塊化編程、狀態機編程、分層思想
狀態模式(狀態機)
以前寫狀態機,比較常用的方式是用 if-else 或 switch-case,高級的一點是函數指針列表。最近,看了一文章《c語言設計模式–狀態模式(
發表于 12-16 16:53
?9次下載
C語言狀態機編程思想
關注、星標公眾號,直達精彩內容文章來源:頭條-嵌入式在左C語言在右鏈接:https://www.toutiao.com/i6843028812112855564/有限狀態機概念有限狀態機
發表于 01-13 13:32
?15次下載
什么是狀態機?狀態機的種類與實現
狀態機,又稱有限狀態機(Finite State Machine,FSM)或米利狀態機(Mealy Machine),是一種描述系統狀態變化的模型。在芯片設計中,
聊聊C語言|特殊狀態機
評論