开发平台(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
哇塞!本来要说注意拼字,看了图以后我眼泪流下来了真是奇葩阿!你都已经写出state enum还有if set 接下来就是要去哪一个state就把主要state变量改掉 还有什么问题
噗顺便提醒你一下 state diagram起码要把前往下个state的条件写出来 不然谁知道接下来要跳哪个状态图上表述清楚了 程式就自然写得出来了
中间那堆if改用chain of responbility来写啦
土一点写成一个大switch也可以的。switch的好处是,只会在开头处理一次,所以不用考虑如果把在状态1把state改成3以后 接下来可能又执行一次的问题
if会有jump指令的分支造成pipeline hazard,每用一次就多一个jump,用switch固定只jump一次,机率来看还是switch比较好吧?
作者:
h520 (恩哈恩哈恩哈哈)
2014-06-23 17:12:0040MHz XD 好吧switch+fun ptr:漂亮 goto+label: low但快:)
会不会测试时PSU_state都是POR或RUN,造理说if会抖更大
作者:
donkeychen (Bad_To_The_Bone)
2014-06-23 18:11:00离题: 用 BIT OR/AND 运算跟 用 == 速度哪个快呢?如果用MASK 不知道对速度有无帮助
er... CoR写法C就做的到了噢...配上function pointer尤其方便 :D 你可以试试看
作者:
licheer (Keep The Faith)
2014-06-23 22:26:00请问为什么要用function pointer?CoR是什么的缩写? thx
function pointer 可以用 array
作者:
licheer (Keep The Faith)
2014-06-23 22:52:00看到了 CoR = Chain of Responsibility
作者:
EdisonX (卡卡兽)
2014-06-23 23:42:00推 h520,现在很少看人用 goto + label 做 state machine.
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比较高效
我不是贴在gist上示范给你看吗 = = 至少用gist吧除非你排版可以排的跟下面佑子这样不伤眼... orz
作者:
xpride (陈ㄚ智)
2014-06-26 15:19:00你用了一大堆的state判断 这个差不多偏离FSM的精神了开玩笑的讲,这个都快变 flag machine
作者:
uorol (′‧ω‧‵)
2014-06-26 19:16:00flag machine XD
作者:
BlazarArc (Midnight Sun)
2014-06-27 02:34:00flag machine XDDD
作者:
CP64 (( ̄▽ ̄#)﹏﹏)
2014-06-27 19:56:00flag machine..... exit 是要要用 DEAD_FLAG 吗 (?
作者:
ACMANIAC (請肥宅救救肥宅)
2014-06-27 20:07:00sate 是啥鬼...