52A 中断作霍尔开关,注册后开不了机器--(已解决)
52A 平台,开合盖的霍尔开关 在代码中 注册了一个此中断后,升级机器,只跑到logo阶段,有电流大概60-70MA
补充: 掉电后,第二次按电源键一点反应都没有,得用FlashTool擦除下才可以 看看到上面的现象
#if (defined(__PHONE_CLAMSHELL__) || defined(__PHONE_SLIDE__))
void CLAM_EINT_HISR(void)
{
ilm_struct *clam_ilm;
aux_id_struct *aux_id_data;
//kal_pROMpt_trace(MOD_NIL,"clam_state=%d",clam_state);
#if defined( __CLAM1_LEVEL_LOW_OPEN__)
if (clam_state == LEVEL_HIGH )
#else
if (clam_state == LEVEL_LOW)
#endif
{
aux_id_data = (aux_id_struct*)
construct_local_para(sizeof(aux_id_struct), TD_CTRL);
aux_id_data->aux_id = AUX_ID_CLAM_CLOSE;
DRV_BuildPrimitive(clam_ilm,
MOD_EINT_HISR,
MOD_UEM,
MSG_ID_AUX_ID,
aux_id_data);
}
else
{
aux_id_data = (aux_id_struct*)
construct_local_para(sizeof(aux_id_struct), TD_CTRL);
aux_id_data->aux_id = AUX_ID_CLAM_OPEN;
DRV_BuildPrimitive(clam_ilm,
MOD_EINT_HISR,
MOD_UEM,
MSG_ID_AUX_ID,
aux_id_data);
}
msg_send_ext_queue(clam_ilm);
clam_state = !clam_state;
EINT_Set_Polarity(CLAMDET_EINT_NO,clam_state);
}
#endif /*__PHONE_CLAMSHELL__*/
在aux_task_main中注册
#if (defined(__PHONE_CLAMSHELL__) || defined(__PHONE_SLIDE__))
EINT_Registration(CLAMDET_EINT_NO,KAL_TRUE,clam_state,CLAM_EINT_HISR, KAL_TRUE);
EINT_Set_HW_Debounce(AUX_EINT_NO,200);
#endif /*__PHONE_CLAMSHELL__*/
中断服务函数有问题?
还有在什么地方注册中断的?
另一个方法通过打LOG的方式 ,是可以看堆栈里的调用关系,应当也能看到死机的地方。
中断响应函数应该没问题,从其他平台上移过来的,在aux_task_main里面注册的
是不是一直在中断?中断得太频繁也会死机的。
你要加个软件防抖动,估计是中断太多了 系统挂掉了!
如果是这样,有个奇怪的地方
补充: 掉电后,第二次按电源键一点反应都没有,得用flashtool擦除下才可以 看看到上面的现象
EINT_SW_Debounce_Modify(LOCK_EINT_NO,50);
加这句话试试,在中断服务函数里面
#if (defined(__PHONE_CLAMSHELL__) || defined(__PHONE_SLIDE__))
extern kal_uint8 is_close_system;
void CLAM_EINT_HISR(void)
{
ilm_struct *clam_ilm;
aux_id_struct *aux_id_data;
if(is_close_system==1)
{
return;
}
if (clam_state == LEVEL_LOW)
{
aux_id_data = (aux_id_struct*)
construct_local_para(sizeof(aux_id_struct), TD_CTRL);
aux_id_data->aux_id = AUX_ID_CLAM_CLOSE;
DRV_BuildPrimitive(clam_ilm,
MOD_EINT_HISR,
MOD_UEM,
MSG_ID_AUX_ID,
aux_id_data);
}
else
{
aux_id_data = (aux_id_struct*)
construct_local_para(sizeof(aux_id_struct), TD_CTRL);
aux_id_data->aux_id = AUX_ID_CLAM_OPEN;
DRV_BuildPrimitive(clam_ilm,
MOD_EINT_HISR,
MOD_UEM,
MSG_ID_AUX_ID,
aux_id_data);
}
msg_send_ext_queue(clam_ilm);
clam_state = !clam_state;
EINT_Set_Polarity(CLAMDET_EINT_NO,clam_state);
}
#endif
下面这一段在aux_task_main中
#if (defined(__PHONE_CLAMSHELL__) || defined(__PHONE_SLIDE__))
//L_Clam_State();
EINT_Registration(CLAMDET_EINT_NO,KAL_TRUE,clam_state,CLAM_EINT_HISR, KAL_TRUE);
EINT_Set_HW_Debounce(CLAMDET_EINT_NO, 5);
EINT_SW_Debounce_Modify(CLAMDET_EINT_NO, 20);
#endif
is_close_system 在EntryIdleScreen的时候设置为0,在ShutdownSystemOperation中设置为1
EINT_Registration(CLAMDET_EINT_NO,KAL_TRUE,clam_state,CLAM_EINT_HISR, KAL_TRUE);
EINT_Set_HW_Debounce(CLAMDET_EINT_NO, 5);
EINT_SW_Debounce_Modify(CLAMDET_EINT_NO, 20);
这3句改为
EINT_SW_Debounce_Modify(CLAMDET_EINT_NO, 0);
EINT_Registration(CLAMDET_EINT_NO,KAL_FALSE,clam_state,CLAM_EINT_HISR, KAL_TRUE); 就OK了!
你这个修改 在在mingchong2005基础上这样做? 我原来的也没加 sw debounce
is_close_system 这个是自己添加默认为0 么? 我是开机阶段死掉的