最近一直在做一个项目,从一个小程序费时一个月多丰富完善成一个大程序!可是随着程序的增大,状态机运行越来越不稳定!十几个进程里,每次烧写,说不定哪个进程里的状态里就锁死了!但单个进程拉出来,都跑的好好的!后来,不断修正,把所有状态机里的涉及判断的变量或信号在首状态变量里初始化,这才让大部分状态机能顺利运行!可是,仍有一个状态机怎么调都不行,花了我三天时间,老板催的我都差点崩溃!最后尽然发现是:状态机变量定义和使用的顺序不同造成!即,我定义的顺序是s0,s1,s2,但使用的顺序是s0,s2,s1!!大家有遇到这种问题的吗??谁能解释解释为什么呀!! 本帖最后由 pinggougou 于 2015-7-2 10:25 编辑
我定义的顺序是s0,s1,s2,但使用的顺序是s0,s3,s2!!
1、S3 ?笔误么?
2、内存溢出。
3、其它任务里有没有操作这几个数的造成阻塞。
4、用的那个状态机,不行的那个加入几个延时试试
mark一下,看讨论~
玩板看这里:
https://bbs.eeworld.com.cn/elecplay.html
EEWorld测评频道众多好板等你来玩,还可以来频道许愿树许愿说说你想要玩的板子,我们都在努力为大家实现!
状态机分两种,一种是事件查询式状态机,程序书写一目了然,每个状态下发生了什么事件,状态在事件里更改,把状态机函数放在主循环中扫描,或者用定时器周期唤醒扫描。但这种只能应用在实时性不高的场合,而且时间的书写顺序默认了事件触发的优先级,不是太好。另外一种是事件触发式状态机,主循环中只需判断什么状态下做什么操作,把状态的转移放在事件中断中去,这样事件的优先级就一样了,但是书写起来比较杂散,不同事件触发方式不一样,需要把原有的状态机拆分开来。针对你这种情况,一般情况下如果确定了状态机逻辑关系没问题的话,最有可能出问题的就是代码重入或者临界代码处理的时候被打断了。在操作重要数据时把中断暂时关掉,防止被打断,有些地方有代码重入的也要把中断关掉。基本就是中断惹的祸了,仔细看看中断分析一下吧
。
分析代码为何s0会跳转到s2而不是s1,可以仿真看看,也可以直接用SignalTap抓下看看