Перейти к содержанию
    

WinAVR-20090313, ошибка в прологе/эпилоге при использовании ISR(xxx_vect, ISR_NOBLOCK)

При компиляции этого обработчика прерывания обнаружил глюк:

 

#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" то код получается нормальный.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

При модификации __SP_H__ / __SP_L__ прерывение не запрещается.

Если применить устаревшый метод декларации "INTERRUPT" то код получается нормальный.

 

Спасибо что сообщили о этой ошибке.

 

Пока используйте INTERRUPT(..) вместо ISR(..., ISR_NOBLOCK).

 

Я открыл Bug Report для avr-libc, статус этого бага Вы можете посмотреть здесь:

https://savannah.nongnu.org/bugs/?26734

 

Анатоли.

Изменено пользователем aesok

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...