Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Startup файл в WinAVR
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > AVR
EugeNNe
В CCV можно использовать свой Startup-файл, который исполняется перед функцией main{}.
Вопрос: как проделать такое же в WinAVR ввиду необходимости произвести дополнительные
процедуры (очистка и тестирование ОЗУ) перед исполнением основной программы ??????
ReAl
Цитата(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 удобно пихать включение шины внешней памяти и настройку тактов ожидания, чтобы дальнейший код уже нормально работал с внешним ОЗУ.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.