/* check the IRQ lines for pending interrupts */ void m6800_cpu_device::CHECK_IRQ_LINES() { // TODO: IS3 interrupt if (m_nmi_pending) { if(m_wai_state & M6800_SLP) m_wai_state &= ~M6800_SLP; m_nmi_pending = FALSE; enter_interrupt("M6800 '%s' take NMI\n",0xfffc); } else { if( m_irq_state[M6800_IRQ_LINE] != CLEAR_LINE ) { /* standard IRQ */ if(m_wai_state & M6800_SLP) m_wai_state &= ~M6800_SLP; if( !(CC & 0x10) ) { enter_interrupt("M6800 '%s' take IRQ1\n",0xfff8); standard_irq_callback(M6800_IRQ_LINE); } } else if( !(CC & 0x10) ) m6800_check_irq2(); } }
void USART3_IRQHandler() { __IO int i; __IO u32_t sr; int need_sched = 0; enter_interrupt(); sr = USART3->SR; if( sr & (1L<<5)) //rxne { i = USART3->DR; } if( sr & (1L<<6)) //txe { if(u3_send.sending.val) { need_sched = uart3_send_next(); } else { USART_ClearITPendingBit(USART3, USART_IT_TC); } } exit_interrupt(need_sched); }
void USART1_IRQHandler() { __IO u32_t sr; uint8_t data; int need_sched = 0; enter_interrupt(); sr = USART1->SR; #if UART1_USE_DMA if(handle_uart1_rcv()) need_sched = 1; #else if( sr & (1L<<5)) //rxne { data = USART1->DR; uart0_read_data(&data, 1); } if( sr & (1L<<6)) //txe { if(u1_send.sending.val) { need_sched = uart1_send_next(); } else { USART_ClearITPendingBit(USART1, USART_IT_TC); } } #endif exit_interrupt(need_sched); }
void DMA2_Stream7_IRQHandler() //发送中断 { uint32_t irq_flag; enter_interrupt(); DMA_Cmd(DMA2_Stream7, DISABLE); NVIC_DisableIRQ(DMA2_Stream7_IRQn); irq_flag = local_irq_save(); if(DMA_GetFlagStatus(DMA2_Stream7, DMA_FLAG_TEIF7)) { p_err("uart dma err"); } DMA_ITConfig(DMA2_Stream7, DMA_IT_TC | DMA_IT_TE | DMA_IT_HT,DISABLE); DMA_ClearFlag(DMA2_Stream7, DMA_FLAG_TCIF7 | DMA_FLAG_TEIF7 | DMA_FLAG_HTIF7 | DMA_FLAG_DMEIF7 | DMA_FLAG_HTIF7); u1_send.cnt = DMA2_Stream7->NDTR; //取剩余字数,应该为0 local_irq_restore(irq_flag); USART_DMACmd(USART1, USART_DMAReq_Tx, DISABLE); p_dbg("u_send irq\n"); wake_up(u1_send.wait); //唤醒等待线程 exit_interrupt(1); }
//extern led_scan(void); void SysTick_Handler (void) { static int cnt = 0; enter_interrupt(); tick_ms++; // led_scan(); if(cnt++ >= 10) { jiffies++; cnt = 0; OSTimeTick(); /* Call uC/OS-II's OSTimeTick() */ exit_interrupt(1); return; } exit_interrupt(0); }
void USBH_OTG_ISR_Handler() { USB_OTG_GINTSTS_TypeDef gintsts; uint32_t retval = 0; USB_OTG_CORE_HANDLE *pdev = &USB_OTG_Core; enter_interrupt(); gintsts.d32 = USB_OTG_READ_REG32(&pdev->regs.GREGS->GINTSTS); gintsts.d32 &= USB_OTG_READ_REG32(&pdev->regs.GREGS->GINTMSK); if (!gintsts.d32) { exit_interrupt(0); return ; } if (gintsts.b.rxstsqlvl) { gintsts.b.rxstsqlvl = 0; USB_OTG_USBH_handle_rx_qlvl_ISR(pdev); } if (gintsts.b.nptxfempty) { gintsts.b.nptxfempty = 0; USB_OTG_USBH_handle_nptxfempty_ISR(pdev); } if (gintsts.b.hcintr) { gintsts.b.hcintr = 0; retval = USB_OTG_USBH_handle_hc_ISR(pdev); } if (!gintsts.d32) goto end; if (gintsts.b.sofintr) { USB_OTG_USBH_handle_sof_ISR(pdev); } if (gintsts.b.ptxfempty) { USB_OTG_USBH_handle_ptxfempty_ISR(pdev); } if (gintsts.b.portintr) { USB_OTG_USBH_handle_port_ISR(pdev); } if (gintsts.b.disconnect) { USB_OTG_USBH_handle_Disconnect_ISR(pdev); } if (gintsts.b.incomplisoout) { USB_OTG_USBH_handle_IncompletePeriodicXfer_ISR(pdev); } if (gintsts.b.datafsusp) { } end: exit_interrupt(retval); }