Skip to content

Commit b3a8e8f

Browse files
authored
Merge pull request #301 from aznoohwee/bugfix/polling-flag-within-isr
allow polling interrupt flag within ISR
2 parents b3e5922 + dd79f41 commit b3a8e8f

File tree

1 file changed

+11
-7
lines changed

1 file changed

+11
-7
lines changed

simavr/sim/sim_interrupts.c

Lines changed: 11 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -114,22 +114,26 @@ avr_raise_interrupt(
114114
{
115115
if (!vector || !vector->vector)
116116
return 0;
117-
if (vector->pending) {
118-
if (vector->trace)
119-
printf("IRQ%d:I=%d already raised (enabled %d) (cycle %lld pc 0x%x)\n",
120-
vector->vector, !!avr->sreg[S_I], avr_regbit_get(avr, vector->enable),
121-
(long long int)avr->cycle, avr->pc);
122-
return 0;
123-
}
117+
124118
if (vector->trace)
125119
printf("IRQ%d raising (enabled %d)\n",
126120
vector->vector, avr_regbit_get(avr, vector->enable));
121+
127122
// always mark the 'raised' flag to one, even if the interrupt is disabled
128123
// this allow "polling" for the "raised" flag, like for non-interrupt
129124
// driven UART and so so. These flags are often "write one to clear"
130125
if (vector->raised.reg)
131126
avr_regbit_set(avr, vector->raised);
132127

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+
133137
avr_raise_irq(vector->irq + AVR_INT_IRQ_PENDING, 1);
134138
avr_raise_irq(avr->interrupts.irq + AVR_INT_IRQ_PENDING, 1);
135139

0 commit comments

Comments
 (0)