2010-01-11 6 views
8

Я новичок в программировании встраиваемых систем. Я работаю над устройством, использующим чипсет 8051. Я заметил в примерах программы, что при определении переменных иногда используется ключевое слово xdata. как это ...Когда я использую xdata?

статический unsigned char xdata PatternSize;

в то время как другое ключевое слово xdata опущено.

Я понимаю, что ключевое слово xdata инструктирует компилятор, чтобы эта переменная хранилась во внешней, флеш-памяти.

В каких случаях я должен хранить переменные извне с помощью xdata? Доступ к этим переменным занимает больше времени, не так ли? Значения, хранящиеся с использованием xdata, не остаются после жесткого сброса устройства?

Кроме того, я понимаю, что ключевое слово static означает, что переменная будет сохраняться через каждый вызов функции, в которой она определена. Должны ли использоваться статические и xdata вместе?

+0

Какой компилятор вы используете – Gerhard

ответ

6

Архитектура 8051 имеет три отдельных адресных пространства, в основной ОЗУ используется 8-разрядный адрес, поэтому может быть до 256 байт, XDATA - это 16-битное адресное пространство (64 Кбайт) с возможностью чтения/записи, а программное пространство 16-битное адресное пространство с возможностью выполнения и возможностью чтения только для чтения.Из-за своего небольшого диапазона адресов и тесной связи с ядром, адресная оперативная память более эффективна с точки зрения кодового пространства и циклов доступа.

Исходное ядро ​​8051 имеет крошечную память на кристалле (адресное пространство 256 байт но некоторые варианты имели в два раза меньше, чем в реальной памяти), а XDATA относится к внебиржевой памяти данных (в отличие от программной памяти). Однако большинство современных устройств архитектуры 8051 имеют встроенную память XDATA и программную память.

Таким образом, вы можете использовать основную память, когда производительность критическая, и XDATA для больших объектов памяти. Однако компилятор должен в большинстве случаев принять это решение за вас (проверьте руководство вашего компилятора, он подробно опишет, как распределяется память). Набор инструкций позволяет эффективно реализовать стек в основной памяти, тогда как статические и динамически распределенные данные обычно более разумно распределяются в XDATA. Если у компилятора есть ключевое слово XDATA, то оно переопределит стратегию компилятора и должно использоваться только тогда, когда стратегия компилятора как-то терпит неудачу, поскольку это уменьшит переносимость кода.

[edit] Обратите внимание также, что основная память включает в себя 32-битный бит-адресуемый регион, инструкции адресации бит используют 8-битный адрес в этой области для прямого доступа к отдельным битам. Область существует в адресной памяти с 256 байтовым адресом, так что и бит, и адрес байта адресуются. [/ Edit]

1

Как и когда использовать область памяти xData зависит от архитектуры системы. Некоторые системы могут иметь ОЗУ по этому адресу, в то время как другие могут иметь ПЗУ или Flash. В любом случае доступ будет медленнее, чем доступ к внутренней памяти, ПЗУ или Flash.

Вообще говоря, крупные предметы, постоянные предметы и менее используемые предметы должны войти в xData. Нет стандартных правил относительно того, что происходит в xData, так как это зависит от архитектуры.

+0

Строго говоря, xdata только изменяет генерацию кода, чтобы испускать инструкции, которые попадают в 16-битное пространство данных. Является ли это оперативной памятью, ПЗУ или (NOR) вспышкой, не то, о чем компилятор заботится; очевидно, что разные устройства могут иметь смешанное адресное пространство, но все они являются «памятью xdata». –

1

8051 имеет 128-байтовый диапазон «псевдо-регистров» с нуля, которые (большинство) компиляторов используют по умолчанию для объявленных переменных. Но, очевидно, эта область очень мала, и вы хотите иметь возможность помещать переменные в 16-битное адресное пространство памяти. Вот что такое спецификатор xdata (т. Е. «Внешние данные»). От чего зависит, на что зависит, какие данные и как вы планируете использовать.

В принципе, я думаю, что это неправильный вопрос. Сначала вы должны понять свою архитектуру процессора, прежде чем научиться использовать специальные функции компилятора C518051.

5

xdata сообщает компилятору, что данные хранятся во внешней ОЗУ, поэтому он должен использовать другую инструкцию для чтения и записи этой памяти вместо внутренней памяти.

Доступ к внешним данным занимает больше времени. Обычно я помещаю переменные прерывания во внутреннюю память и большинство больших массивов во внешнюю ОЗУ.

Что касается состояния внешней ОЗУ после жесткого сброса (не цикла питания): это будет зависеть от настройки оборудования. Ли линия сброса идет на внешний чип? Также некоторые чипы поставляются с XDATA в чипе CPU. Прочтите это снова. Некоторые чипы имеют процессор 8051 плюс некоторое количество XDATA в IC.

статические и xdata не перекрываются. Static сообщает компилятору, как распределить переменную (в стеке или в ячейке памяти). Xdata сообщает компилятору, как добраться до этой переменной. Static также может ограничивать пространство имен этой переменной только этим файлом. У вас может быть статическая переменная xdata, которая является локальной только для функции, и имеет статическую переменную, которая является локальной для функции, но использует внутреннюю память.

2

Важным моментом, о котором еще не упоминалось, является то, что, поскольку разные разные команды используются для доступа к различным областям памяти, аппаратное обеспечение не имеет единого понятие «указатель». Любой адрес, который, как известно, находится в пространстве DATA/IDATA, может быть однозначно идентифицирован с однобайтовым указателем; аналогично любому адресу, который, как известно, находится в пространстве PDATA. Любой адрес, который, как известно, находится в пространстве CODE, может быть идентифицирован с двухбайтовым указателем; аналогично любому адресу, который, как известно, находится в пространстве XDATA. Однако во многих случаях такая процедура, как memcpy, не знает заранее, какое пространство памяти следует использовать с переданными указателями. Для этого компиляторы 8x51 обычно используют трехбайтовый тип указателя, который может использоваться для доступа к вещам в любом пространстве памяти (один байт выбирает, какой тип инструкций должен использоваться с указателем, а остальные байты содержат значение). Объявление указателя типа:

char *ptr; 

определит трехбайтовый указатель, который может указывать на любое пространство памяти. Изменение декларации

char xdata *data ptr; 

будет определять указатель на две-байтовый, который хранится в пространстве данных, но которая может указывать только на вещи в пространстве XDATA. Точно так же

char data * data ptr; 

будет определять указатель на две-байтовый, который хранится в пространстве данных, но которая может указывать только на вещи в DATA и IDATA пространствах. Код, который использует указатели, указывающие на известное пространство данных, будет намного быстрее (возможно, в десять раз), чем код, который использует трехбайтовые указатели общего назначения.

 Смежные вопросы

  • Нет связанных вопросов^_^