前后台程序框架实例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等。



转载请注明出处,谢谢!



原文地址:https://www.cnblogs.com/wenziqi/p/1773378.html