Обновление

This commit is contained in:
cfif 2026-04-20 13:15:00 +03:00
parent a58f53ebe2
commit cd30cb58d9
1 changed files with 44 additions and 50 deletions

View File

@ -4,7 +4,8 @@
#include <SystemDelayInterface.h>
#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) {
env->rx_message_struct.dlc = pRxCfg->u32DataLen;
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;
if (pRxCfg->eDataType != FLEXCAN_FRAME_DATA) {
return; // Ранний выход
}
uint8_t index = 0xFF;
// Копируем основные данные один раз
const uint32_t rx_id = pRxCfg->u32CanId;
const uint8_t dlc = pRxCfg->u32DataLen;
const FLEXCAN_IdType id_type = pRxCfg->eFrameType;
for (uint8_t i = 0; i < env->CountSoftFilter_RX; ++i) {
// Заполняем структуру
can_rx_message_type *pMsg = &env->rx_message_struct;
pMsg->dlc = dlc;
pMsg->id_type = id_type;
if ((env->rx_message_struct.id_type == FLEXCAN_ID_STD) && (env->IdHardSoftFilter_RX[i].eRxFrameType == FLEXCAN_ID_STD)) {
if (id_type == FLEXCAN_ID_STD) {
pMsg->standard_id = rx_id;
} else {
pMsg->extended_id = rx_id;
}
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;
// Быстрый поиск по 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;
}
} 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;
}
}
}
}
}
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;
@ -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;