ViKo 1 4 сентября, 2011 Опубликовано 4 сентября, 2011 · Жалоба Можно использовать макроопределение такого вида (и пример применения): #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)); Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ISK2010 0 4 сентября, 2011 Опубликовано 4 сентября, 2011 (изменено) · Жалоба Да, у меня уже используется что-то подобное : 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. Одинаково выходит, оптимизирует как надо. Изменено 4 сентября, 2011 пользователем ISK2010 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
xvr 12 5 сентября, 2011 Опубликовано 5 сентября, 2011 · Жалоба не только к Вам, а к общественности - а ведь действительно, линкер ТОЛЬКО собирает?Формат ELF (не знаю, что там используется в IAR и Keil, но подозреваю, что именно он) поддерживает весьма ограниченные операции над адресами (на link time) - только адрес +/- константа. Никакой другой арифметики не поддерживается Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться