我用LPC2119上的CAN,程序用了UCOS,CAN接收中断采用IRQ向量中断,能正常产生接收中断,但在UCOS退出中断时总是进入数据中止,请问是什么原因?<br />程序员如下:<br />void CAN1RX_Exception(void)//CAN接收中断<br />{<br /> CANRxBUF buf;<br /> INT8U i,j;<br /> uCANICR k;<br /> static volatile INT8U *pt;<br /> static INT8U count=0;<br /> static INT8U lon=0;<br /> <br /> OS_ENTER_CRITICAL();<br /> <br /> k=CANICR(1);/*清中断标志*/<br /> <br /> buf.CANRcvFS = CANRFS(1);<br /> buf.RxCANID = CANRID(1);<br /> buf.CANRDA = CANRDA(1);<br /> buf.CANRDB = CANRDB(1); <br /> <br /> count=buf.RxCANID.Word&&0x07;<br /> switch(count)<br /> { <br /> case 0://第一帧<br /> if(buf.CANRcvFS.Bits.DLC_BIT<8)<br /> break;<br /> if(buf.CANRDA.Bytes.Data1==0x68 && buf.CANRDB.Bytes.Data4==0x68)<br /> { <br /> pt=CANRx_buf+1;<br /> memcpy((void *)pt,&buf.CANRDA,8);<br /> pt+=8;<br /> CANRx_buf[0]=8;<br /> }<br /> break;<br /> case 1:<br /> if(buf.CANRcvFS.Bits.DLC_BIT<4)//不是一帧完整的数据<br /> { <br /> count=0;<br /> break;<br /> }<br /> lon=buf.CANRDA.Bytes.Data2;//数长<br /> <br /> if(buf.CANRcvFS.Bits.DLC_BIT<8)<br /> {<br /> memcpy((void *)pt,&buf.CANRDA,buf.CANRcvFS.Bits.DLC_BIT);<br /> pt+=buf.CANRcvFS.Bits.DLC_BIT;<br /> CANRx_buf[0]+=buf.CANRcvFS.Bits.DLC_BIT;<br /> }<br /> else <br /> {<br /> memcpy((void *)pt,&buf.CANRDA,8);<br /> pt+=8;<br /> CANRx_buf[0]+=8;<br /> }<br /> <br /> if(lon<=4)<br /> { <br /> count=0;<br /> pt=CANRx_buf+1;<br /> if(*(pt+11+lon)==0x16)<br /> { <br /> pt=CANRx_buf+10;<br /> for(i=0;i<lon;i++)<br /> {<br /> *pt=*pt-0x33;<br /> pt++;<br /> }<br /> pt=CANRx_buf+9;<br /> j=0;<br /> for(i=0;i<lon+2;i++)<br /> {<br /> j+=*pt;<br /> pt++;<br /> }<br /> if(j==*pt)<br /> OSSemPost(CANRxFlag);<br /> }<br /> }<br /> break;<br /> default:<br /> count=0;<br /> break;<br /> }<br /> RelCanRecBuf(1);/*释放接收缓冲区 CANCMR(1).Bits.RRB_BIT=1*/ <br /> VICVectAddr=0;<br /> OS_EXIT_CRITICAL();<br />} |
|