Цитата(Dikoy @ Nov 23 2012, 15:26)

На другом форуме вот что сказали:
"Только вначале нужно сбросить флаг предыдущего прерывания, т.к. аппаратно он сбрасывается только командой RETI - иначе если приоритет этого выше, контроллер зациклится и переполнение стека"
Чушь какая-то: приоритеты, флаги...
Обычно так делаю:
Код
#pragma vector=TIMER0_OVF_vect
__interrupt void timer_1khz_isr(void)
{
unsigned char tmp_byte, new_byte;
TCCR0 = 0x00;
TIMSK &= ~(1 << TOIE0);
__enable_interrupt();
// обработка прерывания
// выход из прерывания
__disable_interrupt();
TIMSK |= (1 << TOIE0);
}
Цитата(Dikoy @ Nov 23 2012, 15:26)

В хелпе ИАРа никаких допдиректив для объявления прерывания не нашёл.
Есть кстати директива __nested (если не попутал чего):
Код
#pragma vector=TIMER0_OVF_vect
__interrupt __nested void timer_1khz_isr(void)
{
}
Цитата(Dikoy @ Nov 23 2012, 15:26)

Я про это:
Про это:
Код
#include <string.h>
#pragma segment="CSTACK"
#pragma segment="RSTACK"
unsigned char *dbg_ptr, *dbg_begin;
#pragma inline=forced
inline void FillStacks()
{
unsigned short stack_size;
// заполнение стека данных
stack_size=(unsigned char *)__segment_end("CSTACK")-(unsigned char *)__segment_begin("CSTACK");
memset(__segment_begin("CSTACK"), 'D', stack_size-10);
//// очистка стека возвратов
dbg_ptr=(unsigned char *)SP;
dbg_ptr-=6;
dbg_begin=(unsigned char *)__segment_begin("RSTACK");
// заполнение стека возвратов символом 'R'
memset(dbg_begin, 'R', dbg_ptr-dbg_begin);
}
__noreturn int main(void)
{
FillStacks();
while (1) {
}
}