Что такое «неподписанный символ рядом»?

12

Я прочитал таблицу данных и нашел переменную, определенную как unsigned char near Sample_X. Что это такое и чем оно отличается unsigned char Sample_X?

OPPO
источник
3
возможно, позволяет компилятору использовать небольшие относительные смещения?
Neil_UK
6
Основываясь на частичном опыте с x86 в DOS, я ожидал бы этого с некоторым типом указателя и в 16-битной среде. Однако то, что указано в OP, не похоже на указатель, а ссылка на таблицу данных подразумевает некоторый MCU. Выполните поиск по ключевому слову «рядом» по следующим двум ссылкам: microchip.com/forums/m549709.aspx barrgroup.com/Embedded-Systems/How-To/Efficient-C-Code
1818 г.
3
Следует отметить, что это расширение компилятора, а не стандартное C
PlasmaHH
Это может быть о СКК. Учитывая, что код в основном предназначен для MCU, он может быть косвенным предложением для компоновщика при поддержке компилятора для размещения его в CCM (ядро с привязкой к памяти), если оно доступно.
Айхан
1
Ключевое слово FYI near- пример спецификатора класса хранилища . Он сообщает компилятору о том, как или где должно быть выделено хранилище для переменной. (См. Ответ Фило ниже, чтобы узнать больше near).
Соломон Медленный

Ответы:

20

MCU, указанный здесь, представляет собой серию Freescale MC9C08 , в которой используется слегка улучшенная версия их архитектуры HC08. Это 8-битное ядро, которое (как и многие другие) имеет более короткие инструкции и более быстрый доступ к адресам «нулевой страницы», чем другие. Адреса нулевых страниц имеют длину всего 8 бит вместо 16 бит, поэтому ссылки на них могут составлять 2 байта вместо 3, и в результате на выполнение уходит на 1 цикл меньше .

Ключевое слово «near» указывает компилятору поместить переменную в «нулевую страницу», если это возможно, для лучшей производительности. Компиляторы, специально написанные для разработки встраиваемых систем, такие как этот , обычно реализуют такие расширения языка (здесь описывается как «Поддержка C для нулевой страницы»).

Chromatix
источник
Мне нравится этот ответ, но есть ли у вас источник вашей информации?
Clonkex
1
Я отредактировал ответ, чтобы предоставить больше деталей и ссылок. На самом деле это новая архитектура Freescale HCS08, но она совместима по коду со старыми архитектурами HC08 и HC05. Архитектуры 6800 и 6502 (ныне положительно древние) также тесно связаны.
Chromatix
Хорошо, намного лучше!
Clonkex
Таким образом, его использование очень похоже на registerключевое слово (для случаев, когда вы действительно уверены, что именно здесь вам нужна оптимизация), но немного менее экстремально?
vsz
Более или менее. Разница в основном связана с тем, что 8-разрядные процессоры, как правило, сами по себе не имеют банка регистров, только один аккумулятор и несколько регистров индекса. Но это также аналогично использованию указателей «ближний» и «дальний» в x86, поскольку существует разница в размере адреса и времени, необходимом для завершения доступа.
Chromatix
15

В зависимости от архитектуры ЦП могут быть разные инструкции для доступа к данным по разным адресам. Вот пример из Keil для одного из их компиляторов.

Ближайший доступ имеет определенный предел памяти, поэтому вы можете дать указание компилятору разместить некоторые часто используемые переменные в области, доступной с помощью более коротких инструкций (очевидно, описание доступа к 32-разрядному адресному пространству превышает 16-разрядный адрес Космос). Это может привести к уменьшению / ускорению кода.

фило
источник
7
Там больше информации в чем разница между дальними и ближними указателями?
Эндрю Мортон
5
@AndrewMorton: Этот вопрос относится к farи nearуказателям на основной устаревшую 8086 архитектуры. Одни и те же ключевые слова используются в связанном, но разном виде на 8-битных микроконтроллерах.
суперкат
@supercat Вопрос обычно задается, хотя ответы сосредоточены на старой архитектуре. Кто-то знающий должен написать на нем ответ, объясняющий, как они используются для 8-битных микроконтроллеров.
curiousdannii
@curiousdannii: рассматриваемый код был написан для 8-битного микро.
суперкат