Как 8051 пространства памяти XDATA обрабатываются в указателях? - PullRequest
0 голосов
/ 05 марта 2020

Я разрабатываю для Cypress EZ-USB FX2LP, который содержит ядро ​​8051, и я использую SD CC для компиляции.

Я заметил, что могу (иногда?) Опускать аннотацию __xdata для указатели и моя прошивка все равно будут работать нормально даже при использовании указателя на область XDATA.

Например, он прекрасно скомпилируется и выполнится со следующим объявлением:

uint16_t crc16(const uint8_t *data, uint8_t len);

вместо

uint16_t crc16(__xdata const uint8_t *data, uint8_t len);

Из того, что я понял, XDATA имеет 16-битную адресацию, а DATA - 8-битную. Компилятор SD CC автоматически переводит указатели на 16-битные, когда они могут указывать на XDATA?

1 Ответ

1 голос
/ 10 марта 2020

Правильно, что указатели типа "generi c" не обязательно должны иметь такую ​​же битовую ширину, как и явные указатели "section". Но компиляторы обычно не продвигают указатели.

Как вы заметили в комментарии, ваш проект использует модель данных medium, которая выделяет переменные в разделе PDATA.

Раздел PDATA идентичен с разделом XDATA, касающимся аппаратного обеспечения, и ему нужен 16-битный адрес. Однако к нему обращаются 8-битные указатели (R0 и R1 на уровне процессора). Верхняя половина адреса происходит от SFR P2. В своей «нормальной» жизни P2 используется для хранения значения для порта 2. Но если вы подключите внешнюю память, порт P2 будет использоваться для старших битов, необходимых для адресации этой памяти, он мультиплексируется. Таким образом, SFR бесплатен для этого использования.

Примечание 1: AFAIR, вы даже можете разделить порт, используя менее 8 бит для адресной памяти и сохраняя оставшиеся биты в качестве битов порта, если Вы не используете внешнюю память КОДА. Если вы используете внешний код, весь порт P2 будет использоваться для вывода верхней половины счетчика программы. Убедитесь, что вы понимаете все последствия!

Начальное значение P2 равно 0xFF (для «все выводы являются входами»), но код запуска SD CC инициализирует его с 0x00. Таким образом, вы случайно получили первые 256 байтов во внешней памяти.

Для доступа к другим «страницам» (это «P» в PDATA, это означает «выгружаемые данные»), вы просто пишете их верхний адрес биты в P2 перед чтением или записью.

Примечание 2. Некоторые библиотечные функции могут быть достаточно умными, чтобы изменить P2, если они пересекают границу страницы. Перед использованием убедитесь, что это так!

...