It takes me several days for debbuging ,but didn't work.
when the para 'timeout' of osMessagePut(id,info,timeout) is not set to 0, then the program crashes with info 'OS_ERROR_MBX_OVF' , which means mailbox overflow. But with timeout setting to 0,everything seems ok.
It really confuses me. Can anyone help me ? Thanks a lot!
The main frame of my program is as follows (it is from mdk example 'CAN_Ex', basically not changed much )
osPoolDef(rlcan_mpool, 80, CAN_msg); osMessageQDef(rlcan_msgq_tx, 20, CAN_msg); /* Thread1, used to send can message */ while(1) { ... /* check if hardware is free for send */ if (CAN_hw_tx_empty (ctrl) == CAN_OK) { CAN_hw_wr (ctrl, msg); /* Send message */ } else { ptrmsg = osPoolAlloc(rlcan_mpool); /* for timeout is not 0, it crashes after ISR getting about 16 messages */ result = osMessagePut(rlcan_msgq_tx, ptrmsg, 10); if (result != osOK) osPoolFree(rlcan_mpool, ptrmsg); } osDelay (500); } /* ISR, interrupt generates after msg sending succeeds */ void CAN0_ORed_Message_buffer_IRQHandler (void) { ... iflag1 = CANc->IFLAG1; //iflag1 will be set if msg sending succeeds while(iflag1) { iflag1 = 0; /* it crashes after getting about 16 messages */ evt = osMessageGet(rlcan_msgq_tx[CTRL0], 0); if (evt.status == osEventMessage) { CAN_hw_wr (CTRL,evt.value.p); /* Send message */ osPoolFree(rlcan_mpool, evt.value.p); } iflag1 = CANc->IFLAG1; //check whether iflag1 is set again } }
Sorry, I referred to mail instead of message functions.
Ensure that both functions: osMessageGet and osMessagePut get the same queue_id.
Once this is verified I suggest you trace the calls to both functions (i.e. increment two counters in your application and use the ULINKpro / MDK Logic Analyzer to see how the values progress - or if you prefer a hardware method toggle two different pins and use an oscilloscope).
My guess is that there is something wrong with the CAN peripheral communication.
thanks, Reinhard. the queue id is the same, and the calls to both functions is ok , i'm pretty sure about this, but cannot figure out why osMessageGet is called one more time than osMessagePut as I wrote ahead.