项目需要把MCAN转为DCAN,我在改动编译成功后,程序运行不起来,我想可能是传输函数这块问题,以下是我修改的部分:
原本部分MCAN程序为:
int32_t Can_Transmit_Schedule(uint32_t msg_id,
uint8_t *txmsg,
uint32_t len)
{
volatile uint32_t index = 0;
int32_t retVal = 0;
int32_t errCode = 0;
// System_printf ("MEssage %x len %d\n", msg_id, len);
if (frameType == CANFD_MCANFrameType_FD)
{
Task_sleep(1);
while (len > 64U)
{
retVal = CANFD_transmitData(txMsgObjHandle, msg_id, CANFD_MCANFrameType_FD, 64U, &txmsg[index], &errCode);
index = index + 64U;
len = len - 64U;
Task_sleep(1);
}
retVal = CANFD_transmitData(txMsgObjHandle, msg_id, CANFD_MCANFrameType_FD, len, &txmsg[index], &errCode);
}
else
{
while (len > 8U)
{
retVal = CANFD_transmitData(txMsgObjHandle, msg_id, CANFD_MCANFrameType_CLASSIC, 8U, &txmsg[index], &errCode);
if (retVal < 0)
{
continue;
}
index = index + 8U;
len = len - 8U;
}
retVal = CANFD_transmitData(txMsgObjHandle, msg_id, CANFD_MCANFrameType_CLASSIC, len, &txmsg[index], &errCode);
while (retVal < 0)
{
// System_printf("Debug: Error transmitting CAN data %x , Errcode %x\n", retVal, errCode);
retVal = CANFD_transmitData(txMsgObjHandle, msg_id, CANFD_MCANFrameType_CLASSIC, len, &txmsg[index], &errCode);
}
}
return retVal;
}
static void MmwDemo_mboxReadTask(UArg arg0, UArg arg1)
{
MmwDemo_message message;
int32_t retVal = 0;
uint32_t totalPacketLen;
uint32_t numPaddingBytes;
uint32_t itemIdx;
/* wait for new message and process all the messages received from the peer */
while (1)
{
Semaphore_pend(gMmwMssMCB.mboxSemHandle, BIOS_WAIT_FOREVER);
/* Read the message from the peer mailbox: We are not trying to protect the read
* from the peer mailbox because this is only being invoked from a single thread */
retVal = Mailbox_read(gMmwMssMCB.peerMailbox, (uint8_t *)&message, sizeof(MmwDemo_message));
if (retVal < 0)
{
/* Error: Unable to read the message. Setup the error code and return values */
System_printf("Error: Mailbox read failed [Error code %d]\n", retVal);
}
else if (retVal == 0)
{
/* We are done: There are no messages available from the peer execution domain. */
continue;
}
else
{
/* Flush out the contents of the mailbox to indicate that we are done with the message. This will
* allow us to receive another message in the mailbox while we process the received message. */
Mailbox_readFlush(gMmwMssMCB.peerMailbox);
/* Process the received message: */
switch (message.type)
{
case MMWDEMO_DSS2MSS_DETOBJ_READY:
/* Got detetced objectes , shipped out through UART */
/* Send header */
totalPacketLen = sizeof(MmwDemo_output_message_header);
txMsgObjectParams.msgIdentifier = Get_CanMessageIdentifier((MmwDemo_output_message_type)MMWDEMO_HEADER);
Can_Transmit_Schedule(txMsgObjectParams.msgIdentifier,
(uint8_t *)&message.body.detObj.header,
sizeof(MmwDemo_output_message_header));
/* Send TLVs */
for (itemIdx = 0; itemIdx < message.body.detObj.header.numTLVs; itemIdx++)
{
txMsgObjectParams.msgIdentifier = Get_CanMessageIdentifier((MmwDemo_output_message_type)message.body.detObj.tlv[itemIdx].type);
Can_Transmit_Schedule(txMsgObjectParams.msgIdentifier,
(uint8_t *)&message.body.detObj.tlv[itemIdx],
sizeof(MmwDemo_output_message_tl));
txMsgObjectParams.msgIdentifier = Get_CanMessageIdentifier((MmwDemo_output_message_type)message.body.detObj.tlv[itemIdx].type);
Can_Transmit_Schedule(txMsgObjectParams.msgIdentifier,
(uint8_t *)SOC_translateAddress(message.body.detObj.tlv[itemIdx].address, SOC_TranslateAddr_Dir_FROM_OTHER_CPU, NULL),
message.body.detObj.tlv[itemIdx].length);
totalPacketLen += sizeof(MmwDemo_output_message_tl) + message.body.detObj.tlv[itemIdx].length;
}
/* Send padding to make total packet length multiple of MMWDEMO_OUTPUT_MSG_SEGMENT_LEN */
numPaddingBytes = MMWDEMO_OUTPUT_MSG_SEGMENT_LEN - (totalPacketLen & (MMWDEMO_OUTPUT_MSG_SEGMENT_LEN - 1));
if (numPaddingBytes < MMWDEMO_OUTPUT_MSG_SEGMENT_LEN)
{
uint8_t padding[MMWDEMO_OUTPUT_MSG_SEGMENT_LEN];
/*DEBUG:*/ memset(&padding, 0xf, MMWDEMO_OUTPUT_MSG_SEGMENT_LEN);
txMsgObjectParams.msgIdentifier = Get_CanMessageIdentifier((MmwDemo_output_message_type)MMWDEMO_PADDING);
Can_Transmit_Schedule(txMsgObjectParams.msgIdentifier,
padding,
numPaddingBytes);
}
现在我仅将Can_Transmit_Schedule改为:(MmwDemo_mboxReadTask不变)
int32_t Can_Transmit_Schedule(uint32_t msg_id,
uint8_t *txmsg,
uint32_t len)
{
volatile uint32_t index = 0;
int32_t retVal = 0;
int32_t errCode = 0;
CAN_DCANData appDcanTxData;
// System_printf ("MEssage %x len %d\n", msg_id, len);
while (len > 8U)
{
appDcanTxData.dataLength = 8U;
memcpy(appDcanTxData.msgData, &txmsg[index], 8U);
retVal = CAN_transmitData(txMsgObjHandle, &appDcanTxData, &errCode);
if (retVal < 0)
{
continue;
}
index = index + 8U;
len = len - 8U;
}
if (len > 0)
{
appDcanTxData.dataLength = len;
memcpy(appDcanTxData.msgData, &txmsg[index], len);
retVal = CAN_transmitData(txMsgObjHandle, &appDcanTxData, &errCode);
while (retVal < 0)
{
// System_printf("Debug: Error transmitting CAN data %x , Errcode %x\n", retVal, errCode);
retVal = CAN_transmitData(txMsgObjHandle, &appDcanTxData, &errCode);
}
}
return retVal;
}
请问我的改动正确吗?应该怎么改动?