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语言 ,