首页 > 解决方案 > 在并发环境中访问 MMIO 的软件模式

问题描述

我正在寻找一种最好在 C/C++ 中的软件模式,如何在并发环境中安全地访问 ARM Cortex-M 等微控制器中的 MMIO 外设 - 中断和主/线程(在操作系统的情况下)。

问题的根源是每个外围设备都将其寄存器声明为全局变量(结构/类)。这意味着任何人都可以访问它们(是的,有 MPU 和 MMU 之类的功能,但它们不是答案)。

为了限制他们的范围,我正在寻找一种软件模式。最接近的是 Singleton(尽管它不是并发编程的最佳选择)。

当我使外围设备成为单例时,我可以安全地睡觉,至少通过外围设备提供的 API,代码的其他部分都不会修改它。

但是,这一直有效,直到我需要中断为止。至少在 Cortex-M 上,中断是由外设生成的,并通过嵌套向量中断控制器向 CPU 发送信号。CPU 停止执行当前指令并获取中断处理程序。

在处理程序内部,我需要在外围设备中设置一些位以停用中断源,否则中断仍将处于挂起状态,离开后我将一次又一次地执行它。

艰难,感谢单例模式,我现在可以创建死锁,因为我可能无法访问。

有没有可以帮助我的软件模式?

标签: c++cconcurrency

解决方案


您的考虑是错误的,因为您将 uC 视为具有操作系统的计算机,用户可以在其中运行许多程序。

这不是这里的情况。

这意味着任何人都可以访问它们

那人是谁?它只是你的程序而已。你写的。你修改它。如果你不相信自己到这个水平 - 最好放弃 uC 开发。甚至 RTOS-es 也与大型计算机操作系统不同。RTOS 是您的应用程序的一部分 - 编译并链接在一起。

所以不要重新发明轮子。


推荐阅读