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

时间:2017-11-21 10:10:10

标签: arm stm32 qemu cortex-m3

我有一个在qemu中运行的stm32(arm-cortexm3)固件,想要模拟一个hw中断,比如uart rx interrupt。如何让qemu跳转到我固件中实现的isr?

我已将isr放在向量表中的正确位置。 我已经在我的模拟uart中设置了irq编号。 但是当我调用qemu_set_irq()然后调用cpu_interrupt(& env,CPU_INTERRUPT_HARD)时, qemu中断但是以" hwerror中断,中断但没有向量"。

缺少一些东西。有谁知道这个?

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

2 个答案:

答案 0 :(得分:2)

您不应该自己调用cpu_interrupt()(它是QEMU的CPU模型代码中的内部函数,而不是从板或设备模型调用的函数)。 Arm M-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配置文件,我强烈建议您使用2.10或更高版本。我可以告诉你不是因为那个特定的错误信息是旧的和错误的代码的一部分。

答案 1 :(得分:0)

我相信您应该改用qemu_set_irq。