在QHsm_init()函数中有一个函数指针数组,用于保存从顶层QHsm_top进入目标状态的路径。声明如下:
QStateHandler path[QEP_MAX_NEST_DEPTH_];
在遍历完之后,需要从第一层开始依次执行ENTRY动作:
Q_SIG(me) = (QSignal)Q_ENTRY_SIG;
do { /* retrace the entry path in reverse (correct) order... */
(void)(*path[ip])(me); /* enter path[ip] */
} while ((--ip) >= (int8_t)0);
但是在执行到(void)(*path[ip])(me);的时候,每次都跳到0x0f之内的空间执行,导致程序出错,有时获得的地址甚至是0xFFFF,到了地址空间的最底部,PC加一后变为0x0,执行出现了问题。但是查看path数组内的数据也是正确的,除了没有赋值的成员为0xFFFF外,ip也是对的,分析了很多次都没有结果。
后来怀疑是没有初始化的问题,将path数组声明为static后,执行正常,此时数组成员都被初始化为0,能正确获取函数指针。