在嵌入式项目中工作时,您经常为硬件资源(如UART(或串行端口))编写驱动程序。一个微控制器可以有多个不同的硬件UART示例(有时也有专门的,比如USARTS)。
我正在寻找一种模式,允许创建驱动程序的多个示例,以便您可以使用不同的硬件外围设备,同时保证只有一个对象“连接”或“代表”物理设备。
以UART1、UART2、UART3、USART4和USART5为例,是否有方法允许:
auto uart1 = UartDriver(UART1, ...);
auto uart2 = UartDriver(UART2, ...);
auto usart4= UsartDriver(USART4, ...);
// later in the code
auto another_instance = UartDriver(UART1, ...); // should not compile
由于资源有限,我无法使用异常。
2条答案
按热度按时间jfgube3f1#
除非所有对象都是静态示例化的,否则阻止编译在运行时示例化对象的代码可能是不可能的,即使这样,我也怀疑任何解决方案的实用性。
然而,资源使用的运行时检查是直接的。例如,在outline中:
t9aqgxwy2#
虽然我不太愿意建议将此作为解决问题的方法,但有一种方法可以构建一个值元组,使所有设备都具有不同的类型,并进行编译时检查。它使用了C++ 11的特性:
首先,我定义了一个递归可变参数模板,它使用
std::is_same
检查参数包中的第一个类型是否与所有其他类型不同:一旦你有了这个,你就可以有一个
alldiffs
predicate trait,它确保所有类型对都是不同的(算法是二次的,但在编译时):最后,你可以实现一个基本上是元组的数据结构,但是使用
static_assert
,所有类型都是不同的:例如: