Когда я использую xdata? - PullRequest
8 голосов
/ 11 января 2010

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

статический символ без знака xdata PatternSize;

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

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

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

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

Ответы [ 5 ]

7 голосов
/ 13 января 2010

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

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

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

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

5 голосов
/ 11 января 2010

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

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

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

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

3 голосов
/ 06 июня 2013

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

char *ptr;

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

char xdata *data ptr;

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

char data * data ptr;

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

1 голос
/ 11 января 2010

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

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

1 голос
/ 11 января 2010

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

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

...