Чому кожна адреса мікроконтролера має розмір лише 8 біт?


18

Я бачив, що в 32-бітному мікроконтролері кожна адреса пам'яті містить лише 8 біт даних; те ж саме для 16-бітного МС. Для 32-бітних даних використовується комбінація 4-х адрес. Чому адреса не може безпосередньо містити 32-бітні дані (32-бітні або 16 замість 8)?


2
Це залежить від шини даних мікроконтролера. Який 32-розрядний мікроконтролер має байт-пам'ять? У вас є приклад?
Swanand

4
Просто не відповідає дійсності, через що мови програмування, такі як C і C ++, містять можливість байта перевищувати 8 біт. Просто більшість працює найкраще з 8-бітовими байтами, але там є 9-бітний або 18-бітний.
ПлазмаHH

6
Це як цукерки. Вони продовжують робити їх меншими за ту ж ціну.
Олін Латроп

4
Чи можна це питання перефразовувати "Чому всі адреси вирівняні до 8 біт"?
Флоріан Кастеллайн

2
@FlorianCastellane Це. Адреси не мають 8 біт (якщо ви не можете знайти пристрій з <256 бітами пам'яті, вони можуть бути).
jayjay

Відповіді:


11

Це фактично вибір дизайну, немає важких причин, чому це повинно бути таким. Ще в старі часи, коли товарні процесори з великим об'ємом працювали на 8-бітних значеннях, відображення було більш послідовно 1: 1. Для послідовності, коли конструкції еволюціонували до сучасних 32 та 64 бітових процесорів, було доцільно зберігати старіші карти байтової адреси, навіть якщо шини даних збільшувались (із зміною витрат на імплементацію). Деякі 32-бітні MCU все ще можуть реалізовувати лише 16 бітових шин даних до деякої пам’яті, процесори високого класу матимуть 256 біт або вище і можуть завантажувати декілька основних системних регістрів в одну транзакцію пам'яті. Широкі інтерфейси корисні для операцій з обривом або потоком.

Невеликий розмір адресної пам'яті корисний не лише у випадку обробки байтових значень у коді, але для роботи зі структурами в пам'яті, як пакети Ethernet, де конкретні байти потрібно читати чи змінювати. Часто такий тип операцій потребує можливості виконувати невеликі операції, але дуже ефективно.

Існують також сценарії, коли необхідно оперувати даними великого ендіану, малого ендіану чи змішаними ендіанами. Зараз для цього часто існує спеціальна апаратна підтримка, але знову ж таки, байт-адресація пам'яті зробить цей тип операцій більш ефективним у деяких сценаріях.

Досить недавно кількість адресних бітів у реєстрі була обмежуючим фактором для адресного простору, тому витрачаючи 2 біти на адресу байтів, а не на 32 бітні слова, не було б особливої ​​турботи 10-15 років тому (і тепер із 64 бітовими вказівниками, загальним для реалізації 48-ти або 56-ти бітових адрес, байт). Вступне викладання інформатики все ще трохи застрягло в щорічному віці мейнфрейму і не завжди чітко вирішує еволюційні аспекти. Багато термінології почали застосовуватися (і визначатись) приблизно в той час, коли архітектури з низькими витратами (в загальному сенсі) почали доповнюватись більш обмеженими ресурсами та більш товарними процесорами, орієнтованими на товар.

Я не відповідав спеціально для MCU, архітектурні межі не такі чіткі, як можна припустити. Навіть сучасний наземний дизайн MCU має хороші шанси інтегруватися разом із багатоядерним серверним процесором або існувати лише як один момент у масштабованому наборі продуктів; будь-який спосіб послідовний підхід до доступу до пам'яті вигідний кінцевому користувачеві, якому потрібно написати або портовий код.

Я поставив запитання щодо ретрокомп'ютерних SE про розміри регістрів, щоб продовжити історичні аспекти цього питання.


2
Я думаю, що процесори з більшими розмірами слова передували 8-бітовим процесорам. 8-розрядний процесор був би досить марним без ефективного способу додавання двох багатобайтових чисел, і ранні процесори не могли ефективно обробляти числа, більші за одне машинне слово.
supercat

1
Я працював з 8-бітовими процесорами досить, щоб знати, що вони могли легко додавати багатобайтові номери, але не з однією інструкцією процесора. Спочатку додайте два найнижчих байта і отримаєте найнижчий байт результату та окремий біт перенесення. Що стосується багатьох інших байтів, додайте наступні вхідні байти та біт перенесення з попереднього кроку, надаючи наступний вихідний байт та наступний біт перенесення. Коли немає вхідних байтів, конвертуйте останній біт перенесення в ще один вихідний байт.
user6030

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

Я вважаю, що це справедливий момент щодо зміни розміру регістра (хоча мені бракує даних)
Шон Хуліхане,

25

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

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

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


Дякую. чи є МС, який є широким, ніж байт в пам'яті?
Арун Джо Черіан

4
Може бути, Intel 4004?
pjc50

6
@ArunCheriyan Прикладом процесора, який працював з ніббелями як найменшим адресовим словом, є Saturn : процесор, розроблений HP і використовуваний у своїх висококласних калькуляторах ще в минулому столітті (зокрема, відомий HP48). Він мав дуже незвичну архітектуру (64-бітні регістри, 4-бітний ALU, 20-бітний адрес, ...).
дим

Інший приклад: Найменший адресований блок для TI TMS320C3x - це 32-бітний.
kkrambo

1
@davidcary О, ну ... Дати і час ніколи не були моїм сильним костюмом. Запитайте мою дружину про її подарунки на день народження, а мій начальник про терміни ...
неділя

18

16-бітовому або 32-бітному мікроконтролеру часто потрібно маніпулювати даними, шириною яких є лише 8 біт (байт). Наприклад, текстові рядки зазвичай зберігаються з одним символом на байт. Маючи схему адресації пам'яті, яка дозволяє адресувати кожен окремий байт, мікроконтролер може ефективно обробляти 8-бітові широкі дані. Це означає, що 32-бітні дані зазвичай розміщуються на адресах, кратних 4 байтам, наприклад, 04, 08, 0С тощо. . У 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-бітні DSP-коди аналогових пристроїв Shark мають 32 біти як найменшу одиницю адреси, що запам'ятовується, тому sizeof (int) == sizeof (короткий) == 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 біт, і якщо є п'ята, вона може має бути 16 біт шириною і використовується лише 8, або це 8-бітова частина. Також є 32-бітні деталі, але найчастіше зустрічається 8-бітова. Дуже поширена практика, яка йде назад.

Нам потрібно було б знати, що таке мікроконтролер. Оскільки ви згадуєте про 32 біт, цілком ймовірно (без детальної інформації, хоча ми не можемо сказати), що пам'ять всередині цієї частини становить 32 біта в ширину, а всі звернення до неї - 32 біти. інструкції, ймовірно, визначають, що програма хоче, яка, ймовірно, пропонує 8-бітний, 16-бітний та 32-бітний тип доступу, менші для запису вимагатимуть де-не-змінити-записати десь, читання ви просто ігноруєте смуги байтів. Те саме стосується спалаху, хоча запис флеш - це інша тема. Але внутрішній спалах, швидше за все, шириною 32 біти, і всі зчитування складаються з одиниць у 32 біти. Зовнішній спалах, однак, це вже інша історія, швидше за все, вони є однією бітною шириною (spi або i2c), хоча частини spi іноді можуть підтримувати 1, 2 або 4 біти, але найчастіше зустрічається одна шпилька miso. Всередині вони організовані в одиниці байтів, може бути шириною 8 біт або 16 або 32, або, хто знає, ви висуваєте їх і адресуєте їх у одиницях байтів. за допомогою spi можна перенести будь-яке місце між одним байтом і всією пам'яттю за одну транзакцію, залежно від дизайну флеш-частини.


0

Ви також можете отримати 1 бітові процесори!

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

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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.