6 个版本 (重大变更)
0.6.0 | 2020年9月28日 |
---|---|
0.5.0 | 2020年9月8日 |
0.4.0 | 2020年8月26日 |
0.3.0 | 2020年8月16日 |
0.1.0 | 2020年8月4日 |
#1624 in 嵌入式开发
在 2 crate中使用
15KB
101 行
embedded-error
用于嵌入式系统的通用特定错误类型集合
什么是 embedded-error
?
embedded-error
应运而生,以满足在嵌入式系统上运行的应用程序对通用但特定的“错误”类型的需求。
与在服务器或桌面电脑上运行的常规应用程序不同,嵌入式系统通常没有用户或监控其输出的管理进程;大多数系统甚至没有可以用来显示错误的显示屏。相反,应用程序必须能够识别任何已发出的错误,以便适当地处理它们。
还需要注意的是,许多错误类型并不是致命的,而是用来在外围设备或连接到外围设备的应用程序之间进行通信的一种方式。因此,通常没有必要将 Err
情况视为全面致命的事件,停止或重启应用程序,这在无法区分错误类型的情况下可能是这种情况,例如,因为错误类型是特定实现的且不适用于不同的硬件。
embedded-error
致力于收集所有可能的错误类型,按照外围设备进行分组,并将它们作为 non-exhaustive
枚举提供,类似于 std::io::ErrorKind
所做的那样。
这允许驱动程序使用定义良好的错误类型,以及应用程序和通用驱动程序可以通用地处理典型的“错误”。
如何使用 embedded-error
使用方法简单明了
- 在您的
Cargo.toml
中声明对embedded-error
的使用
embedded-error = "*"
- 如果您是
embedded-hal
特性的实现者,请在您的实现中定义适当的error
作为关联的Error
类型,例如。
impl WriteRead for I2c
{
type Error = embedded_error::I2cError;
...
- 如果您正在实现一个独立的驱动程序或函数,只需在
Result
中使用它即可,例如:
pub fn new(spi: &mut SPI) -> Result<Self, embedded_error::SpiError>
并通过 ? 操作符返回或传递适当的错误。4. 作为(嵌入式)应用程序编写者,要处理错误,您只需匹配它。请注意,由于错误声明为
non_exhaustive
,您将始终需要与通配符匹配以处理未来添加的未处理或错误情况。Rust 编译器会告诉您是否操作不当。下面是一个例子:
use embedded_error::I2cError;
match i2c.write(addr, &[]) {
Err(I2cError::NACK) => { writeln!(out, "No device on address {}", addr).ok(); },
Ok(_) => { writeln!(out, "Found device on address {}", addr).ok(); },
_ => { writeln!(out, "Ohoh, the device is on fire, let's reboot".ok(); reboot(); },
}
请参阅嵌入式错误文档以获取详细信息。
当前支持的错误类型
目前我们支持以下外围设备
- GPIO
- I2C
- MCI(多媒体卡接口)
- SPI
- 串行
- USB
- 通用实现错误
如何贡献?
感谢您对贡献这项工作的兴趣!贡献就像在嵌入式错误存储库上创建一个拉取请求(PR)一样简单。所有新增内容都必须包含适当的文档字符串;因此,通常不需要解释PR的动机。如果我们有任何疑问或担忧,我们会联系您,否则您的PR将被批准。
目标是发布频繁的版本,这些版本将是向前兼容的,因此只有补丁号会改变,每个人都可以立即受益。如果我们忘记发布,而您希望有一个版本,请联系我们或打开一个问题。
许可协议
许可协议为以下之一:
- Apache License,版本 2.0(《LICENSE-APACHE》或http://www.apache.org/licenses/LICENSE-2.0)
- MIT 许可协议(《LICENSE-MIT》或http://opensource.org/licenses/MIT)
由您选择。
贡献
除非您明确说明,否则根据 Apache-2.0 许可协议定义,您有意提交以包含在作品中并由您创建的所有贡献,将根据上述许可协议双许可,不附加任何其他条款或条件。