При компиляции этого обработчика прерывания обнаружил глюк:
Код
#include "string.h"
u08 tt[44];
ISR(INT0_vect,ISR_NOBLOCK)
//INTERRUPT(INT0_vect)
{
u08 ss[44];
memcpy(tt, ss, 44);
}
на выходе:
511 .global __vector_1
513 __vector_1:
514 .LFB3:
515 .LM43:
516 02e8 7894 sei
517 02ea 1F92 push __zero_reg__
518 02ec 0F92 push r0
519 02ee 0FB6 in r0,__SREG__
520 02f0 0F92 push r0
521 02f2 0BB6 in r0,91-32
522 02f4 0F92 push r0
523 02f6 1124 clr __zero_reg__
524 02f8 8F93 push r24
525 02fa AF93 push r26
526 02fc BF93 push r27
527 02fe EF93 push r30
GAS LISTING C:\DOCUME~1\user\LOCALS~1\Temp/ccUV7KxR.s page 10
528 0300 FF93 push r31
529 0302 DF93 push r29
530 0304 CF93 push r28
531 0306 CDB7 in r28,__SP_L__
532 0308 DEB7 in r29,__SP_H__
533 030a AC97 sbiw r28,44
534 030c DEBF out __SP_H__,r29
535 030e CDBF out __SP_L__,r28
536 /* prologue: Interrupt */
537 /* frame size = 44 */
538 .LM44:
539 0310 A0E0 ldi r26,lo8(tt)
540 0312 B0E0 ldi r27,hi8(tt)
541 0314 FE01 movw r30,r28
542 0316 3196 adiw r30,1
543 0318 8CE2 ldi r24,lo8(44)
544 .L30:
545 031a 0190 ld r0,Z+
546 031c 0D92 st X+,r0
547 031e 8150 subi r24,lo8(-(-1))
548 0320 01F4 brne .L30
549 /* epilogue start */
550 .LM45:
551 0322 AC96 adiw r28,44
552 0324 DEBF out __SP_H__,r29
553 0326 CDBF out __SP_L__,r28
554 0328 CF91 pop r28
555 032a DF91 pop r29
556 032c FF91 pop r31
557 032e EF91 pop r30
558 0330 BF91 pop r27
559 0332 AF91 pop r26
560 0334 8F91 pop r24
561 0336 0F90 pop r0
562 0338 0BBE out 91-32,r0
563 033a 0F90 pop r0
564 033c 0FBE out __SREG__,r0
565 033e 0F90 pop r0
566 0340 1F90 pop __zero_reg__
567 0342 1895 reti
При модификации __SP_H__ / __SP_L__ прерывение не запрещается.
Если применить устаревшый метод декларации "INTERRUPT" то код получается нормальный.