<?xml version="1.0" encoding="UTF-8"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
    <title>Sarmad Gulzar</title>
    <subtitle>Software engineer. Writing about Python, developer tools, and building things for the web.</subtitle>
    <link rel="self" type="application/atom+xml" href="https://sarmadgulzar.com/atom.xml"/>
    <link rel="alternate" type="text/html" href="https://sarmadgulzar.com"/>
    <generator uri="https://www.getzola.org/">Zola</generator>
    <updated>2026-07-07T00:00:00+00:00</updated>
    <id>https://sarmadgulzar.com/atom.xml</id>
    <entry xml:lang="en">
        <title>This site now runs on Zola</title>
        <published>2026-07-07T00:00:00+00:00</published>
        <updated>2026-07-07T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Unknown
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://sarmadgulzar.com/blog/this-site-now-runs-on-zola/"/>
        <id>https://sarmadgulzar.com/blog/this-site-now-runs-on-zola/</id>
        
        <content type="html" xml:base="https://sarmadgulzar.com/blog/this-site-now-runs-on-zola/">&lt;p&gt;Every few years I rebuild my website, and every few years I swear it’s the last time. This is that time, again.&lt;&#x2F;p&gt;
&lt;p&gt;The new stack is &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.getzola.org&quot;&gt;Zola&lt;&#x2F;a&gt; — a static site generator that ships as a single binary. No &lt;code&gt;node_modules&lt;&#x2F;code&gt;, no plugin ecosystem to babysit, no build pipeline that quietly rots while I’m not looking. You write Markdown, it emits HTML, and the whole site builds in a few milliseconds.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;what-i-optimized-for&quot;&gt;What I optimized for&lt;&#x2F;h2&gt;
&lt;p&gt;A short list, in order:&lt;&#x2F;p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Reading.&lt;&#x2F;strong&gt; Text set in a proper serif, a measure around 70 characters, generous line height. Nothing competes with the words.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Speed.&lt;&#x2F;strong&gt; There is no JavaScript on this site. Fonts are self-hosted. A post is one HTML file and one stylesheet.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Longevity.&lt;&#x2F;strong&gt; Content is Markdown files in a git repo. If Zola disappears tomorrow, the writing survives untouched.&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;p&gt;Dark mode follows your system preference — no toggle, no flash, no cookie remembering your choice, because there’s no choice to remember.&lt;&#x2F;p&gt;
&lt;hr &#x2F;&gt;
&lt;p&gt;If you want the details: the fonts are &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;fonts.google.com&#x2F;specimen&#x2F;Newsreader&quot;&gt;Newsreader&lt;&#x2F;a&gt; for prose and IBM Plex Mono for dates and code, syntax highlighting is done at build time by Zola’s built-in highlighter, and the feed lives at &lt;a href=&quot;&#x2F;atom.xml&quot;&gt;&#x2F;atom.xml&lt;&#x2F;a&gt; if RSS is your thing. It usually is, for the right people.&lt;&#x2F;p&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>Two things at once: Embassy tasks</title>
        <published>2026-06-30T00:00:00+00:00</published>
        <updated>2026-06-30T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Unknown
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://sarmadgulzar.com/series/xiao-ble-embassy/embassy-tasks/"/>
        <id>https://sarmadgulzar.com/series/xiao-ble-embassy/embassy-tasks/</id>
        
        <content type="html" xml:base="https://sarmadgulzar.com/series/xiao-ble-embassy/embassy-tasks/">&lt;p&gt;Part three left us with a program that sleeps beautifully but can only wait for one thing. The fix is to give each independent job its own task: one watches the button, one blinks a heartbeat LED, and the executor interleaves them. The code is &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;sarmadgulzar&#x2F;xiao-ble-embassy&#x2F;tree&#x2F;main&#x2F;crates&#x2F;03-digital-input-async-multitask&quot;&gt;&lt;code&gt;crates&#x2F;03-digital-input-async-multitask&lt;&#x2F;code&gt;&lt;&#x2F;a&gt;:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#3C3836, #EBDBB2); background-color: light-dark(#FBF1C7, #282828);&quot;&gt;&lt;code data-lang=&quot;rust&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#7C6F64, #A89984);&quot;&gt;#&lt;&#x2F;span&gt;&lt;span&gt;!&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#7C6F64, #A89984);&quot;&gt;[&lt;&#x2F;span&gt;&lt;span&gt;no_std&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#7C6F64, #A89984);&quot;&gt;]&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#7C6F64, #A89984);&quot;&gt;#&lt;&#x2F;span&gt;&lt;span&gt;!&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#7C6F64, #A89984);&quot;&gt;[&lt;&#x2F;span&gt;&lt;span&gt;no_main&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#7C6F64, #A89984);&quot;&gt;]&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#9D0006, #FB4934);&quot;&gt;use&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#B57614, #FABD2F);&quot;&gt; defmt&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#427B58, #8EC07C);&quot;&gt;::&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#7C6F64, #A89984);&quot;&gt;{&lt;&#x2F;span&gt;&lt;span&gt;info&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#7C6F64, #A89984);&quot;&gt;,&lt;&#x2F;span&gt;&lt;span&gt; unwrap&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#7C6F64, #A89984);&quot;&gt;}&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#7C6F64, #A89984);&quot;&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#9D0006, #FB4934);&quot;&gt;use&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#B57614, #FABD2F);&quot;&gt; embassy_nrf&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#427B58, #8EC07C);&quot;&gt;::&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#B57614, #FABD2F);&quot;&gt;gpio&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#427B58, #8EC07C);&quot;&gt;::&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#7C6F64, #A89984);&quot;&gt;{&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#B57614, #FABD2F);&quot;&gt;Input&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#7C6F64, #A89984);&quot;&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#B57614, #FABD2F);&quot;&gt; Level&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#7C6F64, #A89984);&quot;&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#B57614, #FABD2F);&quot;&gt; Output&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#7C6F64, #A89984);&quot;&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#B57614, #FABD2F);&quot;&gt; OutputDrive&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#7C6F64, #A89984);&quot;&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#B57614, #FABD2F);&quot;&gt; Pull&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#7C6F64, #A89984);&quot;&gt;}&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#7C6F64, #A89984);&quot;&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#9D0006, #FB4934);&quot;&gt;use&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#B57614, #FABD2F);&quot;&gt; embassy_time&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#427B58, #8EC07C);&quot;&gt;::&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#B57614, #FABD2F);&quot;&gt;Timer&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#7C6F64, #A89984);&quot;&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#9D0006, #FB4934);&quot;&gt;use&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#7C6F64, #A89984);&quot;&gt; {&lt;&#x2F;span&gt;&lt;span&gt;defmt_rtt &lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#9D0006, #FB4934);&quot;&gt;as&lt;&#x2F;span&gt;&lt;span&gt; _&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#7C6F64, #A89984);&quot;&gt;,&lt;&#x2F;span&gt;&lt;span&gt; panic_probe &lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#9D0006, #FB4934);&quot;&gt;as&lt;&#x2F;span&gt;&lt;span&gt; _&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#7C6F64, #A89984);&quot;&gt;}&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#7C6F64, #A89984);&quot;&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#7C6F64, #A89984);&quot;&gt;#&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#7C6F64, #A89984);&quot;&gt;[&lt;&#x2F;span&gt;&lt;span&gt;embassy_executor&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#427B58, #8EC07C);&quot;&gt;::&lt;&#x2F;span&gt;&lt;span&gt;task&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#7C6F64, #A89984);&quot;&gt;]&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#9D0006, #FB4934);&quot;&gt;async&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#9D0006, #FB4934);&quot;&gt; fn&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#B57614, #FABD2F);&quot;&gt; button_task&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#7C6F64, #A89984);&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#AF3A03, #FE8019);&quot;&gt;mut&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#076678, #83A598);&quot;&gt; button&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#427B58, #8EC07C);&quot;&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#B57614, #FABD2F);&quot;&gt; Input&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#7C6F64, #A89984);&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#7C6F64, #A89984);&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#B57614, #FABD2F);&quot;&gt;static&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#7C6F64, #A89984);&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#7C6F64, #A89984);&quot;&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#AF3A03, #FE8019);&quot;&gt; mut&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#076678, #83A598);&quot;&gt; red_led&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#427B58, #8EC07C);&quot;&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#B57614, #FABD2F);&quot;&gt; Output&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#7C6F64, #A89984);&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#7C6F64, #A89984);&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#B57614, #FABD2F);&quot;&gt;static&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#7C6F64, #A89984);&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#7C6F64, #A89984);&quot;&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#7C6F64, #A89984);&quot;&gt; {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#9D0006, #FB4934);&quot;&gt;    loop&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#7C6F64, #A89984);&quot;&gt; {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#076678, #83A598);&quot;&gt;        button&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#427B58, #8EC07C);&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#B57614, #FABD2F);&quot;&gt;wait_for_low&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#7C6F64, #A89984);&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#7C6F64, #A89984);&quot;&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#427B58, #8EC07C);&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#9D0006, #FB4934);&quot;&gt;await&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#7C6F64, #A89984);&quot;&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#076678, #83A598);&quot;&gt;        red_led&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#427B58, #8EC07C);&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#B57614, #FABD2F);&quot;&gt;set_low&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#7C6F64, #A89984);&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#7C6F64, #A89984);&quot;&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#7C6F64, #A89984);&quot;&gt;;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#928374, #928374);font-style: italic;&quot;&gt; &#x2F;&#x2F;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#928374, #928374);font-style: italic;&quot;&gt; Red LED ON&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#B57614, #FABD2F);&quot;&gt;        info!&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#7C6F64, #A89984);&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#7C6F64, #A89984);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#79740E, #B8BB26);&quot;&gt;Button pressed!&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#7C6F64, #A89984);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#7C6F64, #A89984);&quot;&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#7C6F64, #A89984);&quot;&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#076678, #83A598);&quot;&gt;        button&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#427B58, #8EC07C);&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#B57614, #FABD2F);&quot;&gt;wait_for_high&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#7C6F64, #A89984);&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#7C6F64, #A89984);&quot;&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#427B58, #8EC07C);&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#9D0006, #FB4934);&quot;&gt;await&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#7C6F64, #A89984);&quot;&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#076678, #83A598);&quot;&gt;        red_led&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#427B58, #8EC07C);&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#B57614, #FABD2F);&quot;&gt;set_high&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#7C6F64, #A89984);&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#7C6F64, #A89984);&quot;&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#7C6F64, #A89984);&quot;&gt;;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#928374, #928374);font-style: italic;&quot;&gt; &#x2F;&#x2F;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#928374, #928374);font-style: italic;&quot;&gt; Red LED OFF&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#B57614, #FABD2F);&quot;&gt;        info!&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#7C6F64, #A89984);&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#7C6F64, #A89984);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#79740E, #B8BB26);&quot;&gt;Button released!&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#7C6F64, #A89984);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#7C6F64, #A89984);&quot;&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#7C6F64, #A89984);&quot;&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#7C6F64, #A89984);&quot;&gt;    }&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#7C6F64, #A89984);&quot;&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#7C6F64, #A89984);&quot;&gt;#&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#7C6F64, #A89984);&quot;&gt;[&lt;&#x2F;span&gt;&lt;span&gt;embassy_executor&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#427B58, #8EC07C);&quot;&gt;::&lt;&#x2F;span&gt;&lt;span&gt;main&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#7C6F64, #A89984);&quot;&gt;]&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#9D0006, #FB4934);&quot;&gt;async&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#9D0006, #FB4934);&quot;&gt; fn&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#B57614, #FABD2F);&quot;&gt; main&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#7C6F64, #A89984);&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#076678, #83A598);&quot;&gt;spawner&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#427B58, #8EC07C);&quot;&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#B57614, #FABD2F);&quot;&gt; embassy_executor&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#427B58, #8EC07C);&quot;&gt;::&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#B57614, #FABD2F);&quot;&gt;Spawner&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#7C6F64, #A89984);&quot;&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#7C6F64, #A89984);&quot;&gt; {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#AF3A03, #FE8019);&quot;&gt;    let&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#076678, #83A598);&quot;&gt; p&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#427B58, #8EC07C);&quot;&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#B57614, #FABD2F);&quot;&gt; embassy_nrf&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#427B58, #8EC07C);&quot;&gt;::&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#B57614, #FABD2F);&quot;&gt;init&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#7C6F64, #A89984);&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#B57614, #FABD2F);&quot;&gt;Default&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#427B58, #8EC07C);&quot;&gt;::&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#B57614, #FABD2F);&quot;&gt;default&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#7C6F64, #A89984);&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#7C6F64, #A89984);&quot;&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#7C6F64, #A89984);&quot;&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#7C6F64, #A89984);&quot;&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#B57614, #FABD2F);&quot;&gt;    info!&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#7C6F64, #A89984);&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#7C6F64, #A89984);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#79740E, #B8BB26);&quot;&gt;Initializing the onboard Red LED...&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#7C6F64, #A89984);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#7C6F64, #A89984);&quot;&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#7C6F64, #A89984);&quot;&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#AF3A03, #FE8019);&quot;&gt;    let&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#076678, #83A598);&quot;&gt; onboard_red&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#427B58, #8EC07C);&quot;&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#B57614, #FABD2F);&quot;&gt; Output&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#427B58, #8EC07C);&quot;&gt;::&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#B57614, #FABD2F);&quot;&gt;new&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#7C6F64, #A89984);&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#076678, #83A598);&quot;&gt;p&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#427B58, #8EC07C);&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#B57614, #FABD2F);&quot;&gt;P0_26&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#7C6F64, #A89984);&quot;&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#B57614, #FABD2F);&quot;&gt; Level&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#427B58, #8EC07C);&quot;&gt;::&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#B57614, #FABD2F);&quot;&gt;High&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#7C6F64, #A89984);&quot;&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#B57614, #FABD2F);&quot;&gt; OutputDrive&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#427B58, #8EC07C);&quot;&gt;::&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#B57614, #FABD2F);&quot;&gt;Standard&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#7C6F64, #A89984);&quot;&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#7C6F64, #A89984);&quot;&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#B57614, #FABD2F);&quot;&gt;    info!&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#7C6F64, #A89984);&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#7C6F64, #A89984);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#79740E, #B8BB26);&quot;&gt;Initializing the heartbeat LED...&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#7C6F64, #A89984);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#7C6F64, #A89984);&quot;&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#7C6F64, #A89984);&quot;&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#AF3A03, #FE8019);&quot;&gt;    let&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#AF3A03, #FE8019);&quot;&gt; mut&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#076678, #83A598);&quot;&gt; heartbeat&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#427B58, #8EC07C);&quot;&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#B57614, #FABD2F);&quot;&gt; Output&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#427B58, #8EC07C);&quot;&gt;::&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#B57614, #FABD2F);&quot;&gt;new&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#7C6F64, #A89984);&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#076678, #83A598);&quot;&gt;p&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#427B58, #8EC07C);&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#B57614, #FABD2F);&quot;&gt;P0_02&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#7C6F64, #A89984);&quot;&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#B57614, #FABD2F);&quot;&gt; Level&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#427B58, #8EC07C);&quot;&gt;::&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#B57614, #FABD2F);&quot;&gt;Low&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#7C6F64, #A89984);&quot;&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#B57614, #FABD2F);&quot;&gt; OutputDrive&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#427B58, #8EC07C);&quot;&gt;::&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#B57614, #FABD2F);&quot;&gt;Standard&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#7C6F64, #A89984);&quot;&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#7C6F64, #A89984);&quot;&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#B57614, #FABD2F);&quot;&gt;    info!&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#7C6F64, #A89984);&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#7C6F64, #A89984);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#79740E, #B8BB26);&quot;&gt;Initializing the button...&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#7C6F64, #A89984);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#7C6F64, #A89984);&quot;&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#7C6F64, #A89984);&quot;&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#AF3A03, #FE8019);&quot;&gt;    let&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#076678, #83A598);&quot;&gt; button&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#427B58, #8EC07C);&quot;&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#B57614, #FABD2F);&quot;&gt; Input&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#427B58, #8EC07C);&quot;&gt;::&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#B57614, #FABD2F);&quot;&gt;new&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#7C6F64, #A89984);&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#076678, #83A598);&quot;&gt;p&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#427B58, #8EC07C);&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#B57614, #FABD2F);&quot;&gt;P0_03&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#7C6F64, #A89984);&quot;&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#B57614, #FABD2F);&quot;&gt; Pull&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#427B58, #8EC07C);&quot;&gt;::&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#B57614, #FABD2F);&quot;&gt;Up&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#7C6F64, #A89984);&quot;&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#7C6F64, #A89984);&quot;&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#928374, #928374);font-style: italic;&quot;&gt;    &#x2F;&#x2F;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#928374, #928374);font-style: italic;&quot;&gt; Move ownership of the button and red LED into another task.&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#076678, #83A598);&quot;&gt;    spawner&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#427B58, #8EC07C);&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#B57614, #FABD2F);&quot;&gt;spawn&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#7C6F64, #A89984);&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#B57614, #FABD2F);&quot;&gt;unwrap!&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#7C6F64, #A89984);&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#B57614, #FABD2F);&quot;&gt;button_task&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#7C6F64, #A89984);&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#076678, #83A598);&quot;&gt;button&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#7C6F64, #A89984);&quot;&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#076678, #83A598);&quot;&gt; onboard_red&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#7C6F64, #A89984);&quot;&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#7C6F64, #A89984);&quot;&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#7C6F64, #A89984);&quot;&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#7C6F64, #A89984);&quot;&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#9D0006, #FB4934);&quot;&gt;    loop&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#7C6F64, #A89984);&quot;&gt; {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#076678, #83A598);&quot;&gt;        heartbeat&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#427B58, #8EC07C);&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#B57614, #FABD2F);&quot;&gt;toggle&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#7C6F64, #A89984);&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#7C6F64, #A89984);&quot;&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#7C6F64, #A89984);&quot;&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#B57614, #FABD2F);&quot;&gt;        info!&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#7C6F64, #A89984);&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#7C6F64, #A89984);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#79740E, #B8BB26);&quot;&gt;Heartbeat: &lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#7C6F64, #A89984);&quot;&gt;{&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#7C6F64, #A89984);&quot;&gt;}&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#7C6F64, #A89984);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#7C6F64, #A89984);&quot;&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#076678, #83A598);&quot;&gt; heartbeat&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#427B58, #8EC07C);&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#B57614, #FABD2F);&quot;&gt;get_output_level&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#7C6F64, #A89984);&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#7C6F64, #A89984);&quot;&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#7C6F64, #A89984);&quot;&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#7C6F64, #A89984);&quot;&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#B57614, #FABD2F);&quot;&gt;        Timer&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#427B58, #8EC07C);&quot;&gt;::&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#B57614, #FABD2F);&quot;&gt;after_millis&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#7C6F64, #A89984);&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#8F3F71, #D3869B);&quot;&gt;1000&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#7C6F64, #A89984);&quot;&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#427B58, #8EC07C);&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#9D0006, #FB4934);&quot;&gt;await&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#7C6F64, #A89984);&quot;&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#7C6F64, #A89984);&quot;&gt;    }&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#7C6F64, #A89984);&quot;&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;The button loop is the same code as part three, lifted verbatim into its own function. What’s new is everything around it.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;anatomy-of-a-task&quot;&gt;Anatomy of a task&lt;&#x2F;h2&gt;
&lt;p&gt;&lt;code&gt;#[embassy_executor::task]&lt;&#x2F;code&gt; turns an async function into something the executor can run independently. Tasks are statically allocated — no heap, remember — so the macro reserves their memory at compile time. That’s also why the arguments are &lt;code&gt;Input&amp;lt;&#x27;static&amp;gt;&lt;&#x2F;code&gt; and &lt;code&gt;Output&amp;lt;&#x27;static&amp;gt;&lt;&#x2F;code&gt;: a task can outlive &lt;code&gt;main&lt;&#x2F;code&gt;’s stack frame, so it can only hold resources that live for the whole program.&lt;&#x2F;p&gt;
&lt;p&gt;The hand-off is ordinary Rust ownership:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#3C3836, #EBDBB2); background-color: light-dark(#FBF1C7, #282828);&quot;&gt;&lt;code data-lang=&quot;rust&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#076678, #83A598);&quot;&gt;spawner&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#427B58, #8EC07C);&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#B57614, #FABD2F);&quot;&gt;spawn&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#7C6F64, #A89984);&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#B57614, #FABD2F);&quot;&gt;unwrap!&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#7C6F64, #A89984);&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#B57614, #FABD2F);&quot;&gt;button_task&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#7C6F64, #A89984);&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#076678, #83A598);&quot;&gt;button&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#7C6F64, #A89984);&quot;&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#076678, #83A598);&quot;&gt; onboard_red&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#7C6F64, #A89984);&quot;&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#7C6F64, #A89984);&quot;&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#7C6F64, #A89984);&quot;&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#7C6F64, #A89984);&quot;&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;&lt;code&gt;button&lt;&#x2F;code&gt; and &lt;code&gt;onboard_red&lt;&#x2F;code&gt; &lt;em&gt;move&lt;&#x2F;em&gt; into the task. After this line, &lt;code&gt;main&lt;&#x2F;code&gt; can’t touch them — try, and the compiler stops you. The same rule that made &lt;code&gt;greet(name)&lt;&#x2F;code&gt; a one-shot in a desktop program here guarantees that exactly one task drives each pin. No mutex, no “who owns the LED” bug class at all.&lt;&#x2F;p&gt;
&lt;p&gt;Meanwhile &lt;code&gt;main&lt;&#x2F;code&gt; — which is itself just the first task — keeps the heartbeat:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#3C3836, #EBDBB2); background-color: light-dark(#FBF1C7, #282828);&quot;&gt;&lt;code data-lang=&quot;rust&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#9D0006, #FB4934);&quot;&gt;loop&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#7C6F64, #A89984);&quot;&gt; {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#076678, #83A598);&quot;&gt;    heartbeat&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#427B58, #8EC07C);&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#B57614, #FABD2F);&quot;&gt;toggle&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#7C6F64, #A89984);&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#7C6F64, #A89984);&quot;&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#7C6F64, #A89984);&quot;&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#B57614, #FABD2F);&quot;&gt;    Timer&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#427B58, #8EC07C);&quot;&gt;::&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#B57614, #FABD2F);&quot;&gt;after_millis&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#7C6F64, #A89984);&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#8F3F71, #D3869B);&quot;&gt;1000&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#7C6F64, #A89984);&quot;&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#427B58, #8EC07C);&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#9D0006, #FB4934);&quot;&gt;await&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#7C6F64, #A89984);&quot;&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#7C6F64, #A89984);&quot;&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;&lt;h2 id=&quot;cooperative-not-preemptive&quot;&gt;Cooperative, not preemptive&lt;&#x2F;h2&gt;
&lt;p&gt;Both loops are infinite, and both run. The trick is that neither ever &lt;em&gt;blocks&lt;&#x2F;em&gt;: each runs for a few microseconds, hits an &lt;code&gt;.await&lt;&#x2F;code&gt;, and yields. The executor wakes whichever task’s event arrived — timer tick or pin change — runs it to its next await, and sleeps again. Press the button mid-heartbeat and both LEDs do their jobs, on time, with the CPU asleep for the overwhelming majority of every second.&lt;&#x2F;p&gt;
&lt;p&gt;That’s the payoff of the whole arc. In four small programs we went from a busy-waiting blinky to genuinely concurrent, interrupt-driven, sleep-when-idle firmware — and the concurrency cost us no threads, no RTOS config, and not one &lt;code&gt;unsafe&lt;&#x2F;code&gt; block. From here the same pattern extends to the board’s headline feature: tasks that talk BLE. Watch the &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;sarmadgulzar&#x2F;xiao-ble-embassy&quot;&gt;repo&lt;&#x2F;a&gt; and the &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.youtube.com&#x2F;playlist?list=PLTNsV-3z5QDA&quot;&gt;playlist&lt;&#x2F;a&gt; for what comes next.&lt;&#x2F;p&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>Waiting for a button instead of polling it</title>
        <published>2026-06-27T00:00:00+00:00</published>
        <updated>2026-06-27T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Unknown
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://sarmadgulzar.com/series/xiao-ble-embassy/digital-input-async/"/>
        <id>https://sarmadgulzar.com/series/xiao-ble-embassy/digital-input-async/</id>
        
        <content type="html" xml:base="https://sarmadgulzar.com/series/xiao-ble-embassy/digital-input-async/">&lt;p&gt;Part two ended with a diagnosis: polling burns the CPU to answer a question the hardware could answer for free. The nRF52840 has a peripheral — GPIOTE, “GPIO tasks and events” — whose whole job is to raise an interrupt when a pin changes. Embassy wraps it in an async method, and the fix is two lines. The code is &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;sarmadgulzar&#x2F;xiao-ble-embassy&#x2F;tree&#x2F;main&#x2F;crates&#x2F;02-digital-input-async&quot;&gt;&lt;code&gt;crates&#x2F;02-digital-input-async&lt;&#x2F;code&gt;&lt;&#x2F;a&gt;:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#3C3836, #EBDBB2); background-color: light-dark(#FBF1C7, #282828);&quot;&gt;&lt;code data-lang=&quot;rust&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#7C6F64, #A89984);&quot;&gt;#&lt;&#x2F;span&gt;&lt;span&gt;!&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#7C6F64, #A89984);&quot;&gt;[&lt;&#x2F;span&gt;&lt;span&gt;no_std&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#7C6F64, #A89984);&quot;&gt;]&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#7C6F64, #A89984);&quot;&gt;#&lt;&#x2F;span&gt;&lt;span&gt;!&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#7C6F64, #A89984);&quot;&gt;[&lt;&#x2F;span&gt;&lt;span&gt;no_main&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#7C6F64, #A89984);&quot;&gt;]&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#9D0006, #FB4934);&quot;&gt;use&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#B57614, #FABD2F);&quot;&gt; defmt&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#427B58, #8EC07C);&quot;&gt;::&lt;&#x2F;span&gt;&lt;span&gt;info&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#7C6F64, #A89984);&quot;&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#9D0006, #FB4934);&quot;&gt;use&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#B57614, #FABD2F);&quot;&gt; embassy_nrf&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#427B58, #8EC07C);&quot;&gt;::&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#B57614, #FABD2F);&quot;&gt;gpio&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#427B58, #8EC07C);&quot;&gt;::&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#7C6F64, #A89984);&quot;&gt;{&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#B57614, #FABD2F);&quot;&gt;Input&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#7C6F64, #A89984);&quot;&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#B57614, #FABD2F);&quot;&gt; Level&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#7C6F64, #A89984);&quot;&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#B57614, #FABD2F);&quot;&gt; Output&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#7C6F64, #A89984);&quot;&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#B57614, #FABD2F);&quot;&gt; OutputDrive&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#7C6F64, #A89984);&quot;&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#B57614, #FABD2F);&quot;&gt; Pull&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#7C6F64, #A89984);&quot;&gt;}&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#7C6F64, #A89984);&quot;&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#9D0006, #FB4934);&quot;&gt;use&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#7C6F64, #A89984);&quot;&gt; {&lt;&#x2F;span&gt;&lt;span&gt;defmt_rtt &lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#9D0006, #FB4934);&quot;&gt;as&lt;&#x2F;span&gt;&lt;span&gt; _&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#7C6F64, #A89984);&quot;&gt;,&lt;&#x2F;span&gt;&lt;span&gt; panic_probe &lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#9D0006, #FB4934);&quot;&gt;as&lt;&#x2F;span&gt;&lt;span&gt; _&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#7C6F64, #A89984);&quot;&gt;}&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#7C6F64, #A89984);&quot;&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#7C6F64, #A89984);&quot;&gt;#&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#7C6F64, #A89984);&quot;&gt;[&lt;&#x2F;span&gt;&lt;span&gt;embassy_executor&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#427B58, #8EC07C);&quot;&gt;::&lt;&#x2F;span&gt;&lt;span&gt;main&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#7C6F64, #A89984);&quot;&gt;]&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#9D0006, #FB4934);&quot;&gt;async&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#9D0006, #FB4934);&quot;&gt; fn&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#B57614, #FABD2F);&quot;&gt; main&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#7C6F64, #A89984);&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#076678, #83A598);&quot;&gt;_spawner&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#427B58, #8EC07C);&quot;&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#B57614, #FABD2F);&quot;&gt; embassy_executor&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#427B58, #8EC07C);&quot;&gt;::&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#B57614, #FABD2F);&quot;&gt;Spawner&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#7C6F64, #A89984);&quot;&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#7C6F64, #A89984);&quot;&gt; {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#AF3A03, #FE8019);&quot;&gt;    let&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#076678, #83A598);&quot;&gt; p&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#427B58, #8EC07C);&quot;&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#B57614, #FABD2F);&quot;&gt; embassy_nrf&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#427B58, #8EC07C);&quot;&gt;::&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#B57614, #FABD2F);&quot;&gt;init&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#7C6F64, #A89984);&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#B57614, #FABD2F);&quot;&gt;Default&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#427B58, #8EC07C);&quot;&gt;::&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#B57614, #FABD2F);&quot;&gt;default&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#7C6F64, #A89984);&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#7C6F64, #A89984);&quot;&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#7C6F64, #A89984);&quot;&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#7C6F64, #A89984);&quot;&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#B57614, #FABD2F);&quot;&gt;    info!&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#7C6F64, #A89984);&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#7C6F64, #A89984);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#79740E, #B8BB26);&quot;&gt;Initializing the onboard Red LED...&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#7C6F64, #A89984);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#7C6F64, #A89984);&quot;&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#7C6F64, #A89984);&quot;&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#AF3A03, #FE8019);&quot;&gt;    let&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#AF3A03, #FE8019);&quot;&gt; mut&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#076678, #83A598);&quot;&gt; onboard_red&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#427B58, #8EC07C);&quot;&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#B57614, #FABD2F);&quot;&gt; Output&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#427B58, #8EC07C);&quot;&gt;::&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#B57614, #FABD2F);&quot;&gt;new&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#7C6F64, #A89984);&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#076678, #83A598);&quot;&gt;p&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#427B58, #8EC07C);&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#B57614, #FABD2F);&quot;&gt;P0_26&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#7C6F64, #A89984);&quot;&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#B57614, #FABD2F);&quot;&gt; Level&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#427B58, #8EC07C);&quot;&gt;::&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#B57614, #FABD2F);&quot;&gt;High&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#7C6F64, #A89984);&quot;&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#B57614, #FABD2F);&quot;&gt; OutputDrive&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#427B58, #8EC07C);&quot;&gt;::&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#B57614, #FABD2F);&quot;&gt;Standard&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#7C6F64, #A89984);&quot;&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#7C6F64, #A89984);&quot;&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#B57614, #FABD2F);&quot;&gt;    info!&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#7C6F64, #A89984);&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#7C6F64, #A89984);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#79740E, #B8BB26);&quot;&gt;Initializing the button...&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#7C6F64, #A89984);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#7C6F64, #A89984);&quot;&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#7C6F64, #A89984);&quot;&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#AF3A03, #FE8019);&quot;&gt;    let&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#AF3A03, #FE8019);&quot;&gt; mut&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#076678, #83A598);&quot;&gt; button&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#427B58, #8EC07C);&quot;&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#B57614, #FABD2F);&quot;&gt; Input&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#427B58, #8EC07C);&quot;&gt;::&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#B57614, #FABD2F);&quot;&gt;new&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#7C6F64, #A89984);&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#076678, #83A598);&quot;&gt;p&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#427B58, #8EC07C);&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#B57614, #FABD2F);&quot;&gt;P0_03&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#7C6F64, #A89984);&quot;&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#B57614, #FABD2F);&quot;&gt; Pull&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#427B58, #8EC07C);&quot;&gt;::&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#B57614, #FABD2F);&quot;&gt;Up&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#7C6F64, #A89984);&quot;&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#7C6F64, #A89984);&quot;&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#9D0006, #FB4934);&quot;&gt;    loop&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#7C6F64, #A89984);&quot;&gt; {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#076678, #83A598);&quot;&gt;        button&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#427B58, #8EC07C);&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#B57614, #FABD2F);&quot;&gt;wait_for_low&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#7C6F64, #A89984);&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#7C6F64, #A89984);&quot;&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#427B58, #8EC07C);&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#9D0006, #FB4934);&quot;&gt;await&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#7C6F64, #A89984);&quot;&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#076678, #83A598);&quot;&gt;        onboard_red&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#427B58, #8EC07C);&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#B57614, #FABD2F);&quot;&gt;set_low&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#7C6F64, #A89984);&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#7C6F64, #A89984);&quot;&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#7C6F64, #A89984);&quot;&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#B57614, #FABD2F);&quot;&gt;        info!&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#7C6F64, #A89984);&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#7C6F64, #A89984);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#79740E, #B8BB26);&quot;&gt;Button pressed!&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#7C6F64, #A89984);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#7C6F64, #A89984);&quot;&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#7C6F64, #A89984);&quot;&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#076678, #83A598);&quot;&gt;        button&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#427B58, #8EC07C);&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#B57614, #FABD2F);&quot;&gt;wait_for_high&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#7C6F64, #A89984);&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#7C6F64, #A89984);&quot;&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#427B58, #8EC07C);&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#9D0006, #FB4934);&quot;&gt;await&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#7C6F64, #A89984);&quot;&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#076678, #83A598);&quot;&gt;        onboard_red&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#427B58, #8EC07C);&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#B57614, #FABD2F);&quot;&gt;set_high&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#7C6F64, #A89984);&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#7C6F64, #A89984);&quot;&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#7C6F64, #A89984);&quot;&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#7C6F64, #A89984);&quot;&gt;    }&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#7C6F64, #A89984);&quot;&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Same wiring, same pull-up, same active-low logic. The &lt;code&gt;if&lt;&#x2F;code&gt;&#x2F;&lt;code&gt;else&lt;&#x2F;code&gt; is gone, replaced by two awaits:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#3C3836, #EBDBB2); background-color: light-dark(#FBF1C7, #282828);&quot;&gt;&lt;code data-lang=&quot;rust&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#076678, #83A598);&quot;&gt;button&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#427B58, #8EC07C);&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#B57614, #FABD2F);&quot;&gt;wait_for_low&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#7C6F64, #A89984);&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#7C6F64, #A89984);&quot;&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#427B58, #8EC07C);&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#9D0006, #FB4934);&quot;&gt;await&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#7C6F64, #A89984);&quot;&gt;;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#928374, #928374);font-style: italic;&quot;&gt;   &#x2F;&#x2F;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#928374, #928374);font-style: italic;&quot;&gt; sleep until pressed&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#928374, #928374);font-style: italic;&quot;&gt;&#x2F;&#x2F;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#928374, #928374);font-style: italic;&quot;&gt; ...&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#076678, #83A598);&quot;&gt;button&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#427B58, #8EC07C);&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#B57614, #FABD2F);&quot;&gt;wait_for_high&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#7C6F64, #A89984);&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#7C6F64, #A89984);&quot;&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#427B58, #8EC07C);&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#9D0006, #FB4934);&quot;&gt;await&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#7C6F64, #A89984);&quot;&gt;;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#928374, #928374);font-style: italic;&quot;&gt;  &#x2F;&#x2F;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#928374, #928374);font-style: italic;&quot;&gt; sleep until released&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;&lt;h2 id=&quot;what-actually-happens-at-the-await&quot;&gt;What actually happens at the await&lt;&#x2F;h2&gt;
&lt;p&gt;&lt;code&gt;wait_for_low()&lt;&#x2F;code&gt; returns a future. When the executor polls it and the pin is still high, the future registers with GPIOTE — “raise an interrupt when this pin goes low” — and returns &lt;code&gt;Pending&lt;&#x2F;code&gt;. The executor has nothing else to run, so it executes a wait-for-interrupt instruction and the core stops. Not “loops quickly”: stops.&lt;&#x2F;p&gt;
&lt;p&gt;When you press the button, GPIOTE fires the interrupt, the interrupt handler wakes the task, and execution resumes on the line after the &lt;code&gt;.await&lt;&#x2F;code&gt;. The log tells the story: instead of &lt;code&gt;Not Pressed...&lt;&#x2F;code&gt; scrolling by endlessly, the terminal is silent until the moment you press.&lt;&#x2F;p&gt;
&lt;p&gt;Note one small signature change: the button is now &lt;code&gt;let mut button&lt;&#x2F;code&gt;. The async wait methods take &lt;code&gt;&amp;amp;mut self&lt;&#x2F;code&gt;, because registering for a pin event mutates the input’s GPIOTE channel state — the type system again tracking who’s allowed to touch the hardware.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;the-structural-win&quot;&gt;The structural win&lt;&#x2F;h2&gt;
&lt;p&gt;Reading top to bottom, the loop is a plain-language description of the behavior: &lt;em&gt;wait for press, LED on, wait for release, LED off.&lt;&#x2F;em&gt; There’s no state machine tracking “was it pressed last time I checked”, because the control flow &lt;strong&gt;is&lt;&#x2F;strong&gt; the state. This is the thing Embassy sells: interrupt-driven firmware that reads like blocking code.&lt;&#x2F;p&gt;
&lt;p&gt;One task still has a limit, though: this &lt;code&gt;main&lt;&#x2F;code&gt; can only wait for one thing at a time. If we also wanted a heartbeat LED blinking on its own schedule, this loop has nowhere to put it — waiting on the button means not counting time, and vice versa. Running both at once is what Embassy &lt;em&gt;tasks&lt;&#x2F;em&gt; are for, and that’s the finale.&lt;&#x2F;p&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>Structs, enums, and pattern matching</title>
        <published>2026-06-15T00:00:00+00:00</published>
        <updated>2026-06-15T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Unknown
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://sarmadgulzar.com/series/intro-to-rust/structs-enums-matching/"/>
        <id>https://sarmadgulzar.com/series/intro-to-rust/structs-enums-matching/</id>
        
        <content type="html" xml:base="https://sarmadgulzar.com/series/intro-to-rust/structs-enums-matching/">&lt;p&gt;Ownership keeps your memory correct. The type system keeps your &lt;em&gt;logic&lt;&#x2F;em&gt; correct — and Rust’s is built around one idea borrowed from functional languages: model your data so that invalid states simply can’t be constructed.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;structs&quot;&gt;Structs&lt;&#x2F;h2&gt;
&lt;p&gt;Structs are the familiar part — named fields, no surprises:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#3C3836, #EBDBB2); background-color: light-dark(#FBF1C7, #282828);&quot;&gt;&lt;code data-lang=&quot;rust&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#AF3A03, #FE8019);&quot;&gt;struct&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#B57614, #FABD2F);&quot;&gt; Post&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#7C6F64, #A89984);&quot;&gt; {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#076678, #83A598);&quot;&gt;    title&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#427B58, #8EC07C);&quot;&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#B57614, #FABD2F);&quot;&gt; String&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#7C6F64, #A89984);&quot;&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#076678, #83A598);&quot;&gt;    published&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#427B58, #8EC07C);&quot;&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#B57614, #FABD2F);&quot;&gt; bool&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#7C6F64, #A89984);&quot;&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#076678, #83A598);&quot;&gt;    views&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#427B58, #8EC07C);&quot;&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#B57614, #FABD2F);&quot;&gt; u64&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#7C6F64, #A89984);&quot;&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#7C6F64, #A89984);&quot;&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;&lt;h2 id=&quot;enums-are-the-good-part&quot;&gt;Enums are the good part&lt;&#x2F;h2&gt;
&lt;p&gt;A Rust enum isn’t a list of integer constants — each variant can carry its own data:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#3C3836, #EBDBB2); background-color: light-dark(#FBF1C7, #282828);&quot;&gt;&lt;code data-lang=&quot;rust&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#AF3A03, #FE8019);&quot;&gt;enum&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#B57614, #FABD2F);&quot;&gt; Status&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#7C6F64, #A89984);&quot;&gt; {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#B57614, #FABD2F);&quot;&gt;    Draft&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#7C6F64, #A89984);&quot;&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#B57614, #FABD2F);&quot;&gt;    Scheduled&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#7C6F64, #A89984);&quot;&gt; {&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#076678, #83A598);&quot;&gt; publish_at&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#427B58, #8EC07C);&quot;&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#B57614, #FABD2F);&quot;&gt; String&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#7C6F64, #A89984);&quot;&gt; }&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#7C6F64, #A89984);&quot;&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#B57614, #FABD2F);&quot;&gt;    Published&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#7C6F64, #A89984);&quot;&gt; {&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#076678, #83A598);&quot;&gt; views&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#427B58, #8EC07C);&quot;&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#B57614, #FABD2F);&quot;&gt; u64&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#7C6F64, #A89984);&quot;&gt; }&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#7C6F64, #A89984);&quot;&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#7C6F64, #A89984);&quot;&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;A scheduled post &lt;em&gt;has&lt;&#x2F;em&gt; a publish date; a published one &lt;em&gt;has&lt;&#x2F;em&gt; a view count; a draft has neither. There is no way to construct a draft with views. The bug where you read &lt;code&gt;publish_at&lt;&#x2F;code&gt; on a published post isn’t caught at runtime — it’s unwritable.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;match-makes-it-total&quot;&gt;Match makes it total&lt;&#x2F;h2&gt;
&lt;p&gt;&lt;code&gt;match&lt;&#x2F;code&gt; forces you to handle every variant:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#3C3836, #EBDBB2); background-color: light-dark(#FBF1C7, #282828);&quot;&gt;&lt;code data-lang=&quot;rust&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#9D0006, #FB4934);&quot;&gt;fn&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#B57614, #FABD2F);&quot;&gt; describe&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#7C6F64, #A89984);&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#076678, #83A598);&quot;&gt;status&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#427B58, #8EC07C);&quot;&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#427B58, #8EC07C);&quot;&gt; &amp;amp;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#B57614, #FABD2F);&quot;&gt;Status&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#7C6F64, #A89984);&quot;&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#427B58, #8EC07C);&quot;&gt; -&amp;gt;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#B57614, #FABD2F);&quot;&gt; String&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#7C6F64, #A89984);&quot;&gt; {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#9D0006, #FB4934);&quot;&gt;    match&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#076678, #83A598);&quot;&gt; status&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#7C6F64, #A89984);&quot;&gt; {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#B57614, #FABD2F);&quot;&gt;        Status&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#427B58, #8EC07C);&quot;&gt;::&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#B57614, #FABD2F);&quot;&gt;Draft&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#427B58, #8EC07C);&quot;&gt; =&amp;gt;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#7C6F64, #A89984);&quot;&gt; &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#79740E, #B8BB26);&quot;&gt;draft&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#7C6F64, #A89984);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#427B58, #8EC07C);&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#B57614, #FABD2F);&quot;&gt;to_string&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#7C6F64, #A89984);&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#7C6F64, #A89984);&quot;&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#7C6F64, #A89984);&quot;&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#B57614, #FABD2F);&quot;&gt;        Status&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#427B58, #8EC07C);&quot;&gt;::&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#B57614, #FABD2F);&quot;&gt;Scheduled&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#7C6F64, #A89984);&quot;&gt; {&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#076678, #83A598);&quot;&gt; publish_at&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#7C6F64, #A89984);&quot;&gt; }&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#427B58, #8EC07C);&quot;&gt; =&amp;gt;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#B57614, #FABD2F);&quot;&gt; format!&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#7C6F64, #A89984);&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#7C6F64, #A89984);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#79740E, #B8BB26);&quot;&gt;goes live &lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#7C6F64, #A89984);&quot;&gt;{&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#79740E, #B8BB26);&quot;&gt;publish_at&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#7C6F64, #A89984);&quot;&gt;}&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#7C6F64, #A89984);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#7C6F64, #A89984);&quot;&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#7C6F64, #A89984);&quot;&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#B57614, #FABD2F);&quot;&gt;        Status&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#427B58, #8EC07C);&quot;&gt;::&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#B57614, #FABD2F);&quot;&gt;Published&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#7C6F64, #A89984);&quot;&gt; {&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#076678, #83A598);&quot;&gt; views&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#7C6F64, #A89984);&quot;&gt; }&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#427B58, #8EC07C);&quot;&gt; =&amp;gt;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#B57614, #FABD2F);&quot;&gt; format!&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#7C6F64, #A89984);&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#7C6F64, #A89984);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#7C6F64, #A89984);&quot;&gt;{&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#79740E, #B8BB26);&quot;&gt;views&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#7C6F64, #A89984);&quot;&gt;}&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#79740E, #B8BB26);&quot;&gt; views&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#7C6F64, #A89984);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#7C6F64, #A89984);&quot;&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#7C6F64, #A89984);&quot;&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#7C6F64, #A89984);&quot;&gt;    }&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#7C6F64, #A89984);&quot;&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Delete an arm and the program stops compiling. Add a new variant next year, and the compiler lists every &lt;code&gt;match&lt;&#x2F;code&gt; in the codebase you now need to update. This is exhaustiveness checking, and once you’ve shipped refactors with it, going back to a language without it feels like removing the handrails.&lt;&#x2F;p&gt;
&lt;p&gt;The standard library runs on this machinery: &lt;code&gt;Option&amp;lt;T&amp;gt;&lt;&#x2F;code&gt; is an enum (&lt;code&gt;Some&lt;&#x2F;code&gt;&#x2F;&lt;code&gt;None&lt;&#x2F;code&gt;) that replaces null, and &lt;code&gt;Result&amp;lt;T, E&amp;gt;&lt;&#x2F;code&gt; (&lt;code&gt;Ok&lt;&#x2F;code&gt;&#x2F;&lt;code&gt;Err&lt;&#x2F;code&gt;) replaces exceptions. You’ve now seen everything they’re made of — which is exactly where the next part picks up.&lt;&#x2F;p&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>Ownership, moves, and borrows</title>
        <published>2026-06-08T00:00:00+00:00</published>
        <updated>2026-06-08T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Unknown
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://sarmadgulzar.com/series/intro-to-rust/ownership-and-borrowing/"/>
        <id>https://sarmadgulzar.com/series/intro-to-rust/ownership-and-borrowing/</id>
        
        <content type="html" xml:base="https://sarmadgulzar.com/series/intro-to-rust/ownership-and-borrowing/">&lt;p&gt;Rust’s memory model fits in three sentences:&lt;&#x2F;p&gt;
&lt;ol&gt;
&lt;li&gt;Every value has exactly &lt;strong&gt;one owner&lt;&#x2F;strong&gt;.&lt;&#x2F;li&gt;
&lt;li&gt;When the owner goes out of scope, the value is &lt;strong&gt;dropped&lt;&#x2F;strong&gt; (freed).&lt;&#x2F;li&gt;
&lt;li&gt;Ownership can be &lt;strong&gt;moved&lt;&#x2F;strong&gt;, or the value can be &lt;strong&gt;borrowed&lt;&#x2F;strong&gt; — but the borrows have rules.&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;p&gt;That’s it. No garbage collector pausing your program, no &lt;code&gt;free()&lt;&#x2F;code&gt; to forget. The compiler tracks owners the way a type checker tracks types.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;moves&quot;&gt;Moves&lt;&#x2F;h2&gt;
&lt;p&gt;Assignment of heap-owning types transfers ownership:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#3C3836, #EBDBB2); background-color: light-dark(#FBF1C7, #282828);&quot;&gt;&lt;code data-lang=&quot;rust&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#AF3A03, #FE8019);&quot;&gt;let&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#076678, #83A598);&quot;&gt; a&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#427B58, #8EC07C);&quot;&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#B57614, #FABD2F);&quot;&gt; String&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#427B58, #8EC07C);&quot;&gt;::&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#B57614, #FABD2F);&quot;&gt;from&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#7C6F64, #A89984);&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#7C6F64, #A89984);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#79740E, #B8BB26);&quot;&gt;hello&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#7C6F64, #A89984);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#7C6F64, #A89984);&quot;&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#7C6F64, #A89984);&quot;&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#AF3A03, #FE8019);&quot;&gt;let&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#076678, #83A598);&quot;&gt; b&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#427B58, #8EC07C);&quot;&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#076678, #83A598);&quot;&gt; a&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#7C6F64, #A89984);&quot;&gt;;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#928374, #928374);font-style: italic;&quot;&gt;                  &#x2F;&#x2F;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#928374, #928374);font-style: italic;&quot;&gt; ownership moves to b&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#928374, #928374);font-style: italic;&quot;&gt;&#x2F;&#x2F;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#928374, #928374);font-style: italic;&quot;&gt; println!(&amp;quot;{a}&amp;quot;);         &#x2F;&#x2F; error: value borrowed after move&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;If you actually want two copies, say so explicitly with &lt;code&gt;a.clone()&lt;&#x2F;code&gt;. Rust makes the expensive thing visible instead of doing it silently.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;borrows&quot;&gt;Borrows&lt;&#x2F;h2&gt;
&lt;p&gt;Most of the time you don’t want to give a value away — you just want to let a function look at it. That’s a reference, written &lt;code&gt;&amp;amp;&lt;&#x2F;code&gt;:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#3C3836, #EBDBB2); background-color: light-dark(#FBF1C7, #282828);&quot;&gt;&lt;code data-lang=&quot;rust&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#9D0006, #FB4934);&quot;&gt;fn&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#B57614, #FABD2F);&quot;&gt; shout&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#7C6F64, #A89984);&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#076678, #83A598);&quot;&gt;text&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#427B58, #8EC07C);&quot;&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#427B58, #8EC07C);&quot;&gt; &amp;amp;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#B57614, #FABD2F);&quot;&gt;String&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#7C6F64, #A89984);&quot;&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#427B58, #8EC07C);&quot;&gt; -&amp;gt;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#B57614, #FABD2F);&quot;&gt; String&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#7C6F64, #A89984);&quot;&gt; {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#076678, #83A598);&quot;&gt;    text&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#427B58, #8EC07C);&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#B57614, #FABD2F);&quot;&gt;to_uppercase&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#7C6F64, #A89984);&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#7C6F64, #A89984);&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#7C6F64, #A89984);&quot;&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#AF3A03, #FE8019);&quot;&gt;let&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#076678, #83A598);&quot;&gt; word&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#427B58, #8EC07C);&quot;&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#B57614, #FABD2F);&quot;&gt; String&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#427B58, #8EC07C);&quot;&gt;::&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#B57614, #FABD2F);&quot;&gt;from&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#7C6F64, #A89984);&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#7C6F64, #A89984);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#79740E, #B8BB26);&quot;&gt;hello&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#7C6F64, #A89984);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#7C6F64, #A89984);&quot;&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#7C6F64, #A89984);&quot;&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#AF3A03, #FE8019);&quot;&gt;let&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#076678, #83A598);&quot;&gt; loud&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#427B58, #8EC07C);&quot;&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#B57614, #FABD2F);&quot;&gt; shout&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#7C6F64, #A89984);&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#427B58, #8EC07C);&quot;&gt;&amp;amp;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#076678, #83A598);&quot;&gt;word&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#7C6F64, #A89984);&quot;&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#7C6F64, #A89984);&quot;&gt;;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#928374, #928374);font-style: italic;&quot;&gt;    &#x2F;&#x2F;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#928374, #928374);font-style: italic;&quot;&gt; word is borrowed...&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#B57614, #FABD2F);&quot;&gt;println!&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#7C6F64, #A89984);&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#7C6F64, #A89984);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#7C6F64, #A89984);&quot;&gt;{&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#79740E, #B8BB26);&quot;&gt;word&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#7C6F64, #A89984);&quot;&gt;}&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#79740E, #B8BB26);&quot;&gt; -&amp;gt; &lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#7C6F64, #A89984);&quot;&gt;{&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#79740E, #B8BB26);&quot;&gt;loud&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#7C6F64, #A89984);&quot;&gt;}&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#7C6F64, #A89984);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#7C6F64, #A89984);&quot;&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#7C6F64, #A89984);&quot;&gt;;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#928374, #928374);font-style: italic;&quot;&gt; &#x2F;&#x2F;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#928374, #928374);font-style: italic;&quot;&gt; ...and still usable here&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Borrows come in two flavors, and the rules are asymmetric on purpose:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;Any number of &lt;strong&gt;shared&lt;&#x2F;strong&gt; borrows (&lt;code&gt;&amp;amp;T&lt;&#x2F;code&gt;) may exist at once — readers don’t conflict.&lt;&#x2F;li&gt;
&lt;li&gt;A &lt;strong&gt;mutable&lt;&#x2F;strong&gt; borrow (&lt;code&gt;&amp;amp;mut T&lt;&#x2F;code&gt;) must be &lt;em&gt;exclusive&lt;&#x2F;em&gt; — one writer, and no readers while it lives.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#3C3836, #EBDBB2); background-color: light-dark(#FBF1C7, #282828);&quot;&gt;&lt;code data-lang=&quot;rust&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#AF3A03, #FE8019);&quot;&gt;let&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#AF3A03, #FE8019);&quot;&gt; mut&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#076678, #83A598);&quot;&gt; nums&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#427B58, #8EC07C);&quot;&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#B57614, #FABD2F);&quot;&gt; vec!&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#7C6F64, #A89984);&quot;&gt;[&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#8F3F71, #D3869B);&quot;&gt;1&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#7C6F64, #A89984);&quot;&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#8F3F71, #D3869B);&quot;&gt; 2&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#7C6F64, #A89984);&quot;&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#8F3F71, #D3869B);&quot;&gt; 3&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#7C6F64, #A89984);&quot;&gt;]&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#7C6F64, #A89984);&quot;&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#AF3A03, #FE8019);&quot;&gt;let&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#076678, #83A598);&quot;&gt; first&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#427B58, #8EC07C);&quot;&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#427B58, #8EC07C);&quot;&gt; &amp;amp;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#076678, #83A598);&quot;&gt;nums&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#7C6F64, #A89984);&quot;&gt;[&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#8F3F71, #D3869B);&quot;&gt;0&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#7C6F64, #A89984);&quot;&gt;]&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#7C6F64, #A89984);&quot;&gt;;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#928374, #928374);font-style: italic;&quot;&gt;       &#x2F;&#x2F;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#928374, #928374);font-style: italic;&quot;&gt; shared borrow&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#928374, #928374);font-style: italic;&quot;&gt;&#x2F;&#x2F;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#928374, #928374);font-style: italic;&quot;&gt; nums.push(4);            &#x2F;&#x2F; error: can&amp;#39;t mutate while borrowed&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#B57614, #FABD2F);&quot;&gt;println!&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#7C6F64, #A89984);&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#7C6F64, #A89984);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#7C6F64, #A89984);&quot;&gt;{&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#79740E, #B8BB26);&quot;&gt;first&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#7C6F64, #A89984);&quot;&gt;}&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#7C6F64, #A89984);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#7C6F64, #A89984);&quot;&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#7C6F64, #A89984);&quot;&gt;;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#928374, #928374);font-style: italic;&quot;&gt;        &#x2F;&#x2F;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#928374, #928374);font-style: italic;&quot;&gt; borrow ends here&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#076678, #83A598);&quot;&gt;nums&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#427B58, #8EC07C);&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#B57614, #FABD2F);&quot;&gt;push&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#7C6F64, #A89984);&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#8F3F71, #D3869B);&quot;&gt;4&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#7C6F64, #A89984);&quot;&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#7C6F64, #A89984);&quot;&gt;;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#928374, #928374);font-style: italic;&quot;&gt;               &#x2F;&#x2F;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#928374, #928374);font-style: italic;&quot;&gt; now it&amp;#39;s fine&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;That &lt;code&gt;push&lt;&#x2F;code&gt; error is the borrow checker preventing a real bug: pushing might reallocate the vector, leaving &lt;code&gt;first&lt;&#x2F;code&gt; pointing at freed memory. In C++ this compiles and corrupts; in Rust it doesn’t compile.&lt;&#x2F;p&gt;
&lt;p&gt;The discipline feels strict for a week. Then you notice you’ve stopped thinking about a whole category of bugs, and it starts feeling like a seatbelt. Next: how structs and enums let you model data precisely.&lt;&#x2F;p&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>Why Rust, and how to think about it</title>
        <published>2026-06-01T00:00:00+00:00</published>
        <updated>2026-06-01T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Unknown
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://sarmadgulzar.com/series/intro-to-rust/why-rust/"/>
        <id>https://sarmadgulzar.com/series/intro-to-rust/why-rust/</id>
        
        <content type="html" xml:base="https://sarmadgulzar.com/series/intro-to-rust/why-rust/">&lt;p&gt;Every language makes a trade. Python trades speed for ergonomics. C trades safety for control. Rust’s pitch is that one of those trades was never necessary: you can have memory safety &lt;em&gt;without&lt;&#x2F;em&gt; a garbage collector, if the compiler is willing to do a lot more work at compile time — and if you’re willing to tell it more about your intentions.&lt;&#x2F;p&gt;
&lt;p&gt;That second clause is the whole learning curve. Rust isn’t hard because the syntax is exotic; it’s hard because the compiler enforces rules about &lt;em&gt;who owns what&lt;&#x2F;em&gt; that other languages leave implicit. Once you internalize those rules, the errors stop feeling like fights and start feeling like code review from a very fast, very pedantic colleague.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;setup&quot;&gt;Setup&lt;&#x2F;h2&gt;
&lt;p&gt;One command installs the toolchain:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#3C3836, #EBDBB2); background-color: light-dark(#FBF1C7, #282828);&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#B57614, #FABD2F);&quot;&gt;curl&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#8F3F71, #D3869B);&quot;&gt; -&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#8F3F71, #D3869B);&quot;&gt;-proto&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#7C6F64, #A89984);&quot;&gt; &amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#79740E, #B8BB26);&quot;&gt;=https&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#7C6F64, #A89984);&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#8F3F71, #D3869B);&quot;&gt; -&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#8F3F71, #D3869B);&quot;&gt;-tlsv1.2&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#8F3F71, #D3869B);&quot;&gt; -&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#8F3F71, #D3869B);&quot;&gt;sSf&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#79740E, #B8BB26);&quot;&gt; https:&#x2F;&#x2F;sh.rustup.rs&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#427B58, #8EC07C);&quot;&gt; |&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#B57614, #FABD2F);&quot;&gt; sh&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;That gives you &lt;code&gt;rustc&lt;&#x2F;code&gt; (the compiler), &lt;code&gt;cargo&lt;&#x2F;code&gt; (build tool and package manager), and &lt;code&gt;rustup&lt;&#x2F;code&gt; (toolchain manager). You will almost never invoke &lt;code&gt;rustc&lt;&#x2F;code&gt; directly — &lt;code&gt;cargo&lt;&#x2F;code&gt; runs the show:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#3C3836, #EBDBB2); background-color: light-dark(#FBF1C7, #282828);&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#B57614, #FABD2F);&quot;&gt;cargo&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#79740E, #B8BB26);&quot;&gt; new&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#79740E, #B8BB26);&quot;&gt; hello&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#7C6F64, #A89984);&quot;&gt; &amp;amp;&amp;amp;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#AF3A03, #FE8019);&quot;&gt; cd&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#79740E, #B8BB26);&quot;&gt; hello&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#B57614, #FABD2F);&quot;&gt;cargo&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#79740E, #B8BB26);&quot;&gt; run&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;&lt;h2 id=&quot;the-first-program-worth-reading&quot;&gt;The first program worth reading&lt;&#x2F;h2&gt;
&lt;p&gt;Skip “Hello, world” — you can guess it. Here’s the smallest program that shows Rust’s personality:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#3C3836, #EBDBB2); background-color: light-dark(#FBF1C7, #282828);&quot;&gt;&lt;code data-lang=&quot;rust&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#9D0006, #FB4934);&quot;&gt;fn&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#B57614, #FABD2F);&quot;&gt; main&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#7C6F64, #A89984);&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#7C6F64, #A89984);&quot;&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#7C6F64, #A89984);&quot;&gt; {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#AF3A03, #FE8019);&quot;&gt;    let&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#076678, #83A598);&quot;&gt; name&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#427B58, #8EC07C);&quot;&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#B57614, #FABD2F);&quot;&gt; String&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#427B58, #8EC07C);&quot;&gt;::&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#B57614, #FABD2F);&quot;&gt;from&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#7C6F64, #A89984);&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#7C6F64, #A89984);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#79740E, #B8BB26);&quot;&gt;Sarmad&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#7C6F64, #A89984);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#7C6F64, #A89984);&quot;&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#7C6F64, #A89984);&quot;&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#B57614, #FABD2F);&quot;&gt;    greet&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#7C6F64, #A89984);&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#076678, #83A598);&quot;&gt;name&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#7C6F64, #A89984);&quot;&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#7C6F64, #A89984);&quot;&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#928374, #928374);font-style: italic;&quot;&gt;    &#x2F;&#x2F;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#928374, #928374);font-style: italic;&quot;&gt; greet(name);  &#x2F;&#x2F; &amp;lt;- uncomment this and the program stops compiling&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#7C6F64, #A89984);&quot;&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#9D0006, #FB4934);&quot;&gt;fn&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#B57614, #FABD2F);&quot;&gt; greet&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#7C6F64, #A89984);&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#076678, #83A598);&quot;&gt;name&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#427B58, #8EC07C);&quot;&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#B57614, #FABD2F);&quot;&gt; String&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#7C6F64, #A89984);&quot;&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#7C6F64, #A89984);&quot;&gt; {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#B57614, #FABD2F);&quot;&gt;    println!&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#7C6F64, #A89984);&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#7C6F64, #A89984);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#79740E, #B8BB26);&quot;&gt;Hello, &lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#7C6F64, #A89984);&quot;&gt;{&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#79740E, #B8BB26);&quot;&gt;name&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#7C6F64, #A89984);&quot;&gt;}&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#79740E, #B8BB26);&quot;&gt;!&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#7C6F64, #A89984);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#7C6F64, #A89984);&quot;&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#7C6F64, #A89984);&quot;&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#7C6F64, #A89984);&quot;&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Calling &lt;code&gt;greet(name)&lt;&#x2F;code&gt; &lt;em&gt;moves&lt;&#x2F;em&gt; the string into the function. After that line, &lt;code&gt;main&lt;&#x2F;code&gt; doesn’t own it anymore, and the compiler will refuse to let you use it. That refusal — checked entirely at compile time, costing nothing at runtime — is the core of the language. Everything else in this series is a consequence of it.&lt;&#x2F;p&gt;
&lt;p&gt;Next up: what “ownership” means precisely, and how borrowing lets you share values without giving them away.&lt;&#x2F;p&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>A tiny LRU cache, from scratch</title>
        <published>2026-05-14T00:00:00+00:00</published>
        <updated>2026-05-14T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Unknown
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://sarmadgulzar.com/blog/a-tiny-lru-cache-from-scratch/"/>
        <id>https://sarmadgulzar.com/blog/a-tiny-lru-cache-from-scratch/</id>
        
        <content type="html" xml:base="https://sarmadgulzar.com/blog/a-tiny-lru-cache-from-scratch/">&lt;p&gt;Python gives you an LRU cache for free:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#3C3836, #EBDBB2); background-color: light-dark(#FBF1C7, #282828);&quot;&gt;&lt;code data-lang=&quot;python&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#9D0006, #FB4934);&quot;&gt;from&lt;&#x2F;span&gt;&lt;span&gt; functools&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#9D0006, #FB4934);&quot;&gt; import&lt;&#x2F;span&gt;&lt;span&gt; lru_cache&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#7C6F64, #A89984);font-weight: bold;&quot;&gt;@&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#B57614, #FABD2F);font-weight: bold;&quot;&gt;lru_cache&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#7C6F64, #A89984);&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#076678, #83A598);&quot;&gt;maxsize&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#427B58, #8EC07C);&quot;&gt;=&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#8F3F71, #D3869B);&quot;&gt;256&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#7C6F64, #A89984);&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#9D0006, #FB4934);&quot;&gt;def&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#427B58, #8EC07C);&quot;&gt; expensive&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#7C6F64, #A89984);&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#076678, #83A598);&quot;&gt;x&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#7C6F64, #A89984);&quot;&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#B57614, #FABD2F);&quot;&gt; int&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#7C6F64, #A89984);&quot;&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#7C6F64, #A89984);&quot;&gt; -&amp;gt;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#B57614, #FABD2F);&quot;&gt; int&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#7C6F64, #A89984);&quot;&gt;:&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#8F3F71, #D3869B);&quot;&gt;    ...&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;That’s the right answer in production. But “least recently used” is one of those ideas that feels obvious until you try to implement it, so let’s build one — partly for fun, mostly because the implementation is a beautiful use of a data structure you already know.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;the-trick-is-the-dict&quot;&gt;The trick is the dict&lt;&#x2F;h2&gt;
&lt;p&gt;Since Python 3.7, dictionaries preserve insertion order. That’s the whole trick. An LRU cache needs two operations to be fast:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Look up a key&lt;&#x2F;strong&gt;, and mark it as recently used.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Evict the oldest key&lt;&#x2F;strong&gt; when the cache is full.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;An ordered dict gives you both. “Mark as recently used” is just &lt;em&gt;delete and re-insert&lt;&#x2F;em&gt; — the key moves to the end. “Evict the oldest” is &lt;em&gt;pop the first key&lt;&#x2F;em&gt;. Both are O(1).&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#3C3836, #EBDBB2); background-color: light-dark(#FBF1C7, #282828);&quot;&gt;&lt;code data-lang=&quot;python&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#9D0006, #FB4934);&quot;&gt;class&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#B57614, #FABD2F);&quot;&gt; LRUCache&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#7C6F64, #A89984);&quot;&gt;:&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#9D0006, #FB4934);&quot;&gt;    def&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#427B58, #8EC07C);&quot;&gt; __init__&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#7C6F64, #A89984);&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#076678, #83A598);&quot;&gt;self&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#7C6F64, #A89984);&quot;&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#076678, #83A598);&quot;&gt; maxsize&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#7C6F64, #A89984);&quot;&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#B57614, #FABD2F);&quot;&gt; int&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#427B58, #8EC07C);&quot;&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#8F3F71, #D3869B);&quot;&gt; 256&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#7C6F64, #A89984);&quot;&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#7C6F64, #A89984);&quot;&gt;:&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#076678, #83A598);&quot;&gt;        self&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#7C6F64, #A89984);&quot;&gt;.&lt;&#x2F;span&gt;&lt;span&gt;maxsize&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#427B58, #8EC07C);&quot;&gt; =&lt;&#x2F;span&gt;&lt;span&gt; maxsize&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#076678, #83A598);&quot;&gt;        self&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#7C6F64, #A89984);&quot;&gt;.&lt;&#x2F;span&gt;&lt;span&gt;_data&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#7C6F64, #A89984);&quot;&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#B57614, #FABD2F);&quot;&gt; dict&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#427B58, #8EC07C);&quot;&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#7C6F64, #A89984);&quot;&gt; {&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#7C6F64, #A89984);&quot;&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#9D0006, #FB4934);&quot;&gt;    def&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#427B58, #8EC07C);&quot;&gt; get&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#7C6F64, #A89984);&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#076678, #83A598);&quot;&gt;self&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#7C6F64, #A89984);&quot;&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#076678, #83A598);&quot;&gt; key&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#7C6F64, #A89984);&quot;&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#7C6F64, #A89984);&quot;&gt;:&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#9D0006, #FB4934);&quot;&gt;        if&lt;&#x2F;span&gt;&lt;span&gt; key&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#9D0006, #FB4934);&quot;&gt; not&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#9D0006, #FB4934);&quot;&gt; in&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#076678, #83A598);&quot;&gt; self&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#7C6F64, #A89984);&quot;&gt;.&lt;&#x2F;span&gt;&lt;span&gt;_data&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#7C6F64, #A89984);&quot;&gt;:&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#9D0006, #FB4934);&quot;&gt;            raise&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#B57614, #FABD2F);&quot;&gt; KeyError&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#7C6F64, #A89984);&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#504945, #D5C4A1);&quot;&gt;key&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#7C6F64, #A89984);&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        value&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#427B58, #8EC07C);&quot;&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#076678, #83A598);&quot;&gt; self&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#7C6F64, #A89984);&quot;&gt;.&lt;&#x2F;span&gt;&lt;span&gt;_data&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#7C6F64, #A89984);&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#076678, #83A598);&quot;&gt;pop&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#7C6F64, #A89984);&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#504945, #D5C4A1);&quot;&gt;key&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#7C6F64, #A89984);&quot;&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#928374, #928374);font-style: italic;&quot;&gt;   #&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#928374, #928374);font-style: italic;&quot;&gt; remove...&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#076678, #83A598);&quot;&gt;        self&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#7C6F64, #A89984);&quot;&gt;.&lt;&#x2F;span&gt;&lt;span&gt;_data&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#7C6F64, #A89984);&quot;&gt;[&lt;&#x2F;span&gt;&lt;span&gt;key&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#7C6F64, #A89984);&quot;&gt;]&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#427B58, #8EC07C);&quot;&gt; =&lt;&#x2F;span&gt;&lt;span&gt; value&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#928374, #928374);font-style: italic;&quot;&gt;       #&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#928374, #928374);font-style: italic;&quot;&gt; ...and re-insert at the end&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#9D0006, #FB4934);&quot;&gt;        return&lt;&#x2F;span&gt;&lt;span&gt; value&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#9D0006, #FB4934);&quot;&gt;    def&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#427B58, #8EC07C);&quot;&gt; put&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#7C6F64, #A89984);&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#076678, #83A598);&quot;&gt;self&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#7C6F64, #A89984);&quot;&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#076678, #83A598);&quot;&gt; key&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#7C6F64, #A89984);&quot;&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#076678, #83A598);&quot;&gt; value&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#7C6F64, #A89984);&quot;&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#7C6F64, #A89984);&quot;&gt; -&amp;gt;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#8F3F71, #D3869B);&quot;&gt; None&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#7C6F64, #A89984);&quot;&gt;:&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#9D0006, #FB4934);&quot;&gt;        if&lt;&#x2F;span&gt;&lt;span&gt; key&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#9D0006, #FB4934);&quot;&gt; in&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#076678, #83A598);&quot;&gt; self&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#7C6F64, #A89984);&quot;&gt;.&lt;&#x2F;span&gt;&lt;span&gt;_data&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#7C6F64, #A89984);&quot;&gt;:&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#076678, #83A598);&quot;&gt;            self&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#7C6F64, #A89984);&quot;&gt;.&lt;&#x2F;span&gt;&lt;span&gt;_data&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#7C6F64, #A89984);&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#076678, #83A598);&quot;&gt;pop&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#7C6F64, #A89984);&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#504945, #D5C4A1);&quot;&gt;key&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#7C6F64, #A89984);&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#9D0006, #FB4934);&quot;&gt;        elif&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#AF3A03, #FE8019);&quot;&gt; len&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#7C6F64, #A89984);&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#076678, #83A598);&quot;&gt;self&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#7C6F64, #A89984);&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#504945, #D5C4A1);&quot;&gt;_data&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#7C6F64, #A89984);&quot;&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#427B58, #8EC07C);&quot;&gt; &amp;gt;=&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#076678, #83A598);&quot;&gt; self&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#7C6F64, #A89984);&quot;&gt;.&lt;&#x2F;span&gt;&lt;span&gt;maxsize&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#7C6F64, #A89984);&quot;&gt;:&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;            oldest&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#427B58, #8EC07C);&quot;&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#AF3A03, #FE8019);&quot;&gt; next&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#7C6F64, #A89984);&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#AF3A03, #FE8019);&quot;&gt;iter&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#7C6F64, #A89984);&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#076678, #83A598);&quot;&gt;self&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#7C6F64, #A89984);&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#504945, #D5C4A1);&quot;&gt;_data&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#7C6F64, #A89984);&quot;&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#7C6F64, #A89984);&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#9D0006, #FB4934);&quot;&gt;            del&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#076678, #83A598);&quot;&gt; self&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#7C6F64, #A89984);&quot;&gt;.&lt;&#x2F;span&gt;&lt;span&gt;_data&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#7C6F64, #A89984);&quot;&gt;[&lt;&#x2F;span&gt;&lt;span&gt;oldest&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#7C6F64, #A89984);&quot;&gt;]&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#076678, #83A598);&quot;&gt;        self&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#7C6F64, #A89984);&quot;&gt;.&lt;&#x2F;span&gt;&lt;span&gt;_data&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#7C6F64, #A89984);&quot;&gt;[&lt;&#x2F;span&gt;&lt;span&gt;key&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#7C6F64, #A89984);&quot;&gt;]&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#427B58, #8EC07C);&quot;&gt; =&lt;&#x2F;span&gt;&lt;span&gt; value&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Twenty lines. The recently-used order is the dict’s insertion order; we never store it separately, so it can never go stale.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;why-the-real-one-is-different&quot;&gt;Why the real one is different&lt;&#x2F;h2&gt;
&lt;p&gt;CPython’s &lt;code&gt;lru_cache&lt;&#x2F;code&gt; is implemented in C with a doubly linked list threaded through the hash table entries, plus a lock for thread safety. The linked list avoids the pop-and-reinsert dance — it just splices nodes. Same idea, fewer allocations.&lt;&#x2F;p&gt;
&lt;blockquote&gt;
&lt;p&gt;The best way to appreciate a standard library function is to write a worse version of it yourself.&lt;&#x2F;p&gt;
&lt;&#x2F;blockquote&gt;
&lt;p&gt;If you want homework: add a &lt;code&gt;hits&lt;&#x2F;code&gt; &#x2F; &lt;code&gt;misses&lt;&#x2F;code&gt; counter and a &lt;code&gt;cache_info()&lt;&#x2F;code&gt; method, then compare your numbers against the real decorator on the same workload. They should match exactly — and if they don’t, finding out why is where the actual learning is.&lt;&#x2F;p&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>Reading a button, the obvious way</title>
        <published>2026-03-27T00:00:00+00:00</published>
        <updated>2026-03-27T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Unknown
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://sarmadgulzar.com/series/xiao-ble-embassy/digital-input/"/>
        <id>https://sarmadgulzar.com/series/xiao-ble-embassy/digital-input/</id>
        
        <content type="html" xml:base="https://sarmadgulzar.com/series/xiao-ble-embassy/digital-input/">&lt;p&gt;Output was easy; input is where wiring details start to matter. This part connects a push button to the board and lights the onboard red LED while it’s held down. The code is &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;sarmadgulzar&#x2F;xiao-ble-embassy&#x2F;tree&#x2F;main&#x2F;crates&#x2F;02-digital-input&quot;&gt;&lt;code&gt;crates&#x2F;02-digital-input&lt;&#x2F;code&gt;&lt;&#x2F;a&gt;:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#3C3836, #EBDBB2); background-color: light-dark(#FBF1C7, #282828);&quot;&gt;&lt;code data-lang=&quot;rust&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#7C6F64, #A89984);&quot;&gt;#&lt;&#x2F;span&gt;&lt;span&gt;!&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#7C6F64, #A89984);&quot;&gt;[&lt;&#x2F;span&gt;&lt;span&gt;no_std&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#7C6F64, #A89984);&quot;&gt;]&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#7C6F64, #A89984);&quot;&gt;#&lt;&#x2F;span&gt;&lt;span&gt;!&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#7C6F64, #A89984);&quot;&gt;[&lt;&#x2F;span&gt;&lt;span&gt;no_main&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#7C6F64, #A89984);&quot;&gt;]&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#9D0006, #FB4934);&quot;&gt;use&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#B57614, #FABD2F);&quot;&gt; defmt&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#427B58, #8EC07C);&quot;&gt;::&lt;&#x2F;span&gt;&lt;span&gt;info&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#7C6F64, #A89984);&quot;&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#9D0006, #FB4934);&quot;&gt;use&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#B57614, #FABD2F);&quot;&gt; embassy_nrf&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#427B58, #8EC07C);&quot;&gt;::&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#B57614, #FABD2F);&quot;&gt;gpio&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#427B58, #8EC07C);&quot;&gt;::&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#7C6F64, #A89984);&quot;&gt;{&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#B57614, #FABD2F);&quot;&gt;Input&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#7C6F64, #A89984);&quot;&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#B57614, #FABD2F);&quot;&gt; Level&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#7C6F64, #A89984);&quot;&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#B57614, #FABD2F);&quot;&gt; Output&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#7C6F64, #A89984);&quot;&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#B57614, #FABD2F);&quot;&gt; OutputDrive&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#7C6F64, #A89984);&quot;&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#B57614, #FABD2F);&quot;&gt; Pull&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#7C6F64, #A89984);&quot;&gt;}&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#7C6F64, #A89984);&quot;&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#9D0006, #FB4934);&quot;&gt;use&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#7C6F64, #A89984);&quot;&gt; {&lt;&#x2F;span&gt;&lt;span&gt;defmt_rtt &lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#9D0006, #FB4934);&quot;&gt;as&lt;&#x2F;span&gt;&lt;span&gt; _&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#7C6F64, #A89984);&quot;&gt;,&lt;&#x2F;span&gt;&lt;span&gt; panic_probe &lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#9D0006, #FB4934);&quot;&gt;as&lt;&#x2F;span&gt;&lt;span&gt; _&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#7C6F64, #A89984);&quot;&gt;}&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#7C6F64, #A89984);&quot;&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#7C6F64, #A89984);&quot;&gt;#&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#7C6F64, #A89984);&quot;&gt;[&lt;&#x2F;span&gt;&lt;span&gt;embassy_executor&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#427B58, #8EC07C);&quot;&gt;::&lt;&#x2F;span&gt;&lt;span&gt;main&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#7C6F64, #A89984);&quot;&gt;]&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#9D0006, #FB4934);&quot;&gt;async&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#9D0006, #FB4934);&quot;&gt; fn&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#B57614, #FABD2F);&quot;&gt; main&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#7C6F64, #A89984);&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#076678, #83A598);&quot;&gt;_spawner&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#427B58, #8EC07C);&quot;&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#B57614, #FABD2F);&quot;&gt; embassy_executor&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#427B58, #8EC07C);&quot;&gt;::&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#B57614, #FABD2F);&quot;&gt;Spawner&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#7C6F64, #A89984);&quot;&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#7C6F64, #A89984);&quot;&gt; {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#AF3A03, #FE8019);&quot;&gt;    let&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#076678, #83A598);&quot;&gt; p&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#427B58, #8EC07C);&quot;&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#B57614, #FABD2F);&quot;&gt; embassy_nrf&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#427B58, #8EC07C);&quot;&gt;::&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#B57614, #FABD2F);&quot;&gt;init&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#7C6F64, #A89984);&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#B57614, #FABD2F);&quot;&gt;Default&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#427B58, #8EC07C);&quot;&gt;::&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#B57614, #FABD2F);&quot;&gt;default&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#7C6F64, #A89984);&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#7C6F64, #A89984);&quot;&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#7C6F64, #A89984);&quot;&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#7C6F64, #A89984);&quot;&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#B57614, #FABD2F);&quot;&gt;    info!&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#7C6F64, #A89984);&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#7C6F64, #A89984);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#79740E, #B8BB26);&quot;&gt;Initializing the onboard Red LED...&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#7C6F64, #A89984);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#7C6F64, #A89984);&quot;&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#7C6F64, #A89984);&quot;&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#AF3A03, #FE8019);&quot;&gt;    let&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#AF3A03, #FE8019);&quot;&gt; mut&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#076678, #83A598);&quot;&gt; onboard_red&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#427B58, #8EC07C);&quot;&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#B57614, #FABD2F);&quot;&gt; Output&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#427B58, #8EC07C);&quot;&gt;::&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#B57614, #FABD2F);&quot;&gt;new&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#7C6F64, #A89984);&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#076678, #83A598);&quot;&gt;p&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#427B58, #8EC07C);&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#B57614, #FABD2F);&quot;&gt;P0_26&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#7C6F64, #A89984);&quot;&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#B57614, #FABD2F);&quot;&gt; Level&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#427B58, #8EC07C);&quot;&gt;::&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#B57614, #FABD2F);&quot;&gt;High&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#7C6F64, #A89984);&quot;&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#B57614, #FABD2F);&quot;&gt; OutputDrive&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#427B58, #8EC07C);&quot;&gt;::&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#B57614, #FABD2F);&quot;&gt;Standard&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#7C6F64, #A89984);&quot;&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#7C6F64, #A89984);&quot;&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#B57614, #FABD2F);&quot;&gt;    info!&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#7C6F64, #A89984);&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#7C6F64, #A89984);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#79740E, #B8BB26);&quot;&gt;Initializing the button...&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#7C6F64, #A89984);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#7C6F64, #A89984);&quot;&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#7C6F64, #A89984);&quot;&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#AF3A03, #FE8019);&quot;&gt;    let&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#076678, #83A598);&quot;&gt; button&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#427B58, #8EC07C);&quot;&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#B57614, #FABD2F);&quot;&gt; Input&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#427B58, #8EC07C);&quot;&gt;::&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#B57614, #FABD2F);&quot;&gt;new&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#7C6F64, #A89984);&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#076678, #83A598);&quot;&gt;p&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#427B58, #8EC07C);&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#B57614, #FABD2F);&quot;&gt;P0_03&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#7C6F64, #A89984);&quot;&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#B57614, #FABD2F);&quot;&gt; Pull&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#427B58, #8EC07C);&quot;&gt;::&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#B57614, #FABD2F);&quot;&gt;Up&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#7C6F64, #A89984);&quot;&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#7C6F64, #A89984);&quot;&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#9D0006, #FB4934);&quot;&gt;    loop&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#7C6F64, #A89984);&quot;&gt; {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#9D0006, #FB4934);&quot;&gt;        if&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#076678, #83A598);&quot;&gt; button&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#427B58, #8EC07C);&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#B57614, #FABD2F);&quot;&gt;is_low&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#7C6F64, #A89984);&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#7C6F64, #A89984);&quot;&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#7C6F64, #A89984);&quot;&gt; {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#B57614, #FABD2F);&quot;&gt;            info!&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#7C6F64, #A89984);&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#7C6F64, #A89984);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#79740E, #B8BB26);&quot;&gt;Pressed...&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#7C6F64, #A89984);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#7C6F64, #A89984);&quot;&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#7C6F64, #A89984);&quot;&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#076678, #83A598);&quot;&gt;            onboard_red&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#427B58, #8EC07C);&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#B57614, #FABD2F);&quot;&gt;set_low&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#7C6F64, #A89984);&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#7C6F64, #A89984);&quot;&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#7C6F64, #A89984);&quot;&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#7C6F64, #A89984);&quot;&gt;        }&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#9D0006, #FB4934);&quot;&gt; else&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#7C6F64, #A89984);&quot;&gt; {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#B57614, #FABD2F);&quot;&gt;            info!&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#7C6F64, #A89984);&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#7C6F64, #A89984);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#79740E, #B8BB26);&quot;&gt;Not Pressed...&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#7C6F64, #A89984);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#7C6F64, #A89984);&quot;&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#7C6F64, #A89984);&quot;&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#076678, #83A598);&quot;&gt;            onboard_red&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#427B58, #8EC07C);&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#B57614, #FABD2F);&quot;&gt;set_high&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#7C6F64, #A89984);&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#7C6F64, #A89984);&quot;&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#7C6F64, #A89984);&quot;&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#7C6F64, #A89984);&quot;&gt;        }&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#7C6F64, #A89984);&quot;&gt;    }&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#7C6F64, #A89984);&quot;&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;&lt;h2 id=&quot;why-pull-up&quot;&gt;Why &lt;code&gt;Pull::Up&lt;&#x2F;code&gt;&lt;&#x2F;h2&gt;
&lt;p&gt;A button is just two contacts. Wire one side to a GPIO pin and the other to ground, and you have half a circuit: when the button is pressed the pin is connected to ground, but when it’s released the pin is connected to &lt;em&gt;nothing&lt;&#x2F;em&gt;. A floating pin reads garbage — it picks up whatever electrical noise is nearby.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;code&gt;Pull::Up&lt;&#x2F;code&gt; fixes that by enabling the chip’s internal pull-up resistor, which gently ties the pin to the supply voltage. Now the pin has a defined state at all times: &lt;strong&gt;high when released, low when pressed&lt;&#x2F;strong&gt;. That’s why the check is &lt;code&gt;button.is_low()&lt;&#x2F;code&gt; for “pressed” — the same inverted logic we met with the active-low LED, this time coming from the circuit rather than the board layout.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;what-s-wrong-with-this-picture&quot;&gt;What’s wrong with this picture&lt;&#x2F;h2&gt;
&lt;p&gt;It works, and for a first input program it’s exactly right. But look at what the loop does when nothing is happening: it checks the pin, checks it again, and again, millions of times per second. The log output makes the problem visible — &lt;code&gt;Not Pressed...&lt;&#x2F;code&gt; scrolls past faster than the terminal can render it.&lt;&#x2F;p&gt;
&lt;p&gt;On a desktop that’s merely wasteful. On a battery-powered board it’s disqualifying: the CPU never idles, so the chip never drops into a low-power state. And the busy loop doesn’t scale — this &lt;code&gt;main&lt;&#x2F;code&gt; can do nothing else while it’s spinning on the button.&lt;&#x2F;p&gt;
&lt;p&gt;We already know the shape of the fix. In part one, &lt;code&gt;Timer::after_millis(1000).await&lt;&#x2F;code&gt; let the chip sleep through a delay. What we want here is the same thing for a pin: &lt;em&gt;sleep until the button changes&lt;&#x2F;em&gt;. That’s exactly what Embassy’s async inputs do, and it’s next.&lt;&#x2F;p&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>Blinky, the async way</title>
        <published>2026-03-04T00:00:00+00:00</published>
        <updated>2026-03-04T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Unknown
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://sarmadgulzar.com/series/xiao-ble-embassy/blinky/"/>
        <id>https://sarmadgulzar.com/series/xiao-ble-embassy/blinky/</id>
        
        <content type="html" xml:base="https://sarmadgulzar.com/series/xiao-ble-embassy/blinky/">&lt;p&gt;Blinky is the embedded hello-world, and it earns the title honestly: getting an LED to blink proves your entire toolchain — compiler target, linker script, flasher, debug logging — end to end. Once it blinks, everything after is just more Rust.&lt;&#x2F;p&gt;
&lt;p&gt;The full crate is &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;sarmadgulzar&#x2F;xiao-ble-embassy&#x2F;tree&#x2F;main&#x2F;crates&#x2F;01-blinky&quot;&gt;&lt;code&gt;crates&#x2F;01-blinky&lt;&#x2F;code&gt;&lt;&#x2F;a&gt;. Here’s the whole program:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#3C3836, #EBDBB2); background-color: light-dark(#FBF1C7, #282828);&quot;&gt;&lt;code data-lang=&quot;rust&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#7C6F64, #A89984);&quot;&gt;#&lt;&#x2F;span&gt;&lt;span&gt;!&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#7C6F64, #A89984);&quot;&gt;[&lt;&#x2F;span&gt;&lt;span&gt;no_std&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#7C6F64, #A89984);&quot;&gt;]&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#7C6F64, #A89984);&quot;&gt;#&lt;&#x2F;span&gt;&lt;span&gt;!&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#7C6F64, #A89984);&quot;&gt;[&lt;&#x2F;span&gt;&lt;span&gt;no_main&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#7C6F64, #A89984);&quot;&gt;]&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#9D0006, #FB4934);&quot;&gt;use&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#B57614, #FABD2F);&quot;&gt; defmt&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#427B58, #8EC07C);&quot;&gt;::&lt;&#x2F;span&gt;&lt;span&gt;info&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#7C6F64, #A89984);&quot;&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#9D0006, #FB4934);&quot;&gt;use&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#B57614, #FABD2F);&quot;&gt; embassy_executor&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#427B58, #8EC07C);&quot;&gt;::&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#B57614, #FABD2F);&quot;&gt;Spawner&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#7C6F64, #A89984);&quot;&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#9D0006, #FB4934);&quot;&gt;use&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#B57614, #FABD2F);&quot;&gt; embassy_nrf&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#427B58, #8EC07C);&quot;&gt;::&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#B57614, #FABD2F);&quot;&gt;gpio&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#427B58, #8EC07C);&quot;&gt;::&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#7C6F64, #A89984);&quot;&gt;{&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#B57614, #FABD2F);&quot;&gt;Level&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#7C6F64, #A89984);&quot;&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#B57614, #FABD2F);&quot;&gt; Output&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#7C6F64, #A89984);&quot;&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#B57614, #FABD2F);&quot;&gt; OutputDrive&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#7C6F64, #A89984);&quot;&gt;}&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#7C6F64, #A89984);&quot;&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#9D0006, #FB4934);&quot;&gt;use&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#B57614, #FABD2F);&quot;&gt; embassy_time&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#427B58, #8EC07C);&quot;&gt;::&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#B57614, #FABD2F);&quot;&gt;Timer&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#7C6F64, #A89984);&quot;&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#9D0006, #FB4934);&quot;&gt;use&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#7C6F64, #A89984);&quot;&gt; {&lt;&#x2F;span&gt;&lt;span&gt;defmt_rtt &lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#9D0006, #FB4934);&quot;&gt;as&lt;&#x2F;span&gt;&lt;span&gt; _&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#7C6F64, #A89984);&quot;&gt;,&lt;&#x2F;span&gt;&lt;span&gt; panic_probe &lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#9D0006, #FB4934);&quot;&gt;as&lt;&#x2F;span&gt;&lt;span&gt; _&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#7C6F64, #A89984);&quot;&gt;}&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#7C6F64, #A89984);&quot;&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#7C6F64, #A89984);&quot;&gt;#&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#7C6F64, #A89984);&quot;&gt;[&lt;&#x2F;span&gt;&lt;span&gt;embassy_executor&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#427B58, #8EC07C);&quot;&gt;::&lt;&#x2F;span&gt;&lt;span&gt;main&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#7C6F64, #A89984);&quot;&gt;]&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#9D0006, #FB4934);&quot;&gt;async&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#9D0006, #FB4934);&quot;&gt; fn&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#B57614, #FABD2F);&quot;&gt; main&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#7C6F64, #A89984);&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#076678, #83A598);&quot;&gt;_spawner&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#427B58, #8EC07C);&quot;&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#B57614, #FABD2F);&quot;&gt; Spawner&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#7C6F64, #A89984);&quot;&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#7C6F64, #A89984);&quot;&gt; {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#AF3A03, #FE8019);&quot;&gt;    let&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#076678, #83A598);&quot;&gt; p&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#427B58, #8EC07C);&quot;&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#B57614, #FABD2F);&quot;&gt; embassy_nrf&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#427B58, #8EC07C);&quot;&gt;::&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#B57614, #FABD2F);&quot;&gt;init&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#7C6F64, #A89984);&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#B57614, #FABD2F);&quot;&gt;Default&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#427B58, #8EC07C);&quot;&gt;::&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#B57614, #FABD2F);&quot;&gt;default&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#7C6F64, #A89984);&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#7C6F64, #A89984);&quot;&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#7C6F64, #A89984);&quot;&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#7C6F64, #A89984);&quot;&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#928374, #928374);font-style: italic;&quot;&gt;    &#x2F;&#x2F;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#928374, #928374);font-style: italic;&quot;&gt; Initialize RGB LED pins (active low)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#AF3A03, #FE8019);&quot;&gt;    let&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#AF3A03, #FE8019);&quot;&gt; mut&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#076678, #83A598);&quot;&gt; red&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#427B58, #8EC07C);&quot;&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#B57614, #FABD2F);&quot;&gt; Output&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#427B58, #8EC07C);&quot;&gt;::&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#B57614, #FABD2F);&quot;&gt;new&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#7C6F64, #A89984);&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#076678, #83A598);&quot;&gt;p&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#427B58, #8EC07C);&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#B57614, #FABD2F);&quot;&gt;P0_26&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#7C6F64, #A89984);&quot;&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#B57614, #FABD2F);&quot;&gt; Level&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#427B58, #8EC07C);&quot;&gt;::&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#B57614, #FABD2F);&quot;&gt;High&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#7C6F64, #A89984);&quot;&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#B57614, #FABD2F);&quot;&gt; OutputDrive&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#427B58, #8EC07C);&quot;&gt;::&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#B57614, #FABD2F);&quot;&gt;Standard&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#7C6F64, #A89984);&quot;&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#7C6F64, #A89984);&quot;&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#AF3A03, #FE8019);&quot;&gt;    let&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#AF3A03, #FE8019);&quot;&gt; mut&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#076678, #83A598);&quot;&gt; green&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#427B58, #8EC07C);&quot;&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#B57614, #FABD2F);&quot;&gt; Output&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#427B58, #8EC07C);&quot;&gt;::&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#B57614, #FABD2F);&quot;&gt;new&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#7C6F64, #A89984);&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#076678, #83A598);&quot;&gt;p&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#427B58, #8EC07C);&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#B57614, #FABD2F);&quot;&gt;P0_30&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#7C6F64, #A89984);&quot;&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#B57614, #FABD2F);&quot;&gt; Level&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#427B58, #8EC07C);&quot;&gt;::&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#B57614, #FABD2F);&quot;&gt;High&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#7C6F64, #A89984);&quot;&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#B57614, #FABD2F);&quot;&gt; OutputDrive&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#427B58, #8EC07C);&quot;&gt;::&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#B57614, #FABD2F);&quot;&gt;Standard&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#7C6F64, #A89984);&quot;&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#7C6F64, #A89984);&quot;&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#AF3A03, #FE8019);&quot;&gt;    let&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#AF3A03, #FE8019);&quot;&gt; mut&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#076678, #83A598);&quot;&gt; blue&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#427B58, #8EC07C);&quot;&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#B57614, #FABD2F);&quot;&gt; Output&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#427B58, #8EC07C);&quot;&gt;::&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#B57614, #FABD2F);&quot;&gt;new&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#7C6F64, #A89984);&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#076678, #83A598);&quot;&gt;p&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#427B58, #8EC07C);&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#B57614, #FABD2F);&quot;&gt;P0_06&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#7C6F64, #A89984);&quot;&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#B57614, #FABD2F);&quot;&gt; Level&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#427B58, #8EC07C);&quot;&gt;::&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#B57614, #FABD2F);&quot;&gt;High&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#7C6F64, #A89984);&quot;&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#B57614, #FABD2F);&quot;&gt; OutputDrive&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#427B58, #8EC07C);&quot;&gt;::&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#B57614, #FABD2F);&quot;&gt;Standard&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#7C6F64, #A89984);&quot;&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#7C6F64, #A89984);&quot;&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#B57614, #FABD2F);&quot;&gt;    info!&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#7C6F64, #A89984);&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#7C6F64, #A89984);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#79740E, #B8BB26);&quot;&gt;Starting RGB LED pattern...&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#7C6F64, #A89984);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#7C6F64, #A89984);&quot;&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#7C6F64, #A89984);&quot;&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#9D0006, #FB4934);&quot;&gt;    loop&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#7C6F64, #A89984);&quot;&gt; {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#928374, #928374);font-style: italic;&quot;&gt;        &#x2F;&#x2F;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#928374, #928374);font-style: italic;&quot;&gt; Red on&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#076678, #83A598);&quot;&gt;        red&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#427B58, #8EC07C);&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#B57614, #FABD2F);&quot;&gt;set_low&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#7C6F64, #A89984);&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#7C6F64, #A89984);&quot;&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#7C6F64, #A89984);&quot;&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#076678, #83A598);&quot;&gt;        green&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#427B58, #8EC07C);&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#B57614, #FABD2F);&quot;&gt;set_high&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#7C6F64, #A89984);&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#7C6F64, #A89984);&quot;&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#7C6F64, #A89984);&quot;&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#076678, #83A598);&quot;&gt;        blue&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#427B58, #8EC07C);&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#B57614, #FABD2F);&quot;&gt;set_high&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#7C6F64, #A89984);&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#7C6F64, #A89984);&quot;&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#7C6F64, #A89984);&quot;&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#B57614, #FABD2F);&quot;&gt;        Timer&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#427B58, #8EC07C);&quot;&gt;::&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#B57614, #FABD2F);&quot;&gt;after_millis&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#7C6F64, #A89984);&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#8F3F71, #D3869B);&quot;&gt;1000&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#7C6F64, #A89984);&quot;&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#427B58, #8EC07C);&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#9D0006, #FB4934);&quot;&gt;await&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#7C6F64, #A89984);&quot;&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#928374, #928374);font-style: italic;&quot;&gt;        &#x2F;&#x2F;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#928374, #928374);font-style: italic;&quot;&gt; Green on&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#076678, #83A598);&quot;&gt;        red&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#427B58, #8EC07C);&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#B57614, #FABD2F);&quot;&gt;set_high&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#7C6F64, #A89984);&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#7C6F64, #A89984);&quot;&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#7C6F64, #A89984);&quot;&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#076678, #83A598);&quot;&gt;        green&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#427B58, #8EC07C);&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#B57614, #FABD2F);&quot;&gt;set_low&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#7C6F64, #A89984);&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#7C6F64, #A89984);&quot;&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#7C6F64, #A89984);&quot;&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#076678, #83A598);&quot;&gt;        blue&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#427B58, #8EC07C);&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#B57614, #FABD2F);&quot;&gt;set_high&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#7C6F64, #A89984);&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#7C6F64, #A89984);&quot;&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#7C6F64, #A89984);&quot;&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#B57614, #FABD2F);&quot;&gt;        Timer&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#427B58, #8EC07C);&quot;&gt;::&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#B57614, #FABD2F);&quot;&gt;after_millis&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#7C6F64, #A89984);&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#8F3F71, #D3869B);&quot;&gt;1000&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#7C6F64, #A89984);&quot;&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#427B58, #8EC07C);&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#9D0006, #FB4934);&quot;&gt;await&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#7C6F64, #A89984);&quot;&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#928374, #928374);font-style: italic;&quot;&gt;        &#x2F;&#x2F;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#928374, #928374);font-style: italic;&quot;&gt; Blue on&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#076678, #83A598);&quot;&gt;        red&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#427B58, #8EC07C);&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#B57614, #FABD2F);&quot;&gt;set_high&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#7C6F64, #A89984);&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#7C6F64, #A89984);&quot;&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#7C6F64, #A89984);&quot;&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#076678, #83A598);&quot;&gt;        green&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#427B58, #8EC07C);&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#B57614, #FABD2F);&quot;&gt;set_high&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#7C6F64, #A89984);&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#7C6F64, #A89984);&quot;&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#7C6F64, #A89984);&quot;&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#076678, #83A598);&quot;&gt;        blue&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#427B58, #8EC07C);&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#B57614, #FABD2F);&quot;&gt;set_low&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#7C6F64, #A89984);&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#7C6F64, #A89984);&quot;&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#7C6F64, #A89984);&quot;&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#B57614, #FABD2F);&quot;&gt;        Timer&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#427B58, #8EC07C);&quot;&gt;::&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#B57614, #FABD2F);&quot;&gt;after_millis&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#7C6F64, #A89984);&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#8F3F71, #D3869B);&quot;&gt;1000&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#7C6F64, #A89984);&quot;&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#427B58, #8EC07C);&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#9D0006, #FB4934);&quot;&gt;await&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#7C6F64, #A89984);&quot;&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#7C6F64, #A89984);&quot;&gt;    }&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#7C6F64, #A89984);&quot;&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;A few lines deserve a closer look.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;no-standard-library-no-main&quot;&gt;No standard library, no main&lt;&#x2F;h2&gt;
&lt;p&gt;&lt;code&gt;#![no_std]&lt;&#x2F;code&gt; opts out of Rust’s standard library — there’s no operating system here to provide files, threads, or heap allocation. &lt;code&gt;#![no_main]&lt;&#x2F;code&gt; opts out of the usual entry point, because there’s no OS to call &lt;code&gt;main&lt;&#x2F;code&gt; either. The &lt;code&gt;#[embassy_executor::main]&lt;&#x2F;code&gt; macro fills that gap: it sets up Embassy’s async executor as the program’s entry point and hands your &lt;code&gt;async fn main&lt;&#x2F;code&gt; to it.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;code&gt;embassy_nrf::init&lt;&#x2F;code&gt; claims the chip’s peripherals and returns them as a struct of singletons. Each pin exists exactly once in &lt;code&gt;p&lt;&#x2F;code&gt;, and moving &lt;code&gt;p.P0_26&lt;&#x2F;code&gt; into an &lt;code&gt;Output&lt;&#x2F;code&gt; consumes it — the type system makes it impossible for two parts of your program to fight over the same pin.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;active-low&quot;&gt;Active low&lt;&#x2F;h2&gt;
&lt;p&gt;The XIAO BLE’s onboard RGB LED is wired &lt;em&gt;active low&lt;&#x2F;em&gt;: the pin sinks current, so &lt;code&gt;set_low()&lt;&#x2F;code&gt; turns the LED &lt;strong&gt;on&lt;&#x2F;strong&gt; and &lt;code&gt;set_high()&lt;&#x2F;code&gt; turns it &lt;strong&gt;off&lt;&#x2F;strong&gt;. That’s why all three pins start at &lt;code&gt;Level::High&lt;&#x2F;code&gt; — everything off — and why the code looks inverted if you’re expecting &lt;code&gt;high = on&lt;&#x2F;code&gt;. This wiring is common on dev boards; check the schematic before you trust a pin name.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;the-await-that-matters&quot;&gt;The await that matters&lt;&#x2F;h2&gt;
&lt;p&gt;The interesting line is the one that looks least interesting:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#3C3836, #EBDBB2); background-color: light-dark(#FBF1C7, #282828);&quot;&gt;&lt;code data-lang=&quot;rust&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#B57614, #FABD2F);&quot;&gt;Timer&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#427B58, #8EC07C);&quot;&gt;::&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#B57614, #FABD2F);&quot;&gt;after_millis&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#7C6F64, #A89984);&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#8F3F71, #D3869B);&quot;&gt;1000&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#7C6F64, #A89984);&quot;&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#427B58, #8EC07C);&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#9D0006, #FB4934);&quot;&gt;await&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#7C6F64, #A89984);&quot;&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;A classic bare-metal blinky burns that second in a busy-wait loop, spinning the CPU at full speed doing nothing. Here, &lt;code&gt;.await&lt;&#x2F;code&gt; hands control back to the executor, which programs a hardware timer and puts the core to sleep until it fires. Same behavior, a fraction of the power — and no concurrency involved yet. That’s the quiet pitch of Embassy: the async syntax you already know compiles down to the interrupt-driven, sleep-when-idle code you’d otherwise write by hand.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;code&gt;defmt&lt;&#x2F;code&gt; provides the logging (&lt;code&gt;info!&lt;&#x2F;code&gt;), streamed over the debug probe by &lt;code&gt;defmt-rtt&lt;&#x2F;code&gt;; &lt;code&gt;cargo run&lt;&#x2F;code&gt; inside the crate flashes the board via &lt;code&gt;probe-rs&lt;&#x2F;code&gt; and tails those logs in your terminal.&lt;&#x2F;p&gt;
&lt;p&gt;Next up: input. We’ll read a button — first the obvious way, then the right way.&lt;&#x2F;p&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>In defense of boring tools</title>
        <published>2026-02-21T00:00:00+00:00</published>
        <updated>2026-02-21T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Unknown
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://sarmadgulzar.com/blog/in-defense-of-boring-tools/"/>
        <id>https://sarmadgulzar.com/blog/in-defense-of-boring-tools/</id>
        
        <content type="html" xml:base="https://sarmadgulzar.com/blog/in-defense-of-boring-tools/">&lt;p&gt;There’s a particular kind of restlessness that disguises itself as diligence: the feeling that your tools are the bottleneck. A faster terminal, a sharper editor, the new framework everyone’s benchmarking — surely &lt;em&gt;that’s&lt;&#x2F;em&gt; what stands between you and the work.&lt;&#x2F;p&gt;
&lt;p&gt;It almost never is.&lt;&#x2F;p&gt;
&lt;p&gt;The most productive engineers I know share one habit, and it isn’t a tool at all: at some point, they stopped shopping. They picked an editor, a language, a way of taking notes — usually nothing fashionable — and then spent the next decade getting frighteningly good at that small set of things. Their setups are boring. Their output is not.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;novelty-has-a-payroll&quot;&gt;Novelty has a payroll&lt;&#x2F;h2&gt;
&lt;p&gt;Every new tool charges you twice. Once up front, in the hours you spend learning it — and again quietly, forever, in the maintenance: config drift, breaking changes, the plugin that stops working, the migration you’ll do in eighteen months. Boring tools have already collected their fees. &lt;code&gt;make&lt;&#x2F;code&gt; is not going to surprise you. Neither is SQLite, or rsync, or a plain text file with today’s date at the top.&lt;&#x2F;p&gt;
&lt;p&gt;That’s the actual argument for boring: not nostalgia, but &lt;em&gt;predictability&lt;&#x2F;em&gt;. A tool you can predict is a tool you can think with. The interface disappears and the problem is all that’s left.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;the-escape-hatch&quot;&gt;The escape hatch&lt;&#x2F;h2&gt;
&lt;p&gt;None of this means never adopting anything. It means changing the default question from “is this better?” — almost everything is better in some dimension — to “is this better enough to pay for twice?” Occasionally the answer is yes. Version control was worth it. So were type checkers. When the answer is really yes, you’ll notice, because you’ll keep hitting the same wall every week and the new thing removes the wall entirely.&lt;&#x2F;p&gt;
&lt;p&gt;Everything else is shopping. And shopping, whatever it feels like at the time, is not the work.&lt;&#x2F;p&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>What I learned recording 100 videos</title>
        <published>2025-11-03T00:00:00+00:00</published>
        <updated>2025-11-03T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Unknown
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://sarmadgulzar.com/blog/what-i-learned-recording-100-videos/"/>
        <id>https://sarmadgulzar.com/blog/what-i-learned-recording-100-videos/</id>
        
        <content type="html" xml:base="https://sarmadgulzar.com/blog/what-i-learned-recording-100-videos/">&lt;p&gt;Somewhere past the hundredth recording, patterns start to show. Not about cameras or microphones — about explanation itself. A few notes, mostly for my past self.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;strong&gt;The first take is a draft.&lt;&#x2F;strong&gt; Nobody writes a good essay in one pass, but every beginner (me included) expects to &lt;em&gt;speak&lt;&#x2F;em&gt; one. Record the explanation once badly, listen to where you rambled, then record it again. The second take is always half the length and twice as clear.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;strong&gt;Cut the setup.&lt;&#x2F;strong&gt; Every instinct says to begin with context: what we’ll cover, why it matters, what you’ll need installed. Delete all of it. Start where the interesting thing starts. People arrived because the title already told them why it matters.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;strong&gt;One idea per video.&lt;&#x2F;strong&gt; The tutorial that covers everything teaches nothing, because nobody finishes it. The ceiling on clarity is set before you record, when you decide what &lt;em&gt;not&lt;&#x2F;em&gt; to include.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;strong&gt;Silence is edit points.&lt;&#x2F;strong&gt; Pause deliberately between sentences while recording. It feels unnatural in the moment and invisible in the final cut — and it makes trimming painless.&lt;&#x2F;p&gt;
&lt;p&gt;The meta-lesson, I think, is that teaching is a subtractive art. Beginners add: more context, more caveats, more slides. The improvement curve is mostly a deletion curve. Which sounds a lot like writing, and a lot like code.&lt;&#x2F;p&gt;
</content>
        
    </entry>
</feed>
