Vova75 0 2 июня, 2009 Опубликовано 2 июня, 2009 · Жалоба При компиляции этого обработчика прерывания обнаружил глюк: #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" то код получается нормальный. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
aesok 0 3 июня, 2009 Опубликовано 3 июня, 2009 (изменено) · Жалоба При модификации __SP_H__ / __SP_L__ прерывение не запрещается. Если применить устаревшый метод декларации "INTERRUPT" то код получается нормальный. Спасибо что сообщили о этой ошибке. Пока используйте INTERRUPT(..) вместо ISR(..., ISR_NOBLOCK). Я открыл Bug Report для avr-libc, статус этого бага Вы можете посмотреть здесь: https://savannah.nongnu.org/bugs/?26734 Анатоли. Изменено 3 июня, 2009 пользователем aesok Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться