【发布时间】:2017-07-19 15:30:00
【问题描述】:
我正在为基于 Cortex-M4 的 C++ 微控制器开发软件。我有很多高度依赖机器的代码(驱动程序等)。而且我有更高级别的代码,它通过直接使用驱动程序密切依赖于低级代码。示例:低级部分是例如。一个硬件专用的UART驱动程序,高级部分是基于UART的通信协议。 (此软件运行在“裸机”上,即下面没有操作系统。)
此代码目前是紧密耦合的,因此不可单元测试。
我想让它可测试。
所以我想我会创建一个低级部分的抽象,并使高级部分只依赖于抽象。然后我可以创建单元测试将使用的抽象的模拟,以及将在微控制器上运行的真实实现。
- 这是正确的方法吗?
- 如何创建这样的抽象?
大多数sourcesI've found 强烈反对在嵌入式系统中使用继承和virtual函数。还有什么其他方法?
所以,总而言之,我想创建一个硬件抽象层 (HAL),但我想问怎么做?我应该在 C++ 中使用virtual 继承,还是有其他更好的方法?
【问题讨论】:
-
您建议的抽象将是一个硬件抽象层,这并不罕见,事实上完全可以。您将在每个 HAL 上定义接口并实现它们。对于 Mocks,您只需实现该接口并提供所需的行为。
-
如果你不想虚拟化,你仍然可以有两个实现。由于您永远不会同时需要两者,请指示您的工具链构建并链接正确的实现。
-
@Samer Tufail:除了性能影响之外,通常的论点是,通过使用函数指针,调用图不再是静态的。因此,在安全关键型系统中很难呈现静态工具辅助证明,例如最大堆栈使用率和分支覆盖率。
-
@doynax:这是一个安全的关键系统吗?如果是,那么您将遇到一系列不同的问题,并且动态内存排在首位。
-
@Samer Tufail:当然。不过,我对 OPs 应用程序一无所知。
标签: c++ unit-testing embedded abstraction