#bit-fields #bit #no-std #bitfields

no-std mju-bits

为u8、u16、u32和u64提供no_std类型化位字段访问

3个版本 (破坏性)

0.3.0 2020年1月3日
0.2.0 2020年1月2日
0.1.0 2020年1月2日

#703 in 嵌入式开发

Apache-2.0

17KB
281

mju-bits

#[no_std] 实现了针对 u8u16u32u64usize 的类型化位字段访问。

使用方法

use mju_bits::*;

struct RegisterMarker;
type Register = Storage<RegisterMarker, u32>;
type RegisterAll = BitField<Register, U0, U31>;
type RegisterFieldA = BitField<Register, U0, U7>;
type RegisterFieldB = BitField<Register, U8, U24>;

let mut reg = Register::new();
reg.set::<RegisterFieldA>(0x56);
reg.set::<RegisterFieldB>(0x1234);
assert_eq!(reg.get::<RegisterAll>(), 0x00123456);

Storage类型确保字段只能与其对应的存储一起使用。

例如,以下代码无法编译

use mju_bits::*;

struct FooMarker;
type Foo = Storage<FooMarker, u8>;
type FooField = BitField<Foo, U0, U1>;

struct BarMarker;
type Bar = Storage<BarMarker, u8>;

let bar = Bar::new();

// Compiler error: FooField can not be used with Bar storage.
bar.get::<FooField>();

路线图

  • 跨越多个原始类型的位字段
  • 支持函数式协议定义的BitFields的可迭代序列
  • 与nightly上的泛型常量兼容的实现
  • 改进类型以便支持更大的位字段 - 128位字段会破坏typenum
  • 其他呢?

变更日志

  • 0.3.0 - 移除 B0..B63 别名以避免与 typenum::B0typenum::B1 混淆
  • 0.2.0 - 文档和清理
  • 0.1.0 - 首次发布

依赖

~155KB