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

Posted

技术标签:

【中文标题】如何让qemu产生外部中断并跳转到isr(裸机代码)【英文标题】:How to make qemu generate external interrupt and jump to isr (bare metal code) 【发布时间】:2018-05-04 18:09:42 【问题描述】:

我有一个在 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 isr,但它没有发生。

这是正确的 nvic/irq 连接,还是缺少一些东西?

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

【问题讨论】:

你为什么不使用实际的硬件? 因为在 qemu 中进行模拟的重点在于您不必这样做。 【参考方案1】:

您不应该自己调用 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 配置板模型将具有执行此操作的代码。)

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

【讨论】:

谢谢,我会研究以后的版本。 好的,什么是“正确的接口”? 查看现有的 M 配置文件设备和板模型,但基本上设备只调用 qemu_set_irq(),并且因为板模型已将该线路连接到 NVIC,这是设备唯一需要做的事情做。 再次感谢,我已经开始工作了! nvic 工作完美!【参考方案2】:

我相信您应该改用 qemu_set_irq。

【讨论】:

以上是关于如何让qemu产生外部中断并跳转到isr(裸机代码)的主要内容,如果未能解决你的问题,请参考以下文章

js获取url 中的值,并跳转相应页面

单片机中void Timer0_isr(void) interrupt 1 using 1 怎么理解

从手机浏览器或者 APP 中跳转到微信并跳转到指定页原理及行业内幕详解

js判断手机访问并跳转到相应页面

推断client手机类型,并跳转到对应的app下载页面

toke过期失效 ---提示并跳转到登录页面