zoukankan      html  css  js  c++  java
  • 前后台程序框架实例2

    /***************************************************
    *作 者:温子祺
    *联系方式:wenziqi@hotmail.com
    *说 明:前后台程序框架实例2

    ***************************************************/


        前后台程序框架实例2对比前后台程序框架实例1虽然在实现功能上没有多大的差异,但是通过宏的使用,程序更具灵活性和移植性。


    前后台程序框架实例2代码如下:

     

     

    代码
    /*
    ---------------------------------------------------------------
    文件名称:Process.h
    说 明:函数进程调度
    作 者:温子祺
    创建时间:2010-06-10
    ---------------------------------------------------------------
    */
    #ifndef __PROCESS_H__
    #define __PROCESS_H__


    #define BEGIN_PROC_MAP(NAME) \
    unsigned
    int g_unCurProc=0;\
    struct\
    {\
    void (*Proc)(void); \
    unsigned
    int bAlive;\
    }StProcTbl[]
    ={


    #define ADD_PROC(PROC,BALIVE){PROC,BALIVE},


    #define END_PROC_MAP() {0,0}\
    };


    #define SetProcIsAlive(PROC,BALIVE) StProcTbl[PROC].bAlive=BALIVE?TRUE:FALSE;

    #define SetCurProcIsAlive(BALIVE) StProcTbl[g_unCurProc].bAlive=BALIVE?TRUE:FALSE;

    #define ProcPerform() for(g_unCurProc=0;StProcTbl[g_unCurProc].Proc;g_unCurProc++)\
    {\
    if(StProcTbl[g_unCurProc].bAlive)\
    {\
    StProcTbl[g_unCurProc].Proc();\
    }\
    }





    #endif



    详细分析:

    1:结构体函数分析

                                 struct\
                                 {\
       void  (*Proc)(void); \
     unsigned int bAlive;\
      }St##NAME##ProcTbl[]

       结构体主要由函数进程Proc与函数进程是否存活bAlive变量组成,当bAlive为TRUE时,对应的Proc就执行;当bAlive为FALSE时,对应的Proc不执行。

    2:消息映射建立

    BEGIN_PROC_MAP(NAME)、ADD_PROC(PROC,BALIVE)、END_PROC_MAP()要配合使用。这三个函数都是模仿MFC里的消息映射进行编写的如图1。


    那么BEGIN_PROC_MAP(NAME)、ADD_PROC(PROC,BALIVE)、END_PROC_MAP()同样可以这样使用,方法如下:

    BEGIN_PROC_MAP(MyProc)

          ADD_PROC(SysIdle,TRUE)

          ADD_PROC(Proc1,TRUE)

          ADD_PROC(Proc2,FALSE)

    END_PROC_MAP()


    3.函数进程是否执行


    (1)SetProcIsAlive(PROC,BALIVE)  :可以在任何位置处调用该函数来设置对应函数进程是否有效。

    (2)SetCurProcIsAlive(BALIVE)    :一定要在函数本体内执行,即在Proc1函数体内调用SetCurProcIsAlive(FALSE)时,表示Proc1在下一次时不执行。


    4.函数进程循环

      ProcPerform()是一个很简单的for循环,只要相对应的proc与bAlive有效,该proc就会执行!该函数一定要放在main函数主体中的while(1)循环中执行。


    完整代码演示:


     

    代码
    #define PROC_IDLE 0
    #define PROC_1 1
    #define PROC_2 2

    void SysIdle(void);
    void Proc1(void);
    void Proc2(void);


    BEGIN_PROC_MAP(MyProc)
    ADD_PROC(SysIdle,TRUE)
    ADD_PROC(Proc1,TRUE)
    ADD_PROC(Proc2,TRUE)
    END_PROC_MAP()

    void SysIdle(void)
    {
    SetCurProcIsAlive(FALSE);

    }

    void Proc1(void)
    {
    SetProcIsAlive(PROC_2,TRUE);

    }

    void Proc2(void)
    {
    SetProcIsAlive(PROC_1,TRUE);
    }


    int main(void)
    {

    while(1)
    {
    ProcPerform();
    }
    }

    通过前后台程序框架实例2的应用,无疑使程序更具灵活性和移植性,基本上复制框架代码就可以在各种不同的单片机开发平台上使用,例如Keil、IAR、MDK等。



    转载请注明出处,谢谢!



  • 相关阅读:
    javaScript
    CSS
    HTML
    折纸 (模拟)
    不等式(数学)
    周期串查询
    大集训模拟赛十一
    大假期集训模拟赛十
    P1631 序列合并
    KMP(烤馍片)算法
  • 原文地址:https://www.cnblogs.com/wenziqi/p/1773378.html
Copyright © 2011-2022 走看看