[問題] Sate Machine寫法

作者: kingzero (一起迷路)   2014-06-23 10:57:09
開發平台(Platform): 32bit/16bit MCU Ansi C
額外使用到的函數庫(Library Used): 沒有任何LIB
問題(Question):
State Machine寫法
餵入的資料(Input):
預期的正確結果(Expected Output):
可以根據外面的狀態變化,可以自動跳到任何狀態.
錯誤結果(Wrong Output):
程式碼(Code):
我的宣告如下
enum m_state
{
idle,PFC_ON, PSU_wake, PSU_RUN,
};
enum m_state PSU_sate;
int main(void)
{
unsigned int i = 0;
// Disable the JTAG function
INIT();
// P_FC_O=1;
// P_FC_O=0;
Init_PM_I2C2();
PMADDR_check();
// ClearCommandData(); /* Clear commands RAM locations */
// WrTestCommandData();
Init_PM_REG();
InitTMR1();
//InitTMR2(); running at Init(); funciton
Init_TMR3(); //Warring Timer3 for PMBUS Don't change it
InitTMR5();
for(i=0;i<256;i++) //Black box rom test
{
Black_BOX.ROM.EEPROM[i]=i;
//P_Debug_O= ~P_Debug_O;
}
Self_Test();
while( 1 )
{
if(global_flags.ready_to_copy == 1) /* Buffer ready to be copied? */
{
global_flags.ready_to_copy = 0;
CopyBufferInRam();
}
if(PSU_sate==PFC_ON)
{
}
else if(PSU_sate==idle)
{
}
else if(PSU_sate==PSU_wake)
{
}
else if(PSU_sate==PSU_RUN)
{
}
if(P_47_AC_I==IO_Low)
{
}
if(IO_FLAG.ADCDONE==1) //When get ADC value , convert ADC value to PBBUS
Stack
{
convert_adc();
}
if(IO_FLAG.CONVERTDONE==1)
{
Check_UVOP();
}
}
while( 1 );
}
補充說明(Supplement):
希望達到下面這一個sate_machine
http://ppt.cc/c5yr
作者: MOONRAKER (㊣牛鶴鰻毛人)   2014-06-23 11:15:00
哇塞!本來要說注意拼字,看了圖以後我眼淚流下來了真是奇葩阿!你都已經寫出state enum還有if set 接下來就是要去哪一個state就把主要state變數改掉 還有什麼問題
作者: azureblaze (AzureBlaze)   2014-06-23 11:22:00
大概是抄來的看不懂?
作者: MOONRAKER (㊣牛鶴鰻毛人)   2014-06-23 11:37:00
噗順便提醒你一下 state diagram起碼要把前往下個state的條件寫出來 不然誰知道接下來要跳哪個狀態圖上表述清楚了 程式就自然寫得出來了
作者: Killercat (殺人貓™)   2014-06-23 13:29:00
中間那堆if改用chain of responbility來寫啦
作者: MOONRAKER (㊣牛鶴鰻毛人)   2014-06-23 15:50:00
土一點寫成一個大switch也可以的。switch的好處是,只會在開頭處理一次,所以不用考慮如果把在狀態1把state改成3以後 接下來可能又執行一次的問題
作者: RealJack   2014-06-23 17:03:00
if會有jump指令的分支造成pipeline hazard,每用一次就多一個jump,用switch固定只jump一次,機率來看還是switch比較好吧?
作者: h520 (恩哈恩哈恩哈哈)   2014-06-23 17:12:00
40MHz XD 好吧switch+fun ptr:漂亮 goto+label: low但快:)
作者: RealJack   2014-06-23 17:28:00
會不會測試時PSU_state都是POR或RUN,造理說if會抖更大
作者: donkeychen (Bad_To_The_Bone)   2014-06-23 18:11:00
離題: 用 BIT OR/AND 運算跟 用 == 速度哪個快呢?如果用MASK 不知道對速度有無幫助
作者: Killercat (殺人貓™)   2014-06-23 20:29:00
er... CoR寫法C就做的到了噢...配上function pointer尤其方便 :D 你可以試試看
作者: licheer (Keep The Faith)   2014-06-23 22:26:00
請問為什麼要用function pointer?CoR是什麼的縮寫? thx
作者: diabloevagto (wi)   2014-06-23 22:27:00
function pointer 可以用 array
作者: licheer (Keep The Faith)   2014-06-23 22:52:00
看到了 CoR = Chain of Responsibility
作者: MOONRAKER (㊣牛鶴鰻毛人)   2014-06-23 23:24:00
有趣…畢竟跟硬體有關,以實作效果為先。
作者: EdisonX (卡卡獸)   2014-06-23 23:42:00
推 h520,現在很少看人用 goto + label 做 state machine.
作者: Killercat (殺人貓™)   2014-06-24 00:17:00
function pointer把所有cor functions放在一個list然後我們只要foreach每個function 看她能不能handle即可大多數結構良好的CoR都會以一個fp跟一組list來運作其實看懂CoR以後大多數人也會往這方向進化就是State Machine基本上是CoR主場 可以試著做做看
作者: askacis (ASKA)   2014-06-24 12:45:00
以arm來說,如果switch 的case太少還是用if-else比較高效
作者: Killercat (殺人貓™)   2014-06-24 13:42:00
https://gist.github.com/Rayer/cc5600f0d177fd8ffd04你的例子雖然也是CoR 不過這C比較作不出來C還是用fp以及fp array為主比較常見
作者: diabloevagto (wi)   2014-06-24 15:58:00
為什麼你程式碼都不用置頂文的網站貼…
作者: Killercat (殺人貓™)   2014-06-24 16:55:00
我不是貼在gist上示範給你看嗎 = = 至少用gist吧除非你排版可以排的跟下面佑子這樣不傷眼... orz
作者: diabloevagto (wi)   2014-06-24 22:03:00
http://ideone.com/ 程式碼貼進去,按下run 結束
作者: xpride (陳ㄚ智)   2014-06-26 15:19:00
你用了一大堆的state判斷 這個差不多偏離FSM的精神了開玩笑的講,這個都快變 flag machine
作者: uorol (′‧ω‧‵)   2014-06-26 19:16:00
flag machine XD
作者: MOONRAKER (㊣牛鶴鰻毛人)   2014-06-26 23:15:00
原來還有flag machine的嗎!? :|
作者: BlazarArc (Midnight Sun)   2014-06-27 02:34:00
flag machine XDDD
作者: CP64 (( ̄▽ ̄#)﹏﹏)   2014-06-27 19:56:00
flag machine..... exit 是要要用 DEAD_FLAG 嗎 (?
作者: ACMANIAC (請肥宅救救肥宅)   2014-06-27 20:07:00
sate 是啥鬼...

Links booklink

Contact Us: admin [ a t ] ucptt.com