Правильно, что указатели типа "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
, если они пересекают границу страницы. Перед использованием убедитесь, что это так!