Подтвердить что ты не робот

@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. Может кто-нибудь, пожалуйста, помогите мне? Я просто новичок в этом.

4b9b3361

Ответ 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".