@@ -115,23 +115,25 @@ avr_raise_interrupt(
115115 if (!vector || !vector -> vector )
116116 return 0 ;
117117
118- if (vector -> pending ) {
119- if (vector -> trace )
120- printf ("IRQ%d:I=%d already raised (enabled %d) (cycle %lld pc 0x%x)\n" ,
121- vector -> vector , !!avr -> sreg [S_I ], avr_regbit_get (avr , vector -> enable ),
122- (long long int )avr -> cycle , avr -> pc );
123- // no return - polling ISR within interrupt allowed
124- }
125-
126118 if (vector -> trace )
127119 printf ("IRQ%d raising (enabled %d)\n" ,
128120 vector -> vector , avr_regbit_get (avr , vector -> enable ));
121+
129122 // always mark the 'raised' flag to one, even if the interrupt is disabled
130123 // this allow "polling" for the "raised" flag, like for non-interrupt
131124 // driven UART and so so. These flags are often "write one to clear"
132125 if (vector -> raised .reg )
133126 avr_regbit_set (avr , vector -> raised );
134127
128+ if (vector -> pending ) {
129+ if (vector -> trace )
130+ printf ("IRQ%d:I=%d already raised (enabled %d) (cycle %lld pc 0x%x)\n" ,
131+ vector -> vector , !!avr -> sreg [S_I ], avr_regbit_get (avr , vector -> enable ),
132+ (long long int )avr -> cycle , avr -> pc );
133+
134+ return 0 ;
135+ }
136+
135137 avr_raise_irq (vector -> irq + AVR_INT_IRQ_PENDING , 1 );
136138 avr_raise_irq (avr -> interrupts .irq + AVR_INT_IRQ_PENDING , 1 );
137139
0 commit comments