Страницы

Поиск по вопросам

вторник, 26 ноября 2019 г.

Двоеточие в полях структуры


Объясните, пожалуйста, как тут создается структура? Что делает знак двоеточие :?

/**
 * @brief Bit-field structure of the state of the packet reception
 */
typedef struct{
    uint32_t Length         :16;        /*!< The number of bytes in the packet including header and CRC. */
    uint32_t PF_ERR         :1;         /*!< A sign package PAUSE. */
    uint32_t CF_ERR         :1;         /*!< A sign Management Pack (filtering by MAC and special tags in the field length - 13.14 - octets). */
    uint32_t LF_ERR         :1;         /*!< A sign excess packet length 1518 octets. */
    uint32_t SF_ERR         :1;         /*!< A sign of lack of packet length 64 octets. */
    uint32_t LEN_ERR        :1;         /*!< A sign mismatch between the actual length and the length specified in the length field - 13.14 octets. */
    uint32_t DN_ERR         :1;         /*!< A sign bit of the packet is not a multiple of 8. */
    uint32_t CRC_ERR        :1;         /*!< A sign mismatch packet CRC. */
    uint32_t SMB_ERR        :1;         /*!< A sign of the presence in the packet error nibbles. */
    uint32_t MCA            :1;         /*!< A sign group package (MAC matches HASH). */
    uint32_t BCA            :1;         /*!< A sign of the broadcast packet (MA
= FF:FF:FF:FF:FF:FF). */
    uint32_t UCA            :1;         /*!< A sign individual package (MAC corresponds to the set). */
}ETH_StatusPacketReceptionBitFileds;

    


Ответы

Ответ 1



В названии самой структуры ETH_StatusPacketReceptionBitFileds присутствует словосочетани BitFileds. Эта структура задает битовые поля, то есть более компактную форму запис целочисленных членов данных структуры, так как заранее известно, что эти члены данных будут хранить ограниченные значения, и для их представления достаточно выделить несколько битов. Например, вы могли бы определить эту структуру следующим образом: typedef struct{ uint32_t Length; /*!< The number of bytes in the packet including header and CRC. */ uint32_t PF_ERR; /*!< A sign package PAUSE. */ //... }ETH_StatusPacketReceptionBitFileds; Но в таком случае каждый член данных структуры занимал бы память в 32 бита, или байта. А если известно, например, что член данных структуры PF_ERR может принимать тольк два значения 0 или 1, то будет расточительно хранить эти значения в члене данных, имеющи 32 бита, так как для представления 0 или 1 достаточно всего лишь одного бита. Поэтому структура определяется как структура с битовыми полями с заданным количеством битов. Эти битовые поля упаковываются компилятором в объекты, как указано в объявлении битовых полей структуры, типа uint32_t. То есть в принципе в одном объекте данного типа может быть упаковано 32 битовых поля размером в 1 бит. Это экономит память, выделяемую под объекты структуры. Из стандарта C++ (9.6 Bit-fields [class.bit]) 1 A member-declarator of the form identifieropt attribute-specifier-seqopt: constant-expression specifies a bit-field; its length is set off from the bit-field name by a colon.,,, Bit-fields are packed into some addressable allocation unit.

Ответ 2



После двоеточия для члена структуры задается размер этого члена в битах. Т.е. тако член является битовым полем. В основном это используется для упаковки данных и при этом сохранения удобного доступа на изменение и чтения значения. При этом для битового поля запрещена операция взятия адреса. Собственно в комментарии к структуре уже содержится ответ: Bit-field structure ...

Комментариев нет:

Отправить комментарий