打印

嵌入式软件中的设计模式

[复制链接]
2157|5
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
mymcudream|  楼主 | 2007-8-23 15:04 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
突然想做做一些嵌入式设计模式方面的小例子,希望大家多抛砖头!


    模式一:state
    应用范围:一些带有状态转换的工业控制软件中,如洗衣机,门禁
    代码示例:
enum STATE
{
    LOCK_STATE = 0,
    UNLOCK_STATE = 1,
};

enum EVENT_CODE
{
    KEY = 0,
    OUT = 1,
};

void Lock_Unlock_Change_Func(void)
{
   printf("Lock to unlock state. ");
}

void UnLock_lock_Change_Func(void)
{
   printf("UnLock to lock state. ");
}

struct STATE_EVENT
{
   int curstate;
   int eventcode;
   int nextstate;    
   void (*changefunc)(void);
};


struct STATE_EVENT state_table[] =
{
    {LOCK_STATE, KEY, UNLOCK_STATE, Lock_Unlock_Change_Func},
    {UNLOCK_STATE, OUT, LOCK_STATE, UnLock_lock_Change_Func},
};

static int currentstate = LOCK_STATE;

void State_Engine(int event)
{
     int i;

     for (i = 0; i < 2; i++)
     {
        if (currentstate == state_table.curstate 
            && event == state_table.eventcode)
        {
            currentstate = state_table.nextstate;
            state_table.changefunc();
            return;
        }
     }
     printf("Aother thing happend ");
}


int main(int argc, char* argv[])
{

    State_Engine(KEY);
    State_Engine(OUT);
    State_Engine(OUT);
    return 0;
}

相关帖子

沙发
yan2005| | 2007-8-24 12:36 | 只看该作者

我也这样做过

在视频通信的过程中,通话的两方的拨号通话挂机等状态的转换当时也是用这种状态机模型来做的。

使用特权

评论回复
板凳
mymcudream|  楼主 | 2007-8-24 14:15 | 只看该作者

终于找到知音了

,有空多交流.
其实我一直在想,嵌入式软件中能不能使用设计模式.

使用特权

评论回复
地板
mymcudream|  楼主 | 2007-8-24 14:17 | 只看该作者

再发一个observer模式

struct observer
{
    void (*update)(void);
};


struct subject
{
    struct observer *observers[4];

    void (*addobserver)(struct subject *subject, struct observer *observer);
    void (*notify)(struct subject *subject);
};

void Subject_AddObserver(struct subject *subject, struct observer *observer)
{
    static int count = 0;
    
    if (count > 4)
    {
            return ;
    }

    subject->observers[count++] = observer;
}

void Subject_Notify(struct subject *subject)
{
    int i;

    printf("Subject Notify Thing ");
    for (i = 0; i < 4; i++)
    {
        subject->observers->update();
    }
}

void Subject_Construct(struct subject *subject)
{
    subject->addobserver = Subject_AddObserver;
    subject->notify      = Subject_Notify ;
}

void ObserverA_Update(void)
{
    printf("Observer A Update ");
}

void ObserverB_Update(void)
{
    printf("Observer B Update ");
}

void ObserverC_Update(void)
{
    printf("Observer C Update ");
}

void ObserverD_Update(void)
{
    printf("Observer D Update ");
}


void Observer_Construct(struct observer *observer, void (*update)(void))
{
    observer->update = update;
}



int main(int argc, char* argv[])
{
    struct observer observera;
    struct observer observerb;
    struct observer observerc;
    struct observer observerd;

    struct subject subject;

    Observer_Construct(&observera, ObserverA_Update);
    Observer_Construct(&observerb, ObserverB_Update);
    Observer_Construct(&observerc, ObserverC_Update);
    Observer_Construct(&observerd, ObserverD_Update);
  

   Subject_Construct(&subject);

    subject.addobserver(&subject, &observera);
    subject.addobserver(&subject, &observerb);
    subject.addobserver(&subject, &observerc);
    subject.addobserver(&subject, &observerd);

    subject.notify(&subject);


    return 0;
}

使用特权

评论回复
5
ketp| | 2007-8-24 21:23 | 只看该作者

没看到跟嵌入式有多大联系

代码写得不怎么样,只是为了使用模式而用模式。

使用特权

评论回复
6
acecao| | 2007-8-25 20:50 | 只看该作者

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

12

主题

14

帖子

1

粉丝