2016-12-05 11 views
1

Мы знаем, что размер указателя зависит от адресной шины, так какой будет размер указателя на 8-битном микроконтроллере, таком как 8051?Каким будет размер указателя на 8-битном микроконтроллере, таком как 8051?

+3

Это зависит от того, какой компилятор, какую команду компиляции вы используете, и какую архитектуру ОС вы нацеливаете. Кроме того, размер указателя либо 32-разрядный, либо 64-разрядный, зависит от того, что я упомянул, и не зависит от того, что вы упомянули. – DMaster

+3

8051 имеет 16-разрядную адресную шину и 16-разрядный регистр указателей, называемый «DPTR». –

+3

@DMaster Нет, это действительно не так. Указатели всегда будут иметь 16 бит в любой реализации 8051. Прочтите вопрос, может быть. – Lundin

ответ

1

Для совместимого компилятора C требуется SIZE_MAX, чтобы быть как минимум 65535 (0xFFFF). Это означает, что указатель объекта должен быть не менее 16 бит.

Учитывая архитектуру 8051, она вряд ли имеет более широкий указатель, но может. Это зависит от компилятора и больше, чем от процессора, а от целевой платформы с ее памятью. Расширенное семейство 8051 включает 32-разрядные машины.

Обратите внимание, что указатель на объект и указатель функции могут иметь разную ширину.

+1

Указатель не должен иметь тот же размер, что и 'size_t'. На самом деле, это причина '(u) intptr_t'. Нет никакой связи между шириной указателя и шириной целого числа, что '(u) intptr_t' достаточно велико ** **. – Olaf

+0

«Указатель не должен иметь тот же размер, что и size_t», но здесь не имеет значения, так как этот ответ утверждает, что указатель объекта нуждается в _least_ размером 'size_t'. – chux

+0

Это было точно мое утверждение, что это утверждение ложно. Указатель очень хорошо может быть меньше, чем 'size_t'. – Olaf

1

Пределы, налагаемые stdint.h, содержат константы INTPTR_MIN/INTPTR_MAX как в автономных, так и в размещенных реализациях (4. Conformance, ISO/IEC 9899:).

От 7.18 Integer types <stdint.h>

7.18.2.4 Limits of integer types capable of holding object pointers 
— minimum value of pointer-holding signed integer type 
INTPTR_MIN       −(2^15 − 1) 
— maximum value of pointer-holding signed integer type 
INTPTR_MAX       2^15 − 1 
— maximum value of pointer-holding unsigned integer type 
UINTPTR_MAX       2^16 − 1 

Если у вас есть экзотический процессор, который имеет адресную шину из 8 вы не можете реализовать C на него, но, конечно, такой процессор не существует.

Если у вас есть процессор с шириной шины 16 и шиной данных 3 бита, вы можете реализовать типы данных, налагаемые абстрактной машиной C, но используя множество выборок для каждой операции.

Кроме того, на экзотических архитектурах это не является прямым соответствием (изоморфизмом) между битами абстрактной машины С и физическими проводами. Некоторые провода не могут использоваться, другие провода могут содержать коды коррекции, другие провода могут генерировать ловушку. На таких архитектурах сложнее делать реализации C.

+3

Но компиляторы C для 8051 редко согласуются - так было бы не воспользоваться своей архитектурой или быть сочувствующим ее серьезным ограничениям. 8051 использует архитектуру Гарварда с отдельным кодом, внешними данными, внутренними данными и бит-адресной областью наложения. Объем IDATA составляет 256 байт (и бит бит 256 бит); компилятор действительно будет генерировать 8-битные указатели для этих пространств - можно использовать более «избыточные» биты, чтобы быть совместимыми, но с учетом недостатков такого подхода это было бы маловероятным решением. – Clifford

5

8051 не является дружественным процессором.

У него есть несколько адресных пространств. Я использовал компилятор Keil 8051 и имел несколько типов указателей.

  • 8-разрядный указатель на внутреннюю память или внутреннее косвенное пространство.
  • 16-разрядный указатель, указывающий на внешнее поле или кодовое пространство.
  • «Умный» 24-разрядный указатель, который может указывать в любом месте. В основном тег, за которым следуют 16 бит.

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

Умные указатели, которых следует избегать, потому что они были большими и медленными.

+0

Привет, вы когда-нибудь видели процессор с шиной на N проводах, где компилятор C не реализует C-абстрактную машину, используя все N физически проводные, а некоторые из N проводов шины являются фиктивными во время выполнения программы C ? – alinsoar

+1

На самом деле да, 8051. Это не проблема «С». Это вопрос 8051. Учитывая хороший 16-разрядный указатель на XDATA, для этого указателя нет значений, которые будут обращаться к пространству DATA или IDATA или CODE. Вам нужны разные типы указателей для этого или так называемый медленный, большой, умный указатель. Чтобы понять это, вам нужно глубоко погрузиться в 8051. Это оставлено как упражнение для читателя ;-) –

+0

Размеры указателя разворота на те же типы объектов в сравнении со стандартом. Таким образом, в основном «умный указатель» будет единственным совместимым типом указателя (со всеми подразумеваемыми препятствиями). Но я согласен, что это одна из худших архитектур, когда речь идет о языках высокого уровня, и без нестандартных расширений следует рассматривать либо другую архитектуру, либо использовать хороший язык Assembly. Я предпочитаю первый вариант; 8051 устарел с 20 лет (архитектура была со дня ее презентации, только оправдана компактностью и ценой и никогда не предназначалась для HLL). – Olaf