static void i2c_slave_callback(I2C_Type *base, volatile i2c_slave_transfer_t *xfer, void *userData) { callback_message_t *cb_msg = (callback_message_t *)userData; BaseType_t reschedule = 0; switch (xfer->event) { /* Transmit request */ case kI2C_SlaveTransmitEvent: /* Update information for transmit process */ xfer->txData = g_slave_return_buff; xfer->txSize = I2C_DATA_LENGTH; break; /* Receive request */ case kI2C_SlaveReceiveEvent: /* Update information for received process */ xfer->rxData = g_slave_buff; xfer->rxSize = I2C_DATA_LENGTH; break; /* Transfer done */ case kI2C_SlaveCompletionEvent: cb_msg->async_status = xfer->completionStatus; xSemaphoreGiveFromISR(cb_msg->sem, &reschedule); portYIELD_FROM_ISR(reschedule); break; default: break; } }