<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>04-静态保证 on 编程那些事儿</title><link>https://before80.github.io/prgms/Rust/embedded/static-guarantees/</link><description>Recent content in 04-静态保证 on 编程那些事儿</description><generator>Hugo</generator><language>zh-cn</language><lastBuildDate>Tue, 11 Aug 2026 23:57:44 +0800</lastBuildDate><atom:link href="https://before80.github.io/prgms/Rust/embedded/static-guarantees/index.xml" rel="self" type="application/rss+xml"/><item><title>01-类型状态编程</title><link>https://before80.github.io/prgms/Rust/embedded/static-guarantees/01-typestate-programming/</link><pubDate>Sat, 01 Aug 2026 10:38:00 +0800</pubDate><guid>https://before80.github.io/prgms/Rust/embedded/static-guarantees/01-typestate-programming/</guid><description>&lt;blockquote&gt;
&lt;p&gt;译文 · 基于 &lt;a href="https://doc.rust-lang.org/stable/embedded-book/"&gt;The Embedded Rust Book&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h1 id="typestate-programming"&gt;类型状态编程&lt;/h1&gt;
&lt;blockquote&gt;
&lt;p&gt;原文链接: &lt;a href="https://doc.rust-lang.org/stable/embedded-book/static-guarantees/typestate-programming.html"&gt;https://doc.rust-lang.org/stable/embedded-book/static-guarantees/typestate-programming.html&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;a href="https://en.wikipedia.org/wiki/Typestate_analysis"&gt;类型状态（typestate）&lt;/a&gt; 的概念是把关于对象当前状态的信息编码进该对象的类型中。虽然这听起来有点晦涩，但如果你在 Rust 中用过 &lt;a href="https://doc.rust-lang.org/1.0.0/style/ownership/builders.html"&gt;Builder Pattern&lt;/a&gt;，你就已经开始使用类型状态编程了！&lt;/p&gt;</description></item><item><title>02-作为状态机的外设</title><link>https://before80.github.io/prgms/Rust/embedded/static-guarantees/02-peripherals-as-state-machines/</link><pubDate>Sat, 01 Aug 2026 10:38:00 +0800</pubDate><guid>https://before80.github.io/prgms/Rust/embedded/static-guarantees/02-peripherals-as-state-machines/</guid><description>&lt;blockquote&gt;
&lt;p&gt;译文 · 基于 &lt;a href="https://doc.rust-lang.org/stable/embedded-book/"&gt;The Embedded Rust Book&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h1 id="peripherals-as-state-machines"&gt;作为状态机的外设&lt;/h1&gt;
&lt;blockquote&gt;
&lt;p&gt;原文链接: &lt;a href="https://doc.rust-lang.org/stable/embedded-book/static-guarantees/state-machines.html"&gt;https://doc.rust-lang.org/stable/embedded-book/static-guarantees/state-machines.html&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;微控制器的外设可以被看作一组状态机。例如，一个简化的 &lt;a href="https://en.wikipedia.org/wiki/General-purpose_input/output"&gt;GPIO 引脚&lt;/a&gt; 的配置可以表示为如下状态树：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Disabled（禁用）&lt;/li&gt;
&lt;li&gt;Enabled（启用）
&lt;ul&gt;
&lt;li&gt;Configured as Output（配置为输出）
&lt;ul&gt;
&lt;li&gt;Output: High（输出：高）&lt;/li&gt;
&lt;li&gt;Output: Low（输出：低）&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Configured as Input（配置为输入）
&lt;ul&gt;
&lt;li&gt;Input: High Resistance（输入：高阻）&lt;/li&gt;
&lt;li&gt;Input: Pulled Low（输入：下拉）&lt;/li&gt;
&lt;li&gt;Input: Pulled High（输入：上拉）&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;若外设从 &lt;code&gt;Disabled&lt;/code&gt; 模式开始，要移到 &lt;code&gt;Input: High Resistance&lt;/code&gt; 模式，必须执行以下步骤：&lt;/p&gt;</description></item><item><title>03-设计契约</title><link>https://before80.github.io/prgms/Rust/embedded/static-guarantees/03-design-contracts/</link><pubDate>Sat, 01 Aug 2026 10:38:00 +0800</pubDate><guid>https://before80.github.io/prgms/Rust/embedded/static-guarantees/03-design-contracts/</guid><description>&lt;blockquote&gt;
&lt;p&gt;译文 · 基于 &lt;a href="https://doc.rust-lang.org/stable/embedded-book/"&gt;The Embedded Rust Book&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h1 id="design-contracts"&gt;设计契约&lt;/h1&gt;
&lt;blockquote&gt;
&lt;p&gt;原文链接: &lt;a href="https://doc.rust-lang.org/stable/embedded-book/static-guarantees/design-contracts.html"&gt;https://doc.rust-lang.org/stable/embedded-book/static-guarantees/design-contracts.html&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;在上一章中，我们写了一个&lt;em&gt;没有&lt;/em&gt;强制执行设计契约的接口。让我们再看一眼假想的 GPIO 配置寄存器：&lt;/p&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th style="text-align: right"&gt;名称&lt;/th&gt;
 &lt;th style="text-align: right"&gt;位编号&lt;/th&gt;
 &lt;th style="text-align: right"&gt;值&lt;/th&gt;
 &lt;th style="text-align: right"&gt;含义&lt;/th&gt;
 &lt;th style="text-align: right"&gt;说明&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td style="text-align: right"&gt;enable&lt;/td&gt;
 &lt;td style="text-align: right"&gt;0&lt;/td&gt;
 &lt;td style="text-align: right"&gt;0&lt;/td&gt;
 &lt;td style="text-align: right"&gt;disabled&lt;/td&gt;
 &lt;td style="text-align: right"&gt;禁用 GPIO&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td style="text-align: right"&gt;&lt;/td&gt;
 &lt;td style="text-align: right"&gt;&lt;/td&gt;
 &lt;td style="text-align: right"&gt;1&lt;/td&gt;
 &lt;td style="text-align: right"&gt;enabled&lt;/td&gt;
 &lt;td style="text-align: right"&gt;启用 GPIO&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td style="text-align: right"&gt;direction&lt;/td&gt;
 &lt;td style="text-align: right"&gt;1&lt;/td&gt;
 &lt;td style="text-align: right"&gt;0&lt;/td&gt;
 &lt;td style="text-align: right"&gt;input&lt;/td&gt;
 &lt;td style="text-align: right"&gt;将方向设为输入&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td style="text-align: right"&gt;&lt;/td&gt;
 &lt;td style="text-align: right"&gt;&lt;/td&gt;
 &lt;td style="text-align: right"&gt;1&lt;/td&gt;
 &lt;td style="text-align: right"&gt;output&lt;/td&gt;
 &lt;td style="text-align: right"&gt;将方向设为输出&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td style="text-align: right"&gt;input_mode&lt;/td&gt;
 &lt;td style="text-align: right"&gt;2..3&lt;/td&gt;
 &lt;td style="text-align: right"&gt;00&lt;/td&gt;
 &lt;td style="text-align: right"&gt;hi-z&lt;/td&gt;
 &lt;td style="text-align: right"&gt;将输入设为高阻&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td style="text-align: right"&gt;&lt;/td&gt;
 &lt;td style="text-align: right"&gt;&lt;/td&gt;
 &lt;td style="text-align: right"&gt;01&lt;/td&gt;
 &lt;td style="text-align: right"&gt;pull-low&lt;/td&gt;
 &lt;td style="text-align: right"&gt;输入引脚下拉&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td style="text-align: right"&gt;&lt;/td&gt;
 &lt;td style="text-align: right"&gt;&lt;/td&gt;
 &lt;td style="text-align: right"&gt;10&lt;/td&gt;
 &lt;td style="text-align: right"&gt;pull-high&lt;/td&gt;
 &lt;td style="text-align: right"&gt;输入引脚上拉&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td style="text-align: right"&gt;&lt;/td&gt;
 &lt;td style="text-align: right"&gt;&lt;/td&gt;
 &lt;td style="text-align: right"&gt;11&lt;/td&gt;
 &lt;td style="text-align: right"&gt;n/a&lt;/td&gt;
 &lt;td style="text-align: right"&gt;无效状态，请勿设置&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td style="text-align: right"&gt;output_mode&lt;/td&gt;
 &lt;td style="text-align: right"&gt;4&lt;/td&gt;
 &lt;td style="text-align: right"&gt;0&lt;/td&gt;
 &lt;td style="text-align: right"&gt;set-low&lt;/td&gt;
 &lt;td style="text-align: right"&gt;输出引脚驱动为低&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td style="text-align: right"&gt;&lt;/td&gt;
 &lt;td style="text-align: right"&gt;&lt;/td&gt;
 &lt;td style="text-align: right"&gt;1&lt;/td&gt;
 &lt;td style="text-align: right"&gt;set-high&lt;/td&gt;
 &lt;td style="text-align: right"&gt;输出引脚驱动为高&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td style="text-align: right"&gt;input_status&lt;/td&gt;
 &lt;td style="text-align: right"&gt;5&lt;/td&gt;
 &lt;td style="text-align: right"&gt;x&lt;/td&gt;
 &lt;td style="text-align: right"&gt;in-val&lt;/td&gt;
 &lt;td style="text-align: right"&gt;输入 &amp;lt; 1.5v 时为 0，输入 &amp;gt;= 1.5v 时为 1&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;若我们改为在使用底层硬件前检查状态，在运行时强制执行设计契约，代码可能看起来像这样：&lt;/p&gt;</description></item><item><title>04-零成本抽象</title><link>https://before80.github.io/prgms/Rust/embedded/static-guarantees/04-zero-cost-abstractions/</link><pubDate>Sat, 01 Aug 2026 10:38:00 +0800</pubDate><guid>https://before80.github.io/prgms/Rust/embedded/static-guarantees/04-zero-cost-abstractions/</guid><description>&lt;blockquote&gt;
&lt;p&gt;译文 · 基于 &lt;a href="https://doc.rust-lang.org/stable/embedded-book/"&gt;The Embedded Rust Book&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h1 id="zero-cost-abstractions"&gt;零成本抽象&lt;/h1&gt;
&lt;blockquote&gt;
&lt;p&gt;原文链接: &lt;a href="https://doc.rust-lang.org/stable/embedded-book/static-guarantees/zero-cost-abstractions.html"&gt;https://doc.rust-lang.org/stable/embedded-book/static-guarantees/zero-cost-abstractions.html&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;类型状态也是零成本抽象（Zero Cost Abstractions）的绝佳例子 —— 即把某些行为移到编译期执行或分析的能力。这些类型状态不包含实际数据，而是用作标记。由于它们不含数据，在运行时内存中没有实际表示：&lt;/p&gt;</description></item></channel></rss>