Skip to content

Commit

Permalink
reorder check to ensure that flag is allowed to be raised within ISR,…
Browse files Browse the repository at this point in the history
… but no nested IRQs occur
  • Loading branch information
Tam Do committed Jul 21, 2018
1 parent a3c405d commit dd79f41
Showing 1 changed file with 10 additions and 8 deletions.
18 changes: 10 additions & 8 deletions simavr/sim/sim_interrupts.c
Original file line number Diff line number Diff line change
Expand Up @@ -115,23 +115,25 @@ avr_raise_interrupt(
if (!vector || !vector->vector)
return 0;

if (vector->pending) {
if (vector->trace)
printf("IRQ%d:I=%d already raised (enabled %d) (cycle %lld pc 0x%x)\n",
vector->vector, !!avr->sreg[S_I], avr_regbit_get(avr, vector->enable),
(long long int)avr->cycle, avr->pc);
// no return - polling ISR within interrupt allowed
}

if (vector->trace)
printf("IRQ%d raising (enabled %d)\n",
vector->vector, avr_regbit_get(avr, vector->enable));

// always mark the 'raised' flag to one, even if the interrupt is disabled
// this allow "polling" for the "raised" flag, like for non-interrupt
// driven UART and so so. These flags are often "write one to clear"
if (vector->raised.reg)
avr_regbit_set(avr, vector->raised);

if (vector->pending) {
if (vector->trace)
printf("IRQ%d:I=%d already raised (enabled %d) (cycle %lld pc 0x%x)\n",
vector->vector, !!avr->sreg[S_I], avr_regbit_get(avr, vector->enable),
(long long int)avr->cycle, avr->pc);

return 0;
}

avr_raise_irq(vector->irq + AVR_INT_IRQ_PENDING, 1);
avr_raise_irq(avr->interrupts.irq + AVR_INT_IRQ_PENDING, 1);

Expand Down

0 comments on commit dd79f41

Please sign in to comment.