Цитата(Огурцов @ Sep 9 2008, 10:26)

Или есть более прямой путь объяснить компилятору, чтобы он проинициализровал определенный вектор адресом произвольной функции ?
Написать ее на ассемблере. Или написать обычную функцию uint16_t GetSerial() { return 0xffff; } и на ассемблере поставить JMP на нее в нужный вектор. Или поместить эту функцию в отдельную секцию, а секцию разместить по известному адресу, не обязательно на вектора, можно и в конце загрузчика. Я делаю именно так. Ну если хочется на вектора, то вот так:
Код
#define VERSION 12345
ISR(SIG_####, ISR_NAKED)
{
asm volatile ("\n\t"
"LDI r24, %A0 \n\t"
"LDI r25, %B0 \n\t"
"RET \n\t"
:
:"i" ((uint16_t)VERSION)
:r23,r24
)
}
Но я бы к векторам не пристраивался - мало ли потом переделаете загрузчик и вектора понадобятся. Обычные функции гибче:
Код
uint16_t GetVersion() __attribute__((section(".get_version")));
uint16_t GetVersion() { return VERSION; }
или так:
int16_t GetVersion() __attribute__((section(".get_version")));
uint16_t GetVersion()
{
uint16_t Version;
asm volatile ("\n\t"
"LDI %A0, %A1 \n\t"
"LDI %B0, %B1 \n\t"
"RET \n\t"
:"=r"(Version)
:"i" ((uint16_t)VERSION)
)
return version;
}