//
/// 以下程序注释由成都地质学院霸王猫添加,引用时请尊重作者劳动成果,标明引用者来自成都地质学院霸王猫。
//
UBYTE user_chk_new_cfg_data(void)
入口参数:
无
出口参数:
无
返回值:
VPC3_CFG_OK/VPC3_CFG_FAULT/VPC3_CFG_UPDATE
调用格式:
switch(user_chk_new_cfg_data())
函数功能:
比较配置缓冲器和读配置缓冲器中的数据是否完全一致,如果一致,则触发一次用户“VPC3+C收到一个Chk_Cfg报文,使CFG缓冲器中的数据可用”的用户事件。
user.event |= VPC3_EV_NEW_CFG_DATA,让主程序继续进行处理。
源程序:
/*---------------------------------------------------------------------------*/
/* function: user_isr_new_cfg_data */
/* */
/* todo : check cfg data */
/* */
/* return: VPC3_CFG_OK 0 */
/* VPC3_CFG_FAULT 1 */
/* VPC3_CFG_UPDATE 2 */
/*---------------------------------------------------------------------------*/
#if( ISR_ENABLE_VPC3_INT_NEW_CFG_DATA == 1 )
UBYTE user_chk_new_cfg_data(void)
{
UBYTE PTR_ATTR* readcfg_ptr; // pointer read config buffer
UBYTE PTR_ATTR* cfg_ptr; // pointer check config buffer
UBYTE cfg_len;
UBYTE ret_value;
UBYTE i;
ret_value = VPC3_CFG_OK;
cfg_len = VPC3_GET_CFG_LEN();
if ( cfg_len == VPC3_GET_READ_CFG_LEN() )
{
readcfg_ptr = VPC3_GET_READ_CFG_BUF_PTR();
cfg_ptr = VPC3_GET_CFG_BUF_PTR();
for (i = 0 ; i < cfg_len ; i++)
{
if (*(readcfg_ptr + i) != *(cfg_ptr + i))
{
ret_value = VPC3_CFG_FAULT;
break;
}
}
}
else
{
ret_value = VPC3_CFG_FAULT;
}
if ( ret_value == VPC3_CFG_OK )
{
user.event |= VPC3_EV_NEW_CFG_DATA;
}
return (ret_value);
}
//-------------------------------------------------------------------------------------
1. 执行下面语句
//-------------------------------------------------------------------------------------
ret_value = VPC3_CFG_OK;
cfg_len = VPC3_GET_CFG_LEN();
已知:
(1)、VPC3_GET_CFG_LEN() = 调用宏定义获取配置缓冲器长度(寄存器地址31H)
(2)、ret_value = VPC3_CFG_OK (首先假定返回值 = VPC3_CFG_OK)
目的:
获取配置缓冲器长度
结果:
cfg_len = 配置缓冲器长度
//-------------------------------------------------------------------------------------
2. 执行下面语句
//-------------------------------------------------------------------------------------
if ( cfg_len == VPC3_GET_READ_CFG_LEN() )
已知:
(1)、VPC3_GET_READ_CFG_LEN() = #define VPC3_GET_READ_CFG_LEN() vpc3->len_read_cfg_data (获取“读配置缓冲器”长度)
(2)、cfg_len = 配置缓冲器长度
目的:
判断“配置缓冲器”长度和“读配置缓冲器”长度是否相等
结果:
逻辑条件为真
//-------------------------------------------------------------------------------------
3. 执行下面语句
//-------------------------------------------------------------------------------------
readcfg_ptr = VPC3_GET_READ_CFG_BUF_PTR();
cfg_ptr = VPC3_GET_CFG_BUF_PTR();
已知:
(1)、VPC3_GET_READ_CFG_BUF_PTR() = #define VPC3_GET_READ_CFG_BUF_PTR() (UBYTE PTR_ATTR *)(((VPC3_ADR)(vpc3->read_cfg_buf_ptr << SEG_MULDIV)+((VPC3_ADR)VPC3_ASIC_ADDRESS))) = 寄存器地址= 34H,读取“读配置缓冲器”的段地址
(2)、VPC3_GET_CFG_BUF_PTR() = #define VPC3_GET_CFG_BUF_PTR() (UBYTE PTR_ATTR *)(((VPC3_ADR)(vpc3->cfg_buf_ptr << SEG_MULDIV )+((VPC3_ADR)VPC3_ASIC_ADDRESS))) = 寄存器地址= 32H,读取“配置缓冲器的段地址”
目的:
(1)、获取“读配置缓冲器”的段地址
(2)、获取配置缓冲器”的段地址
结果:
(1)、readcfg_ptr = 读配置缓冲器段地址
(2)、cfg_ptr = 配置缓冲器段地址
//-------------------------------------------------------------------------------------
4. 执行下面语句
//-------------------------------------------------------------------------------------
for (i = 0 ; i < cfg_len ; i++)
{
if (*(readcfg_ptr + i) != *(cfg_ptr + i))
{
ret_value = VPC3_CFG_FAULT;
break;
}
}
已知:
(1)、cfg_len = 配置缓冲器长度( FOR 循环中比较次数)
(2)、readcfg_ptr = 读配置缓冲器段地址
(3)、cfg_ptr = 配置缓冲器段地址
目的:
(1)、依次比较配置缓冲器和读配置缓冲器中的数据是否完全一致。
结果:
(1)、配置缓冲器和读配置缓冲器中的数据完全一致。
//-------------------------------------------------------------------------------------
5. 执行下面语句
//-------------------------------------------------------------------------------------
if ( ret_value == VPC3_CFG_OK )
{
user.event |= VPC3_EV_NEW_CFG_DATA;
}
已知:
(1)、ret_value
目的:
(1)、如果配置缓冲器和读配置缓冲器中的数据完全一致,触发一次用户“VPC3+C收到一个Chk_Cfg报文,使CFG缓冲器中的数据可用”的用户事件。
让主程序继续进行处理。
结果:
(1)、user.event |= VPC3_EV_NEW_CFG_DATA