Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
Легко написать макрос, который из битовой маски сделает битовую маску с единственным младшим битом
#define LOWBIT(MASK) ((((MASK)-1) <<1 ) & (MASK)) #define LOWBIT(MASK) (~(MASK << 1) & (MASK))
труднее (у меня не получилось), макрос выделяющий номер младшего бита
#define LOWBITIDX(MASK) LOWBITIDX32(MASK)
#define LOWBITIDX32(MASK) ((MASK) >= (1 << 16) ? LOWBITIDX16(MASK >> 16) + 16 : LOWBITIDX16(MASK))
#define LOWBITIDX16(MASK) ((MASK) >= (1 << 8) ? LOWBITIDX8(MASK >> 8) + 8 : LOWBITIDX8(MASK))
#define LOWBITIDX8(MASK) ((MASK) >= (1 << 4) ? LOWBITIDX4(MASK >> 4) + 4 : LOWBITIDX4(MASK))
#define LOWBITIDX4(MASK) ((MASK) >= (1 << 2) ? LOWBITIDX2(MASK >> 2) + 2 : LOWBITIDX2(MASK))
#define LOWBITIDX2(MASK) ((MASK) >= (1 << 1) ? LOWBITIDX1(MASK >> 1) + 1 : LOWBITIDX1(MASK))
#define LOWBITIDX1(MASK) ((MASK) >= 0x1 ? 0 : -1)
читать регистр (read{l,w}, переворачивать (le{32,16}_to_cpu)лучше использовать io{read,write}{8,16,32}{,be} — это более современный и рекомендованный интерфейс.
Пост датируется 2004 годом
Ну и на наших target-платформах нету
я могу сказать по опыту, что разработчики SoC-ов очень любят лицензировать чужие блоки
Работа с регистрами внешних устройств в языке C, часть 2