Как гарвардская архитектура помогает?

12

Я читал об архитектуре arduino и архитектуре AVR и застрял в том моменте, когда решение проблемы остановки конвейера или образования пузырьков решается введением гарвардской архитектуры в AVR. позволяет загружать программу без оператора. Но как это помогает решить вышеуказанную проблему?

Ayush
источник
2
Это немного предположение, поэтому я не буду публиковать в качестве ответа, но я думаю, что Гарвардская архитектура помогает, потому что нет возможности самоизменения кода с помощью предыдущей инструкции в конвейере.
PeterJ
1
я не уверен, что если я вас ... вы хотите сказать, что после того, как инструкция «выбрана», она не может быть изменена или возвращена?
Аюш
1
Да, это верно, для не Гарварда, потому что код может измениться сам, есть вероятность, что инструкция прежде могла изменить инструкцию, которая следует. Но подождите, у кого-то, возможно, будет более четкий и ясный ответ.
PeterJ

Ответы:

9

Гарвардская архитектура, которая случайно использовалась задолго до того, как были изобретены AVR, действительно имеет отдельные адресные пространства для памяти программ и памяти данных. Это дает участнику возможность спроектировать схему таким образом, чтобы отдельная шина и схема управления могли использоваться для обработки потока информации из памяти программ и потока информации в память данных. Использование отдельных шин означает, что выбор и выполнение программы могут продолжаться без прерывания от случайной передачи данных в память данных. Например, в простейшей версии архитектуры модуль выборки программы может быть занят извлечением следующей инструкции в последовательности программ параллельно с операцией передачи данных, которая могла быть частью предыдущей инструкции программы.

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

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

Майкл Карас
источник
большое спасибо .... действительно помогли мне получить это, но только еще одна вещь ... разве у нас не разные автобусы, но одинаковая память и работа в одно и то же время?
Аюш
@Ayush - Если бы у вас было две шины, идущие в одно и то же пространство памяти, то два запроса транзакций памяти, поступивших в память одновременно, все равно должны были бы бороться за доступ к памяти. Один должен ждать другого, чтобы закончить !! Тем не менее, некоторые разработчики «решили» эту проблему, разработав память, работающую с удвоенной нормальной скоростью, и затем позволили одной шине иметь доступ к памяти, чередуя доступ с другой шины. Т.е. все спроектировано так, что первая шина всегда синхронизируется с нечетными слотами доступа к памяти и (продолжение следующего комментария)
Майкл Карас
(продолжение из предыдущего комментария) вторая шина синхронизируется с четными слотами доступа к памяти, после чего обе шины могут работать на скорости без конфликтов доступа к памяти.
Майкл Карас
@MichaelKaras: это можно сделать. С другой стороны, в большинстве случаев основным ограничивающим фактором для общей скорости системы является скорость памяти. Если бы у кого-то была память, которая могла бы работать вдвое быстрее, чем это требовалось бы только для данных или только для кода, разделение системы памяти на одну для данных и кода позволило бы вещам идти в два раза быстрее.
суперкат
4

Некоторые заметки в дополнение к Майклу ответят:

1) Гарвардская архитектура не требует наличия двух отдельных пространств для данных и кода, просто они (в основном) выбираются по двум разным шинам .

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

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

Гарвард использует два автобуса. Не существует внутренней причины придерживаться двух, в очень особых случаях используется более двух, в основном в DSP (процессорах цифровых сигналов).

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

Воутер ван Оойен
источник
4
На самом деле «чистая» Harvard архитектура действительно требует отдельных ячеек памяти (адресные пространства) для инструкций и данных. Однако, поскольку это препятствует загрузке самого компьютера, многие машины реализуют «модифицированную» гарвардскую архитектуру, в которой разрешена запись в память команд.
Дэйв Твид
Банкование памяти не помогает, если между процессором и каждым из банков памяти нет двух (или более) шин.
Дэйв Твид
@ Дэйв 2: банковское дело помогает в определенных обстоятельствах, например, если проблема связана с синхронизацией памяти, а шина к памяти не блокируется (может быть несколько транзакций).
Воутер ван Оойен
@ Dave1: можете ли вы дать ссылку?
Воутер ван Оойен
Википедия , также Принстонский университет (который на самом деле является просто копией страницы Википедии). Кроме того, большинство однокристальных микроконтроллеров имеют гарвардскую архитектуру, и многие таблицы данных фактически обсуждают, как обеспечение механизма для самостоятельной записи флеш-памяти кода создает модифицированную гарвардскую архитектуру.
Дэйв Твид
2

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

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

Некоторые системы имеют отдельные области кода и памяти, но предоставляют специальное оборудование, которое можно попросить кратковременно захватить шину кода, выполнить некоторую операцию и вернуть управление ЦПУ после завершения такой операции. Некоторые такие системы требуют довольно сложного протокола для выполнения таких операций, некоторые имеют специальные инструкции для выполнения такой задачи, а некоторые даже следят за определенными адресами «памяти данных» и запускают захват / освобождение при попытке доступа к ним. , Ключевым аспектом таких систем является то, что существуют явно определенные области памяти для «кода» и «данных»; даже если ЦПУ может читать и записывать пространство «кода», оно все равно распознается как семантически отличное от пространства данных ».

Альтернативный подход, который используется в некоторых системах более высокого уровня, состоит в том, чтобы иметь контроллер с двумя шинами памяти, одна для кода и одна для данных, обе из которых подключаются к блоку арбитража памяти. Это устройство в свою очередь подключается к различным подсистемам памяти, используя отдельную шину памяти для каждой. Кодовый доступ к одной подсистеме памяти может обрабатываться одновременно с доступом к данным к другой; только если код и данные попытаются получить доступ к одной и той же подсистеме одновременно, придется ждать.

В системах, использующих этот подход, части программы, не критичные к производительности, могут просто игнорировать границы между подсистемами памяти. Если код и данные находятся в одной подсистеме памяти, все будет работать не так быстро, как если бы они были в разных подсистемах, но для многих частей типичной программы это не будет иметь значения. В типичной системе будет небольшая часть кода, где производительность действительно имеет значение, и она будет работать только с небольшой частью данных, хранящихся в системе. Если бы у вас была система с 16 КБ ОЗУ, которая была разделена на два раздела по 8 КБ, можно было использовать инструкции компоновщика, чтобы гарантировать, что критичный к производительности код был расположен в начале общего пространства памяти, а критичные к производительности данные были рядом с конец. Если общий размер кода увеличивается, например, до 9K, код в последнем 1K будет работать медленнее, чем код, размещенный в другом месте, но этот код не будет критичным для производительности. Аналогично, если бы код был, например, только 6 КБ, но объем данных вырос до 9 КБ, доступ к самым низким 1 КБ данных был бы медленным, но если бы данные, критичные для производительности, находились в другом месте, это не создавало бы проблем.

Обратите внимание, что, хотя производительность была бы оптимальной, если бы код был меньше 8 КБ, а данные были меньше 8 КБ, вышеупомянутая конструкция системы памяти не налагает какого-либо строгого разделения между кодом и пространством данных. Если программе требуется только 1 КБ данных, код может увеличиться до 15 КБ. Если ему требуется всего 2 КБ кода, данные могут увеличиться до 14 КБ. Гораздо более универсальный, чем область 8K только для кода и область 8K только для данных.

Supercat
источник
1

Один аспект, который не обсуждался, заключается в том, что для небольших микроконтроллеров, обычно с только 16-битной адресной шиной, архитектура Гарварда эффективно удваивает (или утраивает) адресное пространство. Вы можете иметь 64 КБ кода, 64 КБ ОЗУ и 64 КБ ввода-вывода с отображением в памяти (если система использует отображаемый в памяти ввод-вывод вместо номеров портов, последний уже отделяет адресацию ввода-вывода от кода & Места в ОЗУ).

В противном случае вам придется втиснуть код, ОЗУ и, при необходимости, адрес ввода-вывода в одном и том же адресном пространстве 64 КБ.

tcrosley
источник