TEMPLATE_InterruptHandler
void TEMPLATED_InterruptHandler::handleIRQ(IntID id)
{
	// write here to make sure that the event come in order
	if(id == _intm->standardIntID(StandardInterruptType::PROCESS_TIMER))//el1 physical timer interrupt
	{
		_intm->endInterrupt(ExceptionType::IRQ,id);
		schedule();
	}else if(id == _intm->standardIntID(StandardInterruptType::INPUT)){
//		kout << INFO << "handle INPUT\n";
//		_intm->enableInterrupt(id,false);
		// DOCME 这里“提前结束”和“处理完毕再结束”两种处理逻辑对输入有很大的影响
		//       在QEMU上,如果采用“处理完毕再结束”这种模型,则至多能接受34个字符,即多余的字符被丢弃
		//         由此可能导致换行符没有被正确接收到。(注:单字符模式至多接受34个字符,FIFO模式可能接受50+,但是
		//         仍然受限制。)
		//       “提前结束”这种模型能够接收更多的字符(满足一般的需求),对于输入程序的体验改善显著。
		//     猜测原因:handleInputEvent()程序耗费一定的时间,在这段时间内,如果不提前结束中断状态,则额外的字符可能
		//     被丢弃。但是真正的原因仍有待查询。  TODO 找出真正的原因。
		// TESTME  尚未在真机上测试。测试方法:分别注释其中的一者,然后输入 abc..xyz * 3,如果程序没有响应,证明
		//         重现了问题。一般而言,第二个模型出现问题的概率基本是100%,第一个基本不出现(不保证不出现)。
		_intm->endInterrupt(ExceptionType::IRQ,id); // 提前结束
		handleInputEvent();
//		_intm->endInterrupt(ExceptionType::IRQ,id); // 处理完毕再结束
//		_intm->enableInterrupt(id,true);
	}else{ // others
		kout << INFO << "unhandled irq id=" << id<<"\n";
		_intm->endInterrupt(ExceptionType::IRQ,id);
	}
}
Exemplo n.º 2
0
void QtWebPageEventHandler::doneWithTouchEvent(const NativeWebTouchEvent& event, bool wasEventHandled)
{
    if (wasEventHandled || event.type() == WebEvent::TouchCancel) {
        m_panGestureRecognizer.cancel();
        m_pinchGestureRecognizer.cancel();
        if (event.type() != WebEvent::TouchMove)
            m_tapGestureRecognizer.cancel();
        return;
    }

    const QTouchEvent* ev = event.nativeEvent();

    handleInputEvent(ev);
}