Skip to content

Commit dd79f41

Browse files
committed
reorder check to ensure that flag is allowed to be raised within ISR, but no nested IRQs occur
1 parent a3c405d commit dd79f41

File tree

1 file changed

+10
-8
lines changed

1 file changed

+10
-8
lines changed

simavr/sim/sim_interrupts.c

Lines changed: 10 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)