кстати, по поводу битовых полей и регистров периферии год назад наткнулся на геморрой с ARM @ Crossworks
Там при работе с битовыми полями используются байтные инструкции, а некоторые периферийные регистры этого не допускают - проц вылетает в Data Abort.
Написал об этом в Yahoo LPC2000 мейл-листе и был смешан с г...м разработчиком компилятора и другими активными личностями. В чем то они были правы - компилятор не обязан знать конкретную реализацию железа... Особенно напирали на стандарты (типа покажи, почему компилятор работает не правильно) и переносимость с big-endian на little-endian и наоборот (это вообще по поводу битовых полей в целом) - смешно...
Все мои аргументы о том - как хочу, так и делаю, битовые поля - распространенный и удобный способ обращения к периферии, пишите сноски в документации на компилер - ни к чему не привели..
Но я остался не переубежден, снес нах Crossworks и спокойненько пользуюсь Keil'ом
Это к вопросу об аккуратности использования битовых полей с периферийными регистрами