Почему каждый адрес в микроконтроллере имеет размер всего 8 бит?

18

Я видел, что в 32-битном микроконтроллере каждый адрес памяти содержит только 8 бит данных; то же самое относится и к 16-битному MC. Для 32-битных данных используется комбинация из 4 адресов. Почему нельзя сделать адрес для хранения 32-битных данных напрямую (32 или 16 бит вместо 8)?

Арун Джо Чериян
источник
2
Это зависит от шины данных микроконтроллера. Какой 32-битный микроконтроллер имеет байтовую память? У вас есть какой-нибудь пример?
Суонанд
4
Просто не соответствует действительности, что является причиной того, что языки программирования, такие как C и C ++, включают в себя возможность того, что байт будет больше 8 бит. Просто большинство работает лучше всего с 8-битными байтами, но есть 9-битные или 18-битные.
PlasmaHH
6
Это как конфеты. Они продолжают делать их меньше по той же цене.
Олин Латроп
4
Можно ли перефразировать этот вопрос "Почему все адреса выровнены по 8 битам"?
Флориан Кастеллан
2
@FlorianCastellane Это. Адреса имеют размер не 8 бит (если вы не можете найти устройство с <256 бит памяти, то они могут быть).
Джей Джей

Ответы:

11

По сути, это выбор дизайна, нет веской причины, почему так должно быть. В прежние времена, когда массовые товарные процессоры работали на 8-битных значениях, отображение было более последовательным 1: 1. Для обеспечения согласованности по мере того, как проекты эволюционировали до современных 32- и 64-разрядных процессоров, имело смысл сохранить прежнее отображение байтовой адресации даже при увеличении шин данных (с изменяющимся компромиссом стоимости реализации). Некоторые 32-битные микроконтроллеры могут по-прежнему реализовывать только 16-битные шины данных для некоторой памяти, высокопроизводительные процессоры будут иметь 256-битный или выше и могут загружать несколько регистров ядра в одной транзакции памяти. Широкие интерфейсы хороши для пакетных или потоковых операций.

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

Существуют также сценарии, в которых необходимо работать с данными с прямым порядком байтов, с прямым порядком байтов или со смешанным порядком байтов. Сейчас для этого часто существует специальная аппаратная поддержка, но опять-таки байтовая адресация памяти сделает этот тип операций более эффективным в некоторых сценариях.

Совсем недавно, что количество адресных битов в регистре было ограничивающим фактором для адресного пространства, поэтому потеря 15 битов на адреса байтов, а не 32-битных слов не была бы большой проблемой 10-15 лет назад (и теперь с 64-битными указателями, обычно для реализации байтовых адресов шириной 48 или 56). Вступительное преподавание информатики все еще немного застряло в эпоху мэйнфреймов, только что появившихся после поста, и не всегда четко рассматривает аспекты эволюции. Много терминологии вошло в употребление (и определение) в то время, когда низкозатратные высокозатратные архитектуры (в самом общем смысле) начали дополняться более ограниченными ресурсами и более ориентированными на товар процессорами.

Я не отвечал специально для MCU, архитектурные границы не так ясны, как вы могли бы предположить. Даже современный базовый дизайн MCU имеет хорошие шансы быть интегрированным с многоядерным серверным процессором или существовать как единственная точка в масштабируемом наборе продуктов; В любом случае последовательный подход к доступу к памяти выгоден конечному пользователю, которому необходимо написать или перенести код.

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

Шон Хулихейн
источник
2
Я думаю, что процессоры с более длинными размерами слов предшествовали 8-битным процессорам. 8-битный процессор был бы бесполезен без эффективного средства добавления двух многобайтовых чисел, а ранние процессоры не могли эффективно обрабатывать числа, превышающие одно машинное слово.
суперкат
1
Я работал с 8-битными процессорами достаточно, чтобы знать, что они могут легко добавлять многобайтовые числа, но не с помощью одной инструкции процессора. Сначала добавьте два младших байта и получите младший байт результата, а также отдельный бит переноса. Поскольку присутствует столько же других байтов, добавьте следующие входные байты и бит переноса с предыдущего шага, давая следующий выходной байт и следующий бит переноса. Когда не осталось входных байтов, преобразуйте последний бит переноса в еще один выходной байт.
user6030
@ user6030: разве не принято иметь инструкцию АЦП? Это делает AVR (8-разрядный RISC-микроконтроллер, поэтому gcc должен использовать ADC для intиlong ), как и x86, и ARM. Я предполагаю, что большинство 8-битных процессоров будет, поскольку на него будет даже больше спроса, чем в системе с более широкими регами. О, суперкат говорит, что в ранних процессорах не было эффективного АЦП?
Питер Кордес
Я думаю, что это правильная точка зрения относительно эволюции размера регистра (хотя мне не хватает данных)
Шон Хулихейн
25

Существует несколько DSP (например, TI C54x), которые не могут адресовать значения меньше 16 бит, а некоторые аудио DSP используют 24 бита. Однако 8-битные значения используются практически во всем коде общего назначения, поэтому все процессоры общего назначения поддерживают его.

И только то, что уменьшенная единица, используемая для адресов памяти, составляет 8-битные байты, не означает, что это будет самая большая единица, которая фактически используется на шине; большинство процессоров используют свой собственный размер слова (16/32 бита) или даже больший размер для адресации памяти, и при использовании байтового доступа автоматически извлекают байт из большего слова.

Например, шина PCI всегда использует 32-битные транзакции, но имеет сигналы разрешения байтов для доступа, которые должны быть меньше.

CL.
источник
Спасибо. есть ли в памяти MC, который больше байта, чем байта?
Арун Джо Чериян
4
Может быть, Intel 4004?
pjc50
6
@ArunCheriyan Примером процессора, который работал с клевами в качестве наименьшего адресуемого слова, является Saturn : процессор, разработанный HP и использовавшийся в их высококлассных калькуляторах еще в прошлом веке (в частности, известный HP48). У него была очень необычная архитектура (64-битные регистры, 4-битный ALU, 20-битные адреса, ...).
Дим
Другой пример: наименьшее адресуемое устройство для TMS320C3x от TI - 32-разрядное.
kkrambo
1
@ davidcary О, хорошо ... В любом случае, даты и время никогда не были моей сильной стороной. Спросите мою жену о ее подарках на день рождения, а моего босса о сроках ...
Дим
18

16-битному или 32-битному микроконтроллеру часто приходится манипулировать данными, ширина которых составляет всего 8 бит (байт). Например, текстовые строки обычно хранятся с одним символом на байт. Имея схему адресации памяти, которая позволяет адресовать каждый отдельный байт, микроконтроллер может эффективно обрабатывать данные шириной 8 бит. Это означает, что 32-разрядные данные обычно располагаются по адресам, кратным 4 байтам, например, 04, 08, 0C и т. Д. Но если память имеет 32-разрядную ширину, то микроконтроллер может считывать 32-разрядные данные за один цикл чтения. , В Micro часто есть машинные инструкции, которые могут работать с данными различной длины, поэтому вы обнаружите, что инструкция перемещения данных (MOV) может иметь 3 формы: MOV.B, MOV.W и MOV.L для перемещения 8, 16 и 32 битов. данные в одной инструкции.

Стив Г
источник
7

Основной ответ «потому что это, как долго байт». С большой установленной массой кода, которая делает это предположение, нарушение его вызовет всевозможные проблемы.

В прежние времена не было установленного кода. Процессоры часто используют всевозможные странные архитектуры, как показывают другие ответы. К тому времени, когда вышли 16-битные процессоры, было достаточно кода, предполагающего наличие 8-битных данных, которое, если его не упростить, стало бы настоящим препятствием для принятия.

Наличие одного 32-битного слова на адрес не дает никаких недостатков в скорости памяти. В 32-разрядной системе младшие 2 бита адреса часто не попадают в память. Процессор обычно читает все 32-битное слово и выбирает (или маскирует) 8-битный байт, который ему нужен в этом слове. Если ваше адресное пространство может хранить достаточно данных (ограничено 2 ^ 32 байтами в 32-битной системе), то не стоит беспокоиться. На самом деле, на многих 16-битных / 32-битных процессорах обработка с байтовыми значениями занимает больше времени, чем со значениями длины собственного слова - чтение 32-битного слова и отбрасывание части этого слова явно потребуют дополнительной операции, по сравнению только с чтением 32-битного слова.

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

Грэхем
источник
3
В самом деле. И тогда возникает дополнительный вопрос, может ли процессор обрабатывать два разных доступа, необходимых для автоматической загрузки или сохранения невыровненного 32-битного значения в аппаратном обеспечении, или если это должно быть явно обработано в программном обеспечении.
Крис Страттон
5

Это то, что называется наличием байтовой адресуемой памяти. Обычно это хорошо, если у вас не хватает адресного пространства (например, 4 ГБ с 32-разрядными указателями, вместо 16 ГБ с 32-разрядными указателями, где каждый адрес является отдельным 32-разрядным словом).

Питер Кордес
источник
Обратите внимание, что адресное пространство может выйти за такие пределы, если вы разделите адреса на части, которые будут помещаться в один регистр каждая. Когда-то у меня было несколько 8-битных компьютеров, которые занимали 64 КБ памяти, разделив адреса на две части, хранящиеся в отдельных регистрах, и увидели рекламу компьютеров также с 8-битными процессорами, которые могли достигать 1 МБ памяти, разделив адреса на три части. частей.
user6030
AVR (8-битный микроконтроллер RISC) делает это: три пары из 32 8-битных регистров общего назначения могут быть разыменованы как 16-битный указатель. Также есть возможность объединить это с другим 8-битным сегментом для получения 24-битных адресов.
Питер Кордес
4

32-разрядные ЦСП Analog Devices Shark имеют 32-разрядную наименьшую единицу адресуемой памяти, поэтому sizeof (int) == sizeof (short) == sizeof (char) == 1 (Да, у них 32-разрядные символы, что вполне допустимо в соответствии с стандарт С).

Кроме того, такие вещи, как int_8, int_16 и тому подобное, не определены, что является неприятным сюрпризом при переносе кода с других платформ.

Дэн Миллс
источник
1

Размер адресуемой памяти по сути является компромиссом между объемом памяти, который вы можете адресовать, и объемом используемой памяти.

Адресная память . Рассмотрим 32-битный процессор: если вы адресуете байты, вы можете адресовать до 4 ГБ памяти. Если вы адресуете отдельные биты, эта сумма будет уменьшена до 512 МБ, а если вы адресуете 32-битные слова, у вас будет 16 ГБ. (ваш вопрос, кажется, подсказывает последнее).

Впустую память . Если у вас есть переменная, которая может быть представлена ​​с помощью битов X, и вы можете выделить для нее только единицы по N битов, вы в среднем будете тратить (N-1) / 2 бита, предполагая X> N. Если вы обращаетесь к отдельным битам , вы будете использовать память со 100% эффективностью (по крайней мере, с точки зрения адресации). С байтами вы будете тратить 3,5 бит на переменную (эффективность 56%), а с 32-битными словами вы будете терять 15,5 бит (эффективность 52%). Но это ухудшается: если большинство ваших переменных маленькие (например, символы, логические значения, флаги состояния), вы в конечном итоге будете тратить большую часть памяти, если ваши адресуемые блоки слишком велики.

Например, предположим, что средний размер переменной составляет 8 бит.

  • на компьютере с битовой адресацией вы сможете выделить с 100% эффективностью, что даст вам 512*1024*1024*100%= 0,54 миллиарда переменных.
  • на компьютере с байтовой адресацией вы выделите с эффективностью 56%, что даст вам 4096*1024*1024*56%= 2,4 миллиарда переменных. Это почти в 5 раз больше по сравнению с бит-адресуемым компьютером! Конечно, вам нужно будет купить в 8 раз больше памяти.
  • на 32-битном адресуемом компьютере, поскольку хотя бы половина ваших переменных будет занимать менее 8 бит, они будут распределены с эффективностью ниже 7% (с использованием 4,5 бит из 32). В любом случае, вы не получите более 4,3 миллиарда переменных (поскольку у вас есть только столько разных адресов), и меньше, чем в реальности. Я полагаю, что, избегая сложных вычислений, получит на 20-30% больше полезной памяти по сравнению с байтово-адресуемым компьютером, заплатив в 4 раза больше за оперативную память.
Дмитрий Григорьев
источник
1

Наверное, уже говорили разные способы в других ответах. В целом сегодня, но не обязательно исторически, байт равен 8 битам. Большую часть времени мы имеем дело с «байтовой адресуемой памятью», то есть САМЫЙ МАЛЕНЬКИЙ предмет, к которому мы можем получить доступ с одного адреса, это байт. Но это не значит, что это ЕДИНСТВЕННАЯ вещь, к которой мы можем обратиться. В зависимости от платформы для доступа к байту, полуслову / слову (16 битов), слову / двойному слову (32 бита) и т. Д. По 64 битам можно использовать один адрес. Инструкция в основном определяет размер желаемого доступа (8, 16, 32, 64 и т. Д.) Обычно в этих блоках 8, 16, 32, 64. Но это не сложно и быстро, «это зависит».

Также в зависимости от конструкции процессора и / или системы нет оснований предполагать, что размер доступа равен размеру памяти или размеру наименьшего доступа. При больших и больших требованиях становится все меньше смысла со временем внедрять систему памяти, используя наименьший размер, компьютер, на котором вы читаете это, вероятно, использует шину данных 32-битной ширины или шину данных 64-битной ширины для всех обращений. Если вы хотите прочитать один байт, он выполняет 64-битное чтение и отбрасывает остальные биты, поэтому он не стоит ничего лишнего, оставляя шину настолько широкой вплоть до ядра процессора, и процессор выбирает правильную полосу байтов. стоит больше логики и / или тактов, чтобы сделать шину более узкой или переместить байты в байтовых дорожках (иногда это делается). таким образом, внутренняя память в микроконтроллере может иметь ширину 32 бита, например, если это имеет смысл для системы. может быть 16. Да, для записи вы записываете больше циклов, вы должны прочитать-изменить-записать где-нибудь вдоль строки. Хотите записать один байт на вашем компьютере, где-то происходит 64-битное чтение, а затем где-то один байт из этих 64 битов изменяется, в зависимости от того, что вы делаете после этого, эти 64 бита могут возвращаться для воспроизведения только с этими 8 битами в отличие от того, что было раньше, кэширование и ваш код делают это не общим правилом. Операции записи запускаются и забывают, однако, контроллер памяти может собирать адрес и данные от процессора и позволить процессору продолжать работу, пока он в конечном итоге выполняет часы, сохраняющие запись, возможно, большее количество часов, которые записываются при чтении-изменении-записи (если уже в кеше),

Даже сегодня есть исключения из всего этого, возможно, есть инструкции или типы доступа в некоторых системах, которые являются адресно-битными, есть некоторые системы, где адрес находится в единицах чего-то, отличного от байта. Байт не всегда был 8-битным, и, может быть, все еще работают системы, и это правда (мы привыкли использовать восьмеричное и 9-битное 18-битное или 36-битное слово, что имеет большой смысл для программистов и разработчиков микросхем, которые думают, что восьмеричное, 8 бит имеет большой смысл для шестнадцатеричных мыслителей).

Теперь компьютер, на котором вы читаете это, даже если шина данных для этого контроллера драмы может иметь ширину 32 или 64 бита, сам фактический модуль драм, вероятно, состоит из нескольких частей шириной 8 бит, которые вы можете легко увидеть. Если он имеет 8 или 9 микросхем на одной стороне, то, вероятно, это шина шириной 64 или 72 бита (64 бита плюс 8 бит ECC), реализованная с частями шириной 8 бит. Если у вас есть 4 или 5 микросхем на одной стороне модуля, но при этом все еще имеется тонна выводов, то это либо 32-битная ширина (маловероятно в наши дни), либо 4 из 16-битных, а если есть 5-я, это может быть 16 бит в ширину и только 8 используются или это 8-битная часть. Также есть 32-битные детали, но 8-битная - самая распространенная. Очень распространенная практика, уходящая далеко назад.

Нам нужно знать, что такое микроконтроллер. Поскольку вы упоминаете 32-битную версию, вполне вероятно (без подробной информации, хотя мы не можем сказать), что память внутри этой части имеет ширину 32 бита, и все обращения к ней имеют ширину 32 бита. инструкции, скорее всего, определят, чего хочет программа, которая, вероятно, предлагает 8-битный, 16-битный и 32-битный тип доступа, меньшие при записи потребуют где-то чтение-изменение-запись, читает, вы просто игнорируете байтовые дорожки. То же самое относится и к флэш-памяти, хотя флэш-записи являются другой темой. Но внутренняя флэш-память, скорее всего, имеет ширину 32 бита, и все операции чтения выполняются в единицах по 32 бита. Хотя внешняя вспышка - это другая история, скорее всего, они имеют ширину в один бит (spi или i2c), хотя части spi могут иногда поддерживать 1, 2 или 4 бита, но один вывод мисо является наиболее распространенным. Внутренне они организованы в единицах байтов, может быть шириной 8 бит или 16 или 32, или кто знает, вы все же смещаете и адресуете их в единицах байтов. с помощью spi вы можете перемещаться в любом месте между одним байтом и всей памятью за одну транзакцию, в зависимости от конструкции части флэш-памяти.

Старожил
источник
0

Вы можете также получить 1-битные процессоры!

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

8, конечно, является степенью двойного числа. У нас есть история, чтобы поблагодарить за повсеместное использование 8 бит - и COST / способность технологии. Долгое время правила 8 битов, частично из-за того, что ширина шин и сложность в создании регистров (и ОЗУ) более 8 бит (нет смысла в 16-битных данных, если все ваши регистры 8-битные). 8 битов довольно изящны и имеют большой смысл в шестнадцатеричном формате. 8 бит могут содержать ваш алфавит, цифры, символы рисования и управления (ASCII), или от 0 до 255, или + -127. Доступ к более чем 256 байтам данных (8-битная адресная шина) легко осуществить с помощью пейджинга. Выберите страницу, затем байт, например. 256 страниц из 256 возвращает вас к 64K (65536). Обычно ноль страницы - это блокнот, поскольку доступ к нему будет более быстрым, поскольку для этого не потребуется настраивать страницу. Мой первый компьютер имел статическую оперативную память размером 1 x 8 бит! (динамическая оперативная память была дешевле, но нужно больше оборудования, чтобы обновить его). С помощью нескольких флагов (c, nc, z, nz), сложения, вычитания, поворота влево и вправо вы можете сделать довольно сложную математику на 8-битной машине. Вам не нужна арифметическая единица с плавающей точкой! Не супер быстро, но выполнимо! Многие ранние процессоры могут быть одношаговыми и использоваться с простой статической оперативной памятью, что делает отладку действительно простой; добавив несколько восьмеричных буферов и ранних красных светодиодов, вы можете наблюдать за изменением адреса и шин данных :)

aDub
источник