搜索
bottom↓
回复: 10

状态迁移时“事件队列”还有事件没处理,怎么处理,避免

[复制链接]

出0入0汤圆

发表于 2015-5-4 10:53:35 | 显示全部楼层 |阅读模式
本来是状态A的事件,但是状态已经转移到了状态B, 那事件队列里的事件该怎么处理,全丢了,感觉不好,大神分析下这个问题

阿莫论坛20周年了!感谢大家的支持与爱护!!

月入3000的是反美的。收入3万是亲美的。收入30万是移民美国的。收入300万是取得绿卡后回国,教唆那些3000来反美的!

出0入0汤圆

发表于 2015-5-4 11:24:45 | 显示全部楼层
人已结婚,还能脚踏两只船么

出0入0汤圆

发表于 2015-5-4 14:05:04 | 显示全部楼层
如果某个状态机获得CPU资源的频率是10HZ,事件触发的频率是100HZ,这样每次状态机获得CPU使用权时需要处理10次事件,而我的状态机理念是这样的,把该状态机获得CPU
资源的频率提升到200HZ,每次处理一个事件,不需要队列。

出0入0汤圆

 楼主| 发表于 2015-5-4 14:40:48 | 显示全部楼层
macaroni 发表于 2015-5-4 14:05
如果某个状态机获得CPU资源的频率是10HZ,事件触发的频率是100HZ,这样每次状态机获得CPU使用权时需要处理1 ...

事件可能并发的,没有队列,可能会丢事件吧?

出0入0汤圆

发表于 2015-5-4 22:54:48 | 显示全部楼层
状态A离开前发送A_END事件到信息队列,然后进入等A_END状态,收到A_END就可以放心进入状态B了

出0入296汤圆

发表于 2015-5-5 10:25:09 | 显示全部楼层
要看这个事件的重要程度,如果真的非常重要,而且又确实存在你说的这种情况,请另开一个专门的事件队列。
如果事件不那么重要,基本上可以做丢弃处理。

出0入296汤圆

发表于 2015-5-5 10:25:39 | 显示全部楼层
要看这个事件的重要程度,如果真的非常重要,而且又确实存在你说的这种情况,请另开一个专门的事件队列。
如果事件不那么重要,基本上可以做丢弃处理。

出5入0汤圆

发表于 2015-5-5 10:57:45 | 显示全部楼层
只是感觉不好?
要么加快处理速度,要么放心的丢弃

出0入0汤圆

 楼主| 发表于 2015-5-5 11:04:04 | 显示全部楼层
Gorgon_Meducer 发表于 2015-5-5 10:25
要看这个事件的重要程度,如果真的非常重要,而且又确实存在你说的这种情况,请另开一个专门的事件队列。
...

好的,谢谢,我是参考QP-NANO的时候 想到这个问题的,是不是它也存在这样的问题,
以下是QP_NANO的 状态转换代码
void QFsm_dispatch_(QFsm *const me) {
    if ((*me->state.fun)(me) == (QState)Q_RET_TRAN) {       /* tran. taken? */
        Q_SIG(me) = (QSignal)Q_EXIT_SIG;
        (void)(*me->state.fun)(me);                      /* exit the source */

        Q_SIG(me) = (QSignal)Q_ENTRY_SIG;
        (void)(*me->temp.fun)(me);                      /* enter the target */
        me->state.fun = me->temp.fun;        /* record the new active state */
    }
}
也没有对事情队列做处理,很可能会把上个状态的没有处理的直接带到下个状态,

由于个人水平的问题,所以很困惑
以下是我改了的代码,直接清队列
static void Fsm_dispatch(Active_t *me,Event_t const *e)
{
    StateHandler_t s = me->fsm.state;
    State_t r = (*s)(me,e);
    if(r == RET_TRAN){
        (void)(*s)(me,&ReservedEvt[EXIT_SIG]);
        /*???if state transmit clear event pool*/
        /*atom start*/
        if(me->numUsed>0){
            __disable_interrupt( );
            me->head   = 0;            /*index to the event queue head*/
            me->tail   = 0;            /*index to the event queue tail*/      
            me->numUsed= 0;            /*number of events currently in queue*/      
            me->tickCtr= 0;            /*time down counter*/
            __enable_interrupt( );
        }
        /*atom end*/
        (void)(*me->fsm.state)(me,&ReservedEvt[ENTRY_SIG]);
        
    }        
}

出0入0汤圆

 楼主| 发表于 2015-5-5 11:05:22 | 显示全部楼层
LinuxTux.China 发表于 2015-5-5 10:57
只是感觉不好?
要么加快处理速度,要么放心的丢弃

加速的话,理论上还是会碰到这样的情况的,我现在暂时选择丢掉,编程的时候注意这个问题

出0入0汤圆

发表于 2015-10-19 13:15:45 | 显示全部楼层
逻辑上既然状态已经转移,当然不用处理其它状态的事件。如果逻辑上确实要处理这个事件,既然用的QP,可以使用层次状态机。事件的平均处理速度必须大于等于事件的平均产生速度(“平均”是因为有事件队列缓冲),否则这个设计就是失败的,因为要完成一个不可能的事情,这时要升级速度更快的处理器。
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-4-24 10:11

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表