如何让qemu产生外部中断并跳转到isr(裸机代码)

How to make qemu generate external interrupt and jump to isr (bare metal code)

我在 qemu 中有一个 stm32 (arm-cortexm3) 固件 运行 并且想模拟一个硬件中断,比如 uart rx 中断。我怎样才能让 qemu 跳转到我的固件中实现的 isr?

我已将 isr 放置在向量中的正确位置 table。 我已经在我的模拟 uart 中设置了 irq 号。 但是当我调用 qemu_set_irq() 然后调用 cpu_interrupt(&env, CPU_INTERRUPT_HARD) 时, qemu 中断但中止 "hwerror, interrupt but no vector".

有些东西不见了。有人知道吗?

编辑: 使用 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 设置启用寄存器中设置适当的位后,它就可以工作了!

您不应该自己调用 cpu_interrupt()(它是 QEMU CPU 模型代码中的一个内部函数,而不是要从电路板或设备模型中调用的函数)。 Arm M-profile CPU 有一个非常紧密集成的中断控制器(NVIC),在 QEMU 的仿真中它也与 CPU 紧密相连。你应该让你的板模型将 UART 的中断线连接到 NVIC,然后 NVIC 会负责告诉 CPU 需要采取哪个中断(基于中断优先级、屏蔽等)。您收到的错误消息是因为您对 cpu_interrupt() 的错误调用有效地告诉了该系统的一半(cpu)关于中断而不是另一半(NVIC)——所以当 cpu 向 NVIC 询问这个中断时,NVIC 说 "never heard of it" 并中止。如果您使用正确的接口来告知 NVIC 有关中断的信息,它将正常工作。 (现有的 QEMU M profile 板模型将具有执行此操作的代码。)

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

我认为您应该改用 qemu_set_irq。