Макрос препроцессора C для упаковки битовых полей в байт?

ре: ididak

я фиксирую код, который повреждает длинные операторы в слишком много коротких строк.

Позволяют нам столкнуться с ним: это больше не 90-е. Если Ваша компания не может позволить себе широкоэкранный LCDs для своих кодеров, необходимо получить лучшее задание:)

5
задан Brian Tompsett - 汤莱恩 12 February 2016 в 19:39
поделиться

2 ответа

Да, переопределите макросы ABC как 1 << ABC , и вы это упростите. Объединение битовых масок вместе - очень распространенная идиома, которую узнает любой. Выявление позиций сдвига из вашего лица очень поможет.

Ваш код идет от

#define SPIE 7
#define SPE 6
#define DORD 5
#define MSTR 5
#define CPOL 4
#define CPHA 3

void init_spi() {
  SPCR = (1 << SPE) | (1 << SPIE) | (1 << MSTR) | (1 << SPI2X);      
}

к этому

#define BIT(n) (1 << (n))
#define SPIE BIT(7)
#define SPE BIT(6)
#define DORD BIT(5)
#define MSTR BIT(5)
#define CPOL BIT(4)
#define CPHA BIT(3)

void init_spi() {
  SPCR =  SPE | SPIE | MSTR | SPI2X;
}

Это предложение действительно предполагает, что определения битовых полей используются во много раз больше, чем их определений.


Мне кажется, что есть способ использовать для этого макросы с переменным числом аргументов , но я не могу представить себе ничего, что можно было бы легко использовать в качестве выражения. Однако рассмотрите возможность создания литерала массива внутри функции, генерирующей вашу константу:

#define BITS(name, ...) \
     char name() { \
         char[] bits = { __VA_ARGS__ }; \
         char byte = 0, i; \
         for (i = 0; i < sizeof(bits); ++i) byte |= (1 << bits[i]); \
         return byte; }

/*  Define the bit-mask function for this purpose */
BITS(SPCR_BITS, SPE, SPIE, MSTR, SPI2X)

void init_spi() {
    SPCR = SPCR_BITS();
}

Если ваш компилятор хорош, он увидит, что вся функция постоянна во время компиляции, и встроит результирующее значение.

6
ответ дан 14 December 2019 в 13:42
поделиться

Почему бы не создать свои собственные определения в дополнение к предопределенным ...

#define BIT_TO_MASK(n) (1 << (n))

#define SPIE_MASK BIT_TO_MASK(SPIE)
#define SPE_MASK  BIT_TO_MASK(SPE)
#define DORD_MASK BIT_TO_MASK(DORD)
#define MSTR_MASK BIT_TO_MASK(MSTR)
#define CPOL_MASK BIT_TO_MASK(CPOL)
#define CPHA_MASK BIT_TO_MASK(CPHA)

void init_spi() {
  SPCR =  SPE_MASK | SPIE_MASK | MSTR_MASK | SPI2X_MASK;
}
0
ответ дан 14 December 2019 в 13:42
поделиться
Другие вопросы по тегам:

Похожие вопросы: