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 } }
More details, after getting 20 msgs, ie, after osMessageGet() is called for 20 times, the returned value of osMessageGet() is not 'osEventMessage' any more, so it leaves ISR and enters thread1(I didn't call osMessagePut or osMailPut in thread1, neither for other threads ).
Then interrupt occurs, so it enters ISR again , and at this moment, the returned value of osMessageGet() is 'osEventMessage' again! But with timeout setting to 0, everything's ok.
as written in the manual, for both functions osMessagePut and osMessageGet the timeout parameter must be 0 when they are used in ISR.
In your code the timeout for osMessagePut should be 0 not 10.
... result = osMessagePut(rlcan_msgq_tx, ptrmsg, 0); ...
Hi,Chen , osMessagePut is not in ISR, but in thread1 as the comments aside.