在中断函数里面调用函数osal_start_timerEx (Hal_TaskID,HAL_OBD_EVENT, HAL_CAN_DEBOUNCE_VALUE);产生事件,在第一次进入中断调用这个函数以后可以进入HAL_OBD_EVENT的事件处理函数,但是在第二次进入中断调用该函数以后就进不去相应的事件处理函数了,请问这是什么原因呢
This thread has been locked.
If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.
#define HAL_BUZZER_EVENT 0x0080
#define PERIOD_RSSI_RESET_EVT 0x0040
#define HAL_LED_BLINK_EVENT 0x0020
#define HAL_KEY_EVENT 0x0010
#define HAL_CAN_EVENT 0x0100
#define HAL_OBD_EVENT 0x0200
#define HAL_SD_OBD 0x0400
if ( events & HAL_OBD_EVENT)
{
halProcessCANInterrupt();
return events ^ HAL_OBD_EVENT;
}
halProcessCANInterrupt();里面就是接收数据
void halProcessCANInterrupt (void)
{
uint8 RxSID[4];
//uint8 RxDATA[13];
uint8 SIDH;
uint8 SIDL;
uint8 SIDL1;
uint8 SIDL2;
uint8 EIDH;
uint8 EIDL;
// EA=0;
Can_receive( );
//P1IFG = 0;//清除引脚中断标志
//P1IF = 0;//清除组中断标志
SIDH=CAN_Read_Byte(RXB0SIDH);
SIDL=CAN_Read_Byte(RXB0SIDL);
EIDH=CAN_Read_Byte(RXB0EID8);
EIDL=CAN_Read_Byte(RXB0EID0);
SIDL1=(SIDL&0x03);
SIDL2=SIDL&0xE0;
RxSID[0]=SIDH>>3;
RxSID[1]=(SIDH<<5)|(SIDL2>>3)|SIDL1;
RxSID[2]=EIDH;
RxSID[3]=EIDL;
RxDATA[0]=0x23;
RxDATA[1]=RxSID[1];
RxDATA[2]=RxSID[2];
RxDATA[3]=CANBuff.RxData[0];
RxDATA[4]=CANBuff.RxData[1];
RxDATA[5]=CANBuff.RxData[2];
RxDATA[6]=CANBuff.RxData[3];
RxDATA[7]=CANBuff.RxData[4];
RxDATA[8]=CANBuff.RxData[5];
RxDATA[9]=CANBuff.RxData[6];
RxDATA[10]=CANBuff.RxData[7];
RxDATA[11]=0x2a;
for(int i=0;i<12;i++)
{
if(sd_wrnum<1024)
sd_write[sd_wrnum++]=RxDATA[i];
else
{
sd_wrnum=0;
osal_start_timerEx (0x01,HAL_SD_OBD, HAL_CAN_DEBOUNCE_VALUE);//有这个语句的时候第一次能进入else语句,但是执行完这个语句以后就进不去else语句了
// osal_set_event( 0x01, HAL_SD_OBD);
}
}
中断里面调用osal_set_event(Hal_taskID,HAL_OBD_EVENT),只要能进入该事件处理,很明显中断及事件挂起都是正常的:
if ( events & HAL_OBD_EVENT)
{
halProcessCANInterrupt();
return events ^ HAL_OBD_EVENT;
}
但是你在事件处理中,如果sd_wrnum不小于1024,则使用osal_start_timerEx()开启另外一个定时事件(HAL_SAD_DEBOUNCE),并清零sd_wrnum。
此处就不清楚这个事件是怎么处理的了,也不清楚你的用意,更不知道你在处理中是否会修改sd_wrnum的数值。
如果sd_wrnum变量只是在当前的事件处理中被修改,被清零后,要等待触发1024/12 = 85次中断及事件处理,才会使得程序再次跑进else分支。
osal_start_timerEx()是没有问题,还是检查下自己程序的逻辑吧。
osal_set_event(Hal_taskID,HAL_OBD_EVENT)第二次中断以后就进不去了!我说的执行到else语句的情况是我直接把halProcessCANInterrupt();函数放在中断里处理,没有用事件处理函数调用的时候。
HAL_ISR_FUNCTION( halKeyPort1Isr, P1INT_VECTOR )
{
P1IFG = 0;//清除引脚中断标志
P1IF = 0;//清除组中断标志
EA=0;
{
halProcessCANInterrupt();
}
EA=1;
}
sd_wrnum的值我本来在else语句里面是没有清零,在HAL_SD_OBD事件处理函数里面清零的,但是事件处理函数进不去,所以我才在else语句里面清零,不然程序就一直停在else语句里面