Цитата(BigBolt @ Apr 1 2006, 13:12)

В CCV можно использовать свой Startup-файл, который исполняется перед функцией main{}.
Вопрос: как проделать такое же в WinAVR ввиду необходимости произвести дополнительные
процедуры (очистка и тестирование ОЗУ) перед исполнением основной программы ??????
Конечно, можно "вручную" вызвать линкер (в смысле не через драйвер $(СС) ), подсунув ему всё нужное.
Но я бы делал не так, а вот так:
Код
void foo(void) __attribute__ ((section(".init3"))) __attribute__ ((naked));
void foo(void)
{
все твои действия по специфической инициализации
}
Вот комментарии из стандартного линкерного скрипта - в каком init что делается в самой запускалке
Код
*(.init0) /* Start here after reset. */
*(.init1)
*(.init2) /* Clear __zero_reg__, set up stack pointer. */
*(.init3)
*(.init4) /* Initialize data and BSS. */
*(.init5)
*(.init6) /* C++ constructors. */
*(.init7)
*(.init8)
*(.init9) /* Call main(). */
Т.е.
в начале секции init0 в gcrt1.S стоит метка __init, на которую стоит jmp в нулевом адресе.
секция init9 состоит только jmp на main
В зависимости от нужды свои инициализации можно распихивать в разные секции - внутри каждой порядок зависит от порядка линковки файлов, но их порядок соблюдается (фактически вместе с секциями fini это то, что у борланд-С делается через #pragma startup/#pragma exit, номер секции - приоритет "вызова").
Ну а общие инициализации пусть делает gcrt1 - зачем самому переписывать, пусть там и немного.
Да, вдогонку - в init2 удобно пихать включение шины внешней памяти и настройку тактов ожидания, чтобы дальнейший код уже нормально работал с внешним ОЗУ.