【问题标题】:how to build a simple lock (mutex) on nios II cpu如何在 nios II cpu 上构建一个简单的锁(互斥锁)
【发布时间】:2015-11-24 05:25:11
【问题描述】:

我正在尝试使用 altera DE0 或 DE2 或 DE1-SoC 板为大学课程构建一个简单的视频游戏,我查看了 nios II cpu 的 ISA ISA 中没有原子测试和设置指令.我将如何在这里建立一个简单的锁,任何在一小段时间内强制互斥的东西都会起作用。

我们将拥有从main() 运行的代码和将在中断服务例程中运行的代码,我想锁定一些变量,这可能吗?

【问题讨论】:

    标签: c assembly intel-fpga nios


    【解决方案1】:

    Nios II 架构似乎没有原子测试和设置指令。为了在多个 Nios II 处理器之间同步共享资源,该架构使用“硬件互斥内核”。它用作提供原子测试和测试操作的共享外围设备。您可以在Altera's Creating Multiprocessor Nios II Systems Tutorial 阅读更多相关信息。

    但是,您可能不会进行原子测试和设置操作。只需禁用中断,您就可以使任何指令序列相对于单核系统上的中断成为原子指令。

    【讨论】:

    • 事实上,互斥锁并不保护任务和ISR。您必须执行 cli/sti。互斥锁仅适用于核心到核心。如果使用 ISR 的多核:cli,lock,do stuff,unlock,sti
    • 嗯,是的,暂时禁用中断而不是锁定应该可以解决我的问题。但我不明白为什么互斥锁不能在任务和 ISR 之间工作,请你再解释一下。
    • @user2567411 考虑以下序列:task does lock(), does stuff, ISR interrupts, ISR does lock() and is blocked: deadlock! 弱替代方案:task does lock(), ..., ISR interrupts, does trylock() [which fails], ISR exits, task does unlock(), ISR interrupts again, does trylock() [which succeeds], does stuff, does unlock(), ISR returns 请注意,trylock() 会测试锁,但如果无法获得它不会阻塞。它返回 1=锁定,0=失败。
    • 嗯,是的,我在检查之前就想到了 ISR 甚至不能等待很短的时间,因为在单核机器上,只要它正在运行,main() 就无法释放锁,但是弱版本可以工作,如果 ISR 有幂等的事情要做,它可以尝试这样做,如果不可能,则返回并等待下一个中断重试。但在我的情况下,假设我可以在项目中途以这种幂等操作完成所有事情,风险太大。我只是要使用禁用/启用中断作为锁
    猜你喜欢
    • 2017-02-14
    • 2018-05-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-16
    • 1970-01-01
    • 1970-01-01
    • 2011-02-14
    相关资源
    最近更新 更多