TI中文支持网
TI专业的中文技术问题搜集分享网站

osal_start_timerEx( )函数的使用

在中断函数里面调用函数osal_start_timerEx (Hal_TaskID,HAL_OBD_EVENT, HAL_CAN_DEBOUNCE_VALUE);产生事件,在第一次进入中断调用这个函数以后可以进入HAL_OBD_EVENT的事件处理函数,但是在第二次进入中断调用该函数以后就进不去相应的事件处理函数了,请问这是什么原因呢

lily li1:

我刚用断点调试看了一下,第一次调用这个函数的时候Hal_TaskID=0x01是对的,但是第二次调用这个函数的时候Hal_TaskID=0,所以进不去事件处理函数,但是我在程序里面没有找到改变Hal_TaskID值的语句,所以问题还是决解不了

shaokai Lin:

回复 lily li1:

Hi lily

     仔细检查是否某个地方修改了Hal_TaskID的值,osal_start_timerEx()函数传入的是形参,不会修改数据原型的数值的。

另外,不建议使用Debug(个人感觉不太稳定),可以使用串口辅助输出数据、或输出IO电平,来检查程序是否是你期望的那样执行。

lily li1:

回复 shaokai Lin:

 osal_start_timerEx (0x01,HAL_OBD_EVENT, HAL_CAN_DEBOUNCE_VALUE);我直接把第一个参数直接改成1还是不行,程序运行不稳定,第一次中断后可以进入事件处理函数,但是之后就偶尔可以进入,基本上是第二次中断以后就进不去事件处理函数了

shaokai Lin:

回复 lily li1:

你这是在哪个中断里添加的?

试试改成这样子:

在中断里使用osal_set_event(taskID,eventID);然后到taskID的eventID事件处理里调用

osal_start_timerEx (0x01,HAL_OBD_EVENT, HAL_CAN_DEBOUNCE_VALUE);

lily li1:

回复 shaokai Lin:

我实在P1.1管脚中断里面添加的,改成osal_set_event(0x01,HAL_OBD_EVENT);以后结果还是一样的

shaokai Lin:

回复 lily li1:

把事件处理入口发出来看看、

检查该任务层事件的定义是否出现了冲突,HAL_OBD_EVENT的数值是否与其他事件标志位发生重叠。

lily li1:

回复 shaokai Lin:

#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); } }

shaokai Lin:

回复 lily li1:

中断里面调用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()是没有问题,还是检查下自己程序的逻辑吧。

lily li1:

回复 shaokai Lin:

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语句里面

shaokai Lin:

回复 lily li1:

你这里的程序本身就有一个很大的隐患了,每次写入到数组12个Bytes,数组的长度是1024,当你写到第85次,共写入1020个Bytes(0~1019)。

OK,剩下还有4个Bytes,下一次进来处理时接着写入,1020,1021,1022,1023.然后你把sd_wrnum清零,并继续写入8个Bytes(每次写入12Bytes),分别对应的位置是0,1,2…7. 这样第86写入会造成你的数据出错。

看看是不是数据出错导致的吧。

赞(0)
未经允许不得转载:TI中文支持网 » osal_start_timerEx( )函数的使用
分享到: 更多 (0)