Zelepuk 0 28 октября, 2011 Опубликовано 28 октября, 2011 · Жалоба Какая разнится между гарвардской и фон неймовской архитектурой для С-программиста? Если можно конкретный жизненный пример. Заранее благодарен. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Ruslan1 17 28 октября, 2011 Опубликовано 28 октября, 2011 · Жалоба Какая разнится между гарвардской и фон неймовской архитектурой для С-программиста? Если можно конкретный жизненный пример. Заранее благодарен. Никакой. Исходники одинаково хорошо копилируются си-компиляторами в любую архитектуру, от PIC12 до ARM или BF. Лишь бы ресурса хватало. А любую закорюку, требующую индивидуального подхода (прагмы например) нужно очень серьезно обдумывать независимо от архитектуры. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Tiro 0 28 октября, 2011 Опубликовано 28 октября, 2011 · Жалоба Никакой. Исходники одинаково хорошо копилируются си-компиляторами в любую архитектуру, от PIC12 до ARM или BF. Лишь бы ресурса хватало. А любую закорюку, требующую индивидуального подхода (прагмы например) нужно очень серьезно обдумывать независимо от архитектуры. Разницы нет, если он вирусы не пишет )) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
V_G 8 28 октября, 2011 Опубликовано 28 октября, 2011 · Жалоба Да, для Си-программиста разницы никакой. Разница в скорости работы полученного кода. Элементарная операция сложения операндов из внешней памяти в Неймановской архитектуре требует 3 последовательных обращений к памяти (загрузка команды, загрузка 1-го операнда, загрузка 2-го операнда/выполнение сложения). При Гарвардской архитектуре эта же операция потребует уже 2 обращения: загрузка команды из памяти программ и одновременно загрузка 1-го операнда из памяти данных, затем загрузка второго операнда и выполнение инструкции. Налицо выигрыш 33% в скорости. Плюс гарвардская архитектура позволяет делать разные разрядности памяти программ и данных, благодаря чему все или подавляющее большинство кодов инструкций имеют длину всего в одно слово, что также ускоряет их загрузку. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Zelepuk 0 29 октября, 2011 Опубликовано 29 октября, 2011 · Жалоба Спасибо! Получается стоит учитывать особенности архитектуры при расчёте алгоритмов и выборе процессора... Да, для Си-программиста разницы никакой. Разница в скорости работы полученного кода. Элементарная операция сложения операндов из внешней памяти в Неймановской архитектуре требует 3 последовательных обращений к памяти (загрузка команды, загрузка 1-го операнда, загрузка 2-го операнда/выполнение сложения). При Гарвардской архитектуре эта же операция потребует уже 2 обращения: загрузка команды из памяти программ и одновременно загрузка 1-го операнда из памяти данных, затем загрузка второго операнда и выполнение инструкции. Налицо выигрыш 33% в скорости. Плюс гарвардская архитектура позволяет делать разные разрядности памяти программ и данных, благодаря чему все или подавляющее большинство кодов инструкций имеют длину всего в одно слово, что также ускоряет их загрузку. В чём плюсы фон неймовской архитектуры тогда? Нежто МСП430 зря работают по Фон неймовской архитектуре? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
stells 12 29 октября, 2011 Опубликовано 29 октября, 2011 · Жалоба Элементарная операция сложения операндов из внешней памяти... Налицо выигрыш 33% в скорости. так это для внешней памяти, а поскольку обработка данных осуществляется большей частью над содержимым РОН, то выигрыш на порядок меньше Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
DogPawlowa 0 29 октября, 2011 Опубликовано 29 октября, 2011 · Жалоба фон неймовской Несчастный фон Нейман в гробу ворочается. Так фамилию переврать... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
V_G 8 29 октября, 2011 Опубликовано 29 октября, 2011 · Жалоба так это для внешней памяти, а поскольку обработка данных осуществляется большей частью над содержимым РОН, то выигрыш на порядок меньше Зависит от реализации Гарвардской архитектуры. В DSP от Analog Devices возможна одновременная (в одном тактовом цикле) прогрузка данных (в РОН, условно говоря) из двух областей памяти и вычислительная операция. В обычных контроллерах (avr,pic) преимущества Гарвардской проявляются в коротких командах - очень мало двухсловных команд (в picaх вообще не помню, есть ли). 2Zelepuk По Неймановской - общая память как для программ, так и для данных может быть как ее преимуществом, так и недостатком, в зависимости от ситуации. Но по скорости работы у нее преимуществ нет однозначно. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Sergey_Aleksandrovi4 2 29 октября, 2011 Опубликовано 29 октября, 2011 · Жалоба В МК с архитектурой Фон Неймана возможно поместить выполняемый код в ОЗУ и динамически изменят его. Ну например загружать в ОЗУ программы из карты памяти. В МК с гарвардской архитектурой подобные вещи сделать затруднительно. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
kan35 7 29 октября, 2011 Опубликовано 29 октября, 2011 · Жалоба Неймановская безусловно ЛУЧШЕ из за линейного адресного пространства. Простейщий пример для пишущих на Си: гарвардская у AVR требует иметь 3 разных printf - для строк из памяти данных и для строк из памяти программ, и для eeprom,удобно?)). Наличие многих адресных пространств памятей постоянно требует дублирования функций. Это существенно затрудняет портирование интересных и нужных наработок как IP/TCP стеков, графических оболочек (GUI) и проч. Однако, наилучшая архитектура для микроконтроллеров - так наз. смешанная, когда ОЗУ и FLASH висят на разных шинах, но находятся в 1 адресном пространстве. Лучший пример - ARMы серии Cortex-M. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
dxp 58 29 октября, 2011 Опубликовано 29 октября, 2011 · Жалоба В МК с архитектурой Фон Неймана возможно поместить выполняемый код в ОЗУ и динамически изменят его. Ну например загружать в ОЗУ программы из карты памяти. В МК с гарвардской архитектурой подобные вещи сделать затруднительно. Ничуть не затруднительно, если в качестве программ выступает ОЗУ. Пример - процессор фирмы ADI Blackfin. В случае, если не ОЗУ, то потруднее, но это обусловлено не типом архитектуры, а типом памяти. Из уникальных фишек, доступных для фон Неймана, можно отметить возможность писать position-independed code, когда код и данные линкуются в сопряжённые блоки и доступ к данным организуется по относительным (от кода) смещениям, что позволяет эти блоки размещать в любом месте адресного пространства без потери целостности функциональности. Неймановская безусловно ЛУЧШЕ из за линейного адресного пространства. Отнюдь. Линейное адресное пространство не обуславливает тип архитектуры. Ничто принципиально не мешает иметь разные адресные пространства для данных и кода и тем не менее помещать всё это в одно общее физическое адресное пространство. Фон Неймановская архитектура предоставляет одну и ту же шину для доступа в память данных и в память программ, а гарвардская - разные. Но целевая память может быть одной той же (просто во втором случае она должна быть способна к подключению двух шин одновременно пусть и к разным блокам памяти). Гарвардская архитектура тут просто даёт возможность подкачивать данные и код одновременно - каждое по своим шинам, но память при этом может быть одна и та же (ессно, одна должна быть побита на блоки, доступ к которым осуществляется со стороны шин данных и адресов неодновременно). Простейщий пример для пишущих на Си: гарвардская у AVR требует иметь 3 разных printf - для строк из памяти данных и для строк из памяти программ, и для eeprom,удобно?)). Наличие многих адресных пространств памятей постоянно требует дублирования функций. Это просто у AVR так организовано, что память данных ОЗУ, память данных EEPROM и память программ физически разделены, поэтому тут нужны всякие расширения вроде __flash и __eeprom. А можно ведь было сделать и по-другому. Правда, у AVR адресная шина неширокая, поэтому на нём сильно не разгонишься по пути унифицированного адресного пространства для всех видов памяти. Однако, наилучшая архитектура для микроконтроллеров - так наз. смешанная, когда ОЗУ и FLASH висят на разных шинах, но находятся в 1 адресном пространстве. Лучший пример - ARMы серии Cortex-M. Именно. И ещё пример - Blackfin. У всех этих процов шина адресов широкая - 32 бита, есть, где всё разместить. :) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Ruslan1 17 29 октября, 2011 Опубликовано 29 октября, 2011 · Жалоба Неймановская безусловно ЛУЧШЕ из за линейного адресного пространства. Простейщий пример для пишущих на Си: гарвардская у AVR требует иметь 3 разных printf - для строк из памяти данных и для строк из памяти программ, и для eeprom,удобно?)). Мне кажется, это несовершенство конкретного компилятора а не архитектуры. printf не применял, но sprintf на майкрочипе на любом из трех компиляторов работал прозрачно. Странно что компилятор (при корректном описании типов величин, конечно) не может разобраться сам. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
777777 0 31 октября, 2011 Опубликовано 31 октября, 2011 · Жалоба Да, для Си-программиста разницы никакой. Агащязпрям. Попробуйте в AVR создать массив констант в памяти программ и обратиться к нему - сразу поймете разницу. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Палыч 10 31 октября, 2011 Опубликовано 31 октября, 2011 · Жалоба Попробуйте в AVR создать массив констант в памяти программ и обратиться к нему - сразу поймете разницу. С точки зрения языка Си: в какой памяти размещен массив - разницы не будет, обращение к элементам массива будет одинаково (что-то типа M). Другое дело - указатели, но эту проблему должны решать компиляторописатели - решили же эту проблему в Keil... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Ruslan1 17 31 октября, 2011 Опубликовано 31 октября, 2011 · Жалоба Агащязпрям. Попробуйте в AVR создать массив констант в памяти программ и обратиться к нему - сразу поймете разницу. ну а с макрочипом (PIC18 например) это делается просто, именно память программ используется: static const double K1mlt[128] = { 1.0, //in0 1.0, //in1 ...... rezdouble = ((double)adccode._int * K1mlt[n]) + K1add[n]; Так что проблемы не в архитектуре, а в компиляторе. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться