gpt4 book ai didi

c - 如何在输入参数为无符号 32 位数组的函数中传递结构?

转载 作者:行者123 更新时间:2023-12-04 17:29:19 25 4
gpt4 key购买 nike

我想计算STM32微 Controller 中一些数据的CRC值。
用于计算 CRC 的 HAL 函数具有以下占用空间:

uint32_t HAL_CRC_Calculate(CRC_HandleTypeDef *hcrc, uint32_t pBuffer[], uint32_t BufferLength);

我的数据存储在一个结构中:
struct caldata_tag {
float K_P_Htng;
uint16_t K_I_Htng;
uint16_t K_D_Htng;
uint16_t K_P_Coolg; } caldata;

谁是将结构传递给 HAL_CRC_Calculate() 函数的最安全、最合适的方法?

我在想这个:
#define U32BUFFERSIZE sizeof(struct caldata_tag)/sizeof(uint32_t)
uint32_t buffer[U32BUFFERSIZE];
uint32_t crcValue;

/* calculate the crc value of the data */
memcpy(buffer,&localStruct,U32BUFFERSIZE);

crcValue = HAL_CRC_Calculate(&CrcHandle,buffer,U32BUFFERSIZE);

但我认为这是一种丑陋的方式,你能告诉我是否可以吗?或者如果你有更好的主意?

最佳答案

Who is the safest and appropriate way to pass the struct to the HAL_CRC_Calculate()function?



挑战:
  • HAL_CRC_Calculate()显然想根据 uint32_t 的倍数计算 CRC .
  • struct caldata_tag尺寸可能不是 uint32_t 大小的倍数.
  • struct caldata_tag可能包含 caldata 中未知状态的填充.

  • 使用 unionstruct caldata_tag和一个足够大的 uint32_t大批。将其归零,复制成员,然后计算 CRC。

    I am thinking that is an ugly way, could you tell me if it is ok? OR if you have a better idea?



    形成辅助函数。
    // Find the quotient of sizeof caldata_tag / sizeof(uint32_t), rounded up
    #define U32BUFFERSIZE ((sizeof(struct caldata_tag) + sizeof(uint32_t) - 1)/sizeof(uint32_t))

    uint32_t caldata_CRC(CRC_HandleTypeDef *hcrc, const struct caldata_tag *p) {
    // u's size will be a multiple of sizeof uint32_t
    union {
    uint32_t u32[U32BUFFERSIZE];
    struct caldata_tag tag;
    } u = { {0} }; // zero every thing

    // copy the members, not the padding
    u.tag.K_P_Htng = p->K_P_Htng;
    u.tag.K_I_Htng = p->K_I_Htng;
    u.tag.K_D_Htng = p->K_D_Htng;
    u.tag.K_P_Coolg = p->K_P_Coolg;

    return HAL_CRC_Calculate(hcrc, u.u32, U32BUFFERSIZE);
    }


    uint32_t crcValue =  caldata_CRC(&CrcHandle, &caldata);

    [更新]

    Further research表示 BufferLengthuint8_t, uint16_t, uint32_t 的计数取决于 hcrc->InputDataFormat. OP 没有提供,但如果可以设置为 uint8_t .那么代码只需要担心 struct caldata 中的填充.
    #define U8BUFFERSIZE sizeof(struct caldata_tag)

    uint32_t caldata8_CRC(CRC_HandleTypeDef *hcrc, const struct caldata_tag *p) {
    // u's size will be a multiple of sizeof uint32_t
    union {
    uint32_t u32[U32BUFFERSIZE];
    struct caldata_tag tag;
    } u = { {0} }; // zero every thing

    // copy the members, not the padding
    u.tag.K_P_Htng = p->K_P_Htng;
    u.tag.K_I_Htng = p->K_I_Htng;
    u.tag.K_D_Htng = p->K_D_Htng;
    u.tag.K_P_Coolg = p->K_P_Coolg;

    return HAL_CRC_Calculate(hcrc, u.u32, U8BUFFERSIZE);
    }

    如果编译器允许 __attribute__((__packed__)) , @sephiroth答案是一个很好的方法。

    关于c - 如何在输入参数为无符号 32 位数组的函数中传递结构?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58574970/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com