Есть ли у нас оператор '@' во встроенном с или встроенном с ++?Если да, пожалуйста, объясните мне код ниже? - PullRequest
0 голосов
/ 11 октября 2018

код:

static volatile unsigned char   TMR0    @ 0x01;

static volatile unsigned char   PORTA   @ 0x05;

static volatile unsigned char   PORTB   @ 0x06;

static volatile unsigned char   PORTC   @ 0x07;

Этот код взят из файла библиотеки pic.h компилятора HT-PICC для PIC16F877A

Я понимаю, что означает статическое volatile и другое ключевое слово.Здесь адрес регистра Timer0 равен 0x01, но почему они используют @ перед ним?Это как-то связано с указателем?

Ответы [ 3 ]

0 голосов
/ 11 октября 2018

Это переменная, расположенная в (@) определенной ячейке памяти.Таким образом, есть 8-битная переменная TMR0, расположенная по адресу 0x01.В руководстве по компилятору Hi-Tech C для PIC см. Раздел 3.4.4. Типы указателей для получения дополнительной информации.

В vanilla C эквивалент будет:

static volatile unsigned char * TMR0 = (volatile unsigned char *) 0x01;

Оператор @ используется в архитектурах с очень низким объемом памяти, чтобы помочь уменьшить объем используемой памяти.

0 голосов
/ 11 октября 2018

Это обычное нестандартное обозначение для распределения переменной по определенному адресу.В вашем случае он используется для сопоставления аппаратных регистров с переменными C.

В частности, цель @ - позволить компоновщику / отладчику использовать регистры, как если бы они были объектами.Это означает, что вы можете добавить к ним точку останова watch или rw в отладчике, как и в любой другой переменной.

В противном случае, если вам не нужно просматривать их в отладчике, вы можете использовать стандартный эквивалент C:

#define TMR0 (*(volatile uint8_t*)0x01u)

И, разумеется, нет необходимости выделять место для аппаратных регистров, поскольку они уже есть в аппаратном обеспечении независимо от того, что делает программа на Си.

Хорошие отладчики поставляются с MCUподдержка и возможность просмотра регистров, специфичных для MCU, в отдельном окне.Поэтому основная причина использования @ для регистров / карт регистров заключается в том, что в цепочку инструментов входит дрянной отладчик.К сожалению, это мой опыт работы со встроенными цепочками инструментов: чем хуже отладчик, тем сложнее становится карта регистров, предоставляемая компилятором.

Но запись @ также можно использовать для объявления переменных RAM / ROM в определенныхместах.Другие нестандартные расширения других компиляторов используют различные #pragma, ___declspec(section... или __attribute__(section....Было бы неплохо, если бы существовал стандартный способ, но, к сожалению, его нет.

0 голосов
/ 11 октября 2018

Это распространенное расширение компилятора во многих встроенных компиляторах, которое позволяет помещать переменную в абсолютный адрес памяти.

Из руководства по компилятору HI-TECH C:

3.5.4Абсолютные переменные

Большинство переменных можно найти по абсолютному адресу, следуя их объявлению с помощью конструкции @ address , где address - это место в памяти, где переменнаябыть позиционированным.Такие переменные известны как абсолютные переменные.

3.5.4.1 АБСОЛЮТНЫЕ ПЕРЕМЕННЫЕ В ПАМЯТИ ДАННЫХ

Абсолютные переменные в основном предназначены для приравнивания адреса идентификатора C к регистру специальной функции, номожет использоваться для размещения обычных переменных по абсолютному адресу в памяти данных.

В вашем примере:

static volatile unsigned char   TMR0    @ 0x01;

TMR0 - предположительно 8-битный неподписанный аппаратный регистр, который существуетпо адресу 0x01.

...