当前位置:编程学习 > C/C++ >>

C语言中表驱动编程(动态加载)

 

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;

}

 

 

下面以锁机锁卡部分功能来实现锁机锁卡模块命令处理函数应用,加深对此框架的理解。

 

锁pin码命令处理函数

static NMCMD_RETURN nmcmd_lock_pin(C_UINT16 cmd_id, const C_CHAR * p_cmd_data, C_UINT8 data_len)

{

    if ((data_len < 1) || (data_len > 2) || (XINO_IsNumStr(p_cmd_data, data_len) == C_FALSE))

    {

            return RET_NMCMD_INVALID_DATA;

    }

      // 根据数据内容做相应的处理begin

    if(XINO_STR2INT((const C_CHAR *)p_cmd_data, data_len) == 0)

    {

        locknv_enable_pin( 0 );

    }

    else

    {

        locknv_enable_pin( 1 );

    }

     // 根据数据内容做相应的处理end

    return RET_NMCMD_SUCCESS;

}   

 

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

 

//锁机锁卡功能模块 命令 与命令处理函数对应表

 

static const NMCMD_FUNCTION m_acstcmd[] =

{

    {ID_NMCMD_LOCK_PIN,            nmcmd_lock_pin            }, //修改开机自动锁Pin码

    {ID_NMCMD_ENABLE_RAND_PIN,          nmcmd_enable_rand_pin           }, //修改是否启用随机PIN码

    {ID_NMCMD_SET_FIXED_PIN ,           nmcmd_fix_pin            }, /* 设置固定PIN码*/

    {ID_NMCMD_INIT_PIN,            nmcmd_init_pin            }, //修改初始PIN码

   

    {ID_NMCMD_LOCK_IMSI,        nmcmd_lock_imsi            },  //修改开机自动绑定IMSI号

补充:软件开发 , C语言 ,
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,