如何防止在中断例程中调用特定的函数或方法?

问题描述 投票:2回答:1

低级嵌入式开发中使用C ++的障碍(而不是将C ++当作具有一些额外功能的C来处理)是由中断引起的。通常情况下,必须在各个CPU周期中测量时间,并且某些类在那里没有业务使用。当在中断中使用隐式转换,复制构造函数和类似内容时,可能会引起问题,尤其是当它们发生在幕后时。另一方面,可以在中断中有意义地使用一些经过精心设计的类。

这提出了一个问题:是否有一种优雅的方法来向编译器发出信号,当在中断中使用特定的类,函数或变量(或只是代码行)时,该编译器会抛出编译错误? (不必过于依赖说明//Never call this from an interrupt!的评论)

((如果没有,尝试将类似的内容纳入下一个C ++标准?我在考虑类似constexpr说明符如何通知编译器可以使用或不能使用函数或变量的内容。 nointerrupt说明符是否有意义,或者是否已经存在提供该功能的东西?)

c++ embedded bare-metal
1个回答
0
投票

就像主系统上下文(和任务功能,如果使用的是OS)一样,中断服务例程只是其他上下文。问题要运行哪个代码(类的哪个子集的方法)与(类)库本身的技术正交。

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

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

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

© www.soinside.com 2019 - 2024. All rights reserved.