@sign в объявлении переменной C
Я нашел этот файл заголовка для микроконтроллеров PIC по имени pic1250.h, и я не могу получить зависание какого-либо синтаксиса, используемого в нем.
Источник для файла:
/*
* Header file for the Microchip
* PIC 12c508 chip
* PIC 12c509 chip
* Baseline Microcontrollers
*/
static volatile unsigned char RTCC @ 0x01;
static volatile unsigned char TMR0 @ 0x01;
static volatile unsigned char PCL @ 0x02;
static volatile unsigned char STATUS @ 0x03;
static unsigned char FSR @ 0x04;
static volatile unsigned char OSCCAL @ 0x05;
static volatile unsigned char GPIO @ 0x06;
static unsigned char control OPTION @ 0x00;
static volatile unsigned char control TRIS @ 0x06;
/* STATUS bits */
static bit GPWUF @ (unsigned)&STATUS*8+7;
static bit PA0 @ (unsigned)&STATUS*8+5;
static bit TO @ (unsigned)&STATUS*8+4;
static bit PD @ (unsigned)&STATUS*8+3;
static bit ZERO @ (unsigned)&STATUS*8+2;
static bit DC @ (unsigned)&STATUS*8+1;
static bit CARRY @ (unsigned)&STATUS*8+0;
/* OPTION bits */
#define GPWU (1<<7)
#define GPPU (1<<6)
#define T0CS (1<<5)
#define T0SE (1<<4)
#define PSA (1<<3)
#define PS2 (1<<2)
#define PS1 (1<<1)
#define PS0 (1<<0)
/* OSCCAL bits */
static bit CAL7 @ (unsigned)&OSCCAL*8+7;
static bit CAL6 @ (unsigned)&OSCCAL*8+6;
static bit CAL5 @ (unsigned)&OSCCAL*8+5;
static bit CAL4 @ (unsigned)&OSCCAL*8+4;
/* GPIO bits */
static bit GP5 @ (unsigned)&GPIO*8+5;
static bit GP4 @ (unsigned)&GPIO*8+4;
static bit GP3 @ (unsigned)&GPIO*8+3;
static bit GP2 @ (unsigned)&GPIO*8+2;
static bit GP1 @ (unsigned)&GPIO*8+1;
static bit GP0 @ (unsigned)&GPIO*8+0;
#define CONFIG_ADDR 0xFFF
#define FOSC0 0x01
#define FOSC1 0x02
#define WDTE 0x04
#define CP 0x08
#define MCLRE 0x0F
Я не могу понять всю декларацию modifer-datatype @-something. Может кто-нибудь, пожалуйста, помогите мне? Я просто новичок в этом.
Ответы
Ответ 1
Это расширение компилятора.
Из PIC Документация компилятора MPLAB XC8 (акцент мой):
5.5.4 Абсолютные переменные
Большинство переменных могут быть расположены по абсолютному адресу, следуя объявлению с address @address, где адрес - это место в памяти, где переменная должна располагаться. Такие переменные называются абсолютными переменными.
5.5.4.1 АБСОЛЮТНЫЕ ПЕРЕМЕННЫЕ В ПАМЯТИ ДАННЫХ
Абсолютные переменные в основном предназначены для приравнивания адреса идентификатора С с помощью регистр специальных функций, но может быть использован для размещения обычных переменных в абсолютном адрес в памяти данных.
Например:
volatile unsigned char Portvar @0x06;
объявит переменную Portvar, расположенную в 06h в памяти данных. Компилятор зарезервирует хранилище для этого объекта (если адрес попадает в ОЗУ общего назначения) и будет приравнивать идентификатор переменных к этому адресу.
Обратите внимание, что MPLAB XC8 не является единственным компилятором, который должен иметь одну и ту же конструкцию @
для размещения объекта в определенной ячейке памяти.
Другим известным компилятором является Freescale CodeWarrior (по крайней мере, для HCS08).
Другим является компилятор IAR C (по крайней мере, для MSP430 и AVR).
Ответ 2
Это расширение в компиляторе PIC, чтобы поместить переменную в определенную ячейку памяти. Никакой другой компилятор, который я знаю, не имеет этого расширения.
Ответ 3
Это расширение языка C, поддерживаемое компилятором PIC, которое позволяет назначать переменные определенным адресам RAM.
exemples:
char a @ 0x25; /* place A at address 0x25 */
bit b @ 0x25.3; /* place B at the third bit of address 0x25 */
Для этого есть три варианта:
- В встроенной системе у вас часто очень мало памяти и нужно упаковать несколько переменных в один и тот же байт. Этот синтаксис упрощает работу, хотя стандартное поле бит тоже будет работать.
- Другая причина заключается в том, что регистры PIC отображаются в ОЗУ, так что вы можете обращаться к ним, как и к любой другой ячейке памяти. С помощью этого синтаксиса вы можете определить синонимы для интересующих вас битов и использовать их как обычные переменные.
- Поместите свою собственную переменную (независимо от размера) в определенном месте. Это иногда полезно.
Помните, что встроенное программирование - это общий контроль аппаратного обеспечения.
Ответ 4
В дополнение к тому, что уже было сказано, обратите внимание, что нестандартный оператор @
является излишней функцией. Вы можете добиться точно такого же поведения со стандартом C:
#define RTCC (*(volatile uint8_t*)0x0001u)
Поскольку переменные в этом случае являются аппаратными регистрами, вам не нужно беспокоиться о распределении, они уже присутствуют в аппаратном обеспечении. Если вы хотите выделить переменную на пользовательском адресе, должен быть какой-то файл-линкера, чтобы исправить это (поскольку оператор @решает только определенное выделение для переменных, а не для кода).
Основная причина, по которой многие встроенные компиляторы придумывают некоторые нестандартные операторы, такие как @
, потому что они не могут мыслить вне коробки при разработке отладчика. Они ожидают, что какая-то переменная будет присутствовать в объектном файле, который подается в отладчик, но если вы используете #define, такого "отладочного информационного объекта" не выделяется.
Если отладчик вместо этого посмотрел на исходный код или, что еще лучше, был встроен в учетную запись MCU, тогда нестандартный код вроде этого не понадобился. Высококачественные инструменты от компаний, которые ориентированы исключительно на отладчики, всегда имеют встроенную поддержку просмотра карт регистров.
Ответ 5
Краткое расширение:
Это больше не работает, начиная с xc8 2.0 и выше. Теперь вам нужно было написать:
unsigned char a __at(0x025);
поместить переменную (a
) по абсолютному адресу (0x025
).
С XC8 2.0 можно скомпилировать ваш старый код с использованием синтаксиса @, если вы установите в настройках компилятора формат "C90". Настройка выглядит следующим образом: она находится в разделе "Глобальные параметры XC8" и называется "Стандарт C".