diff --git a/raven_spn/raven_spn b/raven_spn/raven_spn index b473534..c363555 100755 Binary files a/raven_spn/raven_spn and b/raven_spn/raven_spn differ diff --git a/raven_spn/src/init.h b/raven_spn/src/init.h index fa4d3e7..0e10921 100644 --- a/raven_spn/src/init.h +++ b/raven_spn/src/init.h @@ -12,8 +12,8 @@ typedef void (*function_ptr_t) (void); //! Instance data for the PLIC. plic_instance_t g_plic; std::array g_ext_interrupt_handlers; -bool spn1_hw_interrupt{true}; -bool spn2_hw_interrupt{true}; +volatile bool spn1_hw_interrupt{true}; +volatile bool spn2_hw_interrupt{true}; /*! \brief external interrupt handler @@ -45,36 +45,40 @@ void configure_irq(size_t irq_num, function_ptr_t handler, unsigned char prio=1) } void wait_for_spn1_interrupt() { - // wait until HW is done - if(spn1_hw_interrupt) { - do{ - asm("wfi"); - asm("nop"); - }while(spn1_hw_interrupt); + clear_csr(mie, MIP_MEIP); + while(spn1_hw_interrupt) { + set_csr(mie, MIP_MEIP); + asm("wfi"); + clear_csr(mie, MIP_MEIP); + asm("nop"); } spn1_hw_interrupt=true; + set_csr(mie, MIP_MEIP); } void wait_for_spn2_interrupt() { - // wait until HW is done - if(spn2_hw_interrupt) { - do{ - asm("wfi"); - asm("nop"); - }while(spn2_hw_interrupt); + clear_csr(mie, MIP_MEIP); + while(spn2_hw_interrupt) { + set_csr(mie, MIP_MEIP); + asm("wfi"); + clear_csr(mie, MIP_MEIP); + asm("nop"); } spn2_hw_interrupt=true; + set_csr(mie, MIP_MEIP); } void wait_for_spn_interrupts() { - if(spn1_hw_interrupt || spn2_hw_interrupt) { - do{ - asm("wfi"); - asm("nop"); - }while(spn1_hw_interrupt || spn2_hw_interrupt); + clear_csr(mie, MIP_MEIP); + while(spn1_hw_interrupt || spn2_hw_interrupt) { + set_csr(mie, MIP_MEIP); + asm("wfi"); + asm("nop"); + clear_csr(mie, MIP_MEIP); } spn1_hw_interrupt=true; spn2_hw_interrupt=true; + set_csr(mie, MIP_MEIP); } /*!\brief initializes platform