Hello,
ISR is:
ISR(CANrez_InterruptTx){ byte buffer = (CAN4TFLG & CAN4TIER) & 7; /* Temporary variable */ CAN4TIER &= ~buffer; /* Clear appropriate transmit flags and release TX buffer */ if (CANrez_EnEvent) { /* Are events enabled? */ CANrez_OnFreeTxBuffer((word)buffer); /* If yes then invoke user event */ }} Here is not disable global interrupt. And event handler:
void CANrez_OnFreeTxBuffer(word BufferMask){ /* Write your code here ... */ MsgCANbus msg_isr_tx_can; // сообщение CAN для передачи контроллеру portBASE_TYPE mng_woken = FALSE; // пробуждение менеджера unsigned char num_buf = 0; // номер используемого аппаратного буфера if ( uxQueueMessagesWaiting( q_isr_tx_can ) ) // CAN очередь не пустая { if ( 1 == ( CANrez_GetStateTX() & CAN4TFLG_TXE0_MASK ) ) // есть свободные { // Принимаем CAN сообщение от менеджера if ( pdPASS == xQueueReceiveFromISR( q_isr_tx_can, & msg_isr_tx_can, & mng_woken ) ) // прочитали сообщение { if ( MI_CANmng2isr == msg_isr_tx_can.id ) // сообщение от менеджера { CANrez_SendFrame( num_buf, msg_isr_tx_can.can_id | CAN_EXTENDED_FRAME_ID, msg_isr_tx_can.frm_type, msg_isr_tx_can.len, msg_isr_tx_can.data ); // передали сообщение контроллеру } } } }}
So, sended messages are in the queue ( I use FreeRTOS ).
May be influenced by a context switch?
Although it seems to me that this should lead only to further delay.
Best regards,
Sergey.