Здравствуйте, Евгений Музыченко, Вы писали:
V>>Двухфакторная инициализация — статическая и динамическая.
ЕМ>CRT не является безусловно необходимым для этого.
Тогда будет UB. ))
Т.е. ты тогда не можешь полагаться на спецификации языка.
ЕМ>Он нужен, когда невозможно загрузить инициализированные данные вместе с программой в готовом виде. Если платформа позволяет это делать (с помощью стандартного загрузчика, отображения памяти, или еще как), CRT не требуется.
Для динамической фазы инициализации CRT требуется, тут подробней:
http://www.rsdn.org/forum/flame.comp/8608986.1
V>>Гарвардская модель удобна для встраиваемых решений, т.к. программы сидят в ПЗУ на кристалле.
ЕМ>Так ПЗУ не является необходимым элементом гарвардской архитектуры.
Ес-но.
ТУт зависимость другая: есть ПЗУ — удобней Гарвард.
И кристаллу удобней (подробности тоже по ссылке выше, почему кристаллу всегда удобней Гарвард), и программисту удобнее, когда численно совпадающие адреса данных и программы на самом деле смотрят в разную память.
ЕМ>В общем случае эта архитектура никак не мешает загрузке в память заранее подготовленных данных.
Разумеется.
Но часто делает ненужным саму эту операцию.
Считай, что это чуть другой образ мышления.
ЕМ>И даже в тех случаях, когда такой возможности нет, именно CRT не требуется. Для одномодульной программы компилятор может складывать код инициализации в заранее известную функцию, которую нужно будет явно вызвать до использования статических переменных.
Так и делается.
Одно плохо — тебе недоступна возможность явного вызова этой ф-ии, этим занимается CRT.
А в случае watch-dog таймеров иногда эту ф-ию надо бы вызывать явно.
А никак!
И вот ты целиком отказываешься от этого раздела спецификации языка и пользуешь другие решения, которые, к тому же, оказываются резко эффективней, бо каждое такое решение выходит "по-месту".
Тут во всей красе проявляется то правило инженерии, что самое общее решения является наихудшим для каждого конкретного случая. ))
ЕМ>Для многомодульных программ это делается складыванием кода в секции, для обработки которых также могла бы генерироваться служебная функция, вызываемая явно.
ЕМ>По сути, это часть CRT, но поднятая чуть выше, вроде явной инициализации вместо умолчания.
Да нет такой возможности в языке, забудь. ))
Только описать такую инициализацию явно, но тогда конструкции языка объявления+инициализации глобальных переменных получаются нерабочими.
Взять простой пример — некая табличная ф-ия, например, кодировка из PCM в u-law.
По классике если, ты опишешь эту таблицу констант в данных, т.е. в ОЗУ, и будешь извлекать из таблицы константы простым обращением к глобальному массиву.
А в микриках другая техника.
Там обычно достаточно большое ПЗУ, но небольшое ОЗУ.
Занимать это ОЗУ большой таблицей — ересь, заслужить линейкой по пальцам.
И ты прошиваешь эти константы в ПЗУ, т.е. по адресу кода.
Причём, если архитектура не позволяет непосредственно читать байты из адресного пространства команд, то ты через макросы прошиваешь команду сложения рабочего регистра с константой (или загрузки константы в регистр) + операция ret.
Тогда обращение к таблице вырождается в call c предвычисленным смещением.
И никакого ОЗУ. Ву а ля! ))