Я видел, что в 32-битном микроконтроллере каждый адрес памяти содержит только 8 бит данных; то же самое относится и к 16-битному MC. Для 32-битных данных используется комбинация из 4 адресов. Почему нельзя сделать адрес для хранения 32-битных данных напрямую (32 или 16 бит вместо 8)?
microcontroller
flash-memories
Арун Джо Чериян
источник
источник
Ответы:
По сути, это выбор дизайна, нет веской причины, почему так должно быть. В прежние времена, когда массовые товарные процессоры работали на 8-битных значениях, отображение было более последовательным 1: 1. Для обеспечения согласованности по мере того, как проекты эволюционировали до современных 32- и 64-разрядных процессоров, имело смысл сохранить прежнее отображение байтовой адресации даже при увеличении шин данных (с изменяющимся компромиссом стоимости реализации). Некоторые 32-битные микроконтроллеры могут по-прежнему реализовывать только 16-битные шины данных для некоторой памяти, высокопроизводительные процессоры будут иметь 256-битный или выше и могут загружать несколько регистров ядра в одной транзакции памяти. Широкие интерфейсы хороши для пакетных или потоковых операций.
Небольшой размер адресуемой памяти полезен не только в случае обработки байтовых значений в коде, но и для работы со структурами в памяти, такими как пакеты Ethernet, где необходимо считывать или изменять конкретные байты. Часто такого рода операции должны быть в состоянии выполнять небольшие операции, но очень эффективно.
Существуют также сценарии, в которых необходимо работать с данными с прямым порядком байтов, с прямым порядком байтов или со смешанным порядком байтов. Сейчас для этого часто существует специальная аппаратная поддержка, но опять-таки байтовая адресация памяти сделает этот тип операций более эффективным в некоторых сценариях.
Совсем недавно, что количество адресных битов в регистре было ограничивающим фактором для адресного пространства, поэтому потеря 15 битов на адреса байтов, а не 32-битных слов не была бы большой проблемой 10-15 лет назад (и теперь с 64-битными указателями, обычно для реализации байтовых адресов шириной 48 или 56). Вступительное преподавание информатики все еще немного застряло в эпоху мэйнфреймов, только что появившихся после поста, и не всегда четко рассматривает аспекты эволюции. Много терминологии вошло в употребление (и определение) в то время, когда низкозатратные высокозатратные архитектуры (в самом общем смысле) начали дополняться более ограниченными ресурсами и более ориентированными на товар процессорами.
Я не отвечал специально для MCU, архитектурные границы не так ясны, как вы могли бы предположить. Даже современный базовый дизайн MCU имеет хорошие шансы быть интегрированным с многоядерным серверным процессором или существовать как единственная точка в масштабируемом наборе продуктов; В любом случае последовательный подход к доступу к памяти выгоден конечному пользователю, которому необходимо написать или перенести код.
Я задал вопрос на ретрокомпьютерной SE о размерах регистров, чтобы рассмотреть исторические аспекты этого вопроса.
источник
int
иlong
), как и x86, и ARM. Я предполагаю, что большинство 8-битных процессоров будет, поскольку на него будет даже больше спроса, чем в системе с более широкими регами. О, суперкат говорит, что в ранних процессорах не было эффективного АЦП?Существует несколько DSP (например, TI C54x), которые не могут адресовать значения меньше 16 бит, а некоторые аудио DSP используют 24 бита. Однако 8-битные значения используются практически во всем коде общего назначения, поэтому все процессоры общего назначения поддерживают его.
И только то, что уменьшенная единица, используемая для адресов памяти, составляет 8-битные байты, не означает, что это будет самая большая единица, которая фактически используется на шине; большинство процессоров используют свой собственный размер слова (16/32 бита) или даже больший размер для адресации памяти, и при использовании байтового доступа автоматически извлекают байт из большего слова.
Например, шина PCI всегда использует 32-битные транзакции, но имеет сигналы разрешения байтов для доступа, которые должны быть меньше.
источник
16-битному или 32-битному микроконтроллеру часто приходится манипулировать данными, ширина которых составляет всего 8 бит (байт). Например, текстовые строки обычно хранятся с одним символом на байт. Имея схему адресации памяти, которая позволяет адресовать каждый отдельный байт, микроконтроллер может эффективно обрабатывать данные шириной 8 бит. Это означает, что 32-разрядные данные обычно располагаются по адресам, кратным 4 байтам, например, 04, 08, 0C и т. Д. Но если память имеет 32-разрядную ширину, то микроконтроллер может считывать 32-разрядные данные за один цикл чтения. , В Micro часто есть машинные инструкции, которые могут работать с данными различной длины, поэтому вы обнаружите, что инструкция перемещения данных (MOV) может иметь 3 формы: MOV.B, MOV.W и MOV.L для перемещения 8, 16 и 32 битов. данные в одной инструкции.
источник
Основной ответ «потому что это, как долго байт». С большой установленной массой кода, которая делает это предположение, нарушение его вызовет всевозможные проблемы.
В прежние времена не было установленного кода. Процессоры часто используют всевозможные странные архитектуры, как показывают другие ответы. К тому времени, когда вышли 16-битные процессоры, было достаточно кода, предполагающего наличие 8-битных данных, которое, если его не упростить, стало бы настоящим препятствием для принятия.
Наличие одного 32-битного слова на адрес не дает никаких недостатков в скорости памяти. В 32-разрядной системе младшие 2 бита адреса часто не попадают в память. Процессор обычно читает все 32-битное слово и выбирает (или маскирует) 8-битный байт, который ему нужен в этом слове. Если ваше адресное пространство может хранить достаточно данных (ограничено 2 ^ 32 байтами в 32-битной системе), то не стоит беспокоиться. На самом деле, на многих 16-битных / 32-битных процессорах обработка с байтовыми значениями занимает больше времени, чем со значениями длины собственного слова - чтение 32-битного слова и отбрасывание части этого слова явно потребуют дополнительной операции, по сравнению только с чтением 32-битного слова.
И наоборот, если у вас есть система, в которой вам необходимо эффективно использовать память, вам необходимо иметь доступ к отдельным байтам. Если вы не можете, у вас закончится память. Имея это в виду, возможность ссылаться на отдельные байты явно необходима, поэтому имеет смысл разделить вашу память на байты.
источник
Это то, что называется наличием байтовой адресуемой памяти. Обычно это хорошо, если у вас не хватает адресного пространства (например, 4 ГБ с 32-разрядными указателями, вместо 16 ГБ с 32-разрядными указателями, где каждый адрес является отдельным 32-разрядным словом).
источник
32-разрядные ЦСП Analog Devices Shark имеют 32-разрядную наименьшую единицу адресуемой памяти, поэтому sizeof (int) == sizeof (short) == sizeof (char) == 1 (Да, у них 32-разрядные символы, что вполне допустимо в соответствии с стандарт С).
Кроме того, такие вещи, как int_8, int_16 и тому подобное, не определены, что является неприятным сюрпризом при переносе кода с других платформ.
источник
Размер адресуемой памяти по сути является компромиссом между объемом памяти, который вы можете адресовать, и объемом используемой памяти.
Адресная память . Рассмотрим 32-битный процессор: если вы адресуете байты, вы можете адресовать до 4 ГБ памяти. Если вы адресуете отдельные биты, эта сумма будет уменьшена до 512 МБ, а если вы адресуете 32-битные слова, у вас будет 16 ГБ. (ваш вопрос, кажется, подсказывает последнее).
Впустую память . Если у вас есть переменная, которая может быть представлена с помощью битов X, и вы можете выделить для нее только единицы по N битов, вы в среднем будете тратить (N-1) / 2 бита, предполагая X> N. Если вы обращаетесь к отдельным битам , вы будете использовать память со 100% эффективностью (по крайней мере, с точки зрения адресации). С байтами вы будете тратить 3,5 бит на переменную (эффективность 56%), а с 32-битными словами вы будете терять 15,5 бит (эффективность 52%). Но это ухудшается: если большинство ваших переменных маленькие (например, символы, логические значения, флаги состояния), вы в конечном итоге будете тратить большую часть памяти, если ваши адресуемые блоки слишком велики.
Например, предположим, что средний размер переменной составляет 8 бит.
512*1024*1024*100%
= 0,54 миллиарда переменных.4096*1024*1024*56%
= 2,4 миллиарда переменных. Это почти в 5 раз больше по сравнению с бит-адресуемым компьютером! Конечно, вам нужно будет купить в 8 раз больше памяти.источник
Наверное, уже говорили разные способы в других ответах. В целом сегодня, но не обязательно исторически, байт равен 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 вы можете перемещаться в любом месте между одним байтом и всей памятью за одну транзакцию, в зависимости от конструкции части флэш-памяти.
источник
Вы можете также получить 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-битной машине. Вам не нужна арифметическая единица с плавающей точкой! Не супер быстро, но выполнимо! Многие ранние процессоры могут быть одношаговыми и использоваться с простой статической оперативной памятью, что делает отладку действительно простой; добавив несколько восьмеричных буферов и ранних красных светодиодов, вы можете наблюдать за изменением адреса и шин данных :)
источник