Цитата(Сергей Борщ @ Feb 6 2008, 12:56)

Ну, почитать описание на avr-libc надо было.
Код
void low_level_init() __attribute__((__naked__)) __attribute__((section(".init3")));
void low_level_init()
{
}
А ещё лучше так:
Код
/*-- INIT_CODE(number) --------------------------------------------------
* Макрос для занесення коду в секції .init#number
*
* Наприклад:
* INIT_CODE(1)
* {
* MCUCR = (1 << SRE);
* XMCRA = (4 << SRL0) | (0 << SRW00);
* XMCRB = (1 << XMBK);
* }
*
* розподіл секцій для avr-gcc:
* .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().
*
*/
#define INIT_CODE_N(_number_,_name_)\
static void init##_name_ (void) __attribute__ ((section(".init" #_number_), naked, used));\
static void init##_name_ (void)
#define _INIT_CODE(n,l) INIT_CODE_N(n,l)
#define INIT_CODE(_number_) _INIT_CODE(_number_,__LINE__)
xelax, avr-gcc позволяет иметь сколько угодно этих "low level init" - хоть по нескольку штук на файл (удобно - достаточно просто прилинковать модуль UART и он сам проинициализирует всё, что ему нужно), причём в разные места относительно работы запускалки - секции .init1, .init3, .init5, .init7, .init8 отданы пользователю. "функции" в секциях .init* не вызываются! они линкуются друг за дружкой без call/ret.
У меня довольно популярна секция .init5 - уже стек и все переменные проинициализированы, но конструкторы ещё не начали работать.