c++ - 在并发环境中访问 MMIO 的软件模式
问题描述
我正在寻找一种最好在 C/C++ 中的软件模式,如何在并发环境中安全地访问 ARM Cortex-M 等微控制器中的 MMIO 外设 - 中断和主/线程(在操作系统的情况下)。
问题的根源是每个外围设备都将其寄存器声明为全局变量(结构/类)。这意味着任何人都可以访问它们(是的,有 MPU 和 MMU 之类的功能,但它们不是答案)。
为了限制他们的范围,我正在寻找一种软件模式。最接近的是 Singleton(尽管它不是并发编程的最佳选择)。
当我使外围设备成为单例时,我可以安全地睡觉,至少通过外围设备提供的 API,代码的其他部分都不会修改它。
但是,这一直有效,直到我需要中断为止。至少在 Cortex-M 上,中断是由外设生成的,并通过嵌套向量中断控制器向 CPU 发送信号。CPU 停止执行当前指令并获取中断处理程序。
在处理程序内部,我需要在外围设备中设置一些位以停用中断源,否则中断仍将处于挂起状态,离开后我将一次又一次地执行它。
艰难,感谢单例模式,我现在可以创建死锁,因为我可能无法访问。
有没有可以帮助我的软件模式?
解决方案
您的考虑是错误的,因为您将 uC 视为具有操作系统的计算机,用户可以在其中运行许多程序。
这不是这里的情况。
这意味着任何人都可以访问它们
那人是谁?它只是你的程序而已。你写的。你修改它。如果你不相信自己到这个水平 - 最好放弃 uC 开发。甚至 RTOS-es 也与大型计算机操作系统不同。RTOS 是您的应用程序的一部分 - 编译并链接在一起。
所以不要重新发明轮子。
推荐阅读
- angular - 为什么动态创建的(SVG)矩形组件只出现在 DOM 中而不出现在视图中?
- php - Cakephp 从 3.6.16 升级到 4.2 rector 命令不起作用 bin/cake upgrade rector --rules phpunit80 C:\Apache24\htdocs\Techno\tests
- javascript - 访问函数外的 JSON response.status (Axios)
- python - a[:,:,0] 和 a[:][:][0] 之间的差异
- c# - 将鼠标指针移到原始图像上时如何找到它所属的文件?
- amazon-web-services - 如何在 AWS Athena 中用 0 填充空值
- git - 拉分支后Git子模块更新
- cockroachdb - CockroachDB:为什么删除速度会随着时间的推移而变慢?
- linux - cURL 命令适用于 linux 但不适用于 windows
- java - 从 ip Java 获取主机名