我正在研究一些低级驱动程序,我想我会使用C++模板来增加趣味。
在 Verilog 中,您可以使用[h:l]
表示法定义位掩码,其中h
是高位,l
是低位。我已经为此定义了数据结构:
uint16_t mask(uint8_t h, uint8_t l) {
return h << 8 + l;
}
我想记住这些位掩码。假设我想修改寄存器 R 的位 [7:4],如果我事先已经在 R 中读取,我可以在写入之前修改 R 的旧值,而不是向我的设备发送新的读取请求。
要找到每个记忆所需的字节数,我已经有一个函数
constexpr uint8_t requiredBytes(uint16_t mask)
返回保持掩码所需的字节数。
有没有办法静态时间声明一个记忆缓冲区以便于分析?(这将在嵌入式平台上运行)
我假设我需要如下所示的管道:
template <uint16_t... masks>
(1) V
Apply requiredBytes() to each mask in the template
(2) V
Convert each value from requirdBytes to a type (requiredBytes() = 1 => uint8_t, ...)
(3) V
Convert this list of types into a std::tuple<>
我知道我可以使用一系列模板专用化进行转换 2,这导致了我的问题,我们如何实现转换 1 和 3?
我认为您的第 2 步(您描述为已经完成的交易)类似于
typename bytesType<n>::type
其中模板参数n
是字节数,这通过适当的专用化为您提供类型。如果是这样,那么这似乎是一个简单的包扩展:
template <uint16_t ...masks>
using tuple_mask=std::tuple<typename bytesType<requiredBytes(masks)>::type...>;
requiredBytes()
是一个 constexpr,这将提供参数bytesType
,这为您提供了类型。然后,打包扩展它,并将其输入到std::tuple
声明中。