Я читаю якийсь код C і натрапив на цю декларацію в програмі:
unsigned char serv_ctr @0x0002;
Хтось може вказати мені на документацію чи пояснити, що таке "@ 0x0002" у компіляторі Mplab XC8 v1.35 C?
Я читаю якийсь код C і натрапив на цю декларацію в програмі:
unsigned char serv_ctr @0x0002;
Хтось може вказати мені на документацію чи пояснити, що таке "@ 0x0002" у компіляторі Mplab XC8 v1.35 C?
Відповіді:
Це означає, щоб вказати абсолютну адресу, на яку розміщувати змінну.
З посібника з компілятора XC8, сторінка 27, розділ 2.5.2 Абсолютна адресація :
Змінні та функції можна розмістити за абсолютною адресою, використовуючи
__at()
конструкцію
......
2.5.2.2 РІЗНИКИ
8-бітні компілятори використовували символ @ для визначення абсолютної адреси
@
є загальним нестандартним розширенням до мови С, що дозволяє оголосити змінну за певною адресою. Він може бути використаний для картографічних апаратних регістрів, відображених на пам'ять тощо. У цьому випадку змінна також повинна бути оголошена volatile
, тому ваш приклад є невірним.
Інші компілятори використовують щось подібне __attribute__(section...
або #pragma ...
, все це нестандартне С.
Єдина раціональна причина (якщо така є), чому ланцюги інструментів роблять це, - це включити налагодження реєстру на скажених налагоджувачах. Нестандартний синтаксис гарантуватиме, що регістр стане частиною вихідних даних і інформації про налагодження. Що в свою чергу дозволяє переглядати реєстр у скаженому відладчику так само, як ви можете дивитися будь-яку іншу змінну.
Якщо у вас хороший налагоджувач, він матиме підтримку та обізнаність про ваш конкретний MCU. Тоді вам не потрібно нестандартне лайно в коді С, але ви можете замість цього написати чистий портативний стандарт C:
#define serv_ctr ( *(volatile uint8_t*)0x0002u )
@
цільові платформи для позначення з кількома просторами пам’яті чи іншими проблемами, так що більшість речей, оголошених за допомогою @
нотацій, поводитимуться інакше, ніж усе, що можна зробити без розширень.
Коротке розширення:
Це більше не працює з xc8 2.0 і вище. Тепер вам довелося написати:
unsigned char serv_ctr __at(0x0002);
ставити змінну ( serv_ctr
) за абсолютною адресою ( 0x0002
).
З XC8 2.0 можна зібрати ваш старий код за допомогою @
синтаксису, якщо ви встановите параметри компілятора для використання у форматі "C90". Налаштування виглядає приблизно так, воно знаходиться в розділі "XC8 Global Options" і називається "стандарт C".
@
теж підтримують синтаксис, не лише Mplab.