一直对QP的HSM中ENTRY和EXIT信号的实现有点迷惑,总觉得写了ENTRY的信号处理代码,可怎么去调用它呢?仔细阅读了一下,理清了头绪。
大体有三步来完成:
1、定义系统默认的信号。
2、定义处理信号宏。QEP_TRIG宏用当前信号调用state所指向的状态(函数指针),来处理信号,比如ENTRY信号,如果当前状态为Calc_on,则在该状态下调用ENTRY信号的处理函数。QEP_EXIT和QEP_ENTER则分别是针对信号EXIT和ENTRY的处理函数。
3、触发信号。有了信号的定义和具体的调用宏,那剩下的就是何时触发该信号了。这部分工作在dispatch函数(QHsm_dispatch)中完成。
该函数的功能就是分发信号进行处理,如果当前状态处理不了,则交给上一级状态处理,如此循环,直至被处理或者到达TOP状态被ignored。如果信号在某一层被处理,出现状态转换,则首先根据路径执行EXIT信号,然后在依次进入目标状态,执行ENTRY信号。具体参见代码qhsm_dis.c