- UID
- 809379
|
请教各位 ,我用XDG128,移植了UCOS系统,我在PH口作为中断输入口 ,当PH口上有杂波输入时,系统就死机(单片机好像没有死机,好像进入了空闲任务的死循环),但我不用操作系统时,PH口上无论有多少杂波也不会导致单片机死机,请教在用ucos系统时PH口上有杂波输入时怎么样处理才不死机
以下是UCOS系统中处理中断的程序,分析分析
void interrupt 25 PH_INT(void){ //PH口中断,引脚PH0--PH3 输入 DisableInterrupts; //关中断
//-----------------------------------------------------------------------
asm
{
ldaa PPAGE;
psha;
} // 保存PPAGE
OSIntEnter();
if(OSIntNesting == 1){
asm
{
ldx OSTCBCur;
sts 0,x;
}
}
//======================================================
//===================中间这里是中断服务程序不用管=====
PHcpu12_now_cnt8us=(TCNT>>1)|(out_TCNT<<15);
// PORTB_PB0=~PORTB_PB0;
k_isr=1;
for(i_isr=0;i_isr<2;i_isr++){
if(PIFH&PIEH&k_isr){ //处理PHIN.x中断
PIFH=k_isr; //清除中断标志
cpu12_PTH_state=i_isr; //确定PH0 or PH1 中断
cpu12_PTH_up_down=(PTIH&k_isr)>>i_isr; // 1: 上升沿 0:下降沿
PPSH=(((~(cpu12_PTH_up_down))&(0x01))<<i_isr)|((~(1<<i_isr))&PPSH);
break;
}
k_isr=k_isr<<1;
}
PIFH=0XFF;
for(i_isr=0;i_isr<2;i_isr++)
{
if(i_isr==cpu12_PTH_state)
{
if(cpu12_PTH_up_down==1)
{
PPSJ=PPSJ|(1<<i_isr); //PJ口上升沿捕捉,同步
PH_SW=i_isr;
err=OSSemPost(ph_sem); //这里代表一个周期结束
}else
{
PH_up_down8us[i_isr][1]= PHcpu12_now_cnt8us; // down time
PH_up_old8us[i_isr]= PH_up_down8us[i_isr][0]; //把上一个上降沿时间存起来
tst=i_isr;
asm("nop");
}
}
}
//=============================================================
OSIntExit(); // exit interrupt and task switch
asm
{
pula;
staa PPAGE;
rti;
}
//---------------------------------------------------------------------------
// EnableInterrupts; //开中断
} |
|