|
|
  |
Гарвардская и фон неймовская, разница на практике? |
|
|
|
Nov 3 2011, 05:13
|

Профессионал
    
Группа: Участник
Сообщений: 1 091
Регистрация: 25-07-07
Из: Саратов
Пользователь №: 29 357

|
Цитата(Палыч @ 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], а еще и указать в какой именно памяти он хочет его разместить - а значит разница для программиста уже есть. И после этого он должен пользоваться указателями соответствующего типа чтобы не перепутать обращение к разным типам памятей - и как после этого можно утверждать что для программиста разницы никакой?
|
|
|
|
|
Nov 3 2011, 08:20
|
Гуру
     
Группа: Свой
Сообщений: 2 360
Регистрация: 6-03-06
Из: Кишинев
Пользователь №: 15 025

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

Профессионал
    
Группа: Участник
Сообщений: 1 091
Регистрация: 25-07-07
Из: Саратов
Пользователь №: 29 357

|
Цитата(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)  Я больше скажу- желание разместить данные по какому-либо физическому адресу может прийти в голову и при пользовании фон-неймановским ядром  Я ничего не говорил о размещении по физическому адресу. Я говорю о размещении данных в памяти разных типов. Цитата(Палыч @ 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, 10:04
|
|
|
|
|
Nov 3 2011, 11:55
|

Гуру
     
Группа: Свой
Сообщений: 2 399
Регистрация: 10-05-06
Из: г. Новочеркасск
Пользователь №: 16 954

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

Профессионал
    
Группа: Участник
Сообщений: 1 091
Регистрация: 25-07-07
Из: Саратов
Пользователь №: 29 357

|
Цитата(Палыч @ Nov 3 2011, 15:55)  Поскольку язык Си был ориентирован на архитектуру фон Неймана, то в стандарте отсутствуют спецификаторы типа памяти, зачастую необходимые для программ, написанных для гарвардской архитектуры. Эти спецификаторы - расширения языка. Они - плод фантазии компиляторописателей, и в разных компиляторах - свои. Впрочем, и различные компиляторы для традиционной (фон Неймановской) архитектуры, обычно, имеют расширения языка (читай: нестандартные конструкции). Так что, программист волей-неволей должен их знать при использовании конкретного компилятора (и это - вне зависимости от архитектуры). В этом смысле можно говорить, что различий в собственно языке СИ в зависимости от архитектуры - нет. Вам не кажется что три выделенных фрагмента противоречат друг другу? Если "программист волей-неволей должен знать нестандартные расширения языка", то это не "вне зависимости от архитектуры", а как раз наоборот, ведь в каждой архитектуре свои собственные расширения. Тем более смешно говорить, что "различий в собственно языке СИ в зависимости от архитектуры - нет". Если для обращения к разным областям памяти нужно применять некие конструкции языка, хоть и нестандартные - значит различия есть. Цитата(Палыч @ Nov 3 2011, 15:55)  Вы, возможно, будите удивлены, но некоторые компиляторы для МК "const" именно для этого используют. Хотя, согласно стандарту, предназначены они не для размещения данных... Получается, что там функцией strcpy нельзя скопировать строку из памяти данных? Значит выкидывать надо такие компиляторы. Цитата(Палыч @ Nov 3 2011, 15:55)  "Эффективность" - понятие очень ёмкое. Каков критерий эффективности? Ничего емкого там нет. Или процессор обращается непосредстаенно по адресу, хранящемся в переменной-указателе, или сначала проверяет хранящийся там флаг и в зависимости от него обращается к той или иной памяти - какие тут могут быть сомнения в эффективности? Цитата(Палыч @ Nov 3 2011, 15:55)  Впрочем, я ещё не видел у новичков эффективно написанных программ (в любом смысле). Но это проходит (а, иногда, - нет) с накопленным опытом. Вот чтобы его набраться, они и задают здесь вопросы. Но получают такие ответы, что лучше бы они дошли до всего сами, чем следовать таким советам.
|
|
|
|
|
Nov 4 2011, 19:32
|

Профессионал
    
Группа: Участник
Сообщений: 1 091
Регистрация: 25-07-07
Из: Саратов
Пользователь №: 29 357

|
Цитата(Ruslan1 @ Nov 4 2011, 01:21)  Перевожу. А вам не кажется, что вы говорите не об архитектуре (гарвард) а о микроконтроллере AVR? Я говорю об архитектуре. Цитата(Ruslan1 @ Nov 4 2011, 01:21)  Потому что есть например майкрочип (тоже гарвард), у которого всех описанных вами заморочек нет вообще? То есть как это нет? Как считать байт в W из ОЗУ? А как из памяти команд?
|
|
|
|
|
Nov 5 2011, 20:59
|
Гуру
     
Группа: Свой
Сообщений: 2 360
Регистрация: 6-03-06
Из: Кишинев
Пользователь №: 15 025

|
Цитата(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. Напомню, речь идет не о написании си-компиляторов, а об использовании готовых  .
|
|
|
|
|
Nov 6 2011, 05:30
|

Профессионал
    
Группа: Участник
Сообщений: 1 091
Регистрация: 25-07-07
Из: Саратов
Пользователь №: 29 357

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