volatile unsigned char ADCON1 @ 0x09F;
Это просто объявляет переменную ADCON1
. volatile
означает, что доступ не должен быть оптимизирован, поскольку содержимое переменной может меняться во время выполнения. (т. е. оборудование обновляет значение.)
Я предполагаю, что синтаксис @
нестандартен C; Я никогда этого не видел. Но я полагаю, что это означает, что значение можно найти со смещением 0x09F
.
volatile bit VCFG0 @ ((unsigned)&ADCON1*8)+4;
volatile bit VCFG1 @ ((unsigned)&ADCON1*8)+5;
volatile bit ADFM @ ((unsigned)&ADCON1*8)+7;
Они снова объявляют переменные. Насколько мне известно, тип bit
также не является стандартным, но должен быть понятным.
Синтаксис @
снова используется здесь, чтобы объявить о месте, но самое интересное в том, что, видимо, смещение в типовых приращений, так как адрес ADCON1
умножается на 8. (A раз размер . bit
)
это так же, как вы бы индексировать массив или делать арифметические операции над указателями в обычном C, например: char foo[4]
представляет собой массив размер 4 байта, но int bar[4]
является массивом 32 байт. За исключением этого случая, ваш «массив» является полным адресным пространством процессора.
Таким образом, в основном, эти переменные представляют конкретные биты ADCON1
, беря обугленный-адрес (&ADCON1
), превращая его в битовом-адрес (*8
), то обращаясь конкретным битом (+4
).
volatile union {
struct {
unsigned : 4;
unsigned VCFG0 : 1;
unsigned VCFG1 : 1;
unsigned : 1;
unsigned ADFM : 1;
};
} ADCON1bits @ 0x09F;
Данное заявление не зависит от вышеуказанного, но достигает примерно того же.
Объявлено объединение одной структуры, и переменная этого типа объявляется со смещением 0x09F
. Синтаксис :4
, который вы видите в структуре, указывает бит размера члена. Элементы Nameless-структуры просто недоступны.
Объединение, похоже, ничего не добавляет. Вы получите доступ к битам как ADCON1bits.VCFG0
.
Определение '@' и 'bit' отсутствует. – hirschhornsalz
Это не простой старый C или простой старый C++. Символа '@' нет (кроме строк). Это, вероятно, специфическая для вендора. Вам необходимо проконсультироваться с документацией компилятора. Я предполагаю, что он указывает абсолютный адрес переменной, но не цитируйте меня на этом. –