Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Гарвардская и фон неймовская
Форум разработчиков электроники ELECTRONIX.ru > Сайт и форум > В помощь начинающему > Программирование
Zelepuk
Какая разнится между гарвардской и фон неймовской архитектурой для С-программиста?
Если можно конкретный жизненный пример.
Заранее благодарен.
Ruslan1
Цитата(Zelepuk @ Oct 28 2011, 22:33) *
Какая разнится между гарвардской и фон неймовской архитектурой для С-программиста?
Если можно конкретный жизненный пример.
Заранее благодарен.

Никакой.
Исходники одинаково хорошо копилируются си-компиляторами в любую архитектуру, от PIC12 до ARM или BF. Лишь бы ресурса хватало. А любую закорюку, требующую индивидуального подхода (прагмы например) нужно очень серьезно обдумывать независимо от архитектуры.
Tiro
Цитата(Ruslan1 @ Oct 28 2011, 22:42) *
Никакой.
Исходники одинаково хорошо копилируются си-компиляторами в любую архитектуру, от PIC12 до ARM или BF. Лишь бы ресурса хватало. А любую закорюку, требующую индивидуального подхода (прагмы например) нужно очень серьезно обдумывать независимо от архитектуры.


Разницы нет, если он вирусы не пишет ))
V_G
Да, для Си-программиста разницы никакой.
Разница в скорости работы полученного кода.
Элементарная операция сложения операндов из внешней памяти в Неймановской архитектуре требует 3 последовательных обращений к памяти (загрузка команды, загрузка 1-го операнда, загрузка 2-го операнда/выполнение сложения).
При Гарвардской архитектуре эта же операция потребует уже 2 обращения: загрузка команды из памяти программ и одновременно загрузка 1-го операнда из памяти данных, затем загрузка второго операнда и выполнение инструкции.
Налицо выигрыш 33% в скорости.
Плюс гарвардская архитектура позволяет делать разные разрядности памяти программ и данных, благодаря чему все или подавляющее большинство кодов инструкций имеют длину всего в одно слово, что также ускоряет их загрузку.
Zelepuk
Спасибо!
Получается стоит учитывать особенности архитектуры при расчёте алгоритмов и выборе процессора...

Цитата(V_G @ Oct 29 2011, 02:24) *
Да, для Си-программиста разницы никакой.
Разница в скорости работы полученного кода.
Элементарная операция сложения операндов из внешней памяти в Неймановской архитектуре требует 3 последовательных обращений к памяти (загрузка команды, загрузка 1-го операнда, загрузка 2-го операнда/выполнение сложения).
При Гарвардской архитектуре эта же операция потребует уже 2 обращения: загрузка команды из памяти программ и одновременно загрузка 1-го операнда из памяти данных, затем загрузка второго операнда и выполнение инструкции.
Налицо выигрыш 33% в скорости.
Плюс гарвардская архитектура позволяет делать разные разрядности памяти программ и данных, благодаря чему все или подавляющее большинство кодов инструкций имеют длину всего в одно слово, что также ускоряет их загрузку.


В чём плюсы фон неймовской архитектуры тогда? Нежто МСП430 зря работают по Фон неймовской архитектуре?
stells
Цитата(V_G @ Oct 29 2011, 03:24) *
Элементарная операция сложения операндов из внешней памяти...
Налицо выигрыш 33% в скорости.

так это для внешней памяти, а поскольку обработка данных осуществляется большей частью над содержимым РОН, то выигрыш на порядок меньше
Dog Pawlowa
Цитата(Zelepuk @ Oct 28 2011, 22:33) *
фон неймовской

Несчастный фон Нейман в гробу ворочается.
Так фамилию переврать...
V_G
Цитата(stells @ Oct 29 2011, 15:34) *
так это для внешней памяти, а поскольку обработка данных осуществляется большей частью над содержимым РОН, то выигрыш на порядок меньше

Зависит от реализации Гарвардской архитектуры. В DSP от Analog Devices возможна одновременная (в одном тактовом цикле) прогрузка данных (в РОН, условно говоря) из двух областей памяти и вычислительная операция. В обычных контроллерах (avr,pic) преимущества Гарвардской проявляются в коротких командах - очень мало двухсловных команд (в picaх вообще не помню, есть ли).

2Zelepuk
По Неймановской - общая память как для программ, так и для данных может быть как ее преимуществом, так и недостатком, в зависимости от ситуации. Но по скорости работы у нее преимуществ нет однозначно.
Sergey_Aleksandrovi4
В МК с архитектурой Фон Неймана возможно поместить выполняемый код в ОЗУ и динамически изменят его. Ну например загружать в ОЗУ программы из карты памяти. В МК с гарвардской архитектурой подобные вещи сделать затруднительно.
kan35
Неймановская безусловно ЛУЧШЕ из за линейного адресного пространства.
Простейщий пример для пишущих на Си:
гарвардская у AVR требует иметь 3 разных printf - для строк из памяти данных и для строк из памяти программ, и для eeprom,удобно?)). Наличие многих адресных пространств памятей постоянно требует дублирования функций. Это существенно затрудняет портирование интересных и нужных наработок как IP/TCP стеков, графических оболочек (GUI) и проч.

Однако, наилучшая архитектура для микроконтроллеров - так наз. смешанная, когда ОЗУ и FLASH висят на разных шинах, но находятся в 1 адресном пространстве. Лучший пример - ARMы серии Cortex-M.
dxp
Цитата(Sergey_Aleksandrovi4 @ Oct 29 2011, 17:36) *
В МК с архитектурой Фон Неймана возможно поместить выполняемый код в ОЗУ и динамически изменят его. Ну например загружать в ОЗУ программы из карты памяти. В МК с гарвардской архитектурой подобные вещи сделать затруднительно.

Ничуть не затруднительно, если в качестве программ выступает ОЗУ. Пример - процессор фирмы ADI Blackfin. В случае, если не ОЗУ, то потруднее, но это обусловлено не типом архитектуры, а типом памяти.

Из уникальных фишек, доступных для фон Неймана, можно отметить возможность писать position-independed code, когда код и данные линкуются в сопряжённые блоки и доступ к данным организуется по относительным (от кода) смещениям, что позволяет эти блоки размещать в любом месте адресного пространства без потери целостности функциональности.

Цитата(kan35 @ Oct 29 2011, 19:44) *
Неймановская безусловно ЛУЧШЕ из за линейного адресного пространства.

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

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

Цитата(kan35 @ Oct 29 2011, 19:44) *
Простейщий пример для пишущих на Си:
гарвардская у AVR требует иметь 3 разных printf - для строк из памяти данных и для строк из памяти программ, и для eeprom,удобно?)). Наличие многих адресных пространств памятей постоянно требует дублирования функций.

Это просто у AVR так организовано, что память данных ОЗУ, память данных EEPROM и память программ физически разделены, поэтому тут нужны всякие расширения вроде __flash и __eeprom. А можно ведь было сделать и по-другому. Правда, у AVR адресная шина неширокая, поэтому на нём сильно не разгонишься по пути унифицированного адресного пространства для всех видов памяти.

Цитата(kan35 @ Oct 29 2011, 19:44) *
Однако, наилучшая архитектура для микроконтроллеров - так наз. смешанная, когда ОЗУ и FLASH висят на разных шинах, но находятся в 1 адресном пространстве. Лучший пример - ARMы серии Cortex-M.

Именно. И ещё пример - Blackfin. У всех этих процов шина адресов широкая - 32 бита, есть, где всё разместить. sm.gif
Ruslan1
Цитата(kan35 @ Oct 29 2011, 15:44) *
Неймановская безусловно ЛУЧШЕ из за линейного адресного пространства.
Простейщий пример для пишущих на Си:
гарвардская у AVR требует иметь 3 разных printf - для строк из памяти данных и для строк из памяти программ, и для eeprom,удобно?)).

Мне кажется, это несовершенство конкретного компилятора а не архитектуры. printf не применял, но sprintf на майкрочипе на любом из трех компиляторов работал прозрачно. Странно что компилятор (при корректном описании типов величин, конечно) не может разобраться сам.
777777
Цитата(V_G @ Oct 29 2011, 03:24) *
Да, для Си-программиста разницы никакой.

Агащязпрям. Попробуйте в AVR создать массив констант в памяти программ и обратиться к нему - сразу поймете разницу.
Палыч
Цитата(777777 @ Oct 31 2011, 13:08) *
Попробуйте в AVR создать массив констант в памяти программ и обратиться к нему - сразу поймете разницу.

С точки зрения языка Си: в какой памяти размещен массив - разницы не будет, обращение к элементам массива будет одинаково (что-то типа M[i]). Другое дело - указатели, но эту проблему должны решать компиляторописатели - решили же эту проблему в Keil...
Ruslan1
Цитата(777777 @ Oct 31 2011, 12:08) *
Агащязпрям. Попробуйте в AVR создать массив констант в памяти программ и обратиться к нему - сразу поймете разницу.

ну а с макрочипом (PIC18 например) это делается просто, именно память программ используется:
Код
static const double K1mlt[128] =
{
        1.0,            //in0
        1.0,            //in1
......

rezdouble = ((double)adccode._int * K1mlt[n]) + K1add[n];

Так что проблемы не в архитектуре, а в компиляторе.
_Pasha
Цитата(777777 @ Oct 31 2011, 14:08) *
Агащязпрям. Попробуйте в AVR создать массив констант в памяти программ и обратиться к нему - сразу поймете разницу.

Дык в ГЦЦ решено давным давно. Не надо было бы пеарить обертки типа PROGMEM - не появилось бы надстроек соответствующих. Бы.
777777
Цитата(Палыч @ Oct 31 2011, 14:42) *
С точки зрения языка Си: в какой памяти размещен массив - разницы не будет, обращение к элементам массива будет одинаково (что-то типа M[i]). Другое дело - указатели, но эту проблему должны решать компиляторописатели - решили же эту проблему в Keil...

В кейле это решили введением нестандартных ключевы слов.

Цитата(_Pasha @ Nov 1 2011, 13:48) *
Дык в ГЦЦ решено давным давно.

Да ну? И как же это сделано? Неужели в стандарт языка ввели новое ключевое слово, означающее размещение переменной в памяти программ?
Цитата(_Pasha @ Nov 1 2011, 13:48) *
Не надо было бы пеарить обертки типа PROGMEM - не появилось бы надстроек соответствующих. Бы.

Я ничего не понял в этом предложении. Нельзя ли поподробнее и по-русски?

Цитата(Палыч @ Oct 31 2011, 14:42) *
С точки зрения языка Си: в какой памяти размещен массив - разницы не будет, обращение к элементам массива будет одинаково (что-то типа M[i]). Другое дело - указатели, но эту проблему должны решать компиляторописатели - решили же эту проблему в Keil...

Кстати о кейле: вообще-то топикстартер поставил вопрос "Какая разнится между гарвардской и фон неймовской архитектурой для С-программиста?" И вы дружно начали кричать, что разницы никакой. Но во-первых даже при размещении массива программист должен не просто написать M[i], а еще и указать в какой именно памяти он хочет его разместить - а значит разница для программиста уже есть. И после этого он должен пользоваться указателями соответствующего типа чтобы не перепутать обращение к разным типам памятей - и как после этого можно утверждать что для программиста разницы никакой?
Ruslan1
Цитата(777777 @ Nov 3 2011, 07:13) *
Кстати о кейле: вообще-то топикстартер поставил вопрос "Какая разнится между гарвардской и фон неймовской архитектурой для С-программиста?" И вы дружно начали кричать, что разницы никакой.
Но во-первых даже при размещении массива программист должен не просто написать M[i], а еще и указать в какой именно памяти он хочет его разместить - а значит разница для программиста уже есть.

Вы считаете, что применение программистом слов "static" и "const" зависит от типа архитектуры ядра?

Цитата(777777 @ Nov 3 2011, 07:13) *
И после этого он должен пользоваться указателями соответствующего типа чтобы не перепутать обращение к разным типам памятей - и как после этого можно утверждать что для программиста разницы никакой?

Давайте определимся. Вы говорите о проблемах и различии в си-программе не для гарвард-негарвард, а при написании программ на одном конкретном гарвардоподобном ядре при применении одного конкретного компилятора. И проецируете эти проблемы на все прцессоры и все компиляторы. Но это не так, есть гарвардоподобные ядра и компиляторы к ним, в которых описанных вами проблем нет.

Я больше скажу- желание разместить данные по какому-либо физическому адресу может прийти в голову и при пользовании фон-неймановским ядром sm.gif
Палыч
Цитата(777777 @ Nov 3 2011, 09:13) *
В кейле это решили введением нестандартных ключевы слов.

Если Вы ведете речь о размещении массива, то - да, нестандартные ключевые слова для этого ввели в большенство трансляторов. Я же говорил об указателе: в Keil - "Generic Pointers", транслятор сам "разбирается" с типами памяти.

Цитата(777777 @ Nov 3 2011, 09:13) *
... а еще и указать в какой именно памяти он хочет его разместить - а значит разница для программиста уже есть. И после этого он должен пользоваться указателями соответствующего типа чтобы не перепутать обращение к разным типам памятей - и как после этого можно утверждать что для программиста разницы никакой?

Если программист хочет разместить массив именно в конкретной памяти - то некоторая разница есть (при описании массива). Но, можно, и - "по-умолчанию" (не всегда эффективно и возможно). Про указатели - см. выше (Generic Pointers).
777777
Цитата(Ruslan1 @ Nov 3 2011, 12:20) *
Вы считаете, что применение программистом слов "static" и "const" зависит от типа архитектуры ядра?

А вы считаете, что они предназначены для размещения данных в той или иной памяти? Впрочем, это распространенная ошибка.

Объясняю: спецификатор const преднаначен лишь для того, чтобы сказать компиляторору, что эта переменная (или, если это указатель, то данные на которые он указывает) не должны меняться. И поэтому если компилятор встретит код, который меняет эти данные, он должен выдать не него ошибку. Но это не значит, что они могут размешаться в памяти программ! Поясню на конкретном примере: функция strcpy имеет такой прототип:

char* strcpy( char *strDestination, const char *strSource);

strSource здесь - константный указатель на char. Значит ли это, чо компилятор при трансляции этой функции должен при обращении к данным, адресуемым этим указателем, генерировать код для обращении к памяти программ? Разумеется нет, ведь я могу использовать эту функцию для пересылки строк из памяти данных! Поэтому const нельзя использовать для таких целей, для этого могут использоваться только нестандартные спецификаторы. Тем более, что типы памятей могут не ограничиваться только памятью команд и данных, в том же 8051 есть области DATA, IDATA, XDATA, и другие, о которых стандарт Си не обязан ничего знать.

Что же касается static, то он вообще не имеет отношения к размещению данных (за исключением некоторых мелочей, не относящихся к обсуждаемому вопросу).

Цитата(Ruslan1 @ Nov 3 2011, 12:20) *
Давайте определимся. Вы говорите о проблемах и различии в си-программе не для гарвард-негарвард, а при написании программ на одном конкретном гарвардоподобном ядре при применении одного конкретного компилятора. И проецируете эти проблемы на все прцессоры и все компиляторы. Но это не так, есть гарвардоподобные ядра и компиляторы к ним, в которых описанных вами проблем нет.

Мудреное предложение которое трудно понять. Я говорю о том, о чем спрашивал топикстартер, а именно: "Какая разнится между гарвардской и фон неймовской архитектурой для С-программиста?" Заметте, речь идет не о проблемах, а о разнице. А она безусловно есть и программист обязательно должен эту разницу учитывать.

Цитата(Ruslan1 @ Nov 3 2011, 12:20) *
Я больше скажу- желание разместить данные по какому-либо физическому адресу может прийти в голову и при пользовании фон-неймановским ядром sm.gif

Я ничего не говорил о размещении по физическому адресу. Я говорю о размещении данных в памяти разных типов.



Цитата(Палыч @ Nov 3 2011, 12:25) *
Если Вы ведете речь о размещении массива, то - да, нестандартные ключевые слова для этого ввели в большенство трансляторов.

Разумеется о размещении, перед тем как пользоваться переменными, их нужно создать, а для этого подумать где им место. И в 8081 этот вопрос программист должен продумывать очень тщательно - какие переменные лучше поместить в DATA, а какие в IDATA - ошибки в выборе могут кардинально поменяь производительность.

Цитата(Палыч @ Nov 3 2011, 12:25) *
Я же говорил об указателе: в Keil - "Generic Pointers", транслятор сам "разбирается" с типами памяти.

А, вы об этом уродстве? Вот уж не думал, что ими кто-то реально пользуется. Нужно быть идиотом, чтобы тщательно продумав о размещении переменных (DATA, IDATA или XDATA) после этого обращаться ко всем ним через generic указатели.

Цитата(Палыч @ Nov 3 2011, 12:25) *
Если программист хочет разместить массив именно в конкретной памяти - то некоторая разница есть (при описании массива). Но, можно, и - "по-умолчанию" (не всегда эффективно и возможно). Про указатели - см. выше (Generic Pointers).

Вот именно! Вы прекрасно понимаете, что это сильно влияет на эффективность, но при этом заявляете новичкам, что дла программиста нет никакой разницы какая архитектура у процессора! Может не стоит разбрасываться такими вредными советами, тем более понимая их вредность?
Палыч
Поскольку язык Си был ориентирован на архитектуру фон Неймана, то в стандарте отсутствуют спецификаторы типа памяти, зачастую необходимые для программ, написанных для гарвардской архитектуры. Эти спецификаторы - расширения языка. Они - плод фантазии компиляторописателей, и в разных компиляторах - свои. Впрочем, и различные компиляторы для традиционной (фон Неймановской) архитектуры, обычно, имеют расширения языка (читай: нестандартные конструкции). Так что, программист волей-неволей должен их знать при использовании конкретного компилятора (и это - вне зависимости от архитектуры). В этом смысле можно говорить, что различий в собственно языке СИ в зависимости от архитектуры - нет.

Цитата(777777 @ Nov 3 2011, 14:03) *
А вы считаете, что они предназначены для размещения данных в той или иной памяти? Впрочем, это распространенная ошибка.
Вы, возможно, будите удивлены, но некоторые компиляторы для МК "const" именно для этого используют. Хотя, согласно стандарту, предназначены они не для размещения данных...

Цитата(777777 @ Nov 3 2011, 14:03) *
Вы прекрасно понимаете, что это сильно влияет на эффективность, но при этом заявляете новичкам, что дла программиста нет никакой разницы какая архитектура у процессора!
"Эффективность" - понятие очень ёмкое. Каков критерий эффективности? Впрочем, я ещё не видел у новичков эффективно написанных программ (в любом смысле). Но это проходит (а, иногда, - нет) с накопленным опытом. Что же касается знания программистом архитектуры применяемого МК, то тут - ну никак без этого. И это знание, зачастую, обязательно для написания программ на любом языке...
777777
Цитата(Палыч @ Nov 3 2011, 15:55) *
Поскольку язык Си был ориентирован на архитектуру фон Неймана, то в стандарте отсутствуют спецификаторы типа памяти, зачастую необходимые для программ, написанных для гарвардской архитектуры. Эти спецификаторы - расширения языка. Они - плод фантазии компиляторописателей, и в разных компиляторах - свои. Впрочем, и различные компиляторы для традиционной (фон Неймановской) архитектуры, обычно, имеют расширения языка (читай: нестандартные конструкции). Так что, программист волей-неволей должен их знать при использовании конкретного компилятора (и это - вне зависимости от архитектуры). В этом смысле можно говорить, что различий в собственно языке СИ в зависимости от архитектуры - нет.

Вам не кажется что три выделенных фрагмента противоречат друг другу?
Если "программист волей-неволей должен знать нестандартные расширения языка", то это не "вне зависимости от архитектуры", а как раз наоборот, ведь в каждой архитектуре свои собственные расширения. Тем более смешно говорить, что "различий в собственно языке СИ в зависимости от архитектуры - нет". Если для обращения к разным областям памяти нужно применять некие конструкции языка, хоть и нестандартные - значит различия есть.

Цитата(Палыч @ Nov 3 2011, 15:55) *
Вы, возможно, будите удивлены, но некоторые компиляторы для МК "const" именно для этого используют. Хотя, согласно стандарту, предназначены они не для размещения данных...

Получается, что там функцией strcpy нельзя скопировать строку из памяти данных? Значит выкидывать надо такие компиляторы.

Цитата(Палыч @ Nov 3 2011, 15:55) *
"Эффективность" - понятие очень ёмкое. Каков критерий эффективности?

Ничего емкого там нет. Или процессор обращается непосредстаенно по адресу, хранящемся в переменной-указателе, или сначала проверяет хранящийся там флаг и в зависимости от него обращается к той или иной памяти - какие тут могут быть сомнения в эффективности?

Цитата(Палыч @ Nov 3 2011, 15:55) *
Впрочем, я ещё не видел у новичков эффективно написанных программ (в любом смысле). Но это проходит (а, иногда, - нет) с накопленным опытом.

Вот чтобы его набраться, они и задают здесь вопросы. Но получают такие ответы, что лучше бы они дошли до всего сами, чем следовать таким советам.
Ruslan1
Цитата(777777 @ Nov 3 2011, 12:03) *
Мудреное предложение которое трудно понять. Я говорю о том, о чем спрашивал топикстартер, а именно: "Какая разнится между гарвардской и фон неймовской архитектурой для С-программиста?" Заметте, речь идет не о проблемах, а о разнице. А она безусловно есть и программист обязательно должен эту разницу учитывать.

Перевожу.
А вам не кажется, что вы говорите не об архитектуре (гарвард) а о микроконтроллере AVR?
Потому что есть например майкрочип (тоже гарвард), у которого всех описанных вами заморочек нет вообще?
777777
Цитата(Ruslan1 @ Nov 4 2011, 01:21) *
Перевожу.
А вам не кажется, что вы говорите не об архитектуре (гарвард) а о микроконтроллере AVR?

Я говорю об архитектуре.
Цитата(Ruslan1 @ Nov 4 2011, 01:21) *
Потому что есть например майкрочип (тоже гарвард), у которого всех описанных вами заморочек нет вообще?

То есть как это нет? Как считать байт в W из ОЗУ? А как из памяти команд?
Ruslan1
Цитата(777777 @ Nov 4 2011, 21:32) *
Я говорю об архитектуре.

То есть как это нет? Как считать байт в W из ОЗУ? А как из памяти команд?


res = W * 5;

независимо от того, что такое W - переменная или константа.

или я не понял вопроса.
777777
Цитата(Ruslan1 @ Nov 5 2011, 16:34) *
res = W * 5;

независимо от того, что такое W - переменная или константа.

или я не понял вопроса.

Скорее всего. Речь идет о размещении в памяти программ больших константных массивов. Или, вообще - о различиях в обращении к памяти программ и памяти данных (а именно наличием двух, как минимум, видов памяти и отличается гарвардская архитектура от фон-неймановской).

И даже не обязательно речь идет о константах - в некоторых сигнальных процессорах ADSP и память данных, и память программ находятся в ОЗУ, благодаря чему запись разрешена и в память программ тоже. Неужели и здесь для программиста архитектура не играет роли?
Ruslan1
Цитата(777777 @ Nov 5 2011, 19:25) *
Скорее всего. Речь идет о размещении в памяти программ больших константных массивов. Или, вообще - о различиях в обращении к памяти программ и памяти данных (а именно наличием двух, как минимум, видов памяти и отличается гарвардская архитектура от фон-неймановской).

Вы невнимательно читаете. Я ответил на ваш вопрос в своем сообщении http://electronix.ru/forum/index.php?showt...st&p=988815 я привел кусочек массива 4-байтовых константных величин и пример обращения к этому массиву.

Цитата(777777 @ Nov 5 2011, 19:25) *
И даже не обязательно речь идет о константах - в некоторых сигнальных процессорах ADSP и память данных, и память программ находятся в ОЗУ, благодаря чему запись разрешена и в память программ тоже. Неужели и здесь для программиста архитектура не играет роли?

Конечно не играет. У меня один и тот же код (ну скажем нормировочные функции и кусочно-линейные кривые с коэффициентами и аппроксимациями- много таблиц и вычислений и массивов) крутился и на bf533 и на adsp2181 и на at91rm9200(arm9) и на pic18. Напомню, речь идет не о написании си-компиляторов, а об использовании готовых sm.gif.
V_G
Цитата(777777 @ Nov 6 2011, 03:25) *
Неужели и здесь для программиста архитектура не играет роли?

Глубоко копаете! Если имеется в виду ответ для начинающего, то не играет роли в большинстве случаев.
А когда дело дойдет до тонкостей, нюансы и проявятся. И если все-таки компилятор хорошо написан, нюансы обращений к разным типам памяти будут предельно тонкими.
И уж в любом случае архитектура для C-программиста играет куда меньшую роль, чем для asm-программиста.
777777
Цитата(V_G @ Nov 6 2011, 04:06) *
Глубоко копаете! Если имеется в виду ответ для начинающего, то не играет роли в большинстве случаев.

Меня всегда удивляло высокомерие здешней публики. Сам факт наличия раздела "для начинающих" чего стоит! Я такого не видел ни на одном форуме! Неудивительно что мои предложения ликвидировать этот раздел не нашли понимания. Действительно, если не будет такого раздела, то как великие гуру будут удовлетворять свое ЧСВ? Да и тонкости в отличиях архитектур начинающему объяснять не следует, а то еще выучит и станет умнее вас, это же непорядок!
Цитата(V_G @ Nov 6 2011, 04:06) *
А когда дело дойдет до тонкостей, <...>

Как же он дойдет до тонкостей, если вы их от него тщательно скрываете?!
V_G
Цитата(777777 @ Nov 6 2011, 15:30) *
Как же он дойдет до тонкостей, если вы их от него тщательно скрываете?!

Вообще-то я к гуру себя не причисляю, а реплика была всего лишь к тому, что все надо изучать постепенно. Если вывалить на голову начинающего сразу все нюансы-тонкости, то легко запутаться. Тут уже 2 страницы споров гуру между собой по нюансам, а всего-то нужен был коротенький ответ.
Ну, и изучать эти нюансы-тонкости все-таки лучше на практике, а не по ответам на форуме. Тогда и скрыть что-то сложно будет.
Ruslan1
Цитата(V_G @ Nov 6 2011, 08:51) *
Вообще-то я к гуру себя не причисляю, а реплика была всего лишь к тому, что все надо изучать постепенно. Если вывалить на голову начинающего сразу все нюансы-тонкости, то легко запутаться. Тут уже 2 страницы споров гуру между собой по нюансам, а всего-то нужен был коротенький ответ.
Ну, и изучать эти нюансы-тонкости все-таки лучше на практике, а не по ответам на форуме. Тогда и скрыть что-то сложно будет.

1. Разницы для си-программиста нет никакой.
2. Есть нюансы при использовании кривых компиляторов, 777777 любезно упомянул об одном из них применительно к гарварду. Уверен, можно найти также кривой компилятор и для фон-неймана. Под "кривым" подразумевается компилятор, оставляющий программисту самому организовывать доступ к разным типам данных, расположенным в разной памяти. Хороший компилятор делает это сам, при его использовании программист не должен заниматься архитектурозависимыми вопросами вообще. Собственно в этом и смысл хорошего компилятора- взять на себя рутинную работу.
3. Мне неизвестны нюансы архитектуры, о которых должен знать си-программист. Если речь идет о том чтобы выжать максимальную эффективность, то программисту нужно знать не нюансы архитектуры, а нюансы конкретного компилятора и конкретного микроконтроллера вплоть до последней ревизии ерраты. Подчеркну, к архитектуре это не имеет никакого отношения.

ILYAUL
Цитата(V_G @ Nov 6 2011, 04:06) *
И уж в любом случае архитектура для C-программиста играет куда меньшую роль, чем для asm-программиста.


Нас выручают макросы.
777777
Цитата(Ruslan1 @ Nov 6 2011, 13:36) *
1. Разницы для си-программиста нет никакой.

Смелое заявление!

Цитата(Ruslan1 @ Nov 6 2011, 13:36) *
2. Есть нюансы при использовании кривых компиляторов, 777777 любезно упомянул об одном из них применительно к гарварду. Уверен, можно найти также кривой компилятор и для фон-неймана. Под "кривым" подразумевается компилятор, оставляющий программисту самому организовывать доступ к разным типам данных, расположенным в разной памяти. Хороший компилятор делает это сам, при его использовании программист не должен заниматься архитектурозависимыми вопросами вообще. Собственно в этом и смысл хорошего компилятора- взять на себя рутинную работу.

Фигасе заявочки! Да если компилятор решает за программиста где разместить те или иные данные, то его надо выкидывать нахрен! Даже const массивы нельзя располагать во флэш без ведома программиста - мало ли как мне захочется их проинициализировать, может это будет делать бутлоадер загружая их при включении по USART. А про const-указатели я уже писал. Забота компилятора лишь в том, чтобы следить за тем, чтобы программист не написал код, пишущий в эту область.

Цитата(Ruslan1 @ Nov 6 2011, 13:36) *
3. Мне неизвестны нюансы архитектуры, о которых должен знать си-программист. Если речь идет о том чтобы выжать максимальную эффективность, то программисту нужно знать не нюансы архитектуры, а нюансы конкретного компилятора и конкретного микроконтроллера вплоть до последней ревизии ерраты. Подчеркну, к архитектуре это не имеет никакого отношения.

Еще более смелое заявление. Странно видеть программиста, исследующего отличия в ревизиях конкретного микроконтроллера, но полностью игнорирующего его архитектуру.
Harvester
Цитата(777777 @ Nov 7 2011, 09:35) *
Фигасе заявочки! Да если компилятор решает за программиста где разместить те или иные данные, то его надо выкидывать нахрен! Даже const массивы нельзя располагать во флэш без ведома программиста - мало ли как мне захочется их проинициализировать, может это будет делать бутлоадер загружая их при включении по USART. А про const-указатели я уже писал. Забота компилятора лишь в том, чтобы следить за тем, чтобы программист не написал код, пишущий в эту область.

А вот для того, чтобы программист мог реализовать все свои хотелки, и существуют нестандартные (и компиляторозависимые) расширения языка.
Но, повторю уже неоднократно прозвучавшую мысль, к архитектуре МК это не имеет ни малейшего отношения
777777
Цитата(Harvester @ Nov 7 2011, 10:32) *
А вот для того, чтобы программист мог реализовать все свои хотелки, и существуют нестандартные (и компиляторозависимые) расширения языка.
Но, повторю уже неоднократно прозвучавшую мысль, к архитектуре МК это не имеет ни малейшего отношения


Нестандартное компиляторозависимое расширение кейла для размещения данных в памяти DATA, IDATA и т.д., а также нестандартное расширение gcc PROGMEM для размещения данных в памяти программ - не имеют, оказывается, отношения к архитектурам этих МК!

Всё, это конец, пора эту дискуссию завязывать.
Палыч
Цитата(777777 @ Nov 7 2011, 11:41) *
Всё, это конец, пора эту дискуссию завязывать.

Давно пора...
Попытаюсь обобщить все мнения, высказанные выше.
Программисту, пишущиму на любом языке программирования, необходимо знание архитектуры ЭВМ/МК, на котором будет работать программа. Причем это касается не только того гарвардская или неймоновская/принстонская архитектура. Нужно знание и системы команд, и разрядности шин, и системы прерываний (кстати, в стандарте языка Си - нет соответствующий средств для работы с ними), и устройств ввода-вывода...
Для МК, зачастую, характерна нехватка ресурсов (в первую очередь - ОЗУ, вероятно это - результат "большого" объема ОЗУ в ПЭВМ). При проектировании программы ресурсы нужно распределить. При написании программы компилятору, обычно, нужно указать это распределение. Делается это - нестандартными расширениями языка Си (коль вопрос изначально был о Си).
В остальном - "Си - он и в Африке...". Большенство компиляторов для МК поддерживают стандарт ISO9899 языка Си.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.