gpt4 book ai didi

c++ - 如何防止从中断例程中调用特定函数或方法?

转载 作者:行者123 更新时间:2023-12-02 01:44:29 26 4
gpt4 key购买 nike

在低级嵌入式开发中使用 C++(而不是将 C++ 处理为“具有一些额外功能的 C”)的一个障碍是由中断引起的。通常,在某些情况下,必须以单个 CPU 周期来测量时间,并且某些类在那里没有任何用途。隐式转换、复制构造函数和类似的东西在中断中使用时可能会导致问题,特别是当它们发生在幕后时。另一方面,一些精心设计的类可以在中断中有意义地使用。

这提出了一个问题:是否有一种优雅的方式来向编译器发出信号,指示特定的类、函数或变量(或只是代码行)在中断内使用时应抛出编译错误? (不必如此严重地依赖注释 //Never call this from an Interrupt!)

<子>(如果没有,尝试将这样的内容纳入下一个 C++ 标准是否有意义?我正在考虑诸如 constexpr 说明符如何告知编译器函数或变量可以做什么的事情或不能用于。nointerrupt 说明符是否有意义,或者是否已经存在提供该功能的东西?)

最佳答案

与主系统上下文(以及任务函数,如果您使用的是操作系统)一样,中断服务例程只是其他上下文。 运行哪些代码(类的子集的方法)这个问题与(类)库本身的技术正交。

RTOS 库经常对 ISR 中可以调用的 API 施加“限制”(或者在具有给定优先级的 ISR 中) - 但这些限制“仅”是为了维护数据一致性所需要的,而不是出于硬件技术原因而强加的µC 基础设施。

您希望将现有类库的使用限制在某些上下文中,因为某些类实现消耗的资源(时间、堆栈内存空间?)超出了您在 ISR 中所能承受的范围,但这是您的部署问题SW 项目架构中的决策。

因此,从我的角度来看,最优雅的解决方案是回到软件架构级别,创建一份简洁的文档(也许 UML 部署图可能已经对您有很大帮助),并指定其中您想要执行哪些代码的上下文。您可能会发现,在 ISR 上下文中,只有一小部分代码要执行,因此标记应该在 ISR 上下文中运行的类子集(或类方法的子集)可能是可行的自上而下的视角。您可以通过在专用共享内存区域中设置/重置 ISR 特定标志来启动/完成每个 ISR 来备份此过程,并将断言语句添加到关键类/方法中以检测特定代码是否在不需要的 ISR 中运行上下文。

关于c++ - 如何防止从中断例程中调用特定函数或方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55828031/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com