如何让qemu生成外部中断并跳转到中断服务程序(裸机代码)

4
我在qemu中运行着一个stm32(arm-cortexm3)固件,并且想要模拟一个硬件中断,比如uart rx中断。我该如何让qemu跳转到我固件中实现的中断服务函数(isr)?
我已经将isr放置在向量表的正确位置。 我已经在我的模拟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中断服务程序,但实际上并没有发生。
这是NVIC/IRQ正确连接吗?还是还有其他东西缺失?
编辑2: 我意识到在固件代码中我没有启用中断!糟糕! 在设置NVIC使能寄存器中的正确位之后,它正常工作了!

为什么不使用实际的硬件? - 0___________
因为在qemu中模拟的整个重点就是你不必这样做。 - Martin
2个回答

3
您不应该自己调用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 profile板卡模型将有执行此操作的代码。)
重要提示:M profile中断处理在QEMU 2.9中进行了重大改写,因为在那之前它相当有缺陷,我们在2.10中修复了更多的异常相关错误。如果您正在使用M profile,我强烈建议使用2.10或更高版本。我可以告诉您,因为特定的错误消息是旧代码中的一部分而且有缺陷。

谢谢,我会查看后续版本。 - user2479653
好的,什么是“适当的接口”? - user2479653
看看现有的M型设备和板模型,但基本上设备只是调用qemu_set_irq()函数,因为板模型已经将该线连接到NVIC,所以设备只需要做这件事。 - Peter Maydell
1
谢谢,我现在已经让它正常工作了!nvic完美运行! - user2479653

0

我认为您应该使用qemu_set_irq。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接