我有两个稍微不同的结构,我想以某种方式链接,以获得最快的结果。
这是两种结构:
/**
* @brief CAN Tx message structure definition
*/
typedef struct
{
uint32_t StdId; /*!< Specifies the standard identifier.
This parameter must be a number between Min_Data = 0 and Max_Data = 0x7FF */
uint32_t ExtId; /*!< Specifies the extended identifier.
This parameter must be a number between Min_Data = 0 and Max_Data = 0x1FFFFFFF */
uint32_t IDE; /*!< Specifies the type of identifier for the message that will be transmitted.
This parameter can be a value of @ref CAN_Identifier_Type */
uint32_t RTR; /*!< Specifies the type of frame for the message that will be transmitted.
This parameter can be a value of @ref CAN_remote_transmission_request */
uint32_t DLC; /*!< Specifies the length of the frame that will be transmitted.
This parameter must be a number between Min_Data = 0 and Max_Data = 8 */
uint8_t Data[8]; /*!< Contains the data to be transmitted.
This parameter must be a number between Min_Data = 0 and Max_Data = 0xFF */
}CanTxMsgTypeDef;
/**
* @brief CAN Rx message structure definition
*/
typedef struct
{
uint32_t StdId; /*!< Specifies the standard identifier.
This parameter must be a number between Min_Data = 0 and Max_Data = 0x7FF */
uint32_t ExtId; /*!< Specifies the extended identifier.
This parameter must be a number between Min_Data = 0 and Max_Data = 0x1FFFFFFF */
uint32_t IDE; /*!< Specifies the type of identifier for the message that will be received.
This parameter can be a value of @ref CAN_Identifier_Type */
uint32_t RTR; /*!< Specifies the type of frame for the received message.
This parameter can be a value of @ref CAN_remote_transmission_request */
uint32_t DLC; /*!< Specifies the length of the frame that will be received.
This parameter must be a number between Min_Data = 0 and Max_Data = 8 */
uint8_t Data[8]; /*!< Contains the data to be received.
This parameter must be a number between Min_Data = 0 and Max_Data = 0xFF */
uint32_t FMI; /*!< Specifies the index of the filter the message stored in the mailbox passes through.
This parameter must be a number between Min_Data = 0 and Max_Data = 0xFF */
uint32_t FIFONumber; /*!< Specifies the receive FIFO number.
This parameter can be CAN_FIFO0 or CAN_FIFO1 */
}CanRxMsgTypeDef;
它们是IAR embedded workbench for ARM中使用的ST驱动程序的一部分,因此我无法更改它们。
我的功能主要是做过滤,这意味着无论我收到什么,我都需要立即发送。
驱动程序功能(我也不能更改)只允许传输
CanTxMsgTypeDef
类型。所以每次我需要将CanRxMsgTypeDef
变量复制到CanTxMsgTypeDef
变量,这是非常低效的。我正在寻找最快结果的最佳实践,即用最少的复制粘贴传输
CanRxMsgTypeDef
数据。请注意
CanRxMsgTypeDef
如何只有额外的数据,即在接收到的CanRxMsgTypeDef
变量中已经传输了所有的信息。 最佳答案
使用两个union
中的struct
,您可以根据6.5.2.3p6访问来自公共初始部分的任何成员:
为了简化联合的使用,有一个特别的保证:如果一个联合包含几个共享一个公共初始序列的结构(见下文),并且如果联合对象当前包含这些结构中的一个,则允许检查其中任何一个结构的公共初始部分,只要工会是可见的。如果对应的成员具有一个或多个初始成员序列的兼容类型(对于位字段,宽度相同),则两个结构共享一个公共的初始序列。
示例代码:
union common
{
CanRxMsgTypeDef rx;
CanTxMsgTypeDef tx;
};
void someFunc(CanTxMsgTypeDef arg)
{
printf("inside func tx.StdId=%d\n",arg.StdId);
printf("inside func tx.DLC=%d\n",arg.DLC);
}
int main()
{
/* Assign RX type to the union */
union common test = {1,2,3,4,5,{0,0,0,0,0,0,0,0},7,8};
printf("test.tx.StdId=%d\n",test.tx.StdId);
printf("test.rx.StdId=%d\n",test.rx.StdId);
printf("test.tx.DLC=%d\n",test.tx.DLC);
printf("test.rx.DLC=%d\n",test.rx.DLC);
printf("test.rx.FMI=%d\n",test.rx.FMI);
/* Use the union as tx type */
someFunc(test.tx);
return 0;
}