Як допомагає архітектура Гарварду?


13

Я читав про ардуїно та архітектуру AVR і застряг у тому, що те, як затримка трубопроводів чи булькання вирішується впровадженням Гарвардської архітектури в AVR. Я маю на увазі те, що робить Гарвард - це просто надання різного місця зберігання пам’яті даних та пам'яті програми, яка дозволяє завантажувати програму без оператора. Але як це допомагає вирішити вищевказану проблему?


2
Це трохи здогад, тому я не буду публікувати як відповідь, але я думаю, що архітектура Гарварду допомагає, оскільки немає можливості самовиправити код попередньою інструкцією на конвеєрі.
PeterJ

1
я не впевнений, чи отримаю я ... чи ти маю на увазі сказати, що після того, як інструкція була "видобута", її неможливо змінити чи відкинути назад?
Айюш

1
Так, для не Гарвардського, оскільки код може сам змінитись, існує можливість, що інструкція раніше могла б змінити інструкцію, що випливає. Але зачекайте деякий час, мабуть, хтось матиме більш остаточну і чіткішу відповідь.
PeterJ

Відповіді:


9

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

На цьому найпростішому рівні гарвардська архітектура має обмеження в тому, що, як правило, неможливо помістити програмний код у пам’ять даних і дозволити його виконувати звідти.

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


велике спасибі .... дійсно допоміг мені це отримати, але тільки ще одна річ ... хіба у нас різні автобуси, але однакова пам’ять і робота одночасно?
Айюш

@Ayush - Якщо у вас було дві шини, що йдуть в один і той же простір пам'яті, то два запити на транзакцію пам'яті, які надійшли в пам'ять одночасно, все одно мали би претендувати на доступ до пам'яті. Треба чекати, коли інша завершиться !! Тепер, коли це сказало, деякі дизайнери "вирішили" цю проблему, створивши пам'ять, щоб вона працювала вдвічі більше звичайної швидкості, а потім дозволила одній шині мати доступ до пам'яті, що чергується з доступом з іншої шини. Тобто речі розроблені таким чином, що перша шина завжди синхронізується з непарними слотами доступу до пам’яті та (продовження наступного коментаря)
Michael Karas

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

@MichaelKaras: Можна це зробити. З іншого боку, у більшості випадків основним обмежуючим фактором загальної швидкості системи є швидкість пам'яті. Якби у вас була пам’ять, яка могла б працювати вдвічі швидше, ніж це було б потрібно лише для даних або просто для коду, розділення системи пам’яті на одну для даних та коду дозволило б проходити вдвічі швидше.
supercat

4

Деякі нотатки, окрім Майкла, відповідають:

1) Гарвардська архітектура не вимагає наявності двох окремих пробілів для даних та коду, лише те, що вони (в основному) розміщені на двох різних шинах .

2) Проблема, яку вирішує архітектура Гарварду, - це суперечка шині: для системи, де пам'ять коду може забезпечити достатньо швидко вказівки, щоб центральний процесор працював на повній швидкості, додаткове навантаження даних / сховищ даних сповільнить процесор вниз. Цю проблему вирішує архітектура Hardvard: пам'ять, яка (трохи) занадто повільна для швидкості процесора.

Зауважте, що кешування - ще один спосіб вирішення цієї проблеми. Часто Harvarding і кешування використовуються в цікавих комбінаціях.

Гарвард використовує два автобуси. Немає властивих причин дотримуватися двох, у дуже особливих випадках використовується більше двох, в основному в DSP (цифрових процесорах сигналу).

Банківська пам'ять (у сенсі розподілу доступу до пам'яті різним наборам мікросхем) може розглядатися як своєрідна Гарвардінг всередині самої системи пам'яті не на основі розрізнення даних / коду, а на певних бітах адреси.


4
На насправді «чиста» Harvard архітектура дійсно вимагає окремих осередків пам'яті (адресні простори) для інструкцій і даних. Однак, оскільки це заважає комп'ютеру самому завантажуватись, багато машин реалізують "модифіковану" Гарвардську архітектуру, в якій дозволено записувати в пам'ять інструкцій.
Трейд Дейва

Банківська пам'ять не допомагає, якщо між процесором та кожним із банків пам'яті є два (або більше) шини.
Трейд Дейва

@Dave 2: банківська допомога допомагає в певних обставинах, наприклад, якщо проблема полягає в синхронізації пам’яті І шина пам'яті не блокує (може бути здійснено кілька транзакцій).
Wouter van Ooijen

@ Dave1: чи можна дати посилання?
Wouter van Ooijen

Вікіпедія , також Принстонський університет (який справді є лише копією сторінки Вікіпедії). Крім того, більшість мікросхем з одночиповими мікроконтролерами є архітектурою Гарварду, і багато аркушів даних фактично обговорюють, як надання механізму самостійного запису флеш-пам'яті коду створює модифіковану Гарвардську архітектуру.
Трейд Дейва

2

Чиста Гарвардська архітектура, як правило, дозволяє комп'ютеру з заданим рівнем складності працювати швидше, ніж архітектура Фон-Неймана, за умови, що між кодом і пам’яттю даних не потрібно ділитися ресурсами. Якщо обмеження чіткості або інші фактори змушують використовувати одну шину для доступу до обох просторів пам'яті, такі переваги, можливо, значною мірою скасовуються.

"Чиста" Гарвардська архітектура буде обмежена запущеним кодом, який зберігається в пам'яті якимсь механізмом, відмінним від процесора, який запускатиме код. Це обмежує корисність подібних архітектур для пристроїв, призначення яких не встановлено заводом (або комусь із спеціалізованим програмним обладнанням). Для полегшення цього питання можуть бути використані два підходи:

Деякі системи мають окремі області коду та пам’яті, але надають спеціальне обладнання, яке може бути запропоновано коротко взяти шину коду, виконати деяку операцію та повернути контроль до центрального процесора після завершення такої операції. Деякі такі системи потребують досить складного протоколу для проведення таких операцій, деякі мають спеціальні вказівки для виконання такого завдання, а деякі навіть спостерігають за певними адресами "пам'яті даних" та запускають передачу / випуск при спробі доступу до них. . Ключовим аспектом таких систем є те, що є чітко визначені області пам’яті для «коду» та «даних»; навіть якщо ЦП може прочитати та записати простір "коду", він все одно визнається як семантично відмінний від простору даних. "

Альтернативний підхід, який використовується в деяких системах вищого класу, полягає в тому, щоб встановити контролер з двома шинами пам'яті, одна для коду і одна для даних, обидві з яких підключаються до арбітражного блоку пам'яті. Цей блок, в свою чергу, підключений до різних підсистем пам'яті, використовуючи окрему шину пам'яті для кожної. Доступ до коду до однієї підсистеми пам'яті може оброблятися одночасно з доступом до даних до іншої; лише якщо код і дані намагаються одночасно отримати доступ до тієї ж підсистеми, або доведеться чекати.

У системах, що використовують такий підхід, не критичні для продуктивності частини програми можуть просто ігнорувати межі між підсистемами пам'яті. Якщо код і дані знаходяться в одній підсистемі пам'яті, речі не будуть працювати так швидко, як якщо б вони були в окремих підсистемах, але для багатьох частин типової програми це не має значення. У типовій системі буде невелика частина коду, де продуктивність дійсно має значення, і вона працюватиме лише на невеликій частині даних, що зберігаються системою. Якщо у вас була система з 16К оперативної пам’яті, яка була розділена на два 8К розділи, можна було використовувати вказівки лінкера, щоб переконатися, що критично важливий для роботи код був розташований поблизу початку загального простору пам’яті, а критично важливі показники - поблизу кінець. Якщо загальний розмір коду зростає, наприклад, до 9 К, код в останній 1K буде працювати повільніше, ніж код, розміщений в іншому місці, але цей код не буде критичним для продуктивності. Так само, якби код був, наприклад, лише 6К, але дані зросли до 9К, доступ до найнижчих 1К даних був би повільним, але якби критично важливі дані знаходилися в іншому місці, це не створювало б проблем.

Зауважте, що хоча продуктивність була б оптимальною, якби код був нижче 8K, а дані - під 8K, вищезгадана конструкція системи пам'яті не накладала б жодного суворого розділу між кодом та простором даних. Якщо програмі потрібно лише 1К даних, код може вирости до 15К. Якщо йому потрібно лише 2K коду, дані можуть зрости до 14K. Набагато більш універсальний, ніж наявність 8K просто для коду та 8K області лише для даних.


2

Один з аспектів, про який не йшлося, полягає в тому, що для невеликих мікроконтролерів, як правило, лише 16-бітної шини адреси архітектура Гарварду ефективно подвоює (або потроїть) адресний простір. Ви можете мати 64K коду, 64K оперативної пам’яті та 64k вводу / виводу, нанесеного на пам’ять (якщо система використовує вбудовані введення / виведення на карті пам'яті замість номерів портів, останні вже відокремлюють адреса вводу / виводу від коду & Простори ОЗУ).

В іншому випадку вам доведеться набити код, оперативну пам’ять і, необов'язково, адресу вводу / виводу все в тому ж 64K адресному просторі.

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