Arm 如何使qemu生成外部中断并跳转到isr(裸机代码)

Arm 如何使qemu生成外部中断并跳转到isr(裸机代码),arm,stm32,qemu,cortex-m3,Arm,Stm32,Qemu,Cortex M3,我有一个在qemu中运行的stm32(arm-cortexm3)固件,希望模拟硬件中断,比如uart rx中断。如何使qemu跳转到固件中实现的isr 我已将isr放置在向量表中的正确位置。 我已经在模拟uart中设置了irq号。 但是当我调用qemu_set_irq()和cpu_interrupt(&env,cpu_interrupt_HARD)时, qemu中断,但以“HWMERROR,中断,但无矢量”中止 有些东西不见了。有人知道这件事吗 编辑: 使用qemu-stable-2.10 nv

我有一个在qemu中运行的stm32(arm-cortexm3)固件,希望模拟硬件中断,比如uart rx中断。如何使qemu跳转到固件中实现的isr

我已将isr放置在向量表中的正确位置。 我已经在模拟uart中设置了irq号。 但是当我调用qemu_set_irq()和cpu_interrupt(&env,cpu_interrupt_HARD)时, qemu中断,但以“HWMERROR,中断,但无矢量”中止

有些东西不见了。有人知道这件事吗

编辑: 使用qemu-stable-2.10

nvic = armv7m_init(system_memory, flash_size, NUM_IRQ_LINES, kernel_filename, cpu_model);
qemu_irq uart_irq = qdev_get_gpio_in(nvic, 1);
uart = sysbus_create_simple(TYPE_VCPU_UART, 0x40020000, uart_irq);
如果我以后这样做:

qemu_set_irq(uart_irq ,1);
我希望跳转到uart isr,但没有发生

这是nvic/irq的正确连接,还是缺少了更多

EDIT2 我意识到我没有在固件代码中启用中断!哎呀!
在NVIC Set Enable寄存器中设置正确的位后,它就可以工作了

您不应该自己调用cpu_interrupt()(它是QEMU的cpu模型代码中的一个内部函数,而不是从板或设备模型调用的函数)。ARMM-profile CPU有一个非常紧密集成的中断控制器(NVIC),在QEMU的仿真中,它也与CPU紧密连接。您应该让您的板模型将UART的中断线连接到NVIC,然后NVIC将负责告诉CPU需要进行哪种中断(基于中断优先级、屏蔽等)。您收到的错误消息是因为您对cpu_interrupt()的错误调用实际上是在告诉此系统的一半(cpu)有关中断,而不是另一半(NVIC)——因此,当cpu向NVIC询问此中断时,NVIC会说“从未听说过”并中止。如果您使用适当的接口告知NVIC中断,它将正常工作。(现有的QEMU M配置文件板模型将具有执行此操作的代码。)


重要提示:在QEMU 2.9中,M配置文件中断处理被显著重写,因为在此之前它有很多错误,我们在2.10中修复了一些与异常相关的错误。如果您使用的是M profile,我强烈建议您使用2.10或更高版本。我可以告诉你不是,因为那个特定的错误消息是旧的错误代码的一部分。

我认为你应该使用qemu\u set\u irq

谢谢,我将研究更高版本。好的,“合适的接口”是什么?看看现有的M配置文件设备和板模型,但基本上设备只调用qemu_set_irq(),因为板模型已将该线路连接到NVIC,这是设备唯一需要做的事情。再次感谢,我现在已经让它工作了!nvic工作完美!为什么不使用实际的硬件呢?因为在qemu中进行仿真的关键是您不必这样做。