Цитата(ig_z @ May 5 2006, 04:40)

Цитата(dxp @ May 4 2006, 16:23)

...Но тут, имхо, трудность в том, что переход надо делать не на любую функцию, а на функцию-обработчик - чтобы компилятор (благодаря __interrupt) понял, что это не простая функция и сохранял используемые ресурсы, как положено в обработчике прерываний. Можно, конечно, наобъявлять функций с квалификатором __interrupt без указания вектора, а потом подставлять их адреса. Но предупреждений он насыпет, что тоже некузяво. Предупреждения можно подавить, но кузявее от этого не становится.

Не удержался и проверил. Ни одного предупреждения. После двух недель безрезультатного траха с иаровской реализацией шаблонов - просто не верится.
Дейсвительно, текущая версия (у меня 3.30) под MSP430 молча глотает __interrupt без указания вектора, что, имхо, нехорошо - грабли скрытые. А вот под AVR (4.12) как положено:
Код
> Compile : "main.cpp"
__interrupt void Timer1_period_ISR()
^
"D:\slon\2\EWAVR_V4\Src\main.cpp",224 Warning[Ta006]: Interrupt function has no assigned vector.
Т.ч. по-любому способ как минимум не переносимый даже в пределах компиляторов одного производителя. Имхо, выдача предупреждения на отсутствие вектора - есть правильно, т.к. защищает от хоть и несложных, но досадных граблей.
Цитата(condor @ May 5 2006, 06:11)

Я делаю так:
Код
void port2_int_func1 (void)
{
//Первый обработчик
}
void port2_int_func2 (void)
{
//Второй обработчик
}
void (*port2_int_handler)(void) = port2_int_func1;
//-----------------------------------
#pragma vector = PORT2_VECTOR
//-----------------------------------
__interrupt void port2_int(void)
{
(*port2_int_handler)();
}
А дальше port2_int_handler можно присваивать указатель на любую функцию.
И никаких предупреждений.
Правда задержка вызова прерывания увеличивается с 6 до 8 тактов.
В этом случае получаете дополнительное сохранение части контекста - компилятор будет сохранять все scratch регистры даже если какие-то из них не используются. На MSP430 здесь оверхед небольшой, т.к. таких регистров мало. А вот на других платформах уже не так радостно - на том же AVR сохраняться будет почти половина (из 32) регистров. Т.ч. оверхед по-любому.