Перейти к содержанию
    

Определение указателя

Можно использовать макроопределение такого вида (и пример применения):

#define ALIAS_PTR(VarPtr, BitNum) \
  *((__IO uint32_t *) (((uint32_t) &(VarPtr) & 0xf0000000) | 0x02000000 \
  + (((uint32_t) &(VarPtr) & 0xfffff)<<5) | (BitNum<<2)))

  ALIAS_PTR(GPIOC->ODR, 8) = ~ALIAS_PTR(GPIOC->ODR, 8);

Но лучше задать атрибут для структуры из битовых полей, и Keil сам будет обращаться к битам через bit-band

typedef struct {
  int  HelpEna : 1;
  int  Lang : 2;
  int  Vect : 1;
  int  Wide : 1;
  int  Scale : 2;
  int  dummy : 1;
} DPY_t __attribute__((bitband));

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Да, у меня уже используется что-то подобное :

typedef union
{
 u8 Byte;
 struct
 {
   u8 B0:1;
   u8 B1:1;
   u8 B2:1;
   u8 B3:1;
   u8 B4:1;
   u8 B5:1;
   u8 B6:1;
   u8 B7:1;
 }Bit __attribute__((bitband));
} MB_ByteCoils;

А тут понадобилось обращаться к флагам именно по номеру . Еще в марте modbus поднял, тут в пятницу за час до момента Х решил ченить соптимизировать)

ViKo, я писал умножение на 32 и сдвиг на 5. Одинаково выходит, оптимизирует как надо.

Изменено пользователем ISK2010

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

не только к Вам, а к общественности - а ведь действительно, линкер ТОЛЬКО собирает?
Формат ELF (не знаю, что там используется в IAR и Keil, но подозреваю, что именно он) поддерживает весьма ограниченные операции над адресами (на link time) - только адрес +/- константа. Никакой другой арифметики не поддерживается

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...