Commit 33c05fb002222858d4fc18f7175324d9e738dae5
authorJakob Gruber <jakob.gruber@gmail.com>
Tue, 31 Jul 2012 10:43:46 +0000 (12:43 +0200)
committerJakob Gruber <jakob.gruber@gmail.com>
Tue, 31 Jul 2012 11:08:25 +0000 (13:08 +0200)
If set, the raise bit is not cleared in avr_clear_interrupt. This
corresponds to the hardware not clearing the interrupt flag when
executing the interrupt routine.

The only known example of this is the TWI Interrupt Flag TWINT.

2 files changed:
simavr/sim/sim_interrupts.c
simavr/sim/sim_interrupts.h

index e84bf7d1003641fd2e43dc890bdd1d6425399c1a..f76375e0a7eeb76a4848d2fda46c772cb2bf1784 100644 (file)
@@ -138,7 +138,7 @@ avr_clear_interrupt(
                printf("%s cleared %d\n", __FUNCTION__, vector->vector);
        vector->pending = 0;
        avr_raise_irq(&vector->irq, 0);
-       if (vector->raised.reg)
+       if (vector->raised.reg && !vector->raise_sticky)
                avr_regbit_clear(avr, vector->raised);
 }
 
index 148b28c6c0334a3128818d5e1bec1d62f59f2d0a..2e86882ef14d2ed6177c024085ae7b4736a39701 100644 (file)
@@ -37,7 +37,9 @@ typedef struct avr_int_vector_t {
 
        avr_irq_t               irq;                    // raised to 1 when queued, to zero when called
        uint8_t                 pending : 1,    // 1 while scheduled in the fifo
-                                       trace : 1;              // only for debug of a vector
+                                       trace : 1,              // only for debug of a vector
+                                       raise_sticky : 1;       // 1 if the interrupt flag (= the raised regbit) is not cleared
+                                                                               // by the hardware when executing the interrupt routine (see TWINT)
 } avr_int_vector_t;
 
 // interrupt vectors, and their enable/clear registers