一種基於指針函數的狀態控制策略

2022-01-15 MLbox

在工作忙碌的2月有餘後,今天想閒下來,總結一下前面的工作。今天來聊一下狀態機。

最早我在AT指令集裡面推薦過一種方式,採用的方式是switch加共同體的方式來進行。如下圖所示:

這種方式的好處如下:

1、可以隨意的在任何位置插入數據,大概率不需要對所有的case進行修改,注意在STA++這地方,用其他的標記防止在後續STA++的時候跳轉的特殊的位置,讓自己掉坑;

2、在用IAR 或者keil查看的是看到的是英文字符串,方便自己看設備運行狀態在什麼地方

小建議:

1、用switch的時候非常不建議在其他函數直接修改狀態機的值,這樣會讓自己程序滿天飛,建議非實時的情況下用條件判斷在switch內部做調整;如上圖的判斷等做狀態機的修改;

2、記得給switch語句加一個default,可以方便打斷點,看看跑飛的原因。

3、可以給switch加個null狀態,看看程序執行的頻率;

在使用上述的方式時,可以為特定的業務流程做狀態控制。但是當你的的狀態機因為業務需要需要隨時變更的時候,那麼上述的switch模式將是一個非常坑爹的事情,維護非常不方便,並且修改後還需要重複驗證狀態流程是否合理。防止某個STA跳轉出錯導致設備運行異常。

在這個時候,你需要採用指針函數的狀態機來完成這個事情了。用他相對而言更加的輕鬆。自己只需要專注於各個業務動作驗證,然後通過指針函數將各個業務串聯起來即可。

指針函數結構體我想到的如下圖:

按照上面的方式構建一個結構體:,

1、給指針函數起一個霸氣的名稱,方便自己記憶。

2、給指針函數導入適當的輸入輸出,以便自己能過傳遞一些控制參數;

3、如果必要給自己做一個完成標記的讀取,以便自己能夠知道任務已經完成;

4、為了安全可靠,加個錯誤處理方式

這就是一個基礎的狀態架構,有個名稱,有動作,有響應和安全。基於這個架構,然後你只需要按照自己的業務需求,將各個動作進行細分,類似把大象塞進冰箱,分成開門,把大象推進去,關門一樣。每個動作,你可以用switch的狀態機來做。不要霸氣到在做一個指針函數狀態機。相信我這不是在給自己爭取摸魚的時間,而是給自己帶來更多的麻煩。靈活的同義詞是多變。這不好控制!

完成上述的聲明後,你可以做一個類似這樣的模塊功能清單表:

到此你就成功的創建了一個摸魚動作,在函數前面做個注釋,會是一個好習慣,方便自己理解,也方便交接,我是因為摸魚後面要刪除,所以沒有注釋。

如何讓摸魚這個動作完美執行起來呢?

1、初始化摸魚動作

類似這樣,我們就可以在極短的時間內構建起一個執行2次動作的狀態。

2、執行動作

1、做一個list的功能函數,通過共同體的名稱,找到實際對應的函數,然後調用對應的函數。

2、查看list對應的執行完成狀態是否完成,如果完成繼續下一個動作;

3、查看list對應的錯誤狀態是否置位,如果置位則需要跳出這個執行動作,切換到異常處理中。

3、

相關焦點

  • 學術︱基於切換模型的雙向AC-DC變換器控制策略
    本文基於切換系統理論,提出一種雙向AC-DC切換控制方法。基於此,設計了系統最優切換律並分析了該切換律條件下系統在切換平衡點處的穩定性。為了便於控制器數位化實現,建立了切換系統單步預測模型並對切換策略離散化。仿真和實驗結果驗證了本文所採用的建模方法和控制策略的有效性。
  • C語言函數指針之回調函數
    如果你把函數的指針(地址)作為參數傳遞給另一個函數,當這個指針被用來調用其所指向的函數時,我們就說這是回調函數。回調函數不是由該函數的實現方直接調用,而是在特定的事件或條件發生時由另外的一方調用的,用於對該事件或條件進行響應。2 為什麼要用回調函數?
  • 如何正確的理解指針和結構體指針、指針函數、函數指針這些東西?
    既然函數指針也是指針,那函數指針也佔用4個字節(32位編譯器)。,只是這個執行函數是使用的call指令並不是之前的函數,而是函數指針的值,即函數的地址。從上面可以看到函數指針並不是和一般的指針一樣可以操作內存,因此作者覺得函數指針可以看作是函數的引用申明。
  • 高級指針話題-函數指針
    -《中國哲學史》前言函數指針是什麼?如何使用函數指針?函數指針到底有什麼大用?本文將一一介紹。如何理解函數指針如果有int *類型變量,它存儲的是int類型變量的地址;那麼對於函數指針來說,它存儲的就是函數的地址。函數也是有地址的,函數實際上由載入內存的一些指令組成,而指向函數的指針存儲了函數指令的起始地址。如此看來,函數指針並沒有什麼特別的。
  • 基於指針對象的方法
    基於指針對象的方法當調用一個函數時,會對其每一個參數值進行拷貝,如果一個函數需要更新一個變量,或者函數的其中一個參數實在太大我們希望能夠避免進行這種默認的拷貝,這種情況下我們就需要用到指針了。在現實的程序裡,一般會約定如果Point這個類有一個指針作為接收器的方法,那麼所有Point的方法都必須有一個指針接收器,即使是那些並不需要這個指針接收器的函數。我們在這裡打破了這個約定只是為了展示一下兩種方法的異同而已。只有類型(Point)和指向他們的指針(*Point),才是可能會出現在接收器聲明裡的兩種接收器。
  • 函數指針方法實現簡單狀態機(附代碼)
    之前寫過一篇狀態機的實用文章,很多朋友說有幾個地方有點難度不易理解,今天給大家換種簡單寫法,使用函數指針的方法實現狀態機。狀態機簡介有限狀態機FSM是有限個狀態及在這些狀態之間的轉移和動作等行為的數學模型,是一種邏輯單元內部的高效編程方法,可以根據不同狀態或者消息類型進行相應的處理邏輯,使得程序邏輯清晰易懂。
  • 小技巧:一種優雅的 C 語言函數指針的寫法
    上一篇文章中代碼很多,大家也許沒有注意到一個很巧妙的小技巧: 那就是 C 語言函數指針的寫法.在一次的代碼中的這樣的一行注釋 "很多同學不會寫函數指針聲明,函數指針的寫法是,先寫正常的函數聲明,然後將函數名加上括號,然後在函數名前再加上*號即可!!!
  • ...一文弄懂「函數指針數組」,為什麼不直接調用函數,而是通過指針...
    通過前面兩節的討論,相信讀者已經發現C語言中函數指針的靈活與強大了。毫不誇張的說,C語言的指針語法,有時甚至讓C語言看起來像具備了「新特性」似的。將指針當作一種普通數據類型不過C語言指針的靈活與強大,也導致很多初學者認為指針是一個很難的概念,因此在遇到指針時,常常會覺得「緊張」。
  • 快速上手系列-C語言之指針篇(四)函數與指針
    數組名作函數的參數:一維數組名作函數的參數,一下兩種寫法都可以第一種方式:第二種方式:數組做形參時,無需指定其下標,(其實a[i]只是*(a+i)的一種簡寫)。二維數組名作函數的參數:二維數組名作為參數,行可以不寫出來,列必須寫出來,如:數組指針作形參,完全等價於二維數組的應用指向函數的指針(函數指針):一個函數在編譯時被分配一個入口地址,這個地址就稱為函數的指針,函數名代表函數的入口地址。
  • 如何快速理解函數指針與回調函數?
    摘要:前面分享了關於指針和結構體使用過程,今天是同系列的函數指針和回調函數。函數指針是指向函數的指針變量。通過函數指針C語言可以實現各種強大的功能與設計方法。然後,此回調函數由硬體驅動程序作為執行的一部分進行調用。如果不使用回調,就會被編碼為直接調用。這將使硬體驅動程序特定於特定的高級軟體級別,並降低其可重用性。回調機制的另一個好處是,在程序執行期間可以動態更改被調用的回調函數。一、函數指針函數指針,顧名思義它就是一個指針,只不過它是一個函數指針,所以指向的是一個函數。
  • C/C++函數指針
    C/C++中,函數總是佔用一段連續的內存區域,函數名在表達式中會被轉換為該函數所在內存區域的首地址,這與字符串和數組類似。因此,可以把函數首地址(入口地址)賦值給一個指針變量,使指針變量指向函數所在的內存區域,然後通過指針變量就可以找到並調用該函數。
  • 函數指針和指針函數還分不清?還不懂來找我
    函數指針和指針函數,在C語言算是比較重要和基礎,但是還是很多人分不清。現在分享下我的理解。它們之間的區分代碼案例為什麼要用函數指針函數指針的應用    指針函數和函數指針,說白了,一個是函數一個是指針。
  • C語言編程:以實例教你學指向函數的指針
    指針是C語言的精髓,對於初學者來講,指針是C語言語法學習中比較難的知識點,而這裡面指向函數的指針更是不太容易理解。下面給大家講下怎樣學習理解C語言中指向函數的指針及編程方法和使用例子。另外,必須將「*」與「p」必須用括號寫成(*p)的形式,否則,由於括號的優先級大於*的優先級,去掉括號的話就成為另外一種意思了。這樣對比著理解,指向函數的指針似乎與普通指針區別也不是太大。
  • ...也可以面向對象面層,使用「函數指針結構體」為C語言找個「對象」
    上一節討論了C語言中的指針可以看作是一種普通的數據類型,這麼一來,函數指針數組就不難理解了,無非就是存放函數指針元素的數組而已。的確如此,C語言中的結構體和指針語法,允許C語言程式設計師寫出「面向對象」風格的代碼。很多程式設計師覺得C語言沒有對象語法,認為C語言只能按照面向過程風格的代碼開發程序。其實,「面向對象」更多時候是一種編程思想,而不僅限於一種程式語言的語法。不過,因為C語言沒有原生的對象語法,在使用函數指針結構體之前,必須對結構體初始化,否則最終C語言程序就會有崩潰的風險。
  • 深入淺出剖析C語言函數指針與回調函數
    回調函數就是一個通過函數指針調用的函數。如果你把函數的指針(地址)作為參數傳遞給另一個函數,當這個指針被用來調用其所指向的函數時,我們就說這是回調函數。回調函數不是由該函數的實現方直接調用,而是在特定的事件或條件發生時由另外的一方調用的,用於對該事件或條件進行響應。
  • 【C語言】NULL指針、零指針、野指針定義及區別
    1.2 什麼是空指針如果 p 是一個指針變量,則 p = 0; p = 0L; p = '\0'; p = 3 - 3; p = 0 * 17; 中的任何一種賦值操作之後(對於 C 來說還可以是 p = (void*)0;), p 都成為一個空指針,由系統保證空指針不指向任何實際的對象或者函數。反過來說,任何對象或者函數的地址都不可能是空指針。
  • 成員函數指針的一些奇怪行為
    如果你只是使用單繼承,則指向成員函數的指針實際上是指向了這個函數的起始地址,因為在單繼承中,所有基類都共享了同一個this指針。我們看看下面的代碼:因為它們都使用了同一個this指針,一個指向基類成員函數的指針可以被當作是指向Derived2的成員函數指針來使用,不需要進行任何的轉換操作。
  • C語言的那些小秘密之函數指針
    我們經常會聽到這樣的說法,不懂得函數指針就不是真正的C語言高手。我們不管這句話對與否,但是它都從側面反應出了函數指針的重要性,所以我們還是有必要掌握對函數指針的使用。先來看看函數指針的定義吧。本文引用地址:http://www.eepw.com.cn/article/270442.htm  函數是由執行語句組成的指令序列或者代碼,這些代碼的有序集合根據其大小被分配到一定的內存空間中,這一片內存空間的起始地址就成為函數的地址,不同的函數有不同的函數地址,編譯器通過函數名來索引函數的入口地址,為了方便操作類型屬性相同的函數,c/c++引入了函數指針,函數指針就是指向代碼入口地址的指針
  • 深入淺出剖析C語言函數指針與回調函數(一)
    百度的權威解釋如下:回調函數就是一個通過函數指針調用的函數。如果你把函數的指針(地址)作為參數傳遞給另一個函數,當這個指針被用來調用其所指向的函數時,我們就說這是回調函數。回調函數不是由該函數的實現方直接調用,而是在特定的事件或條件發生時由另外的一方調用的,用於對該事件或條件進行響應。
  • C語言|用指針實現內存動態分配(malloc、calloc函數的使用)
    程序中需要使用各種變量來保存被處理的數據和各種狀態信息,變量在使用前必須被定義且安排好存儲空間(包括內存起始地址和存儲單元大小)。C語言的全局變量、靜態局部變量的存儲是在編譯時確定的,其存儲空間的實際分配在程序開始執行前完成。