diff --git a/Src/CanSerialPortFrame.c b/Src/CanSerialPortFrame.c index 706f665..ead780a 100644 --- a/Src/CanSerialPortFrame.c +++ b/Src/CanSerialPortFrame.c @@ -4,7 +4,8 @@ #include #include "CanSerialPortFrame.h" #include "memory.h" - +#include "candb.h" +#include "CanPorts.h" #define CAN_USED_NUM 2U // Количество CAN #define CAN_RECEIVE_MB_NUM 128 // Количество mailbox на один CAN @@ -300,64 +301,55 @@ static void CanSerialPortFrameAddDataQueue(tCanSerialPortFrameFlagchip *env, can } } + void CanSerialPortFrameIrqRxProcessingNO_DMA(tCanSerialPortFrameFlagchip *env, FLEXCAN_RxMsgType *pRxCfg) { - if (pRxCfg->eDataType == FLEXCAN_FRAME_DATA) { + if (pRxCfg->eDataType != FLEXCAN_FRAME_DATA) { + return; // Ранний выход + } - env->rx_message_struct.dlc = pRxCfg->u32DataLen; + // Копируем основные данные один раз + const uint32_t rx_id = pRxCfg->u32CanId; + const uint8_t dlc = pRxCfg->u32DataLen; + const FLEXCAN_IdType id_type = pRxCfg->eFrameType; - if (env->rx_message_struct.id_type == FLEXCAN_ID_STD) { - env->rx_message_struct.standard_id = pRxCfg->u32CanId; - } else { - env->rx_message_struct.extended_id = pRxCfg->u32CanId; - } + // Заполняем структуру + can_rx_message_type *pMsg = &env->rx_message_struct; + pMsg->dlc = dlc; + pMsg->id_type = id_type; - uint8_t index = 0xFF; + if (id_type == FLEXCAN_ID_STD) { + pMsg->standard_id = rx_id; + } else { + pMsg->extended_id = rx_id; + } - for (uint8_t i = 0; i < env->CountSoftFilter_RX; ++i) { - - if ((env->rx_message_struct.id_type == FLEXCAN_ID_STD) && (env->IdHardSoftFilter_RX[i].eRxFrameType == FLEXCAN_ID_STD)) { - - if (env->rx_message_struct.standard_id == env->IdHardSoftFilter_RX[i].u32RxCanId) { - env->rx_message_struct.filter_index = env->IdHardSoftFilter_RX[i].filter; - env->rx_message_struct.id_type = pRxCfg->eFrameType; - index = i; - break; - } - - } else { - - if (env->rx_message_struct.extended_id == env->IdHardSoftFilter_RX[i].u32RxCanId) { - - if (env->rx_message_struct.extended_id == env->IdHardSoftFilter_RX[i].u32RxCanId) { - env->rx_message_struct.filter_index = env->IdHardSoftFilter_RX[i].filter; - env->rx_message_struct.id_type = pRxCfg->eFrameType; - index = i; - break; - } - - } + // Быстрый поиск по ID (можно использовать switch или бинарный поиск) + uint8_t filter_index = 0xFF; + const uint8_t count = env->CountSoftFilter_RX; + // Самый быстрый вариант: если ID совпадает с UDS + if (rx_id == Diag_To_CCU_CANID || rx_id == Diag_Functional_CANID) { + filter_index = PROTOCOL_CAN_UDS; + pMsg->filter_index = filter_index; + } else { + // Линейный поиск по остальным ID (только если нужно) + for (uint8_t i = 0; i < count; i++) { + if (rx_id == env->IdHardSoftFilter_RX[i].u32RxCanId) { + filter_index = env->IdHardSoftFilter_RX[i].filter; + pMsg->filter_index = filter_index; + break; } - } + } - - if (index != 0xFF) { - memcpy(env->rx_message_struct.data, pRxCfg->aData, pRxCfg->u32DataLen); - CanSerialPortFrameAddDataQueue(env, &env->rx_message_struct, env->IdHardSoftFilter_RX[index].filter); - } - - if (env->CountSoftFilter_RX == 0) { - memcpy(env->rx_message_struct.data, pRxCfg->aData, pRxCfg->u32DataLen); - CanSerialPortFrameAddDataQueue(env, &env->rx_message_struct, 0); - } - - - - + // Если ID найден или фильтров нет + if (filter_index != 0xFF || count == 0) { + memcpy(pMsg->data, pRxCfg->aData, dlc); + CanSerialPortFrameAddDataQueue(env, pMsg, filter_index != 0xFF ? filter_index : 0); } } + void CanSerialPortFrameIrqRxProcessing(tCanSerialPortFrameFlagchip *env, uint32_t *pBuf) { // message buffer 1th word @@ -381,7 +373,8 @@ void CanSerialPortFrameIrqRxProcessing(tCanSerialPortFrameFlagchip *env, uint32_ for (uint8_t i = 0; i < env->CountSoftFilter_RX; ++i) { - if ((env->rx_message_struct.id_type == FLEXCAN_ID_STD) && (env->IdHardSoftFilter_RX[i].eRxFrameType == FLEXCAN_ID_STD)) { + if ((env->rx_message_struct.id_type == FLEXCAN_ID_STD) && + (env->IdHardSoftFilter_RX[i].eRxFrameType == FLEXCAN_ID_STD)) { if (env->rx_message_struct.standard_id == env->IdHardSoftFilter_RX[i].u32RxCanId) { env->rx_message_struct.filter_index = env->IdHardSoftFilter_RX[i].filter; @@ -422,7 +415,7 @@ void CanSerialPortFrameIrqRxProcessing(tCanSerialPortFrameFlagchip *env, uint32_ } - if (env->CountSoftFilter_RX == 0) { + if (env->CountSoftFilter_RX == 0) { // message buffer 3th word uint32_t *pSrc = (uint32_t *) FLEXCAN_MB_WORDN_ADDR(&pBuf[env->pBufCounter << 2], 0U, 8U, 8U); uint32_t *pDest = (uint32_t *) &env->rx_message_struct.data[0]; @@ -491,7 +484,8 @@ vCanSerialPortFrameReceive(tCanSerialPortFrameFlagchip *env, uint8_t idFilter, u // : 0; //} -uint16_t vCanSerialPortFrameTransmit(tCanSerialPortFrameFlagchip *env, uint8_t *data, uint16_t size, uint32_t adr, uint8_t canType, uint32_t timeout) { +uint16_t vCanSerialPortFrameTransmit(tCanSerialPortFrameFlagchip *env, uint8_t *data, uint16_t size, uint32_t adr, + uint8_t canType, uint32_t timeout) { uint16_t sent = 0;