Цитата(zltigo @ Jul 22 2010, 22:10)

....в самых простейших ее реализациях, например, AVR от Atmel.
Ну вот опять Atmel у вас оказался виноват

Цитата(zltigo @ Jul 22 2010, 22:10)

По нынешним временам так ломово контроллеры, даже если их и называют гаввардскими, уже не делают.
Это проблема не столь аппаратная, сколько логическая. Указанная проблема будет возникать во всех случая, когда числовой адрес памяти не уникален. Т.е. тогда, когда существует более одного адресных пространств, в которых имеется своя собственная нумерация. При этом числового значения указателя оказывается недостаточно для того, чтобы однозначно определить, к какого рода памяти он относится.
Очевидно, совершенно та же самая проблема возникнет, если вместо указателя на flash-память использовать указатель на eeprom-память. В этом случае функция strstr() тоже откажется работать правильно. Точнее говоря, она-то отработает правильно, только символы возьмет не из той памяти, которую хотелось бы.
А гарвардская архитетура тут только при том, что во многих своих реализациях допускает наличие двух адресных пространств (памяти программ и памяти данных), которые допускают перекрытие по номерам ячеек. Но если оба вида памяти разместить в одном адресном пространстве без перекрытия, то указанная проблема исчезнет. Как, например, не возникает такая проблема у компьютеров IBM PC, у которых в младших адресах расположено ПЗУ, а выше его ОЗУ.
Однако в тех случаях, когда команды обращения к ОЗУ и ПЗУ разные, указанная проблема встает в полный рост. И тут разделением адресов горю не поможешь. Хочешь, не хочешь, а код функций, работающих с разными видами памяти, окажется тоже разным. Поэтому сишным переопределением типа указателей проблема не решается.
А гарвардская архитектура становится виноватой

в тот самый момент, как только у процессора появляются РАЗНЫЕ команды обращения к ОЗУ и к ПЗУ. В тех же случаях, когда между этими обращениями нет разницы, подобная проблема не возникает.