We are running a survey to help us improve the experience for all of our members. If you see the survey appear, please take the time to tell us about your experience if you can.
hi,
i have a problem with the isr_mbx_receive() function, which is not working for me.
i have written a class for the mailbox functions and i can send messages between tasks and from an ISR routine to another task
but i can't send any messages from a task to an ISR routine
my add message method
MBX_MSG_STATUS MbxQueueSC::add(U8 in, U16 timeout){ if ((inptr = (T_MBX_SC*)_alloc_box(mailpool))==NULL){ return MBX_ALLOC_FAIL; // no memory available } if (os_mbx_check(mailbox) == 0){ // mailbox full return MBX_FULL; } inptr->data = in; if (os_mbx_send(mailbox, inptr, timeout) != OS_R_OK){ //if != OS_R_OK, error happened return MBX_TIMEOUT; } #ifdef _DEBUG printf("available: %i\n",os_mbx_check(mailbox)); #endif return MBX_OK; //successfully added data to mailbox }
and my read message method for ISR
MBX_MSG_STATUS MbxQueueSC::read_irq(T_MBX_SC *out){ printf("irq: %i \n",isr_mbx_check(mailbox)); if (isr_mbx_receive (mailbox, (void**)&outptr) != OS_R_OK){ *out=*outptr; _free_box(mailpool, outptr); return MBX_OK; } else{ return MBX_EMPTY; //no message was available } }
my ISR
void USART3_IRQHandler(void){ T_MBX_SC send; //this part is working if(USART_GetITStatus(USART3, USART_IT_RXNE) != RESET){ //received char if (q_sm4200_irq_rx.add_irq((U8)USART_ReceiveData(USART3))){ // intercept queue error here } } if(USART_GetITStatus(USART3, USART_IT_TXE) != RESET){ if (q_sm4200_irq_rx.read_irq(&send) == MBX_EMPTY) { USART_ITConfig(USART3, USART_IT_TXE, DISABLE); } else { USART_SendData(USART3, send.data); USART_ClearITPendingBit(USART3, USART_IT_TXE); } } }
i did not post my mailbox init routines here, but as is said they are working as it seems
when i add messages from a task and call os_mbx_check(), the free-mailbox number is decrasing, so i think the messages are added to the mailbox.
if i call isr_mbx_check() in the ISR for the same mailbox, it always shows me the maximum mailbox space, as if no messages were added.
do you have any idea what i might do wrong?
as usual my fault...
i have two queues...a RX and a TX queue. using the RX queue in the TX part of the ISR does not seem to be that clever
i can confirm that isr_mbx_receive() works as expected, if you know what you are doing :)