Цитата(demiurg_spb @ Mar 28 2009, 01:38)

А как быть с расстановкой очерёдности инициализации разных модулей?
...
Уж если считаете, что Вам стал жать С используйте С++ с его конструкторами и деструкторами,
А что, очерёдность вызовов конструкторов (т.е. инициализации) статических объектов из разных модулей в С++ будет определена?
И неужели Вы думаете, что при наличии функции init_XXX(), которая может вызываться по ходу программы в разных местах кто-то будет дублировать её тело в init-блоке? Хотя можно её вызов вставить в
Код
INIT(8) { init_XXX(); }
:-)
Cам подход "подключили модуль - он автоматически проинициализируется по умолчанию" имеет право на жизнь, у того же борланда это делалось через #pragma startup/#pragma exit.
И дело не только в экономии нескольких байт и тактов, но и в автоматизации того, что можно и нужно автоматизировать, а не нагружать себя самого созданием нагромождения вызовов init_XXX() в начале функции main() (заодно явно видно, какие инициализации терпят перестановку местами, а уж то, что осталось в виде init_XXX() - обкомментировать как и почему оставлено и в каком порядке должно вызываться, если это важно).
Ну и кроме того случаи бывают разные, например, может захотеться у той же меги64 или 162 внешнюю память сделать продолжением внутренней и "без дырок" - стек разместить в конце внешней памяти (да, будет работать несколько медленнее, "ну и что"). Тогда включить внешнюю шину надо до первого вызова, даже в С++ с его конструкторами. Вот тогда фрагмент комментария из темы по ссылке выше как раз и поможет.
Код
* INIT_CODE(1)
* {
* MCUCR = (1 << SRE);
* XMCRA = (4 << SRL0) | (0 << SRW00);
* XMCRB = (1 << XMBK);
* }
static inline тут не поможет.
Я таким образом настраиваю всякие таймерные и не только прерывания - рядом с обработчиком ISR() и (если они есть) функциями доступа к разделяемым с прерываниям данными торчит INIT(8), который это всё хозяйство инициализирует. Пусть он себе "вызывается" автоматичекски.
Рассматривайте этот метод как расширение возможностей start-up-модуля, но без модификации его текста
(чем этот метод и является) и станет понятно, когда его удобно и "правильно" применять.
start-up-модуль занимается подготовкй окружения для функции main()
(можно було бы ведь в начале функции main() вызывать библиотечные функции clear_bss(); init_initialized_data(); - Вы же не боретесь за право это делать? ) для общго случая, а код в отданных программисту секциях .init1/3/5/7/8 уточняет это для данной конкретной программы.