Змінна декларація з @ в С


11

Я читаю якийсь код C і натрапив на цю декларацію в програмі:

unsigned char serv_ctr @0x0002;

Хтось може вказати мені на документацію чи пояснити, що таке "@ 0x0002" у компіляторі Mplab XC8 v1.35 C?


14
Я б здогадався, що це розширення компілятора для розміщення змінної за певною адресою.
Євген Ш.

2
питання може принести користь тегу #mplab тоді, оскільки виявляється, це специфічно для Mplab.
sylvainulg

Тільки для того, щоб зрозуміти: це на темі на цьому сайті? Я б подумав, що це належить ТАК. Або добре запитати тут програмування мікроконтролерів. Це зробило б трохи незрозумілим, де мають бути ці питання.
Прощай SE

6
@KamiKaze Про які теми я можу запитати тут? перераховує "написання прошивки для голих металів або додатків RTOS" як на тему, а "Програмування програмного забезпечення для ПК" як поза темою. Оскільки це, мабуть, стосується програмування вбудованих систем, це, на перший погляд, може бути темою. Це може також бути в темі на переповнення стека НЕ само по собі робить його тему тут.
CVn

@KamiKaze спасибі за запитання, у мене були подібні запитання (я не є звичайним користувачем цього ДП)
GPPK

Відповіді:


20

Це означає, щоб вказати абсолютну адресу, на яку розміщувати змінну.
З посібника з компілятора XC8, сторінка 27, розділ 2.5.2 Абсолютна адресація :

Змінні та функції можна розмістити за абсолютною адресою, використовуючи __at()конструкцію
......
2.5.2.2 РІЗНИКИ
8-бітні компілятори використовували символ @ для визначення абсолютної адреси


6

@є загальним нестандартним розширенням до мови С, що дозволяє оголосити змінну за певною адресою. Він може бути використаний для картографічних апаратних регістрів, відображених на пам'ять тощо. У цьому випадку змінна також повинна бути оголошена volatile, тому ваш приклад є невірним.

Інші компілятори використовують щось подібне __attribute__(section...або #pragma ..., все це нестандартне С.

Єдина раціональна причина (якщо така є), чому ланцюги інструментів роблять це, - це включити налагодження реєстру на скажених налагоджувачах. Нестандартний синтаксис гарантуватиме, що регістр стане частиною вихідних даних і інформації про налагодження. Що в свою чергу дозволяє переглядати реєстр у скаженому відладчику так само, як ви можете дивитися будь-яку іншу змінну.

Якщо у вас хороший налагоджувач, він матиме підтримку та обізнаність про ваш конкретний MCU. Тоді вам не потрібно нестандартне лайно в коді С, але ви можете замість цього написати чистий портативний стандарт C:

#define serv_ctr ( *(volatile uint8_t*)0x0002u )

1
У той час як компілятори зобов'язані приймати останню форму, у реалізаціях дозволяється зіставляти номери за адресами будь-яким способом, який вони вважають за потрібне. Крім того, більшість компіляторів, яких я бачив, використовують @цільові платформи для позначення з кількома просторами пам’яті чи іншими проблемами, так що більшість речей, оголошених за допомогою @нотацій, поводитимуться інакше, ніж усе, що можна зробити без розширень.
Supercat

1

Коротке розширення:

Це більше не працює з xc8 2.0 і вище. Тепер вам довелося написати:

unsigned char serv_ctr __at(0x0002);

ставити змінну ( serv_ctr) за абсолютною адресою ( 0x0002).

З XC8 2.0 можна зібрати ваш старий код за допомогою @синтаксису, якщо ви встановите параметри компілятора для використання у форматі "C90". Налаштування виглядає приблизно так, воно знаходиться в розділі "XC8 Global Options" і називається "стандарт C".


Багато інших компіляторів вбудованих систем @теж підтримують синтаксис, не лише Mplab.
Лундін
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.