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); } }
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); }