设为首页 加入收藏

TOP

C语言中表驱动编程(动态加载)(一)
2013-09-24 09:24:49 来源: 作者: 【 】 浏览:1064
Tags:语言 中表 驱动 编程 动态 加载

  C 语言表驱动动态加载应用实例

  目前手机终端功能越来越强大,客户需求也是各种各样,而且对于同一话机可能在不同的时间地点,要求的话机功能也不一样,如何能够通过一种远程的方式

  调制话机功能,也成为各厂商的一个难题,介于此,产生了一种通过 命令+数据 修改终端参数的一种方式出现了。如何设置,设计公司机密,此处不便透露,

  本文的重点在于描述,实现这个功能的一个重点技术应用,C 中的表驱动应用及链表应用。

  废话少说,先做准备工作。

  要处理的数据为  命令+ 数据 那么定义函数如下:

  typedef  NMCMD_RETURN (* COMMAND_FUNCTION)(C_UINT16 cmd_id, const C_CHAR * p_cmd_data, C_UINT8 data_len);

  其中  cmd_id 为命令p_cmd_data 为数据data_len 为数据长度。

  定义结构体 用来扩展不同功能模块的处理,可根据应用来增加功能模块 如:加密卡处理,锁机锁卡处理,安防处理,计费处理等。

  /*-----------------------------------------------------------------------------

  *     文件_数据类型定义

  *-----------------------------------------------------------------------------*/

  typedef struct stnmcmd

  {

  struct stnmcmd *pNext;    /* 链表*/

  COMMAND_FUNCTION fProc;    /* 指向下一个*/

  }XNNM_CMDPROC;

  定义全局 变量  指向链表头

  static XNNM_CMDPROC *m_nmcmdproc = C_PNULL;

  定义不同命令对应的处理函数

  //命令与命令处理函数映射结构

  typedef struct

  {

  C_UINT16 cmd_id;    //命令

  COMMAND_FUNCTION cmd_fun;    //命令处理函数

  }NMCMD_FUNCTION;

  下面是基本框架函数实现 往链表中添加模块命令处理函数

  /*---------------------------------------------------------------------------

  *    函数名称:    xnnm_loadproc

  *    功能描述:     加载处理器

  *

  *    输入参数:     COMMAND_FUNCTION fProc    // 处理器

  *    输出参数:     无

  *    返 回 值:

  *

  *    历史纪录:

  *    修改人        日期             日志

  *               2010-7-9

  *---------------------------------------------------------------------------*/

  C_UINT16 xnnm_LoadProc( COMMAND_FUNCTION fProc )

  {

  XNNM_CMDPROC *pNew = C_PNULL;

  if( fProc == C_PNULL )

  {

  return C_FALSE;

  }

  pNew = NM_MALLOC( sizeof(*pNew) );

  if( pNew == C_PNULL )

  {

  return C_FALSE;

  }

  memset( pNew, 0x00, sizeof(*pNew) );

  pNew->fProc = fProc;

  pNew->pNext = m_nmcmdproc;

  m_nmcmdproc = pNew;

  return C_TRUE;

  }

  将命令及数据传入进行处理

  /*---------------------------------------------------------------------------

  *    函数名称:    xnnm_ExecProc

  *    功能描述:     执行处理器

  *

  *    输入参数:

  *    输出参数:

  *    返 回 值:

  *

  *    历史纪录:

  *    修改人        日期             日志

  *               2010-7-9

  *---------------------------------------------------------------------------*/

  C_UINT16 xnnm_ExecProc( C_UINT16 cmd_id, const C_CHAR * p_cmd_data, C_UINT8 data_len )

  {

  XNNM_CMDPROC *pList = m_nmcmdproc;

  while( pList )

  {

  if( pList->fProc( cmd_id, p_cmd_data, data_len ) == RET_NMCMD_SUCCESS )

  {

  break;

  }

  pList = pList->pNext;

  }

  return C_TRUE;

  }

     

首页 上一页 1 2 3 4 5 6 7 下一页 尾页 1/12/12
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇Windows编程:位图背景与画刷 下一篇C语言复习之结构体和指针

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: