реклама на сайте
подробности

 
 
 
Reply to this topicStart new topic
> Startup файл в WinAVR
EugeNNe
сообщение Apr 1 2006, 11:12
Сообщение #1


Местный
***

Группа: Участник
Сообщений: 424
Регистрация: 6-03-06
Из: Н.Новгород
Пользователь №: 14 997



В CCV можно использовать свой Startup-файл, который исполняется перед функцией main{}.
Вопрос: как проделать такое же в WinAVR ввиду необходимости произвести дополнительные
процедуры (очистка и тестирование ОЗУ) перед исполнением основной программы ??????
Go to the top of the page
 
+Quote Post
ReAl
сообщение Apr 1 2006, 11:45
Сообщение #2


Нечётный пользователь.
******

Группа: Свой
Сообщений: 2 033
Регистрация: 26-05-05
Из: Бровари, Україна
Пользователь №: 5 417



Цитата(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 удобно пихать включение шины внешней памяти и настройку тактов ожидания, чтобы дальнейший код уже нормально работал с внешним ОЗУ.


--------------------
Ну, я пошёл… Если что – звоните…
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 18th July 2025 - 11:15
Рейтинг@Mail.ru


Страница сгенерированна за 0.01345 секунд с 7
ELECTRONIX ©2004-2016