如何防止从中断程序中调用特定函数或方法?

3
在低级别的嵌入式开发中,使用C++(而不是将C++视为“带有一些额外功能的C语言”)面临的一个障碍是中断。通常存在一些情况需要测量单个CPU周期的时间,并且一些类在那里没有任何用处。隐式转换、复制构造函数和类似的东西在中断中使用时可能会导致问题,特别是如果它们在幕后发生。另一方面,一些经过精心设计的类可以在中断中有意义地使用。
这引出了一个问题:是否有一种优雅的方法来向编译器发信号,指示特定的类、函数或变量(或仅仅是代码行)在中断中使用时应该抛出编译错误?(以避免过度依赖注释,例如//从中断中永远不要调用此项!
(如果没有,尝试将类似于此项添加到下一个C++标准中是否有意义?我想到的是像constexpr限定符那样,可以告诉编译器一个函数或变量可以或不能用于什么目的。会不会出现nointerrupt限定符这样的东西有意义,或者是否已经存在提供这种功能的东西?)

6
我怀疑它会被接受为关键字标准。似乎是一个过于特定的语言特性,不足以证明其价值。但你可以考虑一对属性。比如说 [[is_isr]] 用于描述程序,而 [[isr_safe]] 则用于(成员)函数自身的文档说明。然后进行静态分析就可以了。 - StoryTeller - Unslander Monica
1
C和C++都没有中断的概念,因此这个特性不能真正进入C++标准。但是,您可以创建一些针对clang-tidy或类似工具的lint,以检查在某些函数内部仅进行特定调用列表。 - Dan M.
2
@StoryTeller [[isr_safe]] 听起来很有前途。 - πάντα ῥεῖ
2
@DanM。嗯,正如StoryTeller已经提到的那样,我认为我们已经讨论了超出标准的内容,但属性可能是解决问题的好方法。嵌入式(裸机)编程已经需要一些超出C++标准的特殊东西。 - πάντα ῥεῖ
2
如果它真的起作用,这似乎是编译器#pragma的完美用例,因为a)它确实不属于C++标准,b)它确实会是特定于编译器的(即使最终结果几乎总是相同的生成代码)。 话虽如此,正如Clifford指出的那样,问题在于这可能会提供一种虚假的安全感,因为诸如函数指针和链接器符号之类的东西意味着您可能仍然可以绕过此保护。 如果像这样的事情是我的最大问题的那一天,那么我就可以退休了。 - Dan
显示剩余21条评论
1个回答

0

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

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

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

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接