<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>Blogs on 星沉地动的个人博客</title>
    <link>https://xcdd.pages.dev/blog/</link>
    <description>Recent content in Blogs on 星沉地动的个人博客</description>
    <generator>Hugo</generator>
    <language>zh-cn</language>
    <lastBuildDate>Tue, 15 Jul 2025 14:21:11 +0000</lastBuildDate>
    <atom:link href="https://xcdd.pages.dev/blog/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>Windows 10(11)让人诟病的问题强行阉割控制面板</title>
      <link>https://xcdd.pages.dev/blog/2025/2025-07-15/</link>
      <pubDate>Tue, 15 Jul 2025 14:21:11 +0000</pubDate>
      <guid>https://xcdd.pages.dev/blog/2025/2025-07-15/</guid>
      <description>&lt;p&gt;&lt;strong&gt;Windows 10(11)最大的问题不是 UI设计的严重分裂，而是微软强行阉割控制面板的功能，却没有在“设置”应用中提供完整的替代方案&lt;/strong&gt; ，导致用户被迫在两个残缺的界面之间来回切换，体验极其糟糕。&lt;/p&gt;&#xA;&lt;h5 id=&#34;单独使用控制面板或者使用系统设置都不能完整实现特定功能&#34;&gt;&lt;strong&gt;单独使用“控制面板”或者使用“系统设置”都不能完整实现特定功能。&lt;/strong&gt;&lt;/h5&gt;&#xA;&lt;h4 id=&#34;1-控制面板被删减的功能典型例子&#34;&gt;&lt;strong&gt;1. 控制面板被删减的功能（典型例子）&lt;/strong&gt;&lt;/h4&gt;&#xA;&lt;p&gt;微软并没有完整迁移控制面板的所有功能到“设置”应用，而是 &lt;strong&gt;选择性保留&lt;/strong&gt; ，导致很多高级设置只能在旧版控制面板中找到，甚至有些功能被直接删除。例如：&lt;/p&gt;&#xA;&lt;h5 id=&#34;1-网络和共享中心&#34;&gt;&lt;strong&gt;(1) 网络和共享中心&lt;/strong&gt;&lt;/h5&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;&lt;strong&gt;控制面板&lt;/strong&gt; 提供完整的 &lt;strong&gt;高级共享设置&lt;/strong&gt; （如网络发现、文件和打印机共享、密码保护共享）。&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;&lt;strong&gt;设置应用&lt;/strong&gt; 仅提供基础的网络状态和 Wi-Fi 管理， &lt;strong&gt;无法直接配置高级共享选项&lt;/strong&gt; 。&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h5 id=&#34;2-电源管理&#34;&gt;&lt;strong&gt;(2) 电源管理&lt;/strong&gt;&lt;/h5&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;&lt;strong&gt;控制面板&lt;/strong&gt; 允许调整 &lt;strong&gt;CPU 最大/最小状态&lt;/strong&gt; （影响性能和省电）。&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;&lt;strong&gt;设置应用&lt;/strong&gt; 仅提供简单的“电源模式”（最佳性能/平衡/省电）， &lt;strong&gt;无法精细调节&lt;/strong&gt; 。&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h5 id=&#34;3-设备和打印机&#34;&gt;&lt;strong&gt;(3) 设备和打印机&lt;/strong&gt;&lt;/h5&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;&lt;strong&gt;控制面板&lt;/strong&gt; 可以管理 &lt;strong&gt;蓝牙设备、打印机队列、扫描仪属性&lt;/strong&gt; 。&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;&lt;strong&gt;设置应用&lt;/strong&gt; 仅提供基础的设备列表， &lt;strong&gt;无法管理打印任务或调整设备高级属性&lt;/strong&gt; 。&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h5 id=&#34;4-文件关联&#34;&gt;&lt;strong&gt;(4) 文件关联&lt;/strong&gt;&lt;/h5&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;&lt;strong&gt;控制面板&lt;/strong&gt; 允许 &lt;strong&gt;批量修改文件关联&lt;/strong&gt; （如 .txt 默认用 Notepad++ 打开）。&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;&lt;strong&gt;设置应用&lt;/strong&gt; 只能逐个文件类型修改， &lt;strong&gt;效率极低&lt;/strong&gt; 。&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h5 id=&#34;5-用户账户管理&#34;&gt;&lt;strong&gt;(5) 用户账户管理&lt;/strong&gt;&lt;/h5&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;&lt;strong&gt;控制面板&lt;/strong&gt; 可以 &lt;strong&gt;直接修改本地用户组策略&lt;/strong&gt; （如管理员权限）。&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;&lt;strong&gt;设置应用&lt;/strong&gt; 仅提供基础的账户管理， &lt;strong&gt;无法直接修改高级权限&lt;/strong&gt; 。&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h4 id=&#34;2-微软为何这样做&#34;&gt;&lt;strong&gt;2. 微软为何这样做？&lt;/strong&gt;&lt;/h4&gt;&#xA;&lt;h5 id=&#34;1-强制推动-uwp通用-windows-平台&#34;&gt;&lt;strong&gt;(1) 强制推动 UWP（通用 Windows 平台）&lt;/strong&gt;&lt;/h5&gt;&#xA;&lt;p&gt;微软希望淘汰 Win32 旧代码，推广现代化的 UWP 应用，但 &lt;strong&gt;迁移不彻底&lt;/strong&gt; ，导致功能缺失。&lt;/p&gt;</description>
    </item>
    <item>
      <title>Makefile参考样例5：多个文件夹.c和.cpp混合编译</title>
      <link>https://xcdd.pages.dev/blog/2025/2025-06-18/</link>
      <pubDate>Wed, 18 Jun 2025 16:35:26 +0000</pubDate>
      <guid>https://xcdd.pages.dev/blog/2025/2025-06-18/</guid>
      <description>&lt;p&gt;样例4只能编译纯C文件，现在添加C++的支持。&lt;/p&gt;&#xA;&lt;p&gt;同时添加环境变量CROSS_COMPILE支持灵活跨平台编译。&lt;/p&gt;&#xA;&lt;p&gt;源代码根目录为src，所有源码在src的子目录会被编译。&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;#CROSS_COMPILE ?= &lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;CC      &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;$(&lt;/span&gt;CROSS_COMPILE&lt;span style=&#34;color:#66d9ef&#34;&gt;)&lt;/span&gt;gcc&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;CXX     &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;$(&lt;/span&gt;CROSS_COMPILE&lt;span style=&#34;color:#66d9ef&#34;&gt;)&lt;/span&gt;g++&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;LD      &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;$(&lt;/span&gt;CROSS_COMPILE&lt;span style=&#34;color:#66d9ef&#34;&gt;)&lt;/span&gt;g++&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;STRIP   &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;$(&lt;/span&gt;CROSS_COMPILE&lt;span style=&#34;color:#66d9ef&#34;&gt;)&lt;/span&gt;strip&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;#编译选项&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;DEFINES  &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; -DTEST&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;CFLAGS   &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; -O0 -Wall -Wformat-overflow&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;$(&lt;/span&gt;DEFINES&lt;span style=&#34;color:#66d9ef&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;CXXFLAGS &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; -O0 -Wall -Wformat-overflow&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;$(&lt;/span&gt;DEFINES&lt;span style=&#34;color:#66d9ef&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;LDFLAGS  &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; -Wl,-gc-sections -Wl,-rpath&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;lib -Wl,-rpath&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;$$ORIGIN&amp;#39;&lt;/span&gt; -lpthread -lm&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;#目录结构&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;target   &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; main&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;srcdir   &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; src&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;objdir   &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; build&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;srcsub   &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;$(&lt;/span&gt;shell find &lt;span style=&#34;color:#66d9ef&#34;&gt;$(&lt;/span&gt;srcdir&lt;span style=&#34;color:#66d9ef&#34;&gt;)&lt;/span&gt; -type d&lt;span style=&#34;color:#66d9ef&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;objsub   &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;$(&lt;/span&gt;patsubst &lt;span style=&#34;color:#66d9ef&#34;&gt;$(&lt;/span&gt;srcdir&lt;span style=&#34;color:#66d9ef&#34;&gt;)&lt;/span&gt;/%,&lt;span style=&#34;color:#66d9ef&#34;&gt;$(&lt;/span&gt;objdir&lt;span style=&#34;color:#66d9ef&#34;&gt;)&lt;/span&gt;/%,&lt;span style=&#34;color:#66d9ef&#34;&gt;$(&lt;/span&gt;srcsub&lt;span style=&#34;color:#66d9ef&#34;&gt;))&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;#源文件查找&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;csrc    &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;$(&lt;/span&gt;foreach dir,&lt;span style=&#34;color:#66d9ef&#34;&gt;$(&lt;/span&gt;srcsub&lt;span style=&#34;color:#66d9ef&#34;&gt;)&lt;/span&gt;,&lt;span style=&#34;color:#66d9ef&#34;&gt;$(&lt;/span&gt;wildcard &lt;span style=&#34;color:#66d9ef&#34;&gt;$(&lt;/span&gt;dir&lt;span style=&#34;color:#66d9ef&#34;&gt;)&lt;/span&gt;/*.c&lt;span style=&#34;color:#66d9ef&#34;&gt;))&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;cxxsrc  &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;$(&lt;/span&gt;foreach dir,&lt;span style=&#34;color:#66d9ef&#34;&gt;$(&lt;/span&gt;srcsub&lt;span style=&#34;color:#66d9ef&#34;&gt;)&lt;/span&gt;,&lt;span style=&#34;color:#66d9ef&#34;&gt;$(&lt;/span&gt;wildcard &lt;span style=&#34;color:#66d9ef&#34;&gt;$(&lt;/span&gt;dir&lt;span style=&#34;color:#66d9ef&#34;&gt;)&lt;/span&gt;/*.cpp&lt;span style=&#34;color:#66d9ef&#34;&gt;))&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;obj     &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;$(&lt;/span&gt;patsubst &lt;span style=&#34;color:#66d9ef&#34;&gt;$(&lt;/span&gt;srcdir&lt;span style=&#34;color:#66d9ef&#34;&gt;)&lt;/span&gt;/%.c,&lt;span style=&#34;color:#66d9ef&#34;&gt;$(&lt;/span&gt;objdir&lt;span style=&#34;color:#66d9ef&#34;&gt;)&lt;/span&gt;/%.o,&lt;span style=&#34;color:#66d9ef&#34;&gt;$(&lt;/span&gt;csrc&lt;span style=&#34;color:#66d9ef&#34;&gt;))&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;$(&lt;/span&gt;patsubst &lt;span style=&#34;color:#66d9ef&#34;&gt;$(&lt;/span&gt;srcdir&lt;span style=&#34;color:#66d9ef&#34;&gt;)&lt;/span&gt;/%.cpp,&lt;span style=&#34;color:#66d9ef&#34;&gt;$(&lt;/span&gt;objdir&lt;span style=&#34;color:#66d9ef&#34;&gt;)&lt;/span&gt;/%.o,&lt;span style=&#34;color:#66d9ef&#34;&gt;$(&lt;/span&gt;cxxsrc&lt;span style=&#34;color:#66d9ef&#34;&gt;))&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;dep     &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;$(&lt;/span&gt;patsubst &lt;span style=&#34;color:#66d9ef&#34;&gt;$(&lt;/span&gt;srcdir&lt;span style=&#34;color:#66d9ef&#34;&gt;)&lt;/span&gt;/%.c,&lt;span style=&#34;color:#66d9ef&#34;&gt;$(&lt;/span&gt;objdir&lt;span style=&#34;color:#66d9ef&#34;&gt;)&lt;/span&gt;/%.d,&lt;span style=&#34;color:#66d9ef&#34;&gt;$(&lt;/span&gt;csrc&lt;span style=&#34;color:#66d9ef&#34;&gt;))&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;$(&lt;/span&gt;patsubst &lt;span style=&#34;color:#66d9ef&#34;&gt;$(&lt;/span&gt;srcdir&lt;span style=&#34;color:#66d9ef&#34;&gt;)&lt;/span&gt;/%.cpp,&lt;span style=&#34;color:#66d9ef&#34;&gt;$(&lt;/span&gt;objdir&lt;span style=&#34;color:#66d9ef&#34;&gt;)&lt;/span&gt;/%.d,&lt;span style=&#34;color:#66d9ef&#34;&gt;$(&lt;/span&gt;cxxsrc&lt;span style=&#34;color:#66d9ef&#34;&gt;))&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;#包含路径&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;CFLAGS   &lt;span style=&#34;color:#f92672&#34;&gt;+=&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;$(&lt;/span&gt;foreach dir,&lt;span style=&#34;color:#66d9ef&#34;&gt;$(&lt;/span&gt;srcsub&lt;span style=&#34;color:#66d9ef&#34;&gt;)&lt;/span&gt;,-I&lt;span style=&#34;color:#66d9ef&#34;&gt;$(&lt;/span&gt;dir&lt;span style=&#34;color:#66d9ef&#34;&gt;))&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;CXXFLAGS &lt;span style=&#34;color:#f92672&#34;&gt;+=&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;$(&lt;/span&gt;foreach dir,&lt;span style=&#34;color:#66d9ef&#34;&gt;$(&lt;/span&gt;srcsub&lt;span style=&#34;color:#66d9ef&#34;&gt;)&lt;/span&gt;,-I&lt;span style=&#34;color:#66d9ef&#34;&gt;$(&lt;/span&gt;dir&lt;span style=&#34;color:#66d9ef&#34;&gt;))&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;LDFLAGS  &lt;span style=&#34;color:#f92672&#34;&gt;+=&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;$(&lt;/span&gt;foreach dir,&lt;span style=&#34;color:#66d9ef&#34;&gt;$(&lt;/span&gt;srcsub&lt;span style=&#34;color:#66d9ef&#34;&gt;)&lt;/span&gt;,-L&lt;span style=&#34;color:#66d9ef&#34;&gt;$(&lt;/span&gt;dir&lt;span style=&#34;color:#66d9ef&#34;&gt;))&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;#依赖生成规则&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;$(&lt;/span&gt;objdir&lt;span style=&#34;color:#66d9ef&#34;&gt;)&lt;/span&gt;/%.d: &lt;span style=&#34;color:#66d9ef&#34;&gt;$(&lt;/span&gt;srcdir&lt;span style=&#34;color:#66d9ef&#34;&gt;)&lt;/span&gt;/%.c&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;@echo &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Generating &lt;/span&gt;$@&lt;span style=&#34;color:#e6db74&#34;&gt;...&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;@&lt;span style=&#34;color:#66d9ef&#34;&gt;$(&lt;/span&gt;CC&lt;span style=&#34;color:#66d9ef&#34;&gt;)&lt;/span&gt; -MM -MT &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;$(&lt;/span&gt;@:.d&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;.o&lt;span style=&#34;color:#66d9ef&#34;&gt;)&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt; &lt;/span&gt;$@&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;$(&lt;/span&gt;CFLAGS&lt;span style=&#34;color:#66d9ef&#34;&gt;)&lt;/span&gt; $&amp;lt; &amp;gt; $@&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;$(&lt;/span&gt;objdir&lt;span style=&#34;color:#66d9ef&#34;&gt;)&lt;/span&gt;/%.d: &lt;span style=&#34;color:#66d9ef&#34;&gt;$(&lt;/span&gt;srcdir&lt;span style=&#34;color:#66d9ef&#34;&gt;)&lt;/span&gt;/%.cpp&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;@echo &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Generating &lt;/span&gt;$@&lt;span style=&#34;color:#e6db74&#34;&gt;...&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;@&lt;span style=&#34;color:#66d9ef&#34;&gt;$(&lt;/span&gt;CXX&lt;span style=&#34;color:#66d9ef&#34;&gt;)&lt;/span&gt; -MM -MT &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;$(&lt;/span&gt;@:.d&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;.o&lt;span style=&#34;color:#66d9ef&#34;&gt;)&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt; &lt;/span&gt;$@&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;$(&lt;/span&gt;CXXFLAGS&lt;span style=&#34;color:#66d9ef&#34;&gt;)&lt;/span&gt; $&amp;lt; &amp;gt; $@&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;#编译规则&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;$(&lt;/span&gt;objdir&lt;span style=&#34;color:#66d9ef&#34;&gt;)&lt;/span&gt;/%.o: &lt;span style=&#34;color:#66d9ef&#34;&gt;$(&lt;/span&gt;srcdir&lt;span style=&#34;color:#66d9ef&#34;&gt;)&lt;/span&gt;/%.c&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;@echo &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Compiling &lt;/span&gt;$&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;lt;...&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;@&lt;span style=&#34;color:#66d9ef&#34;&gt;$(&lt;/span&gt;CC&lt;span style=&#34;color:#66d9ef&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;$(&lt;/span&gt;CFLAGS&lt;span style=&#34;color:#66d9ef&#34;&gt;)&lt;/span&gt; -c $&amp;lt; -o $@&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;$(&lt;/span&gt;objdir&lt;span style=&#34;color:#66d9ef&#34;&gt;)&lt;/span&gt;/%.o: &lt;span style=&#34;color:#66d9ef&#34;&gt;$(&lt;/span&gt;srcdir&lt;span style=&#34;color:#66d9ef&#34;&gt;)&lt;/span&gt;/%.cpp&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;@echo &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Compiling &lt;/span&gt;$&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;lt;...&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;@&lt;span style=&#34;color:#66d9ef&#34;&gt;$(&lt;/span&gt;CXX&lt;span style=&#34;color:#66d9ef&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;$(&lt;/span&gt;CXXFLAGS&lt;span style=&#34;color:#66d9ef&#34;&gt;)&lt;/span&gt; -c $&amp;lt; -o $@&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;ifeq &lt;span style=&#34;color:#f92672&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;$(&lt;/span&gt;MAKELEVEL&lt;span style=&#34;color:#66d9ef&#34;&gt;)&lt;/span&gt;, 1&lt;span style=&#34;color:#f92672&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;include &lt;span style=&#34;color:#66d9ef&#34;&gt;$(&lt;/span&gt;dep&lt;span style=&#34;color:#66d9ef&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;endif&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;.PHONY: all clean&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;all: &lt;span style=&#34;color:#66d9ef&#34;&gt;$(&lt;/span&gt;objsub&lt;span style=&#34;color:#66d9ef&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;$(&lt;/span&gt;dep&lt;span style=&#34;color:#66d9ef&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;@&lt;span style=&#34;color:#66d9ef&#34;&gt;$(&lt;/span&gt;MAKE&lt;span style=&#34;color:#66d9ef&#34;&gt;)&lt;/span&gt; -s &lt;span style=&#34;color:#66d9ef&#34;&gt;$(&lt;/span&gt;target&lt;span style=&#34;color:#66d9ef&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;clean:&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;@echo Clean target...&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;@rm -rf &lt;span style=&#34;color:#66d9ef&#34;&gt;$(&lt;/span&gt;target&lt;span style=&#34;color:#66d9ef&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;$(&lt;/span&gt;objdir&lt;span style=&#34;color:#66d9ef&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;@echo Clean &lt;span style=&#34;color:#66d9ef&#34;&gt;done&lt;/span&gt;!&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;$(&lt;/span&gt;objsub&lt;span style=&#34;color:#66d9ef&#34;&gt;)&lt;/span&gt;:&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;@mkdir -p $@&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;$(&lt;/span&gt;target&lt;span style=&#34;color:#66d9ef&#34;&gt;)&lt;/span&gt;: &lt;span style=&#34;color:#66d9ef&#34;&gt;$(&lt;/span&gt;obj&lt;span style=&#34;color:#66d9ef&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;@echo Linking...&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;@&lt;span style=&#34;color:#66d9ef&#34;&gt;$(&lt;/span&gt;LD&lt;span style=&#34;color:#66d9ef&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;$(&lt;/span&gt;LDFLAGS&lt;span style=&#34;color:#66d9ef&#34;&gt;)&lt;/span&gt; -o $@ $^&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;@&lt;span style=&#34;color:#66d9ef&#34;&gt;$(&lt;/span&gt;STRIP&lt;span style=&#34;color:#66d9ef&#34;&gt;)&lt;/span&gt; $@&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;@echo Build &lt;span style=&#34;color:#66d9ef&#34;&gt;done&lt;/span&gt;!&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description>
    </item>
    <item>
      <title>RTX系列桌面显卡历史驱动版本</title>
      <link>https://xcdd.pages.dev/blog/2025/2025-04-22/</link>
      <pubDate>Tue, 22 Apr 2025 11:06:25 +0000</pubDate>
      <guid>https://xcdd.pages.dev/blog/2025/2025-04-22/</guid>
      <description>&lt;p&gt;收集目前RTX系列桌面显卡的历史驱动版本，方便查询和遇到问题需要回退版本等情况。&lt;/p&gt;&#xA;&lt;p&gt;操作系统：Windows 10/11 64位&#xA;驱动类型：Studio稳定版&lt;/p&gt;&#xA;&lt;table&gt;&#xA;  &lt;thead&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;th style=&#34;text-align: center&#34;&gt;发布日期&lt;/th&gt;&#xA;          &lt;th style=&#34;text-align: center&#34;&gt;版本&lt;/th&gt;&#xA;          &lt;th style=&#34;text-align: center&#34;&gt;大小&lt;/th&gt;&#xA;          &lt;th style=&#34;text-align: center&#34;&gt;最新系列&lt;/th&gt;&#xA;          &lt;th style=&#34;text-align: center&#34;&gt;下载地址&lt;/th&gt;&#xA;      &lt;/tr&gt;&#xA;  &lt;/thead&gt;&#xA;  &lt;tbody&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;2025年4月16日&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;V576.02&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;857.02MB&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;RTX50系列&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;&lt;a href=&#34;https://www.nvidia.com/zh-cn/drivers/details/244316/&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;https://www.nvidia.com/zh-cn/drivers/details/244316/&lt;/a&gt;&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;2025年3月18日&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;V572.83&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;845.25MB&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;RTX50系列&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;&lt;a href=&#34;https://www.nvidia.cn/Download/driverResults.aspx/242211/cn&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;https://www.nvidia.cn/Download/driverResults.aspx/242211/cn&lt;/a&gt;&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;2025年2月27日&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;V572.60&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;844.73MB&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;RTX50系列&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;&lt;a href=&#34;https://www.nvidia.cn/Download/driverResults.aspx/241096/cn&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;https://www.nvidia.cn/Download/driverResults.aspx/241096/cn&lt;/a&gt;&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;2025年1月30日&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;V572.16&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;844.61MB&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;RTX50系列&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;&lt;a href=&#34;https://www.nvidia.cn/Download/driverResults.aspx/240532/cn&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;https://www.nvidia.cn/Download/driverResults.aspx/240532/cn&lt;/a&gt;&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;2024年12月10日&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;V566.36&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;732.88MB&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;RTX40系列&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;&lt;a href=&#34;https://www.nvidia.cn/Download/driverResults.aspx/237789/cn&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;https://www.nvidia.cn/Download/driverResults.aspx/237789/cn&lt;/a&gt;&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;2024年11月12日&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;V566.14&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;722.9MB&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;RTX40系列&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;&lt;a href=&#34;https://www.nvidia.cn/Download/driverResults.aspx/235974/cn&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;https://www.nvidia.cn/Download/driverResults.aspx/235974/cn&lt;/a&gt;&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;2024年10月15日&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;V565.90&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;711.63MB&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;RTX40系列&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;&lt;a href=&#34;https://www.nvidia.cn/Download/driverResults.aspx/232938/cn&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;https://www.nvidia.cn/Download/driverResults.aspx/232938/cn&lt;/a&gt;&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;2024年9月17日&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;V561.09&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;691.04MB&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;RTX40系列&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;&lt;a href=&#34;https://www.nvidia.cn/Download/driverResults.aspx/232608/cn&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;https://www.nvidia.cn/Download/driverResults.aspx/232608/cn&lt;/a&gt;&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;2024年8月6日&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;V560.81&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;701.16MB&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;RTX40系列&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;&lt;a href=&#34;https://www.nvidia.cn/Download/driverResults.aspx/230790/cn&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;https://www.nvidia.cn/Download/driverResults.aspx/230790/cn&lt;/a&gt;&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;2024年7月16日&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;V560.70&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;729.31MB&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;RTX40系列&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;&lt;a href=&#34;https://www.nvidia.cn/Download/driverResults.aspx/230099/cn&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;https://www.nvidia.cn/Download/driverResults.aspx/230099/cn&lt;/a&gt;&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;2024年6月4日&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;V555.99&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;659.34MB&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;RTX40系列&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;&lt;a href=&#34;https://www.nvidia.cn/Download/driverResults.aspx/227413/cn&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;https://www.nvidia.cn/Download/driverResults.aspx/227413/cn&lt;/a&gt;&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;2024年5月21日&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;V555.85&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;659.29MB&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;RTX40系列&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;&lt;a href=&#34;https://www.nvidia.cn/Download/driverResults.aspx/224940/cn&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;https://www.nvidia.cn/Download/driverResults.aspx/224940/cn&lt;/a&gt;&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;2024年4月16日&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;V552.22&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;665.46MB&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;RTX40系列&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;&lt;a href=&#34;https://www.nvidia.cn/Download/driverResults.aspx/224288/cn&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;https://www.nvidia.cn/Download/driverResults.aspx/224288/cn&lt;/a&gt;&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;2024年3月19日&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;V551.86&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;665.42MB&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;RTX40系列&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;&lt;a href=&#34;https://www.nvidia.cn/Download/driverResults.aspx/223566/cn&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;https://www.nvidia.cn/Download/driverResults.aspx/223566/cn&lt;/a&gt;&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;2024年2月22日&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;V551.61&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;665.33MB&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;RTX40系列&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;&lt;a href=&#34;https://www.nvidia.cn/Download/driverResults.aspx/221749/cn&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;https://www.nvidia.cn/Download/driverResults.aspx/221749/cn&lt;/a&gt;&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;2024年1月24日&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;V551.23&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;665.15MB&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;RTX40系列&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;&lt;a href=&#34;https://www.nvidia.cn/Download/driverResults.aspx/218480/cn&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;https://www.nvidia.cn/Download/driverResults.aspx/218480/cn&lt;/a&gt;&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;2023年12月12日&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;V546.33&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;701.86MB&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;RTX40系列&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;&lt;a href=&#34;https://www.nvidia.cn/Download/driverResults.aspx/216964/cn&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;https://www.nvidia.cn/Download/driverResults.aspx/216964/cn&lt;/a&gt;&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;2023年11月1日&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;V546.01&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;701.66MB&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;RTX40系列&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;&lt;a href=&#34;https://www.nvidia.cn/Download/driverResults.aspx/216402/cn&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;https://www.nvidia.cn/Download/driverResults.aspx/216402/cn&lt;/a&gt;&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;2023年10月10日&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;V537.58&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;675.86MB&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;RTX40系列&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;&lt;a href=&#34;https://www.nvidia.cn/Download/driverResults.aspx/212835/cn&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;https://www.nvidia.cn/Download/driverResults.aspx/212835/cn&lt;/a&gt;&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;2023年9月21日&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;V537.42&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;675.85MB&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;RTX40系列&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;&lt;a href=&#34;https://www.nvidia.cn/Download/driverResults.aspx/211721/cn&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;https://www.nvidia.cn/Download/driverResults.aspx/211721/cn&lt;/a&gt;&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;2023年8月8日&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;V536.99&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;675.81MB&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;RTX40系列&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;&lt;a href=&#34;https://www.nvidia.cn/Download/driverResults.aspx/210528/cn&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;https://www.nvidia.cn/Download/driverResults.aspx/210528/cn&lt;/a&gt;&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;2023年7月18日&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;V536.67&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;676.07MB&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;RTX40系列&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;&lt;a href=&#34;https://www.nvidia.cn/Download/driverResults.aspx/209305/cn&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;https://www.nvidia.cn/Download/driverResults.aspx/209305/cn&lt;/a&gt;&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;2023年6月29日&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;V536.40&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;685.29MB&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;RTX40系列&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;&lt;a href=&#34;https://www.nvidia.cn/Download/driverResults.aspx/209199/cn&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;https://www.nvidia.cn/Download/driverResults.aspx/209199/cn&lt;/a&gt;&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;2023年5月30日&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;V535.98&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;685.28MB&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;RTX40系列&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;&lt;a href=&#34;https://www.nvidia.cn/Download/driverResults.aspx/205174/cn&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;https://www.nvidia.cn/Download/driverResults.aspx/205174/cn&lt;/a&gt;&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;2023年4月13日&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;V531.61&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;895.67MB&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;RTX40系列&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;&lt;a href=&#34;https://www.nvidia.cn/Download/driverResults.aspx/204249/cn&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;https://www.nvidia.cn/Download/driverResults.aspx/204249/cn&lt;/a&gt;&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;2023年3月21日&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;V531.41&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;894.11MB&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;RTX40系列&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;&lt;a href=&#34;https://www.nvidia.cn/Download/driverResults.aspx/200287/cn&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;https://www.nvidia.cn/Download/driverResults.aspx/200287/cn&lt;/a&gt;&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;2023年2月8日&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;V528.49&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;854.49MB&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;RTX40系列&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;&lt;a href=&#34;https://www.nvidia.cn/Download/driverResults.aspx/199794/cn&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;https://www.nvidia.cn/Download/driverResults.aspx/199794/cn&lt;/a&gt;&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;2023年1月23日&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;V528.24&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;852.95MB&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;RTX40系列&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;&lt;a href=&#34;https://www.nvidia.cn/Download/driverResults.aspx/198734/cn&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;https://www.nvidia.cn/Download/driverResults.aspx/198734/cn&lt;/a&gt;&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;2023年1月5日&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;V528.02&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;851.54MB&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;RTX40系列&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;&lt;a href=&#34;http://www.nvidia.cn/Download/driverResults.aspx/198430/cn&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;http://www.nvidia.cn/Download/driverResults.aspx/198430/cn&lt;/a&gt;&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;2022年12月8日&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;V527.56&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;852.95MB&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;RTX40系列&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;&lt;a href=&#34;http://www.nvidia.cn/Download/driverResults.aspx/197400/cn&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;http://www.nvidia.cn/Download/driverResults.aspx/197400/cn&lt;/a&gt;&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;2022年11月16日&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;V526.98&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;852.84MB&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;RTX40系列&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;&lt;a href=&#34;http://www.nvidia.cn/Download/driverResults.aspx/194422/cn&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;http://www.nvidia.cn/Download/driverResults.aspx/194422/cn&lt;/a&gt;&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;2022年10月18日&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;V522.30&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;841.94MB&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;RTX40系列&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;&lt;a href=&#34;http://www.nvidia.cn/Download/driverResults.aspx/193888/cn&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;http://www.nvidia.cn/Download/driverResults.aspx/193888/cn&lt;/a&gt;&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;2022年9月20日&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;V517.40&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;825.34MB&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;RTX30系列&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;&lt;a href=&#34;http://www.nvidia.cn/Download/driverResults.aspx/193239/cn&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;http://www.nvidia.cn/Download/driverResults.aspx/193239/cn&lt;/a&gt;&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;2022年8月9日&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;V516.94&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;822.22MB&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;RTX30系列&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;&lt;a href=&#34;http://www.nvidia.cn/Download/driverResults.aspx/193019/cn&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;http://www.nvidia.cn/Download/driverResults.aspx/193019/cn&lt;/a&gt;&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;2022年7月26日&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;V516.93&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;823.96MB&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;RTX30系列&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;&lt;a href=&#34;http://www.nvidia.cn/Download/driverResults.aspx/191058/cn&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;http://www.nvidia.cn/Download/driverResults.aspx/191058/cn&lt;/a&gt;&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;2022年6月29日&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;V516.59&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;822.56MB&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;RTX30系列&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;&lt;a href=&#34;http://www.nvidia.cn/Download/driverResults.aspx/190620/cn&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;http://www.nvidia.cn/Download/driverResults.aspx/190620/cn&lt;/a&gt;&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;2022年5月23日&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;V512.96&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;824.9MB&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;RTX30系列&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;&lt;a href=&#34;http://www.nvidia.cn/Download/driverResults.aspx/189621/cn&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;http://www.nvidia.cn/Download/driverResults.aspx/189621/cn&lt;/a&gt;&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;2022年4月26日&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;V512.59&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;823.22MB&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;RTX30系列&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;&lt;a href=&#34;http://www.nvidia.cn/Download/driverResults.aspx/187646/cn&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;http://www.nvidia.cn/Download/driverResults.aspx/187646/cn&lt;/a&gt;&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;2022年3月22日&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;V512.15&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;824.96MB&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;RTX30系列&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;&lt;a href=&#34;http://www.nvidia.cn/Download/driverResults.aspx/187308/cn&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;http://www.nvidia.cn/Download/driverResults.aspx/187308/cn&lt;/a&gt;&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;2022年2月1日&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;V511.65&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;821.14MB&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;RTX30系列&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;&lt;a href=&#34;http://www.nvidia.cn/Download/driverResults.aspx/186818/cn&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;http://www.nvidia.cn/Download/driverResults.aspx/186818/cn&lt;/a&gt;&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;2022年1月4日&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;V511.09&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;837.05MB&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;RTX30系列&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;&lt;a href=&#34;http://www.nvidia.cn/Download/driverResults.aspx/184789/cn&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;http://www.nvidia.cn/Download/driverResults.aspx/184789/cn&lt;/a&gt;&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;2021年12月13日&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;V472.84&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;758.46MB&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;RTX30系列&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;&lt;a href=&#34;http://www.nvidia.cn/Download/driverResults.aspx/184344/cn&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;http://www.nvidia.cn/Download/driverResults.aspx/184344/cn&lt;/a&gt;&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;2021年11月10日&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;V472.47&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;754.42MB&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;RTX30系列&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;&lt;a href=&#34;http://www.nvidia.cn/Download/driverResults.aspx/183662/cn&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;http://www.nvidia.cn/Download/driverResults.aspx/183662/cn&lt;/a&gt;&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;2021年10月26日&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;V472.39&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;757.23MB&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;RTX30系列&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;&lt;a href=&#34;http://www.nvidia.cn/Download/driverResults.aspx/183391/cn&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;http://www.nvidia.cn/Download/driverResults.aspx/183391/cn&lt;/a&gt;&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;2021年9月20日&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;V472.12&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;758.01MB&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;RTX30系列&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;&lt;a href=&#34;http://www.nvidia.cn/Download/driverResults.aspx/180818/cn&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;http://www.nvidia.cn/Download/driverResults.aspx/180818/cn&lt;/a&gt;&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;2021年8月10日&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;V471.68&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;756.11MB&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;RTX30系列&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;&lt;a href=&#34;http://www.nvidia.cn/Download/driverResults.aspx/179838/cn&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;http://www.nvidia.cn/Download/driverResults.aspx/179838/cn&lt;/a&gt;&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;2021年7月19日&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;V471.41&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;753.66MB&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;RTX30系列&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;&lt;a href=&#34;http://www.nvidia.cn/Download/driverResults.aspx/177926/cn&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;http://www.nvidia.cn/Download/driverResults.aspx/177926/cn&lt;/a&gt;&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;2021年6月23日&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;V471.11&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;754.97MB&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;RTX30系列&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;&lt;a href=&#34;http://www.nvidia.cn/Download/driverResults.aspx/176860/cn&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;http://www.nvidia.cn/Download/driverResults.aspx/176860/cn&lt;/a&gt;&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;2021年5月11日&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;V462.59&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;663.27MB&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;RTX30系列&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;&lt;a href=&#34;http://www.nvidia.cn/Download/driverResults.aspx/175409/cn&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;http://www.nvidia.cn/Download/driverResults.aspx/175409/cn&lt;/a&gt;&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;2021年4月14日&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;V462.31&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;662.84MB&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;RTX30系列&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;&lt;a href=&#34;http://www.nvidia.cn/Download/driverResults.aspx/172714/cn&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;http://www.nvidia.cn/Download/driverResults.aspx/172714/cn&lt;/a&gt;&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;2021年3月17日&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;V461.92&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;661.82MB&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;RTX30系列&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;&lt;a href=&#34;http://www.nvidia.cn/Download/driverResults.aspx/171734/cn&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;http://www.nvidia.cn/Download/driverResults.aspx/171734/cn&lt;/a&gt;&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;2021年2月25日&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;V461.72&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;659.69MB&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;RTX30系列&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;&lt;a href=&#34;http://www.nvidia.cn/Download/driverResults.aspx/171038/cn&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;http://www.nvidia.cn/Download/driverResults.aspx/171038/cn&lt;/a&gt;&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;2021年1月26日&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;V461.40&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;663.94MB&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;RTX30系列&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;&lt;a href=&#34;http://www.nvidia.cn/Download/driverResults.aspx/170528/cn&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;http://www.nvidia.cn/Download/driverResults.aspx/170528/cn&lt;/a&gt;&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;2020年12月15日&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;V460.89&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;658.44MB&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;RTX30系列&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;&lt;a href=&#34;http://www.nvidia.cn/Download/driverResults.aspx/168018/cn&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;http://www.nvidia.cn/Download/driverResults.aspx/168018/cn&lt;/a&gt;&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;2020年11月17日&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;V457.30&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;647.87MB&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;RTX30系列&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;&lt;a href=&#34;http://www.nvidia.cn/Download/driverResults.aspx/166997/cn&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;http://www.nvidia.cn/Download/driverResults.aspx/166997/cn&lt;/a&gt;&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;2020年10月20日&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;V456.71&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;640.61MB&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;RTX30系列&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;&lt;a href=&#34;http://www.nvidia.cn/Download/driverResults.aspx/166091/cn&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;http://www.nvidia.cn/Download/driverResults.aspx/166091/cn&lt;/a&gt;&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;2020年9月17日&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;V456.38&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;638.55MB&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;RTX30系列&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;&lt;a href=&#34;http://www.nvidia.cn/Download/driverResults.aspx/163845/cn&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;http://www.nvidia.cn/Download/driverResults.aspx/163845/cn&lt;/a&gt;&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;2020年8月18日&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;V452.06&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;589.26MB&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;RTX20系列&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;&lt;a href=&#34;http://www.nvidia.cn/Download/driverResults.aspx/163288/cn&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;http://www.nvidia.cn/Download/driverResults.aspx/163288/cn&lt;/a&gt;&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;2020年7月16日&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;V451.77&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;589.33MB&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;RTX20系列&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;&lt;a href=&#34;http://www.nvidia.cn/Download/driverResults.aspx/162530/cn&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;http://www.nvidia.cn/Download/driverResults.aspx/162530/cn&lt;/a&gt;&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;2020年6月24日&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;V451.48&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;588.97MB&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;RTX20系列&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;&lt;a href=&#34;http://www.nvidia.cn/Download/driverResults.aspx/161491/cn&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;http://www.nvidia.cn/Download/driverResults.aspx/161491/cn&lt;/a&gt;&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;2020年4月16日&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;V442.92&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;555.99MB&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;RTX20系列&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;&lt;a href=&#34;http://www.nvidia.cn/Download/driverResults.aspx/159723/cn&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;http://www.nvidia.cn/Download/driverResults.aspx/159723/cn&lt;/a&gt;&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;2020年2月3日&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;V442.19&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;555.12MB&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;RTX20系列&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;&lt;a href=&#34;http://www.nvidia.cn/Download/driverResults.aspx/156950/cn&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;http://www.nvidia.cn/Download/driverResults.aspx/156950/cn&lt;/a&gt;&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;2019年12月10日&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;V441.66&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;554.01MB&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;RTX20系列&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;&lt;a href=&#34;http://www.nvidia.cn/Download/driverResults.aspx/155814/cn&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;http://www.nvidia.cn/Download/driverResults.aspx/155814/cn&lt;/a&gt;&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;2019年11月18日&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;V441.28&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;551.89MB&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;RTX20系列&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;&lt;a href=&#34;http://www.nvidia.cn/Download/driverResults.aspx/154474/cn&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;http://www.nvidia.cn/Download/driverResults.aspx/154474/cn&lt;/a&gt;&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;2019年11月4日&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;V441.12&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;554.47MB&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;RTX20系列&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;&lt;a href=&#34;http://www.nvidia.cn/Download/driverResults.aspx/153393/cn&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;http://www.nvidia.cn/Download/driverResults.aspx/153393/cn&lt;/a&gt;&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;2019年9月4日&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;V431.86&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;520.87MB&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;RTX20系列&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;&lt;a href=&#34;http://www.nvidia.cn/Download/driverResults.aspx/151097/cn&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;http://www.nvidia.cn/Download/driverResults.aspx/151097/cn&lt;/a&gt;&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;2019年7月29日&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;V431.70&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;521.12MB&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;RTX20系列&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;&lt;a href=&#34;http://www.nvidia.cn/Download/driverResults.aspx/149185/cn&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;http://www.nvidia.cn/Download/driverResults.aspx/149185/cn&lt;/a&gt;&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;2019年5月27日&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;V430.86&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;518.57MB&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;RTX20系列&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;&lt;a href=&#34;http://www.nvidia.cn/Download/driverResults.aspx/148013/cn&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;http://www.nvidia.cn/Download/driverResults.aspx/148013/cn&lt;/a&gt;&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;2019年3月20日&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;V419.67&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;579.15MB&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;RTX20系列&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;&lt;a href=&#34;http://www.nvidia.cn/Download/driverResults.aspx/145445/cn&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;http://www.nvidia.cn/Download/driverResults.aspx/145445/cn&lt;/a&gt;&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;  &lt;/tbody&gt;&#xA;&lt;/table&gt;</description>
    </item>
    <item>
      <title>SSH: PTY allocation request failed on channel 0</title>
      <link>https://xcdd.pages.dev/blog/2025/2025-03-04/</link>
      <pubDate>Tue, 04 Mar 2025 16:44:43 +0000</pubDate>
      <guid>https://xcdd.pages.dev/blog/2025/2025-03-04/</guid>
      <description>&lt;p&gt;SSH登陆成功后，出现如下错误：&lt;/p&gt;&#xA;&lt;p&gt;PTY allocation request failed on channel 0&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;问题原因：&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;没有挂载/dev/pts&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;解决方法：&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;mount -t devpts devpts /dev/pts&lt;/p&gt;&#xA;&lt;p&gt;或者&lt;/p&gt;&#xA;&lt;p&gt;mount -t devpts -o gid=5,mode=620 devpts /dev/pts&lt;/p&gt;&lt;/blockquote&gt;</description>
    </item>
    <item>
      <title>Windows远程协助实现跨网络连接的“黑科技”</title>
      <link>https://xcdd.pages.dev/blog/2024/2024-12-09/</link>
      <pubDate>Mon, 09 Dec 2024 17:59:59 +0000</pubDate>
      <guid>https://xcdd.pages.dev/blog/2024/2024-12-09/</guid>
      <description>&lt;p&gt;为了和远方的朋友进行远程联机，我们组建了一个联机的V&lt;em&gt;N网络，实现虚拟局域网。&#xA;有一次使用Windows远程协助的时候，忘记连接V&lt;/em&gt;N，竟然成功连接上了！&#xA;我和我的小伙伴都惊呆了！&lt;/p&gt;&#xA;&lt;hr&gt;&#xA;&lt;p&gt;环境是这样的：&#xA;操作系统都是Windows 10(22H2)&#xA;电脑是通过中国电信的光猫联网。&#xA;中国电信光猫没有公网IPv4，但有公网IPv6。&#xA;但光猫默认配置是禁止所有的IPv6进站连接的。&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;所以排除2台电脑通过IPv6直联的情况。&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;hr&gt;&#xA;&lt;p&gt;继续研究发现远程协助的进程msra.exe监听的端口是随机的，但可以看到监听了一个IPv6地址。&#xA;2台电脑连接时，可以互相看到msra.exer是通过IPv6的地址连接的。&lt;/p&gt;&#xA;&lt;p&gt;&lt;img src=&#34;./218_1.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;这个IPv6地址是哪来的呢？&#xA;本机的网卡并没有这个IP地址。&lt;/p&gt;&#xA;&lt;p&gt;经过一番研究，找到了，原来Windows创建了一个Teredo虚拟网卡：&lt;/p&gt;&#xA;&lt;p&gt;&lt;img src=&#34;./218_2.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;继续研究这个虚拟网卡，找到了关键信息：这是IPv6的隧道技术。&lt;/p&gt;&#xA;&lt;p&gt;结论：msra.exe启动的时候会尝试建立IPv6的隧道，来实现2台电脑的连接。&#xA;这样一来，Windows远程协助的实用性得到极大的提升。&#xA;在一般的应用场景下，基本可以告别“向日葵”，TeamViewer等第3方软件了。&lt;/p&gt;&#xA;&lt;hr&gt;&#xA;&lt;p&gt;通过分析，不使用msra，我们也可以手动创建隧道网络：&lt;/p&gt;&#xA;&lt;p&gt;命令如下：&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;netsh interface teredo set state type=natawareclient servername=win1910.ipv6.microsoft.com. servervirtualip=0.0.0.0&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;执行这个命令后：查看ipconfig /all就能找到隧道IPv6的地址了。&lt;/p&gt;&#xA;&lt;p&gt;这个命令重启后一般会失效，还可以到组策略开启这个功能：&lt;/p&gt;&#xA;&lt;p&gt;组策略/计算机配置/管理模板/网络/TCPIP设置/IPv6转换技术/&#xA;设置Teredo刷新率：30&#xA;设置Teredo服务器名称：win1910.ipv6.microsoft.com&#xA;设置Teredo状态：企业客户端&lt;/p&gt;&#xA;&lt;p&gt;设置好后，重启电脑。&lt;/p&gt;&#xA;&lt;hr&gt;&#xA;&lt;p&gt;这样的IPv6地址可以实现Windows远程协助 和 Windows远程桌面连接。&lt;/p&gt;&#xA;&lt;p&gt;使用第3方软件暂时没有成功。&lt;/p&gt;</description>
    </item>
    <item>
      <title>使用MSYS搭建linux开发环境踩坑笔记</title>
      <link>https://xcdd.pages.dev/blog/2024/2024-12-06/</link>
      <pubDate>Fri, 06 Dec 2024 09:00:10 +0000</pubDate>
      <guid>https://xcdd.pages.dev/blog/2024/2024-12-06/</guid>
      <description>&lt;h5 id=&#34;前言&#34;&gt;&lt;strong&gt;前言：&lt;/strong&gt;&lt;/h5&gt;&#xA;&lt;p&gt;使用linux系统或虚拟机进行嵌入式linux开发是常规方法；&#xA;使用MSYS是用于尝鲜和研究。&lt;/p&gt;&#xA;&lt;p&gt;由于windows和linux的差异，使用MSYS代替Linux虚拟机会遇到很多坑。&#xA;主要原因在于：&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;windows和linux文件系统的差异：win不区分文件名大小写, linux要区分&lt;/li&gt;&#xA;&lt;li&gt;路径分隔符的差异: win使用&amp;quot;&amp;quot;分隔路径， linux使用&amp;quot;/&amp;ldquo;分隔路径&lt;/li&gt;&#xA;&lt;li&gt;可执行文件的差异：win执行文件后缀名*.exe，linux可执行文件不需要后缀名&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;hr&gt;&#xA;&lt;h5 id=&#34;成果&#34;&gt;成果：&lt;/h5&gt;&#xA;&lt;p&gt;目前MSYS环境已经成功用于编译linux应用层软件，linux内核, U-Boot等。&lt;/p&gt;&#xA;&lt;hr&gt;&#xA;&lt;p&gt;踩坑1：传递编译参数-Wl,&amp;ndash;dynamic-linker=/lib/ld-linux.so，编译后结果路径是错的！&#xA;原因：MSYS调用mingw的gcc.exe传递路径参数时，会转换为windows文件路径。&#xA;解决：MSYS工具链不要和mingw混用；路径使用双斜杠//开头也能凑合使用。&lt;/p&gt;&#xA;&lt;hr&gt;&#xA;&lt;p&gt;踩坑2：编译设备树失败： No rule to make target &amp;lsquo;arch/arm/boot/dts/*.dtb&amp;rsquo;, needed by &amp;lsquo;__build&amp;rsquo;.&#xA;原因：Makefile生成dtb需要调用dtc，而windows下面dtc编译出来是dtc.exe，文件名不一致。&#xA;解决：把dtc.exe改名为dtc&lt;/p&gt;&#xA;&lt;hr&gt;&#xA;&lt;p&gt;踩坑3：创建软链接行为异常，导致一些编译脚本报错&#xA;原因：ln -s创建软链接其行为竟然是复制文件/文件夹.&#xA;解决：添加环境变量:export MSYS=&amp;ldquo;winsymlinks:lnk&amp;rdquo;&lt;/p&gt;&#xA;&lt;hr&gt;&#xA;&lt;p&gt;持续更新&amp;hellip;&lt;/p&gt;</description>
    </item>
    <item>
      <title>CMake典型应用参考样例</title>
      <link>https://xcdd.pages.dev/blog/2024/2024-06-12/</link>
      <pubDate>Wed, 12 Jun 2024 13:35:09 +0000</pubDate>
      <guid>https://xcdd.pages.dev/blog/2024/2024-06-12/</guid>
      <description>&lt;p&gt;&lt;strong&gt;CMake&lt;/strong&gt; 是一个跨平台的自动化建构系统，用于管理软件构建过程。&#xA;很久很久以前编译一个C/C++工程通常采用手写Makefile文件的方法。&#xA;现在使用CMake则改为手写CMakeLists.txt文件，然后用CMake自动生成Makefile文件。&#xA;由于手写CMakeLists.txt比手写Makefile要简便许多，因此CMake逐渐流行起来。&lt;/p&gt;&#xA;&lt;hr&gt;&#xA;&lt;p&gt;&lt;strong&gt;典型应用场景&lt;/strong&gt;&#xA;工程目录结构如下：&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-python&#34; data-lang=&#34;python&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;├─&lt;/span&gt;build&lt;span style=&#34;color:#f92672&#34;&gt;/&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;├─&lt;/span&gt;src&lt;span style=&#34;color:#f92672&#34;&gt;/&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;├─&lt;/span&gt;CMakeLists&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;txt&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;└─&lt;/span&gt;mk&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;sh&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;build目录是一个空目录，用于存放编译生成的临时文件。&#xA;src目录是源代码目录，下面有若干子目录。&#xA;CMakeLists.txt文件则在根目录，管理整个工程。&#xA;mk.sh是快速编译脚本，省去频繁地敲cmake和make指令，也可以根据需要添加更多便捷功能。&lt;/p&gt;&#xA;&lt;p&gt;mk.sh中的关键指令：&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-python&#34; data-lang=&#34;python&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;cd &lt;span style=&#34;color:#f92672&#34;&gt;./&lt;/span&gt;build&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;cmake &lt;span style=&#34;color:#f92672&#34;&gt;../&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;make &lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;j4&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;hr&gt;&#xA;&lt;p&gt;下面是一个典型的CMakeLists.txt示例，以此为基础稍作修改就能应用到实际项目中。&#xA;这个示例中，使用aux_source_directory来搜索指定目录下的所有源文件，并参与编译。&#xA;同时也可以使用list(REMOVE_ITEM)来屏蔽指定的源文件不参与编译。&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-python&#34; data-lang=&#34;python&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# 最小版本要求&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;cmake_minimum_required(VERSION &lt;span style=&#34;color:#ae81ff&#34;&gt;3.0&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# 指定目标系统&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;set(CMAKE_SYSTEM_NAME Linux)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# 指定目标平台&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;set(CMAKE_SYSTEM_PROCESSOR arm)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# 指定交叉编译工具链的根目录&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;set(TOOLCHAIN_PATH &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;/root/toolchain/gcc&amp;#34;&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# 指定C编译器&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;set(CMAKE_C_COMPILER &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;$&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;{TOOLCHAIN_PATH}&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;/bin/arm-linux-gnu-gcc&amp;#34;&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# 指定C++编译器&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;set(CMAKE_CXX_COMPILER &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;$&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;{TOOLCHAIN_PATH}&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;/bin/arm-linux-gnu-g++&amp;#34;&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# 指定C选项&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;set(CMAKE_C_STANDARD &lt;span style=&#34;color:#ae81ff&#34;&gt;99&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;set(CMAKE_C_FLAGS &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;-static -Wall&amp;#34;&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;set(CMAKE_C_FLAGS_RELEASE &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;-O2&amp;#34;&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;set(CMAKE_C_FLAGS_DEBUG &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;-g -rdynamic -O0&amp;#34;&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# 指定C++选项&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;set(CMAKE_CXX_STANDARD &lt;span style=&#34;color:#ae81ff&#34;&gt;99&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;set(CMAKE_CXX_FLAGS &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;-static -Wall&amp;#34;&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;set(CMAKE_CXX_FLAGS_RELEASE &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;-O2&amp;#34;&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;set(CMAKE_CXX_FLAGS_DEBUG &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;-g -rdynamic -O0&amp;#34;&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# 工程定义&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;project(main C CXX)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# 预定义&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;add_definitions(&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;DVERSION&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;1.0&amp;#34;&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# 头文件包含路径&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;include_directories(&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&lt;span style=&#34;color:#f92672&#34;&gt;./&lt;/span&gt;src&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&lt;span style=&#34;color:#f92672&#34;&gt;./&lt;/span&gt;src&lt;span style=&#34;color:#f92672&#34;&gt;/&lt;/span&gt;dir1&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&lt;span style=&#34;color:#f92672&#34;&gt;./&lt;/span&gt;src&lt;span style=&#34;color:#f92672&#34;&gt;/&lt;/span&gt;dir2&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&lt;span style=&#34;color:#f92672&#34;&gt;./&lt;/span&gt;src&lt;span style=&#34;color:#f92672&#34;&gt;/&lt;/span&gt;dir3&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# 源文件&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;aux_source_directory(&lt;span style=&#34;color:#f92672&#34;&gt;./&lt;/span&gt;src             SRC_LIST)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;aux_source_directory(&lt;span style=&#34;color:#f92672&#34;&gt;./&lt;/span&gt;src&lt;span style=&#34;color:#f92672&#34;&gt;/&lt;/span&gt;dir1        SRC_LIST)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;aux_source_directory(&lt;span style=&#34;color:#f92672&#34;&gt;./&lt;/span&gt;src&lt;span style=&#34;color:#f92672&#34;&gt;/&lt;/span&gt;dir2        SRC_LIST)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;aux_source_directory(&lt;span style=&#34;color:#f92672&#34;&gt;./&lt;/span&gt;src&lt;span style=&#34;color:#f92672&#34;&gt;/&lt;/span&gt;dir3        SRC_LIST)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# 屏蔽特定源文件不参与编译&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;list(REMOVE_ITEM SRC_LIST &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;./src/dir2/file.c&amp;#34;&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# 库文件路径&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;link_directories(build)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# 库文件&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;link_libraries(pthread)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;link_libraries(m)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# 目标文件&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;add_executable(&lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;$&lt;/span&gt;{PROJECT_NAME} &lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;$&lt;/span&gt;{SRC_LIST})&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description>
    </item>
    <item>
      <title>VS2017离线安装记录</title>
      <link>https://xcdd.pages.dev/blog/2024/2024-04-25/</link>
      <pubDate>Thu, 25 Apr 2024 10:59:55 +0000</pubDate>
      <guid>https://xcdd.pages.dev/blog/2024/2024-04-25/</guid>
      <description>&lt;h4 id=&#34;制作离线安装包的方法&#34;&gt;&lt;strong&gt;制作离线安装包的方法：&lt;/strong&gt;&lt;/h4&gt;&#xA;&lt;p&gt;1.找一台能上网的电脑，下载在线原版安装器: vs_community.exe&lt;/p&gt;&#xA;&lt;p&gt;微软不提供下载了，我上传1份到CSDN： &lt;a href=&#34;https://download.csdn.net/download/qq446252221/89216965&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;点我进入下载&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;2.在命令行输入命令：(注意不能换行，我这里换行是为了好看)&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;vs_community.exe &#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;--layout C:&lt;span style=&#34;color:#ae81ff&#34;&gt;\v&lt;/span&gt;s2017 &#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;--lang zh-CN &#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;--add Microsoft.VisualStudio.Workload.NativeDesktop&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;--add Microsoft.VisualStudio.Component.VC.Tools.x86.x64&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;--add Microsoft.VisualStudio.Component.VC.ATLMFC&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;--add Microsoft.VisualStudio.Component.Windows10SDK.10240&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# --add Microsoft.VisualStudio.Component.Windows10SDK.17763(默认SDK版本)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# --add Microsoft.VisualStudio.Component.VC.140(旧版本工具集，支持WinXP)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;我这里只添加VC++所必需的组件，根据个人需求选择要下载的组件。&#xA;组件的名字可以在下面链接找到：&#xA;&lt;a href=&#34;https://learn.microsoft.com/zh-cn/previous-versions/visualstudio/visual-studio-2017/install/workload-component-id-vs-community?view=vs-2017&amp;amp;preserve-view=true&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;Visual Studio Community workload and component IDs | Microsoft Learn&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;3.等待下载完成, 将C:\vs2017文件夹打包，这就是离线安装包了。&lt;/p&gt;&#xA;&lt;hr&gt;&#xA;&lt;h4 id=&#34;离线安装&#34;&gt;离线安装&lt;/h4&gt;&#xA;&lt;p&gt;将刚才的压缩包解压。&#xA;运行命令：&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;vs_community.exe --noweb&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;弹出安装界面，选择组件的时候注意不要选择刚才没下载的组件，否则会安装失败。&lt;/p&gt;&#xA;&lt;hr&gt;&#xA;&lt;p&gt;我下载好的离线包：&#xA;链接: &lt;a href=&#34;https://pan.baidu.com/s/1bkLRX0vyMuJKt-hPnEpsUg&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;https://pan.baidu.com/s/1bkLRX0vyMuJKt-hPnEpsUg&lt;/a&gt;&#xA;提取码: mb4r&lt;/p&gt;</description>
    </item>
    <item>
      <title>STM32F407移植OpenHarmony笔记9</title>
      <link>https://xcdd.pages.dev/blog/2024/2024-02-04/</link>
      <pubDate>Sun, 04 Feb 2024 16:40:13 +0000</pubDate>
      <guid>https://xcdd.pages.dev/blog/2024/2024-02-04/</guid>
      <description>&lt;p&gt;继上一篇笔记，已经完成liteos内核的基本功能适配。&#xA;今天尝试启动OHOS和XTS兼容性测试。&lt;/p&gt;&#xA;&lt;hr&gt;&#xA;&lt;p&gt;如何启动OHOS？&#xA;OHOS系统初始化接口是OHOS_SystemInit(void)，在内核初始化完成后，就能调用。&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;extern void OHOS_SystemInit(void);&#xD;&#xA;OHOS_SystemInit();&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;OHOS_SystemInit函数在//base/startup/bootstrap_lite/services/source/system_init.c里面。&#xA;它负责初始化系统组件，由于系统组件的初始化用了特殊的宏定义，比如：&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;CORE_INIT()&#xD;&#xA;SYS_RUN()&#xD;&#xA;SYS_SERVICE_INIT_PRI()&#xD;&#xA;......&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;这些宏在ohos_init.h里面可以看到，利用编译器把这个函数放到指定的代码段，相当于在编译阶段生成一个静态数组，然后OHOS_SystemInit会从这个数组取出函数，再依次执行。要实现这样的机制还需要修改链接脚本，好消息是talkweb的demo代码已经帮我们写好了，直接拿来就能用。&#xA;LD脚本添加的内容长下面的样子：&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;&#xD;&#xA;    __zinitcall_bsp_start = .;&#xD;&#xA;    KEEP (*(.zinitcall.bsp0.init))&#xD;&#xA;    KEEP (*(.zinitcall.bsp1.init))&#xD;&#xA;    KEEP (*(.zinitcall.bsp2.init))&#xD;&#xA;    KEEP (*(.zinitcall.bsp3.init))&#xD;&#xA;    KEEP (*(.zinitcall.bsp4.init))&#xD;&#xA;    __zinitcall_bsp_end = .;&#xD;&#xA;    ......&#xD;&#xA;    __zinitcall_exit_start = .;&#xD;&#xA;    KEEP (*(.zinitcall.exit0.init))&#xD;&#xA;    KEEP (*(.zinitcall.exit1.init))&#xD;&#xA;    KEEP (*(.zinitcall.exit2.init))&#xD;&#xA;    KEEP (*(.zinitcall.exit3.init))&#xD;&#xA;    KEEP (*(.zinitcall.exit4.init))&#xD;&#xA;    __zinitcall_exit_end = .;&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;hr&gt;&#xA;&lt;p&gt;OHOS系统组件是按子系统来分类管理的，每个子系统下面又有多个组件，需要用哪些系统功能就要添加对应的组件到config.json文件里面去。每个组件都有一个专门的描述文件：bundle.json，描述组件的名字和适用系统类型等信息。&lt;/p&gt;&#xA;&lt;p&gt;功能组件之间也存在依赖关系，目前我还不知道怎么查询依赖关系，只能凭经验手动添加来测试。&#xA;在编辑config.json添加组件时，还有一个features字段，也不知道从哪找。&lt;/p&gt;&#xA;&lt;p&gt;XTS是一个独立子系统，依赖组件不太清楚，只能根据编译报错信息往里面加，加到编译不报错为止。不过这就遇到一个奇怪的报错：&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;[OHOS ERROR] FAILED: gen/base/startup/init/services/param/liteos/lite_ohos_param_to_param_cfg_to_code.log &#xD;&#xA;[OHOS ERROR] /home/openharmony/prebuilts/python/linux-x86/3.9.2/bin/python3 ../../../base/startup/init/scripts/param_cfg_to_code.py --source /home/openharmony/base/startup/init/services/etc_lite/param/ohos_const/ohos.para --source /utils/sys_param/vendor.para --source /home/openharmony/base/startup/init/services/etc/param/ohos.para --dest_dir /home/openharmony/out/demo_board/hello/gen/init/&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;通过对比talkweb的demo，原来需要手写一个vendor.para文件，而且还要指定路径。&#xA;需要在config.json里面添加产品适配器的路径，就是下面这行代码：&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;  &amp;#34;product_adapter_dir&amp;#34;: &amp;#34;//vendor/demo/hello/hals&amp;#34;,&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;这表示某些需要产品级适配的组件，会在这个目录去寻找对应的文件。&#xA;刚才的报错就是“syspara_lite”这个组件所需要的适配文件。&#xA;参考talkweb的demo，在这个目录下创建以下文件：&lt;/p&gt;</description>
    </item>
    <item>
      <title>STM32F407移植OpenHarmony笔记8</title>
      <link>https://xcdd.pages.dev/blog/2024/2024-02-02/</link>
      <pubDate>Fri, 02 Feb 2024 18:15:40 +0000</pubDate>
      <guid>https://xcdd.pages.dev/blog/2024/2024-02-02/</guid>
      <description>&lt;p&gt;继上一篇笔记，成功开启了littlefs文件系统，能读写FLASH上的文件了。&#xA;今天继续研究网络功能，让控制台的ping命令能工作。&lt;/p&gt;&#xA;&lt;hr&gt;&#xA;&lt;p&gt;轻量级系统使用的是liteos_m内核+lwip协议栈实现网络功能，需要进行配置开启lwip支持。&lt;/p&gt;&#xA;&lt;p&gt;&lt;img src=&#34;./213_1.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;lwip的移植分为两部分，一部分是sys_arch用于适配rtos，这部分liteos_m已经实现了，&#xA;相关代码在：/kernel/liteos_m/components/net/lwip-2.1/porting/src&lt;/p&gt;&#xA;&lt;p&gt;另一部分则是网卡驱动的适配，这部分代码适配起来和其它平台基本一样。&#xA;自己写一个ethernetif.c，在里面实现ethernetif_init，完成网卡初始化。&#xA;并定义一个struct netif实例，指定一些参数（如下），具体代码可以抄官方demo。&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;netif-&amp;gt;name[0] = &amp;#39;e&amp;#39;;&#xD;&#xA;netif-&amp;gt;name[1] = &amp;#39;n&amp;#39;;&#xD;&#xA;netif-&amp;gt;output = etharp_output;&#xD;&#xA;netif-&amp;gt;linkoutput = low_level_output;&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;网卡驱动的大概流程：&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;ethernetif_init&lt;/strong&gt; 由lwip在添加网卡的时候调用，初始化底层ETH模块；&#xA;然后创建一个线程和信号量，用于接收ETH的数据 ；&#xA;在接收线程里等待信号量，在ETH中断里发送信号量，唤醒接收线程；&#xA;接收线程调用low_level_input读取ETH数据放入pbuf中，并返回这个pbuf;&#xA;最后将pbuf丢给netif-&amp;gt;input处理，这个函数在/third_party/lwip/src/netif/ethernet.c里面。&#xA;当协议栈要发送数据时，它会调用low_level_output，数据放在pbuf参数里面。&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-cpp&#34; data-lang=&#34;cpp&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;struct&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;pbuf&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;p;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;struct&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;netif&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;netif &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; (&lt;span style=&#34;color:#66d9ef&#34;&gt;struct&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;netif&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;)&lt;span style=&#34;color:#f92672&#34;&gt;&amp;amp;&lt;/span&gt;stm32_netif;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;for&lt;/span&gt; (;;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt; (osSemaphoreAcquire(ethSemaphore, osWaitForever) &lt;span style=&#34;color:#f92672&#34;&gt;==&lt;/span&gt; osOK)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#66d9ef&#34;&gt;do&lt;/span&gt; {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                p &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; low_level_input(netif);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                &lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt; (p &lt;span style=&#34;color:#f92672&#34;&gt;!=&lt;/span&gt; NULL)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                    &lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt; (netif&lt;span style=&#34;color:#f92672&#34;&gt;-&amp;gt;&lt;/span&gt;input(p, netif) &lt;span style=&#34;color:#f92672&#34;&gt;!=&lt;/span&gt; ERR_OK)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                    {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                        pbuf_free(p);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                    }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            } &lt;span style=&#34;color:#66d9ef&#34;&gt;while&lt;/span&gt; (p &lt;span style=&#34;color:#f92672&#34;&gt;!=&lt;/span&gt; NULL);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;hr&gt;&#xA;&lt;p&gt;这里简单记录一下lwip的初始化过程：&lt;/p&gt;</description>
    </item>
    <item>
      <title>STM32F407移植OpenHarmony笔记7</title>
      <link>https://xcdd.pages.dev/blog/2024/2024-02-01/</link>
      <pubDate>Thu, 01 Feb 2024 17:40:12 +0000</pubDate>
      <guid>https://xcdd.pages.dev/blog/2024/2024-02-01/</guid>
      <description>&lt;p&gt;继上一篇笔记，成功启动了liteos_m内核，可以创建线程了，也能看到shell控制台了。&#xA;今天研究文件系统，让控制台相关文件命令如mkdir和ls能工作。&lt;/p&gt;&#xA;&lt;hr&gt;&#xA;&lt;p&gt;liteos_m内核支持fatfs和littlefs两个文件系统，&#xA;fatfs适用于SD卡，&#xA;littlefs适用于NORFLASH，如W25Qxx系列。&#xA;我的板子上刚好有W25Q64，试试接入littlefs文件系统。&#xA;基于之前的研究经验，进入make menuconfig看看文件系统相关选项，先把它选上：&lt;/p&gt;&#xA;&lt;p&gt;&lt;img src=&#34;./212_1.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;当启用文件系统后，LOS_KernelInit会调用OsVfsInit进行初始化，&#xA;OsVfsInit又会调用LfsInit初始化littlefs，并把littlefs注册到vfs的类型列表。&lt;/p&gt;&#xA;&lt;hr&gt;&#xA;&lt;p&gt;那我们怎么使用它呢，怎么让littlefs读写我们的SPIFLASH呢？&lt;/p&gt;&#xA;&lt;p&gt;经过调查，我们需要使用mount函数，进行挂载操作来绑定文件系统和FLASH设备。&#xA;那就在bsp目录新建littlefs.c，参考代码：&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-cpp&#34; data-lang=&#34;cpp&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;#include&lt;/span&gt; &lt;span style=&#34;color:#75715e&#34;&gt;&amp;lt;stdio.h&amp;gt;&lt;/span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;#include&lt;/span&gt; &lt;span style=&#34;color:#75715e&#34;&gt;&amp;#34;spiflash.h&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;#include&lt;/span&gt; &lt;span style=&#34;color:#75715e&#34;&gt;&amp;#34;lfs.h&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;#include&lt;/span&gt; &lt;span style=&#34;color:#75715e&#34;&gt;&amp;#34;los_fs.h&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;static&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;LittlefsRead&lt;/span&gt;(&lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt; partition, UINT32 &lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;offset, &lt;span style=&#34;color:#66d9ef&#34;&gt;void&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;buf, UINT32 size)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;{&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    spiflash_read(&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;offset, buf, size);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt; LFS_ERR_OK;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;static&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;LittlefsProg&lt;/span&gt;(&lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt; partition, UINT32 &lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;offset, &lt;span style=&#34;color:#66d9ef&#34;&gt;const&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;void&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;buf, UINT32 size)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;{&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    spiflash_write(&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;offset, buf, size);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt; LFS_ERR_OK;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;static&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;LittlefsErase&lt;/span&gt;(&lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt; partition, UINT32 offset, UINT32 size)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;{&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    spiflash_erase(offset, size);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt; LFS_ERR_OK;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;static&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;void&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;LittlefsPartiton&lt;/span&gt;(&lt;span style=&#34;color:#66d9ef&#34;&gt;void&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;{&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt; lens[&lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;]&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;{&lt;span style=&#34;color:#ae81ff&#34;&gt;1024&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;1024&lt;/span&gt;};&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt; addr[&lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;]&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;{&lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;};&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    LOS_DiskPartition(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;flash0&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;littlefs&amp;#34;&lt;/span&gt;, lens, addr, &lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;static&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;void&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;LittlefsMount&lt;/span&gt;(&lt;span style=&#34;color:#66d9ef&#34;&gt;void&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;{&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt; ret;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;struct&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;PartitionCfg&lt;/span&gt; lfs_cfg;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    lfs_cfg.readFunc &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; LittlefsRead;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    lfs_cfg.writeFunc &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; LittlefsProg;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    lfs_cfg.eraseFunc &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; LittlefsErase;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    lfs_cfg.readSize &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;64&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    lfs_cfg.writeSize &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;256&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    lfs_cfg.blockSize &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;4096&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    lfs_cfg.blockCount &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;256&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    lfs_cfg.cacheSize &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;4096&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    lfs_cfg.partNo &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    lfs_cfg.lookaheadSize &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;64&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    lfs_cfg.blockCycles &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;100&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    ret &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; mount(NULL, &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;/flash&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;littlefs&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;, &lt;span style=&#34;color:#f92672&#34;&gt;&amp;amp;&lt;/span&gt;lfs_cfg);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    printf(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;LittlefsInit ret=%d&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;\n&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&lt;/span&gt;, ret);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;LittlefsInit&lt;/span&gt;(&lt;span style=&#34;color:#66d9ef&#34;&gt;void&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;{&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    printf(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;LittlefsInit enter&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;\n&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&lt;/span&gt;);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    spiflash_init();&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    printf(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;SPIFLASH flash id=0x%x&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;\n&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&lt;/span&gt;, spiflash_read_id());&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    LittlefsPartiton();&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    LittlefsMount();&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt; LFS_ERR_OK;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;LittlefsInit&lt;/strong&gt; 函数是初始化文件系统函数，在main里面完成LOS_KernelInit之后再调用。&#xA;spiflash_init是我们实现的W25QXX的驱动，W25QXX使用的是STM32F407的SPI接口。&lt;/p&gt;</description>
    </item>
    <item>
      <title>STM32F407移植OpenHarmony笔记6</title>
      <link>https://xcdd.pages.dev/blog/2024/2024-01-31-1740/</link>
      <pubDate>Wed, 31 Jan 2024 17:40:16 +0000</pubDate>
      <guid>https://xcdd.pages.dev/blog/2024/2024-01-31-1740/</guid>
      <description>&lt;p&gt;继上一篇笔记，编译好STM32的裸机程序，能点亮LED灯了。&#xA;下一步就是启动liteos_m内核了。&lt;/p&gt;&#xA;&lt;hr&gt;&#xA;&lt;p&gt;不过为了更好的调试代码，需要先把printf重定向到串口，基于gcc的printf重定向和Keil不一样。&#xA;直接新建printf.c，在里面重写printf函数即可。&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-cpp&#34; data-lang=&#34;cpp&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;printf&lt;/span&gt;(&lt;span style=&#34;color:#66d9ef&#34;&gt;char&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;const&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;fmt, ...)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;{&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;char&lt;/span&gt; buf[&lt;span style=&#34;color:#ae81ff&#34;&gt;256&lt;/span&gt;];&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    va_list ap;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    va_start(ap, fmt);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt; len &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; vsnprintf_s(buf, &lt;span style=&#34;color:#66d9ef&#34;&gt;sizeof&lt;/span&gt;(buf), &lt;span style=&#34;color:#66d9ef&#34;&gt;sizeof&lt;/span&gt;(buf) &lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;, fmt, ap);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    UartWrite(buf, len);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    va_end(ap);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt; len;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;UartWrite是写串口的函数，基于HAL库写串口驱动我就不介绍了。&#xA;记得在printf之前要初始化UART和相关的GPIO。&#xA;这里有2个细节需要注意：&#xA;1.写串口没有临界区保护，多线程printf会有竞争风险，等kernel跑起来了，到时候加上mutex。&#xA;2.格式化字符串的buf长度256，是在stack上开辟的，注意调用线程的stack空间要给够。&lt;/p&gt;&#xA;&lt;hr&gt;&#xA;&lt;p&gt;liteos_m内核已经完成了ARM cortex-m4的适配，理论上所有基于cortex-m4的MCU都能快速使用。&#xA;我们只需要在main函数调用LOS_KernelInit()和LOS_Start()可以了。&#xA;启动之前自己创建一个线程，用来闪灯。&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-cpp&#34; data-lang=&#34;cpp&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;static&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;void&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;LED_Blink&lt;/span&gt;(&lt;span style=&#34;color:#66d9ef&#34;&gt;void&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;{&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;GPIO_InitTypeDef GPIO_InitStruct &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; {&lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;};&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;__HAL_RCC_GPIOA_CLK_ENABLE();&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;GPIO_InitStruct.Pin &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; GPIO_PIN_4;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;GPIO_InitStruct.Mode &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; GPIO_MODE_OUTPUT_PP;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;GPIO_InitStruct.Pull &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; GPIO_PULLUP;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;GPIO_InitStruct.Speed &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; GPIO_SPEED_FREQ_VERY_HIGH;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;GPIO_InitStruct.Alternate &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;HAL_GPIO_Init(GPIOA, &lt;span style=&#34;color:#f92672&#34;&gt;&amp;amp;&lt;/span&gt;GPIO_InitStruct);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    printf(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;enter led blink.&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;\n&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&lt;/span&gt;);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&lt;span style=&#34;color:#66d9ef&#34;&gt;while&lt;/span&gt;(&lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;{&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&#x9;HAL_GPIO_WritePin(GPIOA, GPIO_PIN_4, GPIO_PIN_RESET);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&#x9;LOS_TaskDelay(&lt;span style=&#34;color:#ae81ff&#34;&gt;250&lt;/span&gt;);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&#x9;HAL_GPIO_WritePin(GPIOA, GPIO_PIN_4, GPIO_PIN_SET);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&#x9;LOS_TaskDelay(&lt;span style=&#34;color:#ae81ff&#34;&gt;250&lt;/span&gt;);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;static&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;void&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;InitTask&lt;/span&gt;(&lt;span style=&#34;color:#66d9ef&#34;&gt;void&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;{&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    UINT32 taskID &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    TSK_INIT_PARAM_S stTask &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; {&lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;};&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    stTask.pfnTaskEntry &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; (TSK_ENTRY_FUNC)LED_Blink;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    stTask.uwStackSize &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;1024&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    stTask.pcName &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;led&amp;#34;&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    stTask.usTaskPrio &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    LOS_TaskCreate(&lt;span style=&#34;color:#f92672&#34;&gt;&amp;amp;&lt;/span&gt;taskID, &lt;span style=&#34;color:#f92672&#34;&gt;&amp;amp;&lt;/span&gt;stTask);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    printf(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;task id=%d&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;\n&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&lt;/span&gt;, taskID);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;main&lt;/span&gt;(&lt;span style=&#34;color:#66d9ef&#34;&gt;void&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;{&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;HAL_Init();&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;SystemClock_Config();&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;UartInit();&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;printf(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;init...&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;\n&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&lt;/span&gt;);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;LOS_KernelInit();&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;InitTask();&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;LOS_Start();&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    printf(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;BUG!!!&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;\n&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&lt;/span&gt;);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&lt;span style=&#34;color:#66d9ef&#34;&gt;while&lt;/span&gt;(&lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;hr&gt;&#xA;&lt;p&gt;运气好的话，编译下去，可以看到串口打印，同时LED也会闪烁。&lt;/p&gt;</description>
    </item>
    <item>
      <title>STM32F407移植OpenHarmony笔记5</title>
      <link>https://xcdd.pages.dev/blog/2024/2024-01-31/</link>
      <pubDate>Wed, 31 Jan 2024 15:50:27 +0000</pubDate>
      <guid>https://xcdd.pages.dev/blog/2024/2024-01-31/</guid>
      <description>&lt;p&gt;继上一篇笔记，搭建好STM32的编译框架，编译出来的OHOS_Image.bin并不能跑不起来。&#xA;今天要在bsp里面添加一些代码，让程序能跑起来。&lt;/p&gt;&#xA;&lt;hr&gt;&#xA;&lt;p&gt;先从裸机点亮LED灯开始，准备以下3个文件:startup和system文件可以用OHOS官方代码。&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-cpp&#34; data-lang=&#34;cpp&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;/&lt;/span&gt;device&lt;span style=&#34;color:#f92672&#34;&gt;/&lt;/span&gt;board&lt;span style=&#34;color:#f92672&#34;&gt;/&lt;/span&gt;demo&lt;span style=&#34;color:#f92672&#34;&gt;/&lt;/span&gt;demo_board&lt;span style=&#34;color:#f92672&#34;&gt;/&lt;/span&gt;liteos_m&lt;span style=&#34;color:#f92672&#34;&gt;/&lt;/span&gt;bsp&lt;span style=&#34;color:#f92672&#34;&gt;/&lt;/span&gt;src&lt;span style=&#34;color:#f92672&#34;&gt;/&lt;/span&gt;main.c&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;/&lt;/span&gt;device&lt;span style=&#34;color:#f92672&#34;&gt;/&lt;/span&gt;board&lt;span style=&#34;color:#f92672&#34;&gt;/&lt;/span&gt;demo&lt;span style=&#34;color:#f92672&#34;&gt;/&lt;/span&gt;demo_board&lt;span style=&#34;color:#f92672&#34;&gt;/&lt;/span&gt;liteos_m&lt;span style=&#34;color:#f92672&#34;&gt;/&lt;/span&gt;bsp&lt;span style=&#34;color:#f92672&#34;&gt;/&lt;/span&gt;src&lt;span style=&#34;color:#f92672&#34;&gt;/&lt;/span&gt;system_stm32f4xx.c&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;/&lt;/span&gt;device&lt;span style=&#34;color:#f92672&#34;&gt;/&lt;/span&gt;board&lt;span style=&#34;color:#f92672&#34;&gt;/&lt;/span&gt;demo&lt;span style=&#34;color:#f92672&#34;&gt;/&lt;/span&gt;demo_board&lt;span style=&#34;color:#f92672&#34;&gt;/&lt;/span&gt;liteos_m&lt;span style=&#34;color:#f92672&#34;&gt;/&lt;/span&gt;bsp&lt;span style=&#34;color:#f92672&#34;&gt;/&lt;/span&gt;src&lt;span style=&#34;color:#f92672&#34;&gt;/&lt;/span&gt;startup_stm32f407xx.s&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;main.c里面做最简单的初始化，由于官方soc提供的st库是HAL库，因此用HAL库点亮LED。&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-cpp&#34; data-lang=&#34;cpp&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;#include&lt;/span&gt; &lt;span style=&#34;color:#75715e&#34;&gt;&amp;#34;stm32f4xx_hal.h&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;void&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;HAL_MspInit&lt;/span&gt;(&lt;span style=&#34;color:#66d9ef&#34;&gt;void&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;{&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;__HAL_RCC_SYSCFG_CLK_ENABLE();&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;__HAL_RCC_PWR_CLK_ENABLE();&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;void&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;SystemClock_Config&lt;/span&gt;(&lt;span style=&#34;color:#66d9ef&#34;&gt;void&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;{&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    RCC_OscInitTypeDef RCC_OscInitStruct &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; {&lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;};&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    RCC_ClkInitTypeDef RCC_ClkInitStruct &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; {&lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;};&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    __HAL_RCC_PWR_CLK_ENABLE();&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    __HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE1);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; &#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    RCC_OscInitStruct.OscillatorType &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; RCC_OSCILLATORTYPE_HSE;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    RCC_OscInitStruct.HSEState &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; RCC_HSE_ON;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    RCC_OscInitStruct.PLL.PLLState &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; RCC_PLL_ON;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    RCC_OscInitStruct.PLL.PLLSource &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; RCC_PLLSOURCE_HSE;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    RCC_OscInitStruct.PLL.PLLM &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;25&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    RCC_OscInitStruct.PLL.PLLN &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;336&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    RCC_OscInitStruct.PLL.PLLP &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; RCC_PLLP_DIV2;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    RCC_OscInitStruct.PLL.PLLQ &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;7&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    HAL_RCC_OscConfig(&lt;span style=&#34;color:#f92672&#34;&gt;&amp;amp;&lt;/span&gt;RCC_OscInitStruct);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    RCC_ClkInitStruct.ClockType &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; RCC_CLOCKTYPE_HCLK &lt;span style=&#34;color:#f92672&#34;&gt;|&lt;/span&gt; RCC_CLOCKTYPE_SYSCLK &lt;span style=&#34;color:#f92672&#34;&gt;|&lt;/span&gt; RCC_CLOCKTYPE_PCLK1 &lt;span style=&#34;color:#f92672&#34;&gt;|&lt;/span&gt; RCC_CLOCKTYPE_PCLK2;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    RCC_ClkInitStruct.SYSCLKSource &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; RCC_SYSCLKSOURCE_PLLCLK;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    RCC_ClkInitStruct.AHBCLKDivider &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; RCC_SYSCLK_DIV1;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    RCC_ClkInitStruct.APB1CLKDivider &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; RCC_HCLK_DIV4;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    RCC_ClkInitStruct.APB2CLKDivider &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; RCC_HCLK_DIV2;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    HAL_RCC_ClockConfig(&lt;span style=&#34;color:#f92672&#34;&gt;&amp;amp;&lt;/span&gt;RCC_ClkInitStruct, FLASH_LATENCY_5);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;//我的板子上有个LED，连接在PA4&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;static&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;void&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;LED_Blink&lt;/span&gt;(&lt;span style=&#34;color:#66d9ef&#34;&gt;void&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;{&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;GPIO_InitTypeDef GPIO_InitStruct &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; {&lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;};&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;__HAL_RCC_GPIOA_CLK_ENABLE();&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;GPIO_InitStruct.Pin &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; GPIO_PIN_4;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;GPIO_InitStruct.Mode &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; GPIO_MODE_OUTPUT_PP;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;GPIO_InitStruct.Pull &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; GPIO_PULLUP;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;GPIO_InitStruct.Speed &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; GPIO_SPEED_FREQ_VERY_HIGH;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;GPIO_InitStruct.Alternate &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;HAL_GPIO_Init(GPIOA, &lt;span style=&#34;color:#f92672&#34;&gt;&amp;amp;&lt;/span&gt;GPIO_InitStruct);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&lt;span style=&#34;color:#66d9ef&#34;&gt;while&lt;/span&gt;(&lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;{&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&#x9;HAL_GPIO_WritePin(GPIOA, GPIO_PIN_4, GPIO_PIN_RESET);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&#x9;HAL_Delay(&lt;span style=&#34;color:#ae81ff&#34;&gt;500&lt;/span&gt;);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&#x9;HAL_GPIO_WritePin(GPIOA, GPIO_PIN_4, GPIO_PIN_SET);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&#x9;HAL_Delay(&lt;span style=&#34;color:#ae81ff&#34;&gt;500&lt;/span&gt;);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;main&lt;/span&gt;(&lt;span style=&#34;color:#66d9ef&#34;&gt;void&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;{&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;HAL_Init();&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;SystemClock_Config();&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;LED_Blink();&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;这段代码初始化LED引脚，然后500ms改变1次LED状态。&#xA;这里面用到HAL_Delay函数，是由Systick中断驱动的延时函数，也考验中断能不能正常运行。&lt;/p&gt;</description>
    </item>
    <item>
      <title>STM32F407移植OpenHarmony笔记4</title>
      <link>https://xcdd.pages.dev/blog/2024/2024-01-30-1727/</link>
      <pubDate>Tue, 30 Jan 2024 17:27:35 +0000</pubDate>
      <guid>https://xcdd.pages.dev/blog/2024/2024-01-30-1727/</guid>
      <description>&lt;p&gt;上一篇写到make menuconfig报错，继续开整。&lt;/p&gt;&#xA;&lt;p&gt;make menuconfig需要/device/soc/*下面有对应的Kconfig文件。&#xA;直接去gitee下载stm32的配置文件拿来参考用。&#xA;先提取Kconfig文件，后面再添加其它文件。&lt;a href=&#34;https://gitee.com/openharmony/device_soc_st/tree/OpenHarmony-v3.2-Beta5/&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;https://gitee.com/openharmony/device_soc_st/tree/OpenHarmony-v3.2-Beta5/&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;soc下的目录结构如下：&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;└── soc&#xD;&#xA;    └── st&#xD;&#xA;        ├── Kconfig.liteos_m.defconfig&#xD;&#xA;        ├── Kconfig.liteos_m.series&#xD;&#xA;        ├── Kconfig.liteos_m.soc&#xD;&#xA;        └── stm32f4xx&#xD;&#xA;            ├── Kconfig.liteos_m.defconfig.series&#xD;&#xA;            ├── Kconfig.liteos_m.defconfig.stm32f4xx&#xD;&#xA;            ├── Kconfig.liteos_m.series&#xD;&#xA;            └── Kconfig.liteos_m.soc&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Kconfig.liteos_m.soc会在菜单里添加st这个SOC_COMPANY&#xA;还会扫描子目录下的Kconfig.liteos_m.soc，&#xA;在stm32f4xx子目录下面的这个文件又向菜单添加SOC_STM32F407&lt;/p&gt;&#xA;&lt;p&gt;Kconfig.liteos_m.series扫描子目录下的同名文件，&#xA;在stm32f4xx子目录里的这个文件又向菜单添加SOC_SERIES_STM32F4xx&lt;/p&gt;&#xA;&lt;hr&gt;&#xA;&lt;p&gt;再次测试make menuconfig还是会报错：&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;warning: &amp;lt;choice&amp;gt; (defined at arch/arm/Kconfig:34) defined with type unknown&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;根据错误提示并找不到问题在哪，&#xA;最后发现Makefile需要/vendor/demo/hello/kernel_configs/debug.config文件，空文件就行。&lt;/p&gt;&#xA;&lt;p&gt;&lt;img src=&#34;./209_1.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;进入Platform选择 Soc和stm32f407。&lt;/p&gt;&#xA;&lt;p&gt;&lt;img src=&#34;./209_2.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;Compat菜单下，选择newlibc&lt;/p&gt;&#xA;&lt;p&gt;&lt;img src=&#34;./209_3.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;配置完菜单后，配置保存在.config，并生成config.h文件，&#xA;同时还会向/vendor/demo/hello/kernel_configs/debug.config写入一部分配置内容。&lt;/p&gt;&#xA;&lt;hr&gt;&#xA;&lt;p&gt;再次编译看看报什么错：&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;[OHOS INFO] ERROR at //kernel/liteos_m/BUILD.gn:140:18: Unable to load &amp;#34;/home/openharmony/device/board/demo/BUILD.gn&amp;#34;.&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;根据错误，添加BUILD.gn&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;# /device/board/demo/BUILD.gn&#xD;&#xA;# https://kerndev.blog.csdn.net/&#xD;&#xA;&#xD;&#xA;import(&amp;#34;//kernel/liteos_m/liteos.gni&amp;#34;)&#xD;&#xA;module_name = get_path_info(rebase_path(&amp;#34;.&amp;#34;), &amp;#34;name&amp;#34;)&#xD;&#xA;module_group(module_name) {&#xD;&#xA;    modules = [ &amp;#34;demo_board&amp;#34; ]&#xD;&#xA;}&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;hr&gt;&#xA;&lt;p&gt;再次测试，继续根据错误提示，添加以下文件：&lt;/p&gt;</description>
    </item>
    <item>
      <title>STM32F407移植OpenHarmony笔记3</title>
      <link>https://xcdd.pages.dev/blog/2024/2024-01-30/</link>
      <pubDate>Tue, 30 Jan 2024 16:03:27 +0000</pubDate>
      <guid>https://xcdd.pages.dev/blog/2024/2024-01-30/</guid>
      <description>&lt;p&gt;接上一篇，搭建完环境，找个DEMO能跑，现在我准备尝试从0开始搬砖。&lt;/p&gt;&#xA;&lt;p&gt;首先把/device和/vendor之前的代码全删除，这个时候用hb set命令看不到任何项目了。&lt;/p&gt;&#xA;&lt;p&gt;/device目录是硬件设备目录，包括soc芯片厂商和board板级支持代码。&#xA;创建目录规则：“device/{芯片厂商}/{芯片开发板}”。&lt;/p&gt;&#xA;&lt;p&gt;/vendor目录是产品项目定义目录。&#xA;创建目录规则：“vendor/{产品模组厂商}/{产品模组名称}”。&lt;/p&gt;&#xA;&lt;p&gt;&lt;img src=&#34;./208_1.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;参考文档： &lt;a href=&#34;https://gitee.com/openharmony/docs/blob/master/zh-cn/device-dev/porting/porting-minichip-prepare.md&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;zh-cn/device-dev/porting/porting-minichip-prepare.md · OpenHarmony/docs - Gitee.com&lt;/a&gt;&lt;/p&gt;&#xA;&lt;hr&gt;&#xA;&lt;p&gt;hb set是扫描/vendor/目录下的config.json，所以我们从这个文件开始。&#xA;然后根据报错信息一步一步添加代码。&lt;/p&gt;&#xA;&lt;p&gt;先依葫芦画飘，写一个最小配置文件，把它放到/vendor/demo/hello目录。&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;{&#xD;&#xA;  &amp;#34;product_name&amp;#34;: &amp;#34;hello&amp;#34;,&#xD;&#xA;  &amp;#34;ohos_version&amp;#34;: &amp;#34;OpenHarmony 3.2&amp;#34;,&#xD;&#xA;  &amp;#34;type&amp;#34;: &amp;#34;mini&amp;#34;,&#xD;&#xA;  &amp;#34;version&amp;#34;: &amp;#34;3.0&amp;#34;,&#xD;&#xA;  &amp;#34;device_company&amp;#34;: &amp;#34;demo&amp;#34;,&#xD;&#xA;  &amp;#34;board&amp;#34;: &amp;#34;demo_board&amp;#34;,&#xD;&#xA;  &amp;#34;target_cpu&amp;#34;: &amp;#34;arm&amp;#34;,&#xD;&#xA;  &amp;#34;kernel_type&amp;#34;: &amp;#34;liteos_m&amp;#34;,&#xD;&#xA;  &amp;#34;kernel_version&amp;#34;: &amp;#34;3.0.0&amp;#34;,&#xD;&#xA;  &amp;#34;subsystems&amp;#34;:&#xD;&#xA;  [&#xD;&#xA;    {&#xD;&#xA;      &amp;#34;subsystem&amp;#34;: &amp;#34;kernel&amp;#34;,&#xD;&#xA;      &amp;#34;components&amp;#34;: &#xD;&#xA;      [&#xD;&#xA;        {&#xD;&#xA;          &amp;#34;component&amp;#34;: &amp;#34;liteos_m&amp;#34;, &#xD;&#xA;          &amp;#34;features&amp;#34;: []&#xD;&#xA;        }&#xD;&#xA;      ]&#xD;&#xA;    }&#xD;&#xA;  ],&#xD;&#xA;  &amp;#34;vendor_adapter_dir&amp;#34;: &amp;#34;&amp;#34;,&#xD;&#xA;  &amp;#34;product_adapter_dir&amp;#34;: &amp;#34;&amp;#34;,&#xD;&#xA;  &amp;#34;third_party_dir&amp;#34;: &amp;#34;//third_party&amp;#34;&#xD;&#xA;}&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;这个时候用hb set就能选择hello了。但是会报错：&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;OHOS Which product do you need?  hello&#xD;&#xA;[OHOS ERROR] invalid path: /home/openharmony/device/board/demo/demo_board&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;没关系因为我们device目录还没有东西，要按照规则创建/device/board/demo/demo_board。&#xA;继续报错：&lt;/p&gt;</description>
    </item>
    <item>
      <title>STM32F407移植OpenHarmony笔记2</title>
      <link>https://xcdd.pages.dev/blog/2024/2024-01-24-1601/</link>
      <pubDate>Wed, 24 Jan 2024 16:01:50 +0000</pubDate>
      <guid>https://xcdd.pages.dev/blog/2024/2024-01-24-1601/</guid>
      <description>&lt;p&gt;接上篇，搭建完开发环境后，我们还要继续工作。&lt;/p&gt;&#xA;&lt;p&gt;官方合作的开发板刚好有STM32F407，我准备试一下开发板的demo，虽然我用的不是他们的开发板。&lt;/p&gt;&#xA;&lt;p&gt;先下载以下3份代码：&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;https://gitee.com/openharmony/device_board_talkweb/tree/OpenHarmony-v3.2-Beta5/&#xD;&#xA;https://gitee.com/openharmony/vendor_talkweb/tree/OpenHarmony-v3.2-Beta5/&#xD;&#xA;https://gitee.com/openharmony/device_soc_st/tree/OpenHarmony-v3.2-Beta5/&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;device_board_talkweb下载后，要解压到：//device/board/talkweb&#xA;device_talkweb下载后，要解压到：//vendor/talkweb&#xA;device_soc_st下载后，要解压到：//device/soc/st&lt;/p&gt;&#xA;&lt;p&gt;准备好后，我们再运行hb set可以在列表里看到talkweb的信息,选中niobe407。&lt;/p&gt;&#xA;&lt;p&gt;根据开发板的文档，还要进入kernel/liteos_m，进行make menuconfig选择board和applications。&lt;/p&gt;&#xA;&lt;p&gt;然后执行hb build编译试一下。&lt;/p&gt;&#xA;&lt;p&gt;编译成功后，就在out下面能找到OHOS_Image.bin&lt;/p&gt;&#xA;&lt;p&gt;用JLINK下载OHOS_Image.bin后，串口什么反应也没有。&lt;/p&gt;&#xA;&lt;hr&gt;&#xA;&lt;p&gt;由于硬件差异，需要根据自己的硬件来修改时钟配置和串口引脚。&lt;/p&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;修改里面的参数。&lt;/p&gt;&#xA;&lt;p&gt;/device/board/talkweb/niobe407/liteos_m/bsp/src/main.c&lt;/p&gt;&lt;/blockquote&gt;&#xA;&lt;p&gt;主要是PLL和GPIO。&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;//板子晶振是25M的，如下修改&#xD;&#xA;#define BAUDRATE 115200&#xD;&#xA;#define NIOBE_PLLM 25&#xD;&#xA;#define NIOBE_PLLN 336&#xD;&#xA;#define NIOBE_PLLQ 7&#xD;&#xA;#define NIOBE_DELAY 1000&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;修改后，再次编译下载，还是没有反应。&lt;/p&gt;&#xA;&lt;hr&gt;&#xA;&lt;p&gt;经过一番调查后，发现这demo还编译了一个bootloader，这个bootloader什么也没做，只负责跳转到0x08010000。&lt;/p&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;参见：/device/board/talkweb/niobe407/liteos_m/bootloader/src/bootloader.c&lt;/p&gt;&lt;/blockquote&gt;&#xA;&lt;p&gt;最终bootloader合并app后，生成的文件名是:OHOS_Image_allinone.bin&lt;/p&gt;&#xA;&lt;p&gt;用JLINK下载这个bin文件，终于在串口看到日志打印信息了。&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;*************************************************************&#xD;&#xA;&#xD;&#xA;████████╗ █████╗ ██╗     ██╗  ██╗██╗    ██╗███████╗██████╗&#xD;&#xA;╚══██╔══╝██╔══██╗██║     ██║ ██╔╝██║    ██║██╔════╝██╔══██╗&#xD;&#xA;   ██║   ███████║██║     █████╔╝ ██║ █╗ ██║█████╗  ██████╔╝&#xD;&#xA;   ██║   ██╔══██║██║     ██╔═██╗ ██║███╗██║██╔══╝  ██╔══██╗&#xD;&#xA;   ██║   ██║  ██║███████╗██║  ██╗╚███╔███╔╝███████╗██████╔╝&#xD;&#xA;   ╚═╝   ╚═╝  ╚═╝╚══════╝╚═╝  ╚═╝ ╚══╝╚══╝ ╚══════╝╚═════╝&#xD;&#xA;&#xD;&#xA;         Welcome to use Niobe407 development board!&#xD;&#xA;             Hardware version: 1.0.0&#xD;&#xA;             Software version: 1.0.0&#xD;&#xA;*************************************************************&#xD;&#xA;entering kernel init...&#xD;&#xA;hilog will init.&#xD;&#xA;hievent will init.&#xD;&#xA;&#xD;&#xA;hievent init success.&#xD;&#xA;Entering scheduler&#xD;&#xA;hiview init success.&#xD;&#xA;[HDF:E/HDF_LOG_TAG]DeviceManagerStart in&#xD;&#xA;printf error!&#xD;&#xA;printf error!&#xD;&#xA;[HDF:I/gpio_manager]GpioManagerAdd: start:0 count:6 added success&#xD;&#xA;[HDF:D/HDF_LOG_TAG]PlatformManagerAddDevice: add dev:(null)(0) to PLATFORM_MODULE_GPIO success&#xD;&#xA;[HDF:D/HDF_LOG_TAG]PlatformDeviceAdd: add dev:(null)(0) success&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;虽然到此代码在我的STM32F407上面跑起来了，但还有满脑子问号需要进一步学习和调查。&lt;/p&gt;</description>
    </item>
    <item>
      <title>STM32F407移植OpenHarmony笔记1</title>
      <link>https://xcdd.pages.dev/blog/2024/2024-01-24/</link>
      <pubDate>Wed, 24 Jan 2024 15:16:48 +0000</pubDate>
      <guid>https://xcdd.pages.dev/blog/2024/2024-01-24/</guid>
      <description>&lt;h4 id=&#34;参考文档&#34;&gt;参考文档：&lt;/h4&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://docs.openharmony.cn/pages/v3.2/zh-cn/device-dev/get-code/gettools-acquire.md/&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;OpenAtom OpenHarmony&lt;/a&gt;&lt;/p&gt;&#xA;&lt;h4 id=&#34;搭建环境&#34;&gt;搭建环境&lt;/h4&gt;&#xA;&lt;p&gt;安装linux系统:&lt;/p&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;Ubuntu 22.04.2 LTS (GNU/Linux 5.15.0-91-generic x86_64)&lt;/p&gt;&lt;/blockquote&gt;&#xA;&lt;p&gt;下载源代码：我选择的是V3.2.4版本&lt;/p&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://repo.huaweicloud.com/openharmony/os/3.2.4/code-v3.2.4-Release_20231113.tar.gz&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;https://repo.huaweicloud.com/openharmony/os/3.2.4/code-v3.2.4-Release_20231113.tar.gz&lt;/a&gt;&lt;/p&gt;&lt;/blockquote&gt;&#xA;&lt;p&gt;安装docker：&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;sudo apt install docker.io&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;下载docker镜像： 单片机用的是轻量系统，因此选择对应的mini镜像&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;sudo docker pull swr.cn-south-1.myhuaweicloud.com/openharmony-docker/docker_oh_mini:3.2&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;创建docker容器：给它取个别名叫ohos3,以后记得都用它，避免每次都重新创建新容器。&#xA;-v $(pwd):/home/openharmony参数是把当前目录映射到容器内的/home/openharmony。&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;#创建并运行docker&#xD;&#xA;sudo docker run --name ohos3 -it -v $(pwd):/home/openharmony swr.cn-south-1.myhuaweicloud.com/openharmony-docker/docker_oh_mini:3.2&#xD;&#xA;#当需要重新进入docker的时候用：&#xD;&#xA;sudo docker start -ai ohos3&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;后续代码编译都是在docker内进行。&lt;/p&gt;&#xA;&lt;h4 id=&#34;验证环境&#34;&gt;验证环境：&lt;/h4&gt;&#xA;&lt;p&gt;解压源码:&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;tar -xvf ./code-v3.2.4-Release_20231113.tar.gz&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;进入源码根目录：&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;OpenHarmony-v3.2.4-Release/OpenHarmony&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;安装hb工具：&lt;/p&gt;&#xA;&lt;p&gt;默认情况下，用官方文档的方法：python3 build.py -p {product_name}@{company}是编译不了的。&#xA;需要安装hb，后续也建议用hb命令来编译。&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;pip install --user build/lite&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;安装成功后，输入hb，可以看到命令提示：&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;root@46010c9c023d:/home/openharmony# hb&#xD;&#xA;usage: -c [-h] [-v] {build,set,env,clean,tool} ...&#xD;&#xA;&#xD;&#xA;OHOS Build System version 0.4.6&#xD;&#xA;&#xD;&#xA;positional arguments:&#xD;&#xA;  {build,set,env,clean,tool}&#xD;&#xA;    build               Build source code&#xD;&#xA;    set                 OHOS build settings&#xD;&#xA;    env                 Show OHOS build env&#xD;&#xA;    clean               Clean output&#xD;&#xA;    tool                Call the gn command through the hb tool&#xD;&#xA;&#xD;&#xA;optional arguments:&#xD;&#xA;  -h, --help            show this help message and exit&#xD;&#xA;  -v, --version         show program&amp;#39;s version number and exit&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;编译测试：用hb set选择要编译的目标，然后执行build，我们先测试qemu_mini_system_demo&lt;/p&gt;</description>
    </item>
    <item>
      <title>解决VSCode使用SSH远程连接时无法指定用户名的问题</title>
      <link>https://xcdd.pages.dev/blog/2023/2023-11-01/</link>
      <pubDate>Wed, 01 Nov 2023 14:34:21 +0000</pubDate>
      <guid>https://xcdd.pages.dev/blog/2023/2023-11-01/</guid>
      <description>&lt;p&gt;Windows 11自带OpenSSH客户端，和VSCode配合得很好，没有这个问题。&lt;/p&gt;&#xA;&lt;p&gt;今天要说的是旧版本Windows 7/8/10系统遇到的问题。&lt;/p&gt;&#xA;&lt;p&gt;PS: Windows 7可以运行的最后版本是VSCode 1.80.2&lt;/p&gt;&#xA;&lt;hr&gt;&#xA;&lt;p&gt;由于Windows 7/8/10没有自带的OpenSSH客户端，但可以调用MSYS环境下的ssh。&#xA;我制作的MSYS绿色版，有需要的可以下载： &lt;a href=&#34;https://pan.baidu.com/s/1ZKn_VxI5UZRhQaHzR-896w?pwd=jbe8&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;百度网盘 请输入提取码&lt;/a&gt; :jbe8&#xA;如下图所示，修改SSH:Path&lt;/p&gt;&#xA;&lt;p&gt;&lt;img src=&#34;./205_1.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;默认设置下，通过Remote Explorer添加远程主机时，无法指定登陆用户名，它总是以Administrator账户登陆。&lt;/p&gt;&#xA;&lt;p&gt;在VSCode 1.80版本以前，我发现可以使用下面的方式添加SSH远程连接，添加远程主机时,把用户名写在前面。&#xA;如下图所示myname就是登陆的用户名。&lt;/p&gt;&#xA;&lt;p&gt;&lt;img src=&#34;./205_2.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;但是VSCode版本更新到1.80以后，这种方式不起作用了，会提示如下错误：&lt;/p&gt;&#xA;&lt;p&gt;&lt;img src=&#34;./205_3.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;后来经过研究，找到了无法改变用户名的根本原因，也就能解决1.80以后的这个问题。&lt;/p&gt;&#xA;&lt;p&gt;原因是我们调用的MSYS的ssh,它只会加载MSYS/home/Administrator/.ssh/config这个文件，&#xA;而不是VSCode里面默认的那个config文件。&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;因此我们只需要在VSCode设置里面，把config文件路径修改为MSYS下面的就可以啦！&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;&lt;img src=&#34;./205_4.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;现在我们就能正常使用VSCode添加远程主机和指定登陆用户名了。&lt;/p&gt;&#xA;&lt;p&gt;如下图：一个正常的config文件内容&lt;/p&gt;&#xA;&lt;p&gt;&lt;img src=&#34;./205_5.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;</description>
    </item>
    <item>
      <title>解释 Git 的基本概念</title>
      <link>https://xcdd.pages.dev/blog/2023/2023-08-28/</link>
      <pubDate>Mon, 28 Aug 2023 09:01:39 +0000</pubDate>
      <guid>https://xcdd.pages.dev/blog/2023/2023-08-28/</guid>
      <description>&lt;p&gt;Git是一种分布式版本控制系统，用于管理代码和其他项目文件的版本，以及协调多个开发者对同一项目的工作。以下是Git的主要概念和使用方式：&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;仓库（Repository）：用于存储和管理项目代码和文件的地方，可以是本地仓库或远程仓库。&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;提交（Commit）：将更改保存到Git仓库中的过程。一个提交包含一组文件更改，每次提交都会生成一个唯一的SHA值。&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;分支（Branch）：用于并行开发的独立的代码分支。主分支通常称为主干（Master），可以基于主干创建其他分支，在分支上进行更改和提交，最终将更改合并回主干。&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;合并（Merge）：将一个分支的更改合并到另一个分支的过程。可以手动合并或使用Git自动合并工具。&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;远程仓库（Remote）：在互联网上托管的Git仓库，用于多人协作和备份。&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;克隆（Clone）：从远程仓库中复制代码到本地计算机的过程。可以使用Git URL或HTTP URL进行克隆。&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;拉取（Pull）：从远程仓库获取更新并将其合并到本地仓库的过程。&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;推送（Push）：将本地代码更改推送到远程仓库的过程。&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;标签（Tag）：用于标记在代码库中的特定状态，通常用于发布版本。&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;p&gt;使用Git，可以在本地计算机上创建一个仓库，进行更改和提交，并将更改推送到远程仓库。也可以通过克隆远程仓库并在本地计算机上工作，将更改推送回远程仓库。还可以使用分支进行并行开发，并使用合并将更改合并回主干。Git提供了强大的版本控制和协作功能，使多人协作和代码管理变得更加容易和可靠。&lt;/p&gt;&#xA;&lt;hr&gt;&#xA;&lt;p&gt;以上内容由AI创作助手根据用户提示词生成。&lt;/p&gt;</description>
    </item>
    <item>
      <title>SNMP协议中OID的编码规则</title>
      <link>https://xcdd.pages.dev/blog/2023/2023-07-17/</link>
      <pubDate>Mon, 17 Jul 2023 14:56:32 +0000</pubDate>
      <guid>https://xcdd.pages.dev/blog/2023/2023-07-17/</guid>
      <description>&lt;h2 id=&#34;前言&#34;&gt;&lt;strong&gt;前言&lt;/strong&gt;&lt;/h2&gt;&#xA;&lt;p&gt;SNMP协议基于UDP，代理软件（服务器）监听161端口，管理端（客户端）监听162端口。&lt;/p&gt;&#xA;&lt;p&gt;正常请求：管理端发送请求到161端口，代理软件收到请求后将数据返回给管理端源端口。&#xA;主动上报：代理软件主动把数据发送管理端的162端口。&lt;/p&gt;&#xA;&lt;p&gt;SNMP协议中请求数据主要是读和写操作。&#xA;每个操作会有一个目标对象，这个对象用OID来表示。&#xA;OID是用一串数字表示：比如.1.3.6.1.2.1.1.5表示设备名称。&#xA;并且父子节点之间用小数点(.)分隔，形成类似于文件夹的树形结构。&lt;/p&gt;&#xA;&lt;hr&gt;&#xA;&lt;h2 id=&#34;本文主要介绍oid的编码和解码规则&#34;&gt;&lt;strong&gt;本文主要介绍OID的编码和解码规则。&lt;/strong&gt;&lt;/h2&gt;&#xA;&lt;p&gt;编码：.1.3.6.1.2.1.1.5在UDP报文中是怎么表达的？&lt;/p&gt;&#xA;&lt;p&gt;解码：我收到一串UDP报文，如何解析出它的OID值是多少？&lt;/p&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;设备名称 ＝ .1.3.6.1.2.1.1.5 ＝ 0x2B, 0x06, 0x01, 0x02, 0x01, 0x01, 0x05&lt;/p&gt;&lt;/blockquote&gt;&#xA;&lt;hr&gt;&#xA;&lt;p&gt;&lt;strong&gt;编码规则：&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;最开始的2个数字.1.3是特殊规则，编码固定值：0x2B&#xA;其后面的每个OID节点数值都用一个或多个字节来表示。&#xA;如果这个值小于128，最简单的情况就用1个字节。&#xA;如果大于128则需要用多个字节：&#xA;对OID进行128整除，如果商大于128则继续整除，直到商小于128，则记为第1字节。&#xA;对余数重复上面的操作，将产生第2,3,4&amp;hellip;字节，直到余数小于128，此时的余数记为最后1字节。&#xA;最后除了最后1字节外，前面的所有字节都要把最高位置1。&lt;/p&gt;&#xA;&lt;p&gt;文字表达可能并不容易理解，下面多举几个例子就很容易理解了：&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;OID：.1.3.6.1.2.1.1.5&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;HEX：0x2B, 0x06, 0x01, 0x02, 0x01, 0x01, 0x05&#xD;&#xA;所有数字都小于128，每个数字直接用1字节表示。&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;strong&gt;OID：.1.3.6.1.2.1.255.5&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;HEX: 0x2B, 0x06, 0x01, 0x02, 0x01, 0x81, 0x7F, 0x05 &#xD;&#xA;由于255大于128，需要分解为多个字节：&#xD;&#xA;255 = 128 * 1 + 127（商为1，余数为127，所以用2个字节表示：0x81（高位置1）, 0x7F）&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;strong&gt;OID： .1.3.6.1.2.1.255.99999&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;HEX: 0x2B, 0x06, 0x01, 0x02, 0x01, 0x81, 0x7F, 0x86, 0x8D, 0x1F &#xD;&#xA;255 = 128 * 1 + 127（0x81, 0x7F）&#xD;&#xA;99999 = 128 * 128 * 6 + 128 * 13 + 31（0x86，0x8D, 0x1F）&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;strong&gt;OID：.1.3.6.1.2.1.255.99999.4294967295&lt;/strong&gt;&lt;/p&gt;</description>
    </item>
    <item>
      <title>android系统中定义的按键码(包含键盘，游戏手柄，TV遥控器)</title>
      <link>https://xcdd.pages.dev/blog/2023/2023-05-31/</link>
      <pubDate>Wed, 31 May 2023 17:55:20 +0000</pubDate>
      <guid>https://xcdd.pages.dev/blog/2023/2023-05-31/</guid>
      <description>&lt;p&gt;数据来源：android sdk.&lt;/p&gt;&#xA;&lt;table&gt;&#xA;  &lt;thead&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;th style=&#34;text-align: center&#34;&gt;KEYCODE_UNKNOWN&lt;/th&gt;&#xA;          &lt;th style=&#34;text-align: center&#34;&gt;0&lt;/th&gt;&#xA;      &lt;/tr&gt;&#xA;  &lt;/thead&gt;&#xA;  &lt;tbody&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;KEYCODE_SOFT_LEFT&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;1&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;KEYCODE_SOFT_RIGHT&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;2&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;KEYCODE_HOME&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;3&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;KEYCODE_BACK&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;4&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;KEYCODE_CALL&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;5&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;KEYCODE_ENDCALL&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;6&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;KEYCODE_0&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;7&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;KEYCODE_1&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;8&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;KEYCODE_2&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;9&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;KEYCODE_3&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;10&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;KEYCODE_4&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;11&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;KEYCODE_5&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;12&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;KEYCODE_6&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;13&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;KEYCODE_7&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;14&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;KEYCODE_8&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;15&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;KEYCODE_9&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;16&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;KEYCODE_STAR&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;17&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;KEYCODE_POUND&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;18&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;KEYCODE_DPAD_UP&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;19&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;KEYCODE_DPAD_DOWN&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;20&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;KEYCODE_DPAD_LEFT&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;21&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;KEYCODE_DPAD_RIGHT&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;22&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;KEYCODE_DPAD_CENTER&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;23&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;KEYCODE_VOLUME_UP&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;24&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;KEYCODE_VOLUME_DOWN&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;25&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;KEYCODE_POWER&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;26&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;KEYCODE_CAMERA&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;27&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;KEYCODE_CLEAR&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;28&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;KEYCODE_A&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;29&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;KEYCODE_B&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;30&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;KEYCODE_C&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;31&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;KEYCODE_D&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;32&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;KEYCODE_E&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;33&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;KEYCODE_F&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;34&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;KEYCODE_G&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;35&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;KEYCODE_H&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;36&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;KEYCODE_I&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;37&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;KEYCODE_J&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;38&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;KEYCODE_K&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;39&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;KEYCODE_L&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;40&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;KEYCODE_M&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;41&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;KEYCODE_N&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;42&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;KEYCODE_O&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;43&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;KEYCODE_P&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;44&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;KEYCODE_Q&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;45&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;KEYCODE_R&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;46&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;KEYCODE_S&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;47&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;KEYCODE_T&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;48&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;KEYCODE_U&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;49&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;KEYCODE_V&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;50&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;KEYCODE_W&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;51&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;KEYCODE_X&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;52&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;KEYCODE_Y&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;53&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;KEYCODE_Z&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;54&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;KEYCODE_COMMA&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;55&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;KEYCODE_PERIOD&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;56&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;KEYCODE_ALT_LEFT&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;57&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;KEYCODE_ALT_RIGHT&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;58&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;KEYCODE_SHIFT_LEFT&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;59&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;KEYCODE_SHIFT_RIGHT&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;60&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;KEYCODE_TAB&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;61&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;KEYCODE_SPACE&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;62&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;KEYCODE_SYM&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;63&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;KEYCODE_EXPLORER&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;64&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;KEYCODE_ENVELOPE&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;65&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;KEYCODE_ENTER&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;66&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;KEYCODE_DEL&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;67&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;KEYCODE_GRAVE&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;68&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;KEYCODE_MINUS&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;69&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;KEYCODE_EQUALS&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;70&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;KEYCODE_LEFT_BRACKET&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;71&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;KEYCODE_RIGHT_BRACKET&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;72&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;KEYCODE_BACKSLASH&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;73&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;KEYCODE_SEMICOLON&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;74&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;KEYCODE_APOSTROPHE&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;75&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;KEYCODE_SLASH&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;76&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;KEYCODE_AT&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;77&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;KEYCODE_NUM&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;78&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;KEYCODE_HEADSETHOOK&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;79&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;KEYCODE_FOCUS&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;80   // &lt;em&gt;Camera&lt;/em&gt; focus&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;KEYCODE_PLUS&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;81&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;KEYCODE_MENU&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;82&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;KEYCODE_NOTIFICATION&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;83&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;KEYCODE_SEARCH&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;84&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;KEYCODE_MEDIA_PLAY_PAUSE= 85&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;KEYCODE_MEDIA_STOP&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;86&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;KEYCODE_MEDIA_NEXT&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;87&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;KEYCODE_MEDIA_PREVIOUS&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;88&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;KEYCODE_MEDIA_REWIND&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;89&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;KEYCODE_MEDIA_FAST_FORWARD&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;90&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;KEYCODE_MUTE&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;91&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;KEYCODE_PAGE_UP&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;92&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;KEYCODE_PAGE_DOWN&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;93&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;KEYCODE_PICTSYMBOLS&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;94   // switch symbol-sets (Emoji,Kao-moji)&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;KEYCODE_SWITCH_CHARSET&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;95   // switch char-sets (Kanji,Katakana)&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;KEYCODE_BUTTON_A&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;96&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;KEYCODE_BUTTON_B&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;97&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;KEYCODE_BUTTON_C&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;98&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;KEYCODE_BUTTON_X&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;99&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;KEYCODE_BUTTON_Y&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;100&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;KEYCODE_BUTTON_Z&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;101&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;KEYCODE_BUTTON_L1&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;102&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;KEYCODE_BUTTON_R1&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;103&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;KEYCODE_BUTTON_L2&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;104&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;KEYCODE_BUTTON_R2&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;105&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;KEYCODE_BUTTON_THUMBL&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;106&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;KEYCODE_BUTTON_THUMBR&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;107&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;KEYCODE_BUTTON_START&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;108&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;KEYCODE_BUTTON_SELECT&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;109&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;KEYCODE_BUTTON_MODE&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;110&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;KEYCODE_ESCAPE&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;111&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;KEYCODE_FORWARD_DEL&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;112&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;KEYCODE_CTRL_LEFT&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;113&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;KEYCODE_CTRL_RIGHT&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;114&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;KEYCODE_CAPS_LOCK&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;115&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;KEYCODE_SCROLL_LOCK&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;116&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;KEYCODE_META_LEFT&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;117&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;KEYCODE_META_RIGHT&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;118&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;KEYCODE_FUNCTION&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;119&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;KEYCODE_SYSRQ&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;120&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;KEYCODE_BREAK&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;121&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;KEYCODE_MOVE_HOME&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;122&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;KEYCODE_MOVE_END&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;123&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;KEYCODE_INSERT&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;124&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;KEYCODE_FORWARD&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;125&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;KEYCODE_MEDIA_PLAY&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;126&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;KEYCODE_MEDIA_PAUSE&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;127&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;KEYCODE_MEDIA_CLOSE&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;128&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;KEYCODE_MEDIA_EJECT&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;129&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;KEYCODE_MEDIA_RECORD&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;130&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;KEYCODE_F1&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;131&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;KEYCODE_F2&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;132&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;KEYCODE_F3&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;133&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;KEYCODE_F4&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;134&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;KEYCODE_F5&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;135&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;KEYCODE_F6&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;136&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;KEYCODE_F7&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;137&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;KEYCODE_F8&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;138&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;KEYCODE_F9&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;139&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;KEYCODE_F10&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;140&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;KEYCODE_F11&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;141&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;KEYCODE_F12&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;142&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;KEYCODE_NUM_LOCK&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;143&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;KEYCODE_NUMPAD_0&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;144&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;KEYCODE_NUMPAD_1&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;145&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;KEYCODE_NUMPAD_2&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;146&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;KEYCODE_NUMPAD_3&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;147&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;KEYCODE_NUMPAD_4&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;148&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;KEYCODE_NUMPAD_5&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;149&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;KEYCODE_NUMPAD_6&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;150&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;KEYCODE_NUMPAD_7&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;151&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;KEYCODE_NUMPAD_8&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;152&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;KEYCODE_NUMPAD_9&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;153&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;KEYCODE_NUMPAD_DIVIDE&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;154&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;KEYCODE_NUMPAD_MULTIPLY&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;155&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;KEYCODE_NUMPAD_SUBTRACT&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;156&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;KEYCODE_NUMPAD_ADD&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;157&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;KEYCODE_NUMPAD_DOT&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;158&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;KEYCODE_NUMPAD_COMMA&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;159&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;KEYCODE_NUMPAD_ENTER&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;160&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;KEYCODE_NUMPAD_EQUALS&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;161&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;KEYCODE_NUMPAD_LEFT_PAREN&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;162&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;KEYCODE_NUMPAD_RIGHT_PAREN&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;163&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;KEYCODE_VOLUME_MUTE&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;164&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;KEYCODE_INFO&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;165&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;KEYCODE_CHANNEL_UP&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;166&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;KEYCODE_CHANNEL_DOWN&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;167&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;KEYCODE_ZOOM_IN&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;168&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;KEYCODE_ZOOM_OUT&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;169&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;KEYCODE_TV&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;170&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;KEYCODE_WINDOW&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;171&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;KEYCODE_GUIDE&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;172&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;KEYCODE_DVR&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;173&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;KEYCODE_BOOKMARK&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;174&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;KEYCODE_CAPTIONS&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;175&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;KEYCODE_SETTINGS&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;176&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;KEYCODE_TV_POWER&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;177&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;KEYCODE_TV_INPUT&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;178&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;KEYCODE_STB_POWER&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;179&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;KEYCODE_STB_INPUT&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;180&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;KEYCODE_AVR_POWER&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;181&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;KEYCODE_AVR_INPUT&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;182&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;KEYCODE_PROG_RED&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;183&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;KEYCODE_PROG_GREEN&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;184&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;KEYCODE_PROG_YELLOW&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;185&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;KEYCODE_PROG_BLUE&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;186&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;KEYCODE_APP_SWITCH&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;187&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;KEYCODE_BUTTON_1&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;188&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;KEYCODE_BUTTON_2&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;189&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;KEYCODE_BUTTON_3&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;190&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;KEYCODE_BUTTON_4&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;191&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;KEYCODE_BUTTON_5&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;192&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;KEYCODE_BUTTON_6&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;193&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;KEYCODE_BUTTON_7&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;194&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;KEYCODE_BUTTON_8&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;195&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;KEYCODE_BUTTON_9&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;196&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;KEYCODE_BUTTON_10&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;197&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;KEYCODE_BUTTON_11&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;198&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;KEYCODE_BUTTON_12&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;199&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;KEYCODE_BUTTON_13&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;200&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;KEYCODE_BUTTON_14&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;201&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;KEYCODE_BUTTON_15&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;202&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;KEYCODE_BUTTON_16&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;203&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;KEYCODE_LANGUAGE_SWITCH&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;204&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;KEYCODE_MANNER_MODE&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;205&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;KEYCODE_3D_MODE&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;206&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;KEYCODE_CONTACTS&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;207&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;KEYCODE_CALENDAR&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;208&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;KEYCODE_MUSIC&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;209&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;KEYCODE_CALCULATOR&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;210&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;KEYCODE_ZENKAKU_HANKAKU&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;211&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;KEYCODE_EISU&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;212&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;KEYCODE_MUHENKAN&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;213&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;KEYCODE_HENKAN&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;214&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;KEYCODE_KATAKANA_HIRAGANA&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;215&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;KEYCODE_YEN&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;216&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;KEYCODE_RO&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;217&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;KEYCODE_KANA&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;218&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;KEYCODE_ASSIST&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;219&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;KEYCODE_BRIGHTNESS_DOWN&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;220&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;KEYCODE_BRIGHTNESS_UP&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;221&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;KEYCODE_MEDIA_AUDIO_TRACK&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;222&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;KEYCODE_SLEEP&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;223&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;KEYCODE_WAKEUP&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;224&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;KEYCODE_PAIRING&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;225&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;KEYCODE_MEDIA_TOP_MENU&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;226&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;KEYCODE_11&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;227&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;KEYCODE_12&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;228&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;KEYCODE_LAST_CHANNEL&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;229&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;KEYCODE_TV_DATA_SERVICE&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;230&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;KEYCODE_VOICE_ASSIST&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;231&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;KEYCODE_TV_RADIO_SERVICE&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;232&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;KEYCODE_TV_TELETEXT&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;233&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;KEYCODE_TV_NUMBER_ENTRY&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;234&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;KEYCODE_TV_TERRESTRIAL_ANALOG&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;235&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;KEYCODE_TV_TERRESTRIAL_DIGITAL&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;236&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;KEYCODE_TV_SATELLITE&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;237&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;KEYCODE_TV_SATELLITE_BS&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;238&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;KEYCODE_TV_SATELLITE_CS&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;239&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;KEYCODE_TV_SATELLITE_SERVICE&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;240&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;KEYCODE_TV_NETWORK&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;241&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;KEYCODE_TV_ANTENNA_CABLE&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;242&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;KEYCODE_TV_INPUT_HDMI_1&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;243&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;KEYCODE_TV_INPUT_HDMI_2&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;244&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;KEYCODE_TV_INPUT_HDMI_3&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;245&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;KEYCODE_TV_INPUT_HDMI_4&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;246&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;KEYCODE_TV_INPUT_COMPOSITE_1&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;247&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;KEYCODE_TV_INPUT_COMPOSITE_2&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;248&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;KEYCODE_TV_INPUT_COMPONENT_1&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;249&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;KEYCODE_TV_INPUT_COMPONENT_2&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;250&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;KEYCODE_TV_INPUT_VGA_1&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;251&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;KEYCODE_TV_AUDIO_DESCRIPTION&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;252&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;KEYCODE_TV_AUDIO_DESCRIPTION_MIX_UP&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;253&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;KEYCODE_TV_AUDIO_DESCRIPTION_MIX_DOWN&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;254&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;KEYCODE_TV_ZOOM_MODE&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;255&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;KEYCODE_TV_CONTENTS_MENU&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;256&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;KEYCODE_TV_MEDIA_CONTEXT_MENU&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;257&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;KEYCODE_TV_TIMER_PROGRAMMING&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;258&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;KEYCODE_HELP&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;259&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;KEYCODE_NAVIGATE_PREVIOUS&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;260&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;KEYCODE_NAVIGATE_NEXT&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;261&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;KEYCODE_NAVIGATE_IN&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;262&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;KEYCODE_NAVIGATE_OUT&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;263&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;KEYCODE_STEM_PRIMARY&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;264&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;KEYCODE_STEM_1&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;265&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;KEYCODE_STEM_2&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;266&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;KEYCODE_STEM_3&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;267&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;KEYCODE_DPAD_UP_LEFT&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;268&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;KEYCODE_DPAD_DOWN_LEFT&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;269&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;KEYCODE_DPAD_UP_RIGHT&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;270&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;KEYCODE_DPAD_DOWN_RIGHT&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;271&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;KEYCODE_MEDIA_SKIP_FORWARD&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;272&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;KEYCODE_MEDIA_SKIP_BACKWARD&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;273&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;KEYCODE_MEDIA_STEP_FORWARD&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;274&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;KEYCODE_MEDIA_STEP_BACKWARD&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;275&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;KEYCODE_SOFT_SLEEP&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;276&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;KEYCODE_CUT&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;277&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;KEYCODE_COPY&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;278&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;KEYCODE_PASTE&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;279&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;KEYCODE_SYSTEM_NAVIGATION_UP&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;280&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;KEYCODE_SYSTEM_NAVIGATION_DOWN&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;281&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;KEYCODE_SYSTEM_NAVIGATION_LEFT&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;282&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;KEYCODE_SYSTEM_NAVIGATION_RIGHT&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;283&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;KEYCODE_ALL_APPS&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;284&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;KEYCODE_REFRESH&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;285&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;KEYCODE_THUMBS_UP&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;286&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;KEYCODE_THUMBS_DOWN&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;287&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;KEYCODE_PROFILE_SWITCH&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;288&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;KEYCODE_VIDEO_APP_1&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;289&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;KEYCODE_VIDEO_APP_2&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;290&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;KEYCODE_VIDEO_APP_3&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;291&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;KEYCODE_VIDEO_APP_4&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;292&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;KEYCODE_VIDEO_APP_5&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;293&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;KEYCODE_VIDEO_APP_6&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;294&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;KEYCODE_VIDEO_APP_7&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;295&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;KEYCODE_VIDEO_APP_8&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;296&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;KEYCODE_FEATURED_APP_1&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;297&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;KEYCODE_FEATURED_APP_2&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;298&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;KEYCODE_FEATURED_APP_3&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;299&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;KEYCODE_FEATURED_APP_4&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;300&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;KEYCODE_DEMO_APP_1&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;301&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;KEYCODE_DEMO_APP_2&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;302&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;KEYCODE_DEMO_APP_3&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;303&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;KEYCODE_DEMO_APP_4&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;304&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;  &lt;/tbody&gt;&#xA;&lt;/table&gt;</description>
    </item>
    <item>
      <title>FBAlpha编译和裁剪笔记</title>
      <link>https://xcdd.pages.dev/blog/2023/2023-05-24/</link>
      <pubDate>Wed, 24 May 2023 16:20:47 +0000</pubDate>
      <guid>https://xcdd.pages.dev/blog/2023/2023-05-24/</guid>
      <description>&lt;p&gt;FBAlpha是一个开源的街机游戏模拟器.链接：http://www.fbalpha.com/&lt;/p&gt;&#xA;&lt;p&gt;每个版本都会发布Windows Binary文件和源代码，目前新版本为0.2.97.39.&lt;/p&gt;&#xA;&lt;p&gt;原版程序支持的游戏非常多，但是在搜索ROM的时候，速度非常慢，于是产生了裁剪的想法！主要想解决搜索ROM速度过慢的问题.&lt;/p&gt;&#xA;&lt;p&gt;从官方文档了解到，可以在Windows环境下使用mingw进行编译.需要依次下载以下文件：&lt;/p&gt;&#xA;&lt;p&gt;1.从官网下载源码包.&lt;/p&gt;&#xA;&lt;p&gt;下载地址：http://static.fbalpha.com/files/fba_src_029739.7z&lt;/p&gt;&#xA;&lt;p&gt;2.下载MINGW&lt;/p&gt;&#xA;&lt;p&gt;官方推荐使用：http://tdm-gcc.tdragon.net/&lt;/p&gt;&#xA;&lt;p&gt;我下载的版本是tdm64-gcc-5.1.0-2.exe&lt;/p&gt;&#xA;&lt;p&gt;3.下载binutil&lt;/p&gt;&#xA;&lt;p&gt;下载地址：http://www.fbalpha.com/files/gnu_utils.zip&lt;/p&gt;&#xA;&lt;p&gt;解压到MINGW/BIN目录下&lt;/p&gt;&#xA;&lt;p&gt;4.下载NASM&lt;/p&gt;&#xA;&lt;p&gt;下载地址：http://www.nasm.us/pub/nasm/releasebuilds/2.11.08/win32/nasm-2.11.08-win32.zip&lt;/p&gt;&#xA;&lt;p&gt;解压到MINGW/BIN目录&lt;/p&gt;&#xA;&lt;p&gt;5.安装Perl&lt;/p&gt;&#xA;&lt;p&gt;下载地址：http://www.activestate.com/activeperl/&lt;/p&gt;&#xA;&lt;p&gt;我下载的是ActivePerl-5.24.1.2402-MSWin32-x86-64int-401627.exe&lt;/p&gt;&#xA;&lt;hr&gt;&#xA;&lt;p&gt;准备工作做好了，就可以开始编译了！&lt;/p&gt;&#xA;&lt;p&gt;切换到源码目录下面，打开命令行，输入mingw32-make mingw510就可以编译了,大约5－10分钟可以看到生成fba.exe文件.&lt;/p&gt;&#xA;&lt;p&gt;编译环境弄好了，就可以研究一下代码了，fba搜索ROM需要搜索20个文件夹！搜索的游戏有几千个，依次查找对应的zip文件，&lt;/p&gt;&#xA;&lt;p&gt;所以可以考虑删除那些不需要的游戏驱动，提高搜索速度的同时还可以减少exe文件的体积.&lt;/p&gt;&#xA;&lt;p&gt;游戏驱动在 src\burn\drv 目录下面，我只保留CPS1/2/3, NEOGEO, PGM，其它的驱动全部删除掉。再次编译报错，找不到文件依赖项。&lt;/p&gt;&#xA;&lt;p&gt;打开makefile.burn_rules,打到那些被我删除的依赖项，删除掉，再重新编译，通过了！&lt;/p&gt;&#xA;&lt;p&gt;这下fba.exe体积从原版的25MB缩小到了8M，再打开ROM搜索界面，搜索速度也变快了，非常好！&lt;/p&gt;&#xA;&lt;hr&gt;&#xA;&lt;p&gt;编译正常，还可以进行一些其它修改.比如：&lt;/p&gt;&#xA;&lt;p&gt;1.ROM路径配置对话框，太难用了.  界面相关的代码在src/burner/win32目录下，资源文件是app.rc，可以修改对话框，菜单的布局.&lt;/p&gt;&#xA;&lt;p&gt;2.原版创建的文件夹太多了，可以去掉那些没用的文件夹，在src/burner/win32/main.cpp 可以看到创建了一堆文件夹.&lt;/p&gt;&#xA;&lt;p&gt;3.默认NEOGEO的BIOS为英语，可以修改为日版， 在src/burn/drv/neogeo/d_neogeo.c，第569行，倒数第二个值，原版为0x80，修改为0x8a.&lt;/p&gt;&#xA;&lt;p&gt;修改之后像战国传承3这类游戏就可以看到日文界面了。&lt;/p&gt;&#xA;&lt;p&gt;4&amp;hellip;&amp;hellip;&amp;hellip;..&lt;/p&gt;&#xA;&lt;p&gt;附上我精简过后的源代码： &lt;a href=&#34;https://gitee.com/kerndev/fba_lite&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;fba_lite: FBA模拟器精简版.&lt;/a&gt;&lt;/p&gt;</description>
    </item>
    <item>
      <title>apktool打包失败</title>
      <link>https://xcdd.pages.dev/blog/2023/2023-04-29/</link>
      <pubDate>Sat, 29 Apr 2023 00:06:35 +0000</pubDate>
      <guid>https://xcdd.pages.dev/blog/2023/2023-04-29/</guid>
      <description>&lt;p&gt;报错信息：&lt;/p&gt;&#xA;&lt;p&gt;invalid resource directory name: res navigation&#xA;brut.androlib.AndrolibException: brut.common.BrutException: could not exec&amp;hellip;&lt;/p&gt;&#xA;&lt;p&gt;在解包时如果加上-r参数，不反编译资源，则重打包没有问题。&#xA;试试下面的命令打包：&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;打包时添加--use-aapt2参数：&#xD;&#xA;apktool b --use-aapt2 dir&#xA;&lt;/code&gt;&lt;/pre&gt;</description>
    </item>
    <item>
      <title>APK安装失败:Failed to extract native libraries</title>
      <link>https://xcdd.pages.dev/blog/2023/2023-04-28/</link>
      <pubDate>Fri, 28 Apr 2023 23:59:55 +0000</pubDate>
      <guid>https://xcdd.pages.dev/blog/2023/2023-04-28/</guid>
      <description>&lt;p&gt;APK使用apktool重新编译后安装失败。&lt;/p&gt;&#xA;&lt;p&gt;错误提示：Failure [INSTALL_FAILED_INVALID_APK: Failed to extract native libraries, res=-2]&lt;/p&gt;&#xA;&lt;p&gt;可能是因为AndroidManifest.xml 中设置 extractNativeLibs= false导致的，将其修改为true。&lt;/p&gt;&#xA;&lt;p&gt;参考资料： &lt;a href=&#34;https://testerhome.com/topics/18463&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;Failure [INSTALL_FAILED_INVALID_APK: Failed to extract native libraries, res=-2] · TesterHome&lt;/a&gt;&lt;/p&gt;</description>
    </item>
    <item>
      <title>把TKStudio改造为一个小巧的代码编辑器</title>
      <link>https://xcdd.pages.dev/blog/2023/2023-02-03/</link>
      <pubDate>Fri, 03 Feb 2023 10:08:46 +0000</pubDate>
      <guid>https://xcdd.pages.dev/blog/2023/2023-02-03/</guid>
      <description>&lt;p&gt;TKStudio是周立功公司开发的一款嵌入式集成开发环境，功能挺强大的。&#xA;通过外挂编译器的形式支持8051，430，ARM等各种内核的软件编译和调试。&#xA;同时还支持SSH远程调试，LINUX内核裁剪等一大堆实用工具，&#xA;看得出来开发这套软件应该要耗费不少时间和精力！&#xA;可惜2012年发布5.0版本之后就停止维护了，实在有点可惜。&lt;/p&gt;&#xA;&lt;p&gt;大学期间用TKStudio用得比较多，最大感受就是代码编辑功能很强大，拥有代码染色，参数补全，智能提示等，秒杀当时的IAR和Keil。&#xA;最顺手的功能就是工程目录可以直接导入文件夹，自动生成代码目录树，非常方便！&#xA;而KEIL和IAR则只能手动建立目录树，对于代码文件夹很多的工程来说，非常麻烦。&lt;/p&gt;&#xA;&lt;hr&gt;&#xA;&lt;p&gt;最近要阅读一个linux社区的开源软件，解压后没有工程文件，用Notepad++一个一个地打开源码又太繁琐，&#xA;而电脑又很久没有安装Source Insight了，突然想到多年前的TKStudio软件，于是心血来潮折腾一下，看看能不能改造利用一下。&lt;/p&gt;&#xA;&lt;p&gt;如下图：&#xA;使用导入文件夹功能，自动生成的代码树，查看这种开源代码实用性很高。&#xA;&lt;img src=&#34;./168_1.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;&#xA;&lt;hr&gt;&#xA;&lt;p&gt;确认软件功能没问题后，可以着手改造了，&#xA;安装完整版软件后，目录结构如下，整个文件夹有1.0GB。&#xA;&lt;img src=&#34;./168_2.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;里面大部分文件都是编译器和调试器相关的组件，我想着应该可以删掉大部分，只保留代码编辑的功能。&lt;/p&gt;&#xA;&lt;p&gt;说干就干，经过一番分析，此软件的模块化设计做的还不错，很多文件可以直接删掉不影响主程序功能。&#xA;而且还有mcudev.ini负责软件的安装配置，手动修改该文件可以去掉很多无用的模块。&#xA;比如：&#xA;build目录下面是各种编译器的配置选项对话框，可以通过修改mcudev.ini来选择性的使用。&#xA;DN目录下面是开发手册，类似于MSDN一样的帮助文件。&#xA;EStype是代码染色方案配置&#xA;opt是编译器全局选项的配置文件&#xA;skin是图片资源，其中splash.png启动LOGO&#xA;其它文件夹都是可以直接删除的。&#xA;而根目录下面的一大堆DLL文件，通过测试发现很多都是可以删除的。&#xA;TKStudio.cbd是支持的MCU设备列表，可以手动删除，只保留一个就可以了，因为新建工程的时候，必须要选择一个MCU型号。&#xA;langs.xml和native.xml两个分别是代码染色的配置和中文化界面语言配置文件，从这两个文件可以看出TKStudio的代码编辑功能相关代码直接引用了Notepad++的部分源码。&lt;/p&gt;&#xA;&lt;hr&gt;&#xA;&lt;p&gt;最终精简后，得到一个只保留代码编辑功能的软件，文件夹体积只有13MB！&#xA;很小巧吧！最终的目录结构如下：&#xA;&lt;img src=&#34;./168_3.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;我也将最终的软件，打包上传到CSDN了，有兴趣的同学可以自行下载体验：&#xA;&lt;a href=&#34;https://download.csdn.net/download/qq446252221/15677258&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;TKStudio可代替SourceInsight的代码编辑器_TKStudio-C文档类资源-CSDN下载&lt;/a&gt;&lt;/p&gt;&#xA;&lt;hr&gt;&#xA;&lt;p&gt;&lt;strong&gt;#2023更新&lt;/strong&gt;&#xA;上次打包少了个文件，启动时会警告弹窗。现在重新打包，解决问题。&#xA;同时添加了一个TKStudio.reg文件，默认的主页布局很乱，可以导入这个注册表文件快速恢复。&#xA;请下载下面的文件：&#xA;&lt;a href=&#34;https://share.weiyun.com/M3qAb6DL&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;文件分享&lt;/a&gt;&lt;/p&gt;</description>
    </item>
    <item>
      <title>PLMN=46004是中国移动的SIM卡</title>
      <link>https://xcdd.pages.dev/blog/2023/2023-01-30/</link>
      <pubDate>Mon, 30 Jan 2023 09:12:34 +0000</pubDate>
      <guid>https://xcdd.pages.dev/blog/2023/2023-01-30/</guid>
      <description>&lt;p&gt;今天遇到一张SIM卡，其IMSI号码是46004开头的，导致自动识别运营商失败.&lt;/p&gt;&#xA;&lt;p&gt;百度搜索到的资料都没有说明46004是哪家运营商，经过一番仔细搜索发现网上的资料比较老。&lt;/p&gt;&#xA;&lt;p&gt;后再来工信部网站找到了2017年发布的通告，46004是分配给中国移动的。&lt;/p&gt;&#xA;&lt;p&gt;顺便记录一下目前已分配的PLMN（MCC+MNC）号段。&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;1.号码结构&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;ITU-T E.212国际移动用户识别码(IMSI)是在数字公用陆地蜂窝移动通信网中唯一地识别一个移动用户的号码，其结构如图2所示，最长位数为15位，目前我国IMSI的位数为所允许的最长位数，即为一个15位数字的号码。&lt;/p&gt;&#xA;&lt;div style=&#34;text-align:center;&#34;&gt;&lt;img alt=&#34;&#34; height=&#34;154&#34; src=&#34;https://i-blog.csdnimg.cn/blog_migrate/7cf5aa2bf6f3106e7acf9837ad201ed9.png&#34; width=&#34;441&#34;&gt;&lt;/div&gt;&#xD;&#xA;&lt;p&gt;IMSI由三部分组成：&lt;/p&gt;&#xA;&lt;p&gt;移动国家号码MCC：由3个数字组成，唯一地识别移动用户所属的国家，中国为460；&lt;/p&gt;&#xA;&lt;p&gt;移动网络识别码MNC：识别移动用户所归属的移动网，中国采用2位；&lt;/p&gt;&#xA;&lt;p&gt;移动用户识别码MSIN：唯一地识别移动通信网中的移动用户，中国采用10位。&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;2.移动网络识别码（MNC）的规划和分配情况&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;table&gt;&#xA;  &lt;thead&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;th style=&#34;text-align: center&#34;&gt;&lt;strong&gt;移动网络识别码MNC&lt;/strong&gt;&lt;/th&gt;&#xA;          &lt;th style=&#34;text-align: center&#34;&gt;使用单位&lt;/th&gt;&#xA;      &lt;/tr&gt;&#xA;  &lt;/thead&gt;&#xA;  &lt;tbody&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;00&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;中国移动&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;01&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;中国联通&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;02&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;中国移动&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;03&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;中国电信&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;04&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;中国移动&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;06&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;中国联通&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;07&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;中国移动&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;08&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;中国移动&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;09&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;中国联通&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;10&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;中国联通&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;11&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;中国电信&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;12&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;中国电信&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;1X（X=3～9）&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;根据需要核配启用&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;2X（X=0～9）&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;中国移动&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;  &lt;/tbody&gt;&#xA;&lt;/table&gt;&#xA;&lt;p&gt;（根据需要核配启用） |&#xA;| 3X（X=0～9） | 中国联通&lt;/p&gt;&#xA;&lt;p&gt;（根据需要核配启用） |&#xA;| 4X（X=0～9） | 备用 |&#xA;| 5X（X=0～9） | 中国电信&lt;/p&gt;&#xA;&lt;p&gt;（根据需要核配启用） |&#xA;| 6X～9X（X=0～9） | 备用 |&lt;/p&gt;&#xA;&lt;p&gt;资料来源： &lt;a href=&#34;http://www.miit.gov.cn/n1146295/n1652858/n1652930/n3757020/c5623267/content.html&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;工业和信息化部关于发布《电信网编号计划（2017年版）》的通告&lt;/a&gt;&lt;/p&gt;</description>
    </item>
    <item>
      <title>常见分组加密算法和加密模式</title>
      <link>https://xcdd.pages.dev/blog/2023/2023-01-05/</link>
      <pubDate>Thu, 05 Jan 2023 20:32:16 +0000</pubDate>
      <guid>https://xcdd.pages.dev/blog/2023/2023-01-05/</guid>
      <description>&lt;h3 id=&#34;加密算法&#34;&gt;加密算法&lt;/h3&gt;&#xA;&lt;p&gt;&lt;strong&gt;DES&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;DES算法是1972年由IBM设计的，然后被美国政府选为标准加密算法。&#xA;分组大小64位，缺点是密钥较短，只有56位，抵抗破解的能力较弱，后来有了3DES。&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;3DES&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;3DES算法1981年从DES发展而来，对一块数据用3个不同的密钥进行3次DES加密，强度更高。&#xA;不过3DES的计算量较大，效率较低。在密钥长度、迭代次数等方面难以扩展，所以有了AES。&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;AES&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;AES前身是Rijndael算法，由1997年美国国家标准与技术研究院（NIST）的公开邀请而创建。&#xA;NIST通过公开选拔挑选出来作为国家标准的加密算法，2000年正式成为高级加密标准（AES）。&#xA;分组大小固定为128位，支持128、192、256、512位密钥的加密。&#xA;优点是速度快，安全级别高，是目前最常见的对称加密算法。&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;Blowfish&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;Blowfish是由Bruce Schneier于1993年开发的，最初目的是替代DES，&#xA;它采用和DES相同的分组大小64位，但密钥长度可扩展32－448位。&#xA;其安全性并不弱于AES，但不如AES知名度高。&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;Camellia&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;Camellia算法由三菱和日本电信电话（NTT）在2000年共同发明，2003年入选欧洲NESSIE工程。&#xA;Camellia算法的分组长度为128位，密钥长度可以使用128、192或256位。&#xA;具有与AES同等级的安全强度及运算量。&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;​ARIA&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;​ARIA是韩国Daesung Kwon等提出的一种分组密码算法，&#xA;ARIA于2004年确认为韩国标准分组密码算法。&#xA;ARIA算法的分组长度为128位，密钥长度可变，可取128、192或256位。&lt;/p&gt;&#xA;&lt;hr&gt;&#xA;&lt;h3 id=&#34;加密模式&#34;&gt;加密模式&lt;/h3&gt;&#xA;&lt;p&gt;加密模式在分组加密中用来对每个分组的数据进行调整，包括填充以提高数据整体的安全性。&#xA;常用的模式有以下一些：&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;ECB（Electronic Codebook Mode）&lt;/strong&gt;&#xA;ECB是最简单和最基本的模式，对每个分组使用相同的方式加密，&#xA;相同的明文数据块会被加密成相同的密文，降低了破解的难度，所以实际应用中很少使用。&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;CBC（Cipher Block Chaining Mode）&lt;/strong&gt;&#xA;CBC模式中，每个数据块加密时直接使用明文跟上个数据块加密后产生的密文&#xA;或初始向量进行异或，再与密钥进行加密，得到密文。&#xA;它的缺点是不利于并行、传递误差、需要初始化向量。&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;OFB（Output Feedback Mode）&lt;/strong&gt;&#xA;每个数据块加密过程中的中间输出会反馈到下个数据块的加密过程中。&#xA;缺点跟CBC类似。&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;CFB（Cipher Feedback Mode）&lt;/strong&gt;&#xA;每个数据块加密产生的密文会反馈到下个数据块的加密过程中。&#xA;缺点跟CBC类似。&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;CTR（Counter Mode）&lt;/strong&gt;&#xA;用密钥对输入的计数器加密，然后跟明文异或得到密文。&#xA;优点是可以并行，避免误差传递问题。&#xA;缺点是可以针对单个数据块进行攻击。&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;CCM（Counter with CBC-MAC Mode）&lt;/strong&gt;&#xA;CCM是在CBC和CTR的基础上增加CMAC算法校验，&#xA;主要是通过MAC校验来解决CTR容易被攻击的问题。&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;GCM（Galois/Counter Mode）&lt;/strong&gt;&#xA;GCM是在CCM的基础上改用GMAC算法代替CMAC算法，&#xA;增加了并行化设计，可以提高加密性能，降低时延。&lt;/p&gt;&#xA;&lt;hr&gt;&#xA;&lt;p&gt;虽然加密模式有很多种，但现在有实用价值的还是CCM和GCM两种。这两种也是TLS 1.3唯二使用的AES加密算法。&lt;/p&gt;</description>
    </item>
    <item>
      <title>Marvell交换机芯片SMI接口读写协议</title>
      <link>https://xcdd.pages.dev/blog/2022/2022-12-14/</link>
      <pubDate>Wed, 14 Dec 2022 17:39:17 +0000</pubDate>
      <guid>https://xcdd.pages.dev/blog/2022/2022-12-14/</guid>
      <description>&lt;p&gt;Marvell的88E6XXX系列交换机芯片基本都提供SMI（Serial Management Interface）接口。&#xA;SMI接口使用2线串行通信，一个MDC提供时钟，一个MDIO为双向数据引脚。&#xA;外部CPU通过这2个引脚访问芯片内部的寄存器。&lt;/p&gt;&#xA;&lt;hr&gt;&#xA;&lt;p&gt;SMI接口的通信时序如图所示：&lt;/p&gt;&#xA;&lt;div style=&#34;text-align:center;&#34;&gt;&lt;img alt=&#34;&#34; src=&#34;https://i-blog.csdnimg.cn/blog_migrate/943ec14bb459ebcde4143ff541357855.png&#34;&gt;&lt;/div&gt;&#xD;&#xA;&lt;p&gt;开始通信前要发送32个时钟做为前导帧，操作结束后同样也发送32个时钟作为空闲。空闲期间MDIO引脚保持高电平。&lt;/p&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;通信数据包含：&#xA;2bit起始位，&#xA;2bit读写操作码，&#xA;5bit设备地址，&#xA;5bit寄存器地址，&#xA;2bit读写转换，&#xA;16bit寄存器数据。&lt;/p&gt;&lt;/blockquote&gt;&#xA;&lt;hr&gt;&#xA;&lt;p&gt;SMI寻址方式又分为2种，单芯片模式和多芯片模式。&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;单芯片模式：&lt;/strong&gt; 是直接通过读写命令访问内部寄存器。&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;多芯片模式：&lt;/strong&gt; 多个芯片并联在同一条SMI总线上，类似于I2C，通过芯片地址来访问。&#xA;由于多了一个芯片地址，只能以间接的方式访问内部寄存器。&#xA;&lt;strong&gt;此时的设备地址是芯片地址，寄存器地址只能是0x00或0x01。&lt;/strong&gt;&#xA;把要访问的内部寄存器地址和设备地址写入0x00(Command Register)，&#xA;把要写入的数据写入0x01(Data Register)，或者从0x01(Data Register)读出内部数据。&lt;/p&gt;&#xA;&lt;div style=&#34;text-align:center;&#34;&gt;&lt;img alt=&#34;&#34; src=&#34;https://i-blog.csdnimg.cn/blog_migrate/ce136ec26e38a3c4b4c8a5f1ce04f77e.png&#34;&gt;&lt;/div&gt;&#xD;&#xA;&lt;p&gt;如图所示：Command Register的bit[9:5]写入的是设备地址，这个地址就是单芯片模式的SMI设备地址，bit[4:0]写入的是寄存器地址，和单芯片模式的SMI寄存器地址一样。&lt;/p&gt;&#xA;&lt;p&gt;然后读回Command Register的bit15，如果为0表示操作完成，此时可以从Data Register读回数据。&lt;/p&gt;&#xA;&lt;hr&gt;&#xA;&lt;p&gt;&lt;strong&gt;芯片内部寄存器地址解读：&lt;/strong&gt;&#xA;如下图所示，是某芯片手册里的寄存器地址表。&#xA;顶部的0到1D表示设备地址。左侧的0到1F是寄存器地址。&#xA;比如设备地址10，寄存器地址0，那就是Port Status（端口1的状态）。&lt;/p&gt;&#xA;&lt;div style=&#34;text-align:center;&#34;&gt;&lt;img alt=&#34;&#34; src=&#34;https://i-blog.csdnimg.cn/blog_migrate/53f9937252160eae7eb818b1b105578c.png&#34;&gt;&lt;/div&gt;</description>
    </item>
    <item>
      <title>MODBUS-ASCII协议</title>
      <link>https://xcdd.pages.dev/blog/2022/2022-12-12-0954/</link>
      <pubDate>Mon, 12 Dec 2022 09:54:16 +0000</pubDate>
      <guid>https://xcdd.pages.dev/blog/2022/2022-12-12-0954/</guid>
      <description>&lt;p&gt;MODBUS协议在RS485总线上有RTU和ASCII两种传输格式。&lt;/p&gt;&#xA;&lt;p&gt;其中ASCII协议应用比较少，主要还是以RTU格式为主。&lt;/p&gt;&#xA;&lt;hr&gt;&#xA;&lt;p&gt;相比较于RTU的2进制传输，ASCII使用的是文本传输， &lt;strong&gt;整个数据包都是可打印字符。&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;下面是示例：&lt;/p&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;:010300000001FB\r\n&lt;/p&gt;&lt;/blockquote&gt;&#xA;&lt;p&gt;帧头是冒号(:)，帧尾是换行符(\r\n)，掐头去尾得到有效数据：&lt;/p&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;010300000001FB&lt;/p&gt;&lt;/blockquote&gt;&#xA;&lt;p&gt;我们再把字符串转换为16进制就得到：&lt;/p&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;0x01，0x03，0x00，0x00，0x00，0x01，0xFB&lt;/p&gt;&lt;/blockquote&gt;&#xA;&lt;p&gt;0x01是设备地址，0x03是功能码，0x0000是寄存器地址，0x0001是寄存器数量，0xFB是校验。&lt;/p&gt;&#xA;&lt;p&gt;由些可见，ASCII帧格式虽然与RTU有所差别，但是功能码和寄存器格式是一样的。&lt;/p&gt;&#xA;&lt;p&gt;唯一不同的是校验位，ASCII格式使用的是LRC校验算法，RTU格式使用的是CRC16校验算法。&lt;/p&gt;&#xA;&lt;p&gt;下面是校验位的算法：&lt;/p&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;0xFB = (~(0x01 + 0x03 + 0x00 + 0x00 + 0x00 + 0x01) + 1) &amp;amp; 0xFF&lt;/p&gt;&lt;/blockquote&gt;&#xA;&lt;hr&gt;&#xA;&lt;p&gt;&lt;strong&gt;再举一个例子，生成一条数据包：&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;设备地址为0x10，我要用06功能码写0x0001寄存器，值为0xABCD。&lt;/p&gt;&#xA;&lt;p&gt;首先是生成命令字节：&lt;/p&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;0x10，0x06，0x00，0x01，0xAB，0xCD&lt;/p&gt;&lt;/blockquote&gt;&#xA;&lt;p&gt;然后计算校验位：&lt;/p&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;（~（0x10+0x06+0x00+0x01+0xAB+0xCD）+1）&amp;amp;0xFF ＝ 0x71&lt;/p&gt;&lt;/blockquote&gt;&#xA;&lt;p&gt;添加校验后的有效数据：&lt;/p&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;0x10，0x06，0x00，0x01，0xAB，0xCD ，0x71&lt;/p&gt;&lt;/blockquote&gt;&#xA;&lt;p&gt;把数组转成16进制字符串：&lt;/p&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;10060001ABCD71&lt;/p&gt;&lt;/blockquote&gt;&#xA;&lt;p&gt;最后加上帧头帧尾：&lt;/p&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;:10060001ABCD71\r\n&lt;/p&gt;&lt;/blockquote&gt;&#xA;&lt;p&gt;&lt;strong&gt;最后的最后，别忘了通过RS485把这一串字符串发出去！&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;hr&gt;&#xA;&lt;p&gt;关于MODBUS-RTU的功能码详细说明，请参见下面的文章：&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://blog.csdn.net/qq446252221/article/details/125293329&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;MODBUS常用功能码_星沉地动的博客&lt;/a&gt;&lt;/p&gt;</description>
    </item>
    <item>
      <title>MODBUS-TCP协议</title>
      <link>https://xcdd.pages.dev/blog/2022/2022-12-12/</link>
      <pubDate>Mon, 12 Dec 2022 09:54:10 +0000</pubDate>
      <guid>https://xcdd.pages.dev/blog/2022/2022-12-12/</guid>
      <description>&lt;p&gt;modbus-tcp顾名思义是基于TCP网络连接的MODBUS协议。&#xA;和RS485总线不同，TCP协议是通过设备的IP地址和端口来寻址。&#xA;modbus-tcp的默认端口号是502，设备端作为TCP服务器监听502端口，主机为TCP客户端主动去连接外设。 &lt;strong&gt;与RS485一样，主机发起请求，设备返回响应，设备不会主动发送数据。&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;1个主机可以同时与多个设备建立连接。&#xA;1个设备可以同时被多个主机连接。&lt;/p&gt;&lt;/blockquote&gt;&#xA;&lt;p&gt;在协议层使用的包格式是二进制格式：&lt;/p&gt;&#xA;&lt;table&gt;&#xA;  &lt;thead&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;th style=&#34;text-align: center&#34;&gt;序号&lt;/th&gt;&#xA;          &lt;th style=&#34;text-align: center&#34;&gt;协议&lt;/th&gt;&#xA;          &lt;th style=&#34;text-align: center&#34;&gt;长度&lt;/th&gt;&#xA;          &lt;th style=&#34;text-align: center&#34;&gt;数据&lt;/th&gt;&#xA;      &lt;/tr&gt;&#xA;  &lt;/thead&gt;&#xA;  &lt;tbody&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;2字节&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;2字节&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;2字节&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;N字节&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;  &lt;/tbody&gt;&#xA;&lt;/table&gt;&#xA;&lt;p&gt;序号：标识通信流水号，主机发送时每次加1，设备原样返回。&#xA;协议：固定为0x00,0x00&#xA;长度：表示后续数据的长度（网络序：大端格式）&#xA;数据：包含设备地址和功能码以及寄存器参数，和RTU格式一样，但不包含校验。&lt;/p&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;因为TCP本身是可靠通信连接，因此MODBUS-TCP协议层没有添加校验位。&lt;/p&gt;&lt;/blockquote&gt;&#xA;&lt;hr&gt;&#xA;&lt;p&gt;&lt;strong&gt;下面是示例：&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;主机发送：0x00,0x09,0x00,0x00,0x00,0x06,0x01,0x03,0x00,0x01,0x00,0x02&#xA;设备返回：0x00,0x09,0x00,0x00,0x00,0x05,0x01,0x03,0x02,0x00,0x00&lt;/p&gt;&lt;/blockquote&gt;&#xA;&lt;p&gt;序号：0x00,0x09&#xA;协议：0x00,0x00&#xA;长度：0x00,0x06&#xA;数据：0x01,0x03,0x00,0x01,0x00,0x02&lt;/p&gt;&#xA;&lt;p&gt;数据部分的格式和MODBUS-RTU是一样的，但不包含2个字节的CRC16。&#xA;解析出来就是: 0x01(地址)，0x03（功能码），0x0001（寄存器地址）,0x0002（寄存器数量）&lt;/p&gt;&#xA;&lt;p&gt;RTU格式请参见：&lt;a href=&#34;https://blog.csdn.net/qq446252221/article/details/125293329&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;MODBUS常用功能码&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;设备返回数据时，也是按照上面的格式，带上6字节的帧头再加上N字节的RTU数据。&lt;/p&gt;&#xA;&lt;p&gt;在此不再赘述。&lt;/p&gt;</description>
    </item>
    <item>
      <title>用python写一个简单的TFTP服务器</title>
      <link>https://xcdd.pages.dev/blog/2022/2022-11-01-1604/</link>
      <pubDate>Tue, 01 Nov 2022 16:04:39 +0000</pubDate>
      <guid>https://xcdd.pages.dev/blog/2022/2022-11-01-1604/</guid>
      <description>&lt;p&gt;用python写一个简单的TFTP服务器，练习python socket用法。&#xA;暂时只实现文件上传，思路很简单：&#xA;1.创建UDP接口；&#xA;2.监听69端口；&#xA;3.接收UDP数据；&#xA;4.解析TFTP协议报文，执行创建文件或写入文件；&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-python&#34; data-lang=&#34;python&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;#!python&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;#Simple TFTP Server&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;#蒋晓岗&amp;lt;kerndev@foxmail.com&amp;gt;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;import&lt;/span&gt; os&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;import&lt;/span&gt; io&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;import&lt;/span&gt; sys&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;import&lt;/span&gt; time&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;import&lt;/span&gt; socket&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;def&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;send_ack&lt;/span&gt;(s, addr, pid):&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;pkt &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;b&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;\x00\x04&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt; pid&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;s&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;sendto(pkt, addr)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;def&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;send_err&lt;/span&gt;(s, addr, code, reason):&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;pkt &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;b&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;\x00\x05&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt; code&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;to_bytes(&lt;span style=&#34;color:#ae81ff&#34;&gt;2&lt;/span&gt;, &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;big&amp;#34;&lt;/span&gt;) &lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt; reason&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;encode(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;utf-8&amp;#34;&lt;/span&gt;) &lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;b&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;\x00&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;s&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;sendto(pkt, addr)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&lt;span style=&#34;color:#75715e&#34;&gt;#print(pkt.hex(&amp;#34; &amp;#34;))&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;#main&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;total &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;processing &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;False&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;s &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; socket&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;socket(socket&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;AF_INET, socket&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;SOCK_DGRAM)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;s&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;bind((&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;0.0.0.0&amp;#34;&lt;/span&gt;,&lt;span style=&#34;color:#ae81ff&#34;&gt;69&lt;/span&gt;))&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;s&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;settimeout(&lt;span style=&#34;color:#ae81ff&#34;&gt;2&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;print(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;TFTPD start...&amp;#34;&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;while&lt;/span&gt;(&lt;span style=&#34;color:#66d9ef&#34;&gt;True&lt;/span&gt;):&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&lt;span style=&#34;color:#66d9ef&#34;&gt;try&lt;/span&gt;:&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&#x9;req &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; s&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;recvfrom(&lt;span style=&#34;color:#ae81ff&#34;&gt;1024&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&lt;span style=&#34;color:#66d9ef&#34;&gt;except&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;Exception&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;as&lt;/span&gt; e:&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&#x9;&lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt;(processing):&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&#x9;&#x9;processing &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;False&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&#x9;&#x9;fp&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;close()&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&#x9;&#x9;print(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;\n&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;Recv file failed:&amp;#34;&lt;/span&gt;, e)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&lt;span style=&#34;color:#66d9ef&#34;&gt;else&lt;/span&gt;:&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&#x9;req_data &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; req[&lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;]&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&#x9;req_addr &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; req[&lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;]&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&#x9;&lt;span style=&#34;color:#75715e&#34;&gt;#print(&amp;#34;recv&amp;#34;, len(req_data), &amp;#34;bytes from:&amp;#34;, req_addr)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&#x9;&lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt;(req_data[&lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;:&lt;span style=&#34;color:#ae81ff&#34;&gt;2&lt;/span&gt;] &lt;span style=&#34;color:#f92672&#34;&gt;==&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;b&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;\x00\x02&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&lt;/span&gt;):&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&#x9;&#x9;name &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; req_data[&lt;span style=&#34;color:#ae81ff&#34;&gt;2&lt;/span&gt;:]&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;split(&lt;span style=&#34;color:#e6db74&#34;&gt;b&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;\x00&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&lt;/span&gt;)[&lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;]&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;decode(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;utf-8&amp;#34;&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&#x9;&#x9;&lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt;(processing):&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&#x9;&#x9;&#x9;print(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;\n&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;Refused new file:&amp;#34;&lt;/span&gt;, name, &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;, from:&amp;#34;&lt;/span&gt;, req_addr)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&#x9;&#x9;&#x9;send_err(s, req_addr, &lt;span style=&#34;color:#ae81ff&#34;&gt;0x00&lt;/span&gt;, &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;server busy!&amp;#34;&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&#x9;&#x9;&lt;span style=&#34;color:#66d9ef&#34;&gt;else&lt;/span&gt;:&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&#x9;&#x9;&#x9;&lt;span style=&#34;color:#66d9ef&#34;&gt;try&lt;/span&gt;:&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&#x9;&#x9;&#x9;&#x9;fp &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; open(name, &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;wb+&amp;#34;&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&#x9;&#x9;&#x9;&lt;span style=&#34;color:#66d9ef&#34;&gt;except&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;Exception&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;as&lt;/span&gt; e:&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&#x9;&#x9;&#x9;&#x9;print(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Accept new file:&amp;#34;&lt;/span&gt;, name, &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;, from:&amp;#34;&lt;/span&gt;, req_addr, &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;failed!&amp;#34;&lt;/span&gt;, e)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&#x9;&#x9;&#x9;&#x9;send_err(s, req_addr, &lt;span style=&#34;color:#ae81ff&#34;&gt;0x03&lt;/span&gt;, &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;disk error!&amp;#34;&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&#x9;&#x9;&#x9;&lt;span style=&#34;color:#66d9ef&#34;&gt;else&lt;/span&gt;:&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&#x9;&#x9;&#x9;&#x9;print(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Accept new file:&amp;#34;&lt;/span&gt;, name, &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;, from:&amp;#34;&lt;/span&gt;, req_addr, &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;OK&amp;#34;&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&#x9;&#x9;&#x9;&#x9;send_ack(s, req_addr, &lt;span style=&#34;color:#e6db74&#34;&gt;b&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;\x00\x00&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&#x9;&#x9;&#x9;&#x9;processing &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;True&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&#x9;&#x9;&#x9;&#x9;total &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&#x9;&lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt;(req_data[&lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;:&lt;span style=&#34;color:#ae81ff&#34;&gt;2&lt;/span&gt;] &lt;span style=&#34;color:#f92672&#34;&gt;==&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;b&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;\x00\x03&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&lt;/span&gt;):&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&#x9;&#x9;&lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;not&lt;/span&gt; processing:&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&#x9;&#x9;&#x9;send_err(s, req_addr, &lt;span style=&#34;color:#ae81ff&#34;&gt;0x04&lt;/span&gt;, &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;invalid session!&amp;#34;&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&#x9;&#x9;&lt;span style=&#34;color:#66d9ef&#34;&gt;else&lt;/span&gt;:&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&#x9;&#x9;&#x9;pid &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; req_data[&lt;span style=&#34;color:#ae81ff&#34;&gt;2&lt;/span&gt;:&lt;span style=&#34;color:#ae81ff&#34;&gt;4&lt;/span&gt;]&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&#x9;&#x9;&#x9;buf &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; req_data[&lt;span style=&#34;color:#ae81ff&#34;&gt;4&lt;/span&gt;:]&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&#x9;&#x9;&#x9;total &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; total &lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt; len(buf)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&#x9;&#x9;&#x9;fp&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;write(buf)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&#x9;&#x9;&#x9;send_ack(s, req_addr, pid)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&#x9;&#x9;&#x9;print(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Recv &lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;%d&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt; bytes&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;%&lt;/span&gt; total, end&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;\r&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&#x9;&#x9;&#x9;&lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt;(len(buf) &lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;512&lt;/span&gt;):&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&#x9;&#x9;&#x9;&#x9;processing &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;False&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&#x9;&#x9;&#x9;&#x9;fp&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;close()&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&#x9;&#x9;&#x9;&#x9;print(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;\n&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;Recv file complete, total size:&amp;#34;&lt;/span&gt;, total, &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;bytes&amp;#34;&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;hr&gt;&#xA;&lt;p&gt;使用Windows自带TFTP进行上传文件的测试。&lt;/p&gt;</description>
    </item>
    <item>
      <title>python改变或不改变函数的输入参数内容</title>
      <link>https://xcdd.pages.dev/blog/2022/2022-11-01-1346/</link>
      <pubDate>Tue, 01 Nov 2022 13:46:16 +0000</pubDate>
      <guid>https://xcdd.pages.dev/blog/2022/2022-11-01-1346/</guid>
      <description>&lt;h2 id=&#34;python的函数能像c语言指针一样改变输入参数指向的内容吗&#34;&gt;python的函数能像C语言指针一样改变输入参数指向的内容吗？&lt;/h2&gt;&#xA;&lt;p&gt;看一个例子：&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-python&#34; data-lang=&#34;python&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;#python&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;#改变或不改变函数的输入参数内容&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;def&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;change_list&lt;/span&gt;(l1, l2):&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;l1&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;append(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;append&amp;#34;&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;l2 &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; l2 &lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt; [&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;append&amp;#34;&lt;/span&gt;]&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;print(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;l1:&amp;#34;&lt;/span&gt;, l1)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;print(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;l2:&amp;#34;&lt;/span&gt;, l2)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;None&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;list1 &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; [&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;list1&amp;#34;&lt;/span&gt;]&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;list2 &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; [&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;list2&amp;#34;&lt;/span&gt;]&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;change_list(list1, list2)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;print(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;----------------------------&amp;#34;&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;print(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;list1:&amp;#34;&lt;/span&gt;, list1)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;print(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;list2:&amp;#34;&lt;/span&gt;, list2)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;运行结果：&lt;/p&gt;&#xA;&lt;p&gt;&lt;img src=&#34;./195_1.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;&#xA;&lt;hr&gt;&#xA;&lt;p&gt;从运行结果看，执行函数前后，list1的内容发生了变化，list2的内容没有变。&lt;/p&gt;&#xA;&lt;p&gt;在函数change_list()里面：&#xA;l1.append是往列表里追加一个元素，l1列表的内容发生了变化，会导致函数外面的列表内容也跟着一起变。&lt;/p&gt;&#xA;&lt;p&gt;l2 = l2 + [&amp;ldquo;append&amp;rdquo;] 虽然也是在l2列表里追加一个元素，但是等号左边的l2和输入参数l2不是同一个对象，不会导致函数外面的列表发生变化。&lt;/p&gt;&#xA;&lt;p&gt;可以通过print(id(l1))和print(id(l2))来调试，会发现l2的id前后并不一样。&lt;/p&gt;&#xA;&lt;hr&gt;&#xA;&lt;p&gt;答案是：python可以像C语言指针一样改变输入对象的内容，但有一定的限定条件。&lt;/p&gt;&#xA;&lt;p&gt;如果想要改变输入参数的内容，需要参数对象本身有改变自身的能力(函数)，比如list.append()&lt;/p&gt;&#xA;&lt;p&gt;如果不想改变输入参数的内容，可以使用等号操作符返回一个新的对象，或者使用深拷贝copy.deepcopy(obj)返回一个新的对象。&lt;/p&gt;</description>
    </item>
    <item>
      <title>TELNET协议笔记</title>
      <link>https://xcdd.pages.dev/blog/2022/2022-11-01/</link>
      <pubDate>Tue, 01 Nov 2022 11:41:42 +0000</pubDate>
      <guid>https://xcdd.pages.dev/blog/2022/2022-11-01/</guid>
      <description>&lt;p&gt;TELNET是基于TCP协议的应用层协议，服务器默认监听23端口。&#xA;客户端与服务器建立连接后有一个协商过程，这个过程是可选的。&#xA;协商完成后，就是数据透传了，服务器发什么客户端就显示什么内容。&lt;/p&gt;&#xA;&lt;p&gt;有两个细节通过协商完成：&lt;/p&gt;&#xA;&lt;h4 id=&#34;1回显&#34;&gt;1.回显&lt;/h4&gt;&#xA;&lt;p&gt;客户端回显：客户端发送数据时自己在屏幕上把发送的内容显示出来；&#xA;服务器回显：客户端发送数据时屏幕不显示，由服务器把数据发回来，客户端再显示内容。&lt;/p&gt;&#xA;&lt;h4 id=&#34;2行模式&#34;&gt;2.行模式&lt;/h4&gt;&#xA;&lt;p&gt;开启行模式：客户端在收到回车键后再发送整行内容；&#xA;关闭行模式：客户端每按一个键就发送一次按键内容；&lt;/p&gt;&#xA;&lt;hr&gt;&#xA;&lt;p&gt;之所以提到这2个细节是因为Windows自带的telnet客户端和SecureCRT的默认行为不一样。&lt;/p&gt;&#xA;&lt;p&gt;Windows Telnet：连接时没有主动发起协商，默认客户端回显，回车按键发送CRLF。&lt;/p&gt;&#xA;&lt;p&gt;SecureCRT：连接时主动发起协商，默认客户端回显，默认开启行模式，回车按键发送CR\0。&lt;/p&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;SecureCRT回车内容可通过参数配置：&#xA;Options/Session Options/Terminal/Emulation/Modes/New line mode&lt;/p&gt;&#xA;&lt;p&gt;默认不勾选，勾选New line mode后回车发送CRLF&#xA;Options/Session Options/Telnet/Server requires bare CR&lt;/p&gt;&#xA;&lt;p&gt;默认不勾选，勾选后CR后面不带0x00&lt;/p&gt;&lt;/blockquote&gt;&#xA;&lt;p&gt;行为一致协商：&#xA;只要服务器在连接时发送： FF FB 01，就可以使两个客户端的行为变成一致。&#xA;FF FB 01表示服务器要开启回显，SecureCRT关闭回显的同时也会关闭行模式。&#xA;这样每一次按键，服务器都能收到1次数据，客户端都不会回显。&lt;/p&gt;&#xA;&lt;hr&gt;&#xA;&lt;p&gt;扩展内容：&#xA;命令字：&#xA;0xFF:IAC  选项协商字节&#xA;0xF0:SE   子选项结束&#xA;0xFA:SB   子选项开始&#xA;0xFB:WILL 发送方想激活选项，接收方回复DO(同意)/DONT(不同意)&#xA;0xFC:WONT 发送方想禁止选项，接收方必须同意，回复DONT&#xA;0xFD:DO   发送方想让对方激活选项，接收方回复WILL(同意)/WONT(不同意)&#xA;0xFE:DONT 发送方想让对方禁止选项，接收方必须同意，回复WONT&lt;/p&gt;&#xA;&lt;p&gt;选项字：&#xA;0x01: 回显&#xA;0x03: 抑制继续进行&#xA;0x18: 终端类型&#xA;0x1F: 窗口大小&#xA;0x20: 终端速率&#xA;0x21: 远程流量控制&#xA;0x22: 行模式&#xA;0x24: 环境变量&lt;/p&gt;</description>
    </item>
    <item>
      <title>KEIL/MDK中的标准C库函数printf和malloc实现线程安全</title>
      <link>https://xcdd.pages.dev/blog/2022/2022-08-17/</link>
      <pubDate>Wed, 17 Aug 2022 14:22:38 +0000</pubDate>
      <guid>https://xcdd.pages.dev/blog/2022/2022-08-17/</guid>
      <description>&lt;p&gt;在ARM嵌入式开发中，编译器提供的C库函数有 &lt;strong&gt;一部分&lt;/strong&gt; 不是线程安全的。&#xA;如果项目中运行了第三方RTOS，在调用标准C库函数时就要关心它们是不是线程安全的。&lt;/p&gt;&#xA;&lt;p&gt;比如printf函数，它是可重入的函数，但是在多线程环境下打印的内容可能会交叉乱序。&#xA;当然这种问题还不算严重。&#xA;但如果调用库函数malloc，这个函数在RTOS环境下多线程调用则会引发堆数据结构异常。&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;那么有没有办法让C库标准函数实现线程安全呢？&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;经过查阅文档，在KEIL/MDK中确实存在这么一种方法，可以实现malloc线程安全。&lt;/p&gt;&#xA;&lt;p&gt;在KEIL/MDK的标准库中提供了一组可重载的互斥锁函数，我们可以自行实现这一组函数，来保证C库函数线程安全。&lt;/p&gt;&#xA;&lt;p&gt;函数原型和参考实现代码如下：&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;//创建互斥锁，成功返回1，失败返回0&#xD;&#xA;int _mutex_initialize(mutex *m)&#xD;&#xA;{&#xD;&#xA;    *m = mutex_create(); /* 调用RTOS提供的函数，创建锁 */&#xD;&#xA;    return 1;&#xD;&#xA;}&#xD;&#xA;&#xD;&#xA;//获取互斥锁(加锁操作)&#xD;&#xA;void _mutex_acquire(mutex *m)&#xD;&#xA;{&#xD;&#xA;    mutex_lock(*m); /* 调用RTOS提供的函数，加锁 */&#xD;&#xA;}&#xD;&#xA;&#xD;&#xA;//释放互斥锁(解锁操作)&#xD;&#xA;void _mutex_release(mutex *m)&#xD;&#xA;{&#xD;&#xA;    mutex_unlock(*m); /* 调用RTOS提供的函数，解锁 */&#xD;&#xA;}&#xD;&#xA;&#xD;&#xA;//删除互斥锁&#xD;&#xA;void _mutex_free(mutex *m)&#xD;&#xA;{&#xD;&#xA;    mutex_delete(*m); /* 调用RTOS提供的函数，删除锁 */&#xD;&#xA;}&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;strong&gt;需要注意的是，重载以上互斥锁函数后，要确保调用C库函数的时机一定要晚于RTOS的初始化。&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;hr&gt;&#xA;&lt;p&gt;&lt;strong&gt;KEIL官方参考资料:&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://developer.arm.com/documentation/dui0475/g/the-arm-c-and-c---libraries/management-of-locks-in-multithreaded-applications?lang=en&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;ARM编译器：重载互斥锁实现C库函数线程安全&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://developer.arm.com/documentation/dui0492/g/Chdiedfe&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;ARM编译器：线程安全的C标准库函数&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://developer.arm.com/documentation/dui0492/g/Chddjdaj&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;ARM编译器：线程不安全的C标准库函数&lt;/a&gt;&lt;/p&gt;</description>
    </item>
    <item>
      <title>一种简单通用的获取函数栈空间大小的方法</title>
      <link>https://xcdd.pages.dev/blog/2022/2022-07-27/</link>
      <pubDate>Wed, 27 Jul 2022 13:33:42 +0000</pubDate>
      <guid>https://xcdd.pages.dev/blog/2022/2022-07-27/</guid>
      <description>&lt;p&gt;有些时候我们需要评估某个函数所使用的栈空间大小，比如创建线程的时候，我们需要估算该线程函数所需的栈空间，分配合适的线程栈。&lt;/p&gt;&#xA;&lt;p&gt;本文介绍一种简单的方法，来获取某个函数所占用的栈空间大小。&lt;/p&gt;&#xA;&lt;h2 id=&#34;原理&#34;&gt;原理：&lt;/h2&gt;&#xA;&lt;p&gt;针对递减栈内存模型，调用函数时，栈指针会往下移动，移动的距离取决于该函数的局部变量和调用子函数，也就是该函数所使用的栈空间，在函数返回时，栈指针又会恢复到调用前的位置。&lt;/p&gt;&#xA;&lt;p&gt;根据这一特性，我们可以在调用函数前把栈底部的内存用一个特定值来填充，调用结束后检查栈底部的值是否发生变化，搜索到最后1个发生变化的地址就是该函数所使用的栈底。用当前栈指针减去栈底指针就能算出该函数实际使用的栈空间大小。&lt;/p&gt;&#xA;&lt;h2 id=&#34;实施&#34;&gt;实施：&lt;/h2&gt;&#xA;&lt;p&gt;废话不多说，直接上测试代码：&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-cpp&#34; data-lang=&#34;cpp&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;//用0xAA填充栈底512字节&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;void&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;stack_test_begin&lt;/span&gt;(&lt;span style=&#34;color:#66d9ef&#34;&gt;void&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;{&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&lt;span style=&#34;color:#66d9ef&#34;&gt;register&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt; i;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&lt;span style=&#34;color:#66d9ef&#34;&gt;unsigned&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;char&lt;/span&gt; mem[&lt;span style=&#34;color:#ae81ff&#34;&gt;512&lt;/span&gt;];&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&lt;span style=&#34;color:#66d9ef&#34;&gt;for&lt;/span&gt;(i &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;; i &lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;512&lt;/span&gt;; i&lt;span style=&#34;color:#f92672&#34;&gt;++&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;{&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&#x9;mem[i] &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;0xAA&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;//检查栈底，返回栈大小&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;stack_test_end&lt;/span&gt;(&lt;span style=&#34;color:#66d9ef&#34;&gt;void&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;{&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&lt;span style=&#34;color:#66d9ef&#34;&gt;register&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt; i;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&lt;span style=&#34;color:#66d9ef&#34;&gt;unsigned&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;char&lt;/span&gt; mem[&lt;span style=&#34;color:#ae81ff&#34;&gt;512&lt;/span&gt;];&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&lt;span style=&#34;color:#66d9ef&#34;&gt;for&lt;/span&gt;(i &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;; i &lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;512&lt;/span&gt;; i&lt;span style=&#34;color:#f92672&#34;&gt;++&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;{&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&#x9;&lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt;(mem[i] &lt;span style=&#34;color:#f92672&#34;&gt;!=&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;0xAA&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&#x9;{&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&#x9;&#x9;&lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;512&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt; i;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&#x9;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;//被测试函数, 此函数理论占用栈空间为128字节&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;void&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;stack_use_128&lt;/span&gt;(&lt;span style=&#34;color:#66d9ef&#34;&gt;void&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;{&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&lt;span style=&#34;color:#66d9ef&#34;&gt;register&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt; i;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&lt;span style=&#34;color:#66d9ef&#34;&gt;char&lt;/span&gt; mem[&lt;span style=&#34;color:#ae81ff&#34;&gt;128&lt;/span&gt;];&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&lt;span style=&#34;color:#66d9ef&#34;&gt;for&lt;/span&gt;(i&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;; i&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;128&lt;/span&gt;; i&lt;span style=&#34;color:#f92672&#34;&gt;++&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;{&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&#x9;mem[i] &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;//测试&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;void&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;main&lt;/span&gt;(&lt;span style=&#34;color:#66d9ef&#34;&gt;void&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;{&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt; stack_size;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;stack_test_begin();&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;stack_use_128();&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    stack_size &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; stack_test_end();&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;printf(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;stack: %d&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;\n&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&lt;/span&gt;, stack_size);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;代码解读：&lt;/strong&gt;&lt;/p&gt;</description>
    </item>
    <item>
      <title>面对JFlashLite修不好的BUG若有所思</title>
      <link>https://xcdd.pages.dev/blog/2022/2022-07-08/</link>
      <pubDate>Fri, 08 Jul 2022 18:04:08 +0000</pubDate>
      <guid>https://xcdd.pages.dev/blog/2022/2022-07-08/</guid>
      <description>&lt;p&gt;JLink做为最常用的ARM调试工具，其配套上位机软件的版本更新频率几乎是一月N更，甚至有隔天就更新，这更新频率连一直刷版本号的chrome都怕是要自愧不如。&lt;/p&gt;&#xA;&lt;p&gt;更新日志在这里，有兴趣的可以看一看。&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://www.segger.com/downloads/jlink/ReleaseNotes_JLink.html&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;JLink更新日志&lt;/a&gt;&lt;/p&gt;&#xA;&lt;hr&gt;&#xA;&lt;p&gt;其中JFlashLite是一个比较精简的烧录工具，比完整版JFlash的操作简单明了。&#xA;有些时候只是为了下载HEX文件，用它是很合适的选择。&lt;/p&gt;&#xA;&lt;p&gt;但是这个工具从JLink 5.0版本发布，最目前最新版本V7.66，已经有7年历史了。&#xA;就这么一个几百KB的小小小小工具，却还BUG百出。&lt;/p&gt;&#xA;&lt;p&gt;不得不让我发生思考：&#xA;这是什么样的软件管理？&#xA;Segger的上位机软件开发团队可能存在很大的问题？&#xA;一方面开发人员的流动性可能很大，一套代码频繁换人就可能出现解决1个BUG，产生10个BUG。&#xA;另一方面还暴露出软件测试非常匮乏，不经过认真测试就直接发版了，&#xA;有些BUG稍微测试一下就能发现的却流到了正式版本。&#xA;最有可能的情况是这个小工具本身对于JLink来说并不重要，让那些没经验的新人来写代码。&lt;/p&gt;&#xA;&lt;hr&gt;&#xA;&lt;p&gt;我连续下载了N个历史版本来对比，想找一个相对稳定好用的版本，发现每个版本都是BUG。&lt;/p&gt;&#xA;&lt;p&gt;&lt;img src=&#34;./190_1.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;&#xA;&lt;hr&gt;&#xA;&lt;p&gt;简单总结下JFlashLite这个软件的历史：&lt;/p&gt;&#xA;&lt;p&gt;V5.00 - V6.12j：&#xA;BUG：日志输出窗口会乱序输出（多线程输出没有做好同步）。&#xA;缺点：没有记录最后选择的MCU型号，每次要重新选芯片 。&#xA;缺点：MCU选择对话框只能按厂商过滤，不能按型号过滤，找芯片很麻烦。&#xA;优点：支持中文路径，窗口大小可以调整。&lt;/p&gt;&#xA;&lt;p&gt;V6.14:&#xA;优点：增加了记住最后选择的MCU型号的功能。&lt;/p&gt;&#xA;&lt;p&gt;V6.30b:&#xA;优点：增加了按MCU型号搜索过滤的功能。&#xA;缺点：不能调整窗口大小，窗口太小文件路径会显示不全。&#xA;&lt;strong&gt;新增BUG&lt;/strong&gt; ：文件选择对话框换了风格（全英文），且不能选择本地磁盘以外的路径。&#xA;&lt;strong&gt;新增BUG&lt;/strong&gt; ：无法下载中文路径的HEX文件（之前的版本支持中文）。&lt;/p&gt;&#xA;&lt;p&gt;V6.30c:&#xA;解决了日志输出窗口会乱序输出的问题。&lt;/p&gt;&#xA;&lt;p&gt;V6.32:&#xA;这个版本终于发现文件选择对话框的问题了，又改回原来的文件选择方式。&lt;/p&gt;&#xA;&lt;p&gt;V6.48:&#xA;默认的烧录地址从0变成了MCU的FLASH起始地址。&lt;/p&gt;&#xA;&lt;p&gt;V6.60:&#xA;这个版本文件路径框变成只读（之前可写，但改写也没用）。&#xA;&lt;strong&gt;新增BUG&lt;/strong&gt; ：日志输出大部分内容都不会换行，全挤在一行。&lt;/p&gt;&#xA;&lt;p&gt;V6.82:&#xA;解决中文路径的文件无法下载的问题；&#xA;&lt;strong&gt;新增BUG&lt;/strong&gt; ：选择中文路径后无法选择其它中文路径的文件；&lt;/p&gt;&#xA;&lt;p&gt;V6.94b:&#xA;解决了日志输出不换行的问题。&lt;/p&gt;&#xA;&lt;p&gt;V6.94c - V7.66g:&#xA;BUG依旧，中文路径只能选1次，但可以选英文路径的文件。&lt;/p&gt;&#xA;&lt;hr&gt;&#xA;&lt;p&gt;这个小工具，估计代码量也就2K行左右，随便有点QT基础都能写出来。&#xA;实在不应该这么多问题。&lt;/p&gt;</description>
    </item>
    <item>
      <title>MODBUS常用功能码</title>
      <link>https://xcdd.pages.dev/blog/2022/2022-06-15-1114/</link>
      <pubDate>Wed, 15 Jun 2022 11:14:54 +0000</pubDate>
      <guid>https://xcdd.pages.dev/blog/2022/2022-06-15-1114/</guid>
      <description>&lt;h2 id=&#34;1-简述&#34;&gt;1 简述&lt;/h2&gt;&#xA;&lt;p&gt;Modbus寄存器分为四种，如表1.1所示：&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;表1.1&lt;/strong&gt; 寄存器分类&lt;/p&gt;&#xA;&lt;table&gt;&#xA;  &lt;thead&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;th style=&#34;text-align: center&#34;&gt;寄存器种类&lt;/th&gt;&#xA;          &lt;th style=&#34;text-align: center&#34;&gt;数据类型&lt;/th&gt;&#xA;          &lt;th style=&#34;text-align: center&#34;&gt;访问类型&lt;/th&gt;&#xA;          &lt;th style=&#34;text-align: center&#34;&gt;功能码&lt;/th&gt;&#xA;          &lt;th style=&#34;text-align: center&#34;&gt;PLC地址&lt;/th&gt;&#xA;          &lt;th style=&#34;text-align: center&#34;&gt;寄存器地址&lt;/th&gt;&#xA;      &lt;/tr&gt;&#xA;  &lt;/thead&gt;&#xA;  &lt;tbody&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;线圈寄存器&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;位&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;读写&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;01H 05H 0FH&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;00001-09999&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;0000H-FFFFH&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;离散输入寄存器&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;位&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;只读&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;02H&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;10001-19999&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;0000H-FFFFH&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;输入寄存器&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;字&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;只读&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;04H&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;30001-39999&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;0000H-FFFFH&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;保持寄存器&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;字&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;读写&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;03H 06H 10H&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;40001-49999&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;0000H-FFFFH&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;  &lt;/tbody&gt;&#xA;&lt;/table&gt;&#xA;&lt;h2 id=&#34;2-常用功能码&#34;&gt;2 常用功能码&lt;/h2&gt;&#xA;&lt;p&gt;Modbus中常用的功能码有8个，可以分为位操作和字操作两类，如表2.1所示：&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;表2.1&lt;/strong&gt; 常用功能码&lt;/p&gt;&#xA;&lt;table&gt;&#xA;  &lt;thead&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;th style=&#34;text-align: center&#34;&gt;功能码&lt;/th&gt;&#xA;          &lt;th style=&#34;text-align: center&#34;&gt;描述&lt;/th&gt;&#xA;          &lt;th style=&#34;text-align: center&#34;&gt;PLC地址&lt;/th&gt;&#xA;          &lt;th style=&#34;text-align: center&#34;&gt;寄存器地址&lt;/th&gt;&#xA;          &lt;th style=&#34;text-align: center&#34;&gt;位/字操作&lt;/th&gt;&#xA;          &lt;th style=&#34;text-align: center&#34;&gt;操作数量&lt;/th&gt;&#xA;      &lt;/tr&gt;&#xA;  &lt;/thead&gt;&#xA;  &lt;tbody&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;01H&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;读线圈寄存器&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;00001-09999&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;0000H-FFFFH&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;位操作&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;单个或多个&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;02H&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;读离散输入寄存器&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;10001-19999&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;0000H-FFFFH&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;位操作&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;单个或多个&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;03H&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;读保持寄存器&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;40001-49999&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;0000H-FFFFH&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;字操作&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;单个或多个&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;04H&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;读输入寄存器&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;30001-39999&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;0000H-FFFFH&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;字操作&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;单个或多个&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;05H&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;写单个线圈寄存器&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;00001-09999&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;0000H-FFFFH&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;位操作&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;单个&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;06H&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;写单个保持寄存器&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;40001-49999&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;0000H-FFFFH&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;字操作&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;单个&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;0FH&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;写多个线圈寄存器&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;00001-09999&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;0000H-FFFFH&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;位操作&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;多个&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;10H&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;写多个保持寄存器&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;40001-49999&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;0000H-FFFFH&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;字操作&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;多个&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;  &lt;/tbody&gt;&#xA;&lt;/table&gt;&#xA;&lt;h2 id=&#34;3-读线圈寄存器01h&#34;&gt;3 读线圈寄存器(01H)&lt;/h2&gt;&#xA;&lt;p&gt;功能码01H读取Modbus从机中线圈寄存器的状态，可以是单个寄存器，或者多个连续的寄存器。&lt;/p&gt;</description>
    </item>
    <item>
      <title>TFTP文件传输协议</title>
      <link>https://xcdd.pages.dev/blog/2022/2022-06-15/</link>
      <pubDate>Wed, 15 Jun 2022 10:58:08 +0000</pubDate>
      <guid>https://xcdd.pages.dev/blog/2022/2022-06-15/</guid>
      <description>&lt;p&gt;TFTP是一个简单的文件传输协议，默认使用UDP，服务器开放69端口。&lt;/p&gt;&#xA;&lt;p&gt;关于协议的细节网上可以找到，在此不再赘述。&lt;/p&gt;&#xA;&lt;p&gt;本文用一个简单的通信实例来分析通信协议。&lt;/p&gt;&#xA;&lt;hr&gt;&#xA;&lt;p&gt;Windows 系统自带TFTP客户端，服务器可以下载tftp32，下面是下载连接。&lt;a href=&#34;https://bitbucket.org/phjounin/tftpd64/downloads/&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;phjounin / tftpd64 / Downloads — Bitbucket&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;打开cmd.exe输入以下命令：&lt;/p&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;tftp -i 192.168.1.100 PUT D:\123.txt 123.bin&lt;/p&gt;&lt;/blockquote&gt;&#xA;&lt;p&gt;这条命令会把本地的D:\123.txt文件上传到服务器，在服务器生成的文件名为 123.bin。&lt;/p&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;并没有要求上传的文件名必须一样，可以在上传时对文件改名。&lt;/p&gt;&lt;/blockquote&gt;&#xA;&lt;p&gt;我们用wireshark进行抓包，看看它们是怎么通信的。&lt;/p&gt;&#xA;&lt;hr&gt;&#xA;&lt;p&gt;下面是所有的通信数据，文件内容用XX替换了。&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;客户端发送：&#xD;&#xA;00 02 31 32 33 2e 62 69 6e 00 6f 63 74 65 74 00&#xD;&#xA;&#xD;&#xA;服务器响应：&#xD;&#xA;00 04 00 00&#xD;&#xA;&#xD;&#xA;客户端发送：&#xD;&#xA;00 03 00 01 XX ... XX (文件数据长度512字节)&#xD;&#xA;&#xD;&#xA;服务器响应：&#xD;&#xA;00 04 00 01&#xD;&#xA;&#xD;&#xA;客户端发送：&#xD;&#xA;00 03 00 02 XX ... XX（文件数据长度182字节）&#xD;&#xA;&#xD;&#xA;服务器响应：&#xD;&#xA;00 04 00 02&#xD;&#xA;&#xD;&#xA;到此传输完成.&#xD;&#xA;这个测试文件总长度694字节，第1次传输512，第2次传输182，就传输完成了。&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;对每一条数据进行解释：&#xA;第1次通信是建立握手，告诉服务器准备上传文件，并告知文件名和传输方式。&lt;/p&gt;</description>
    </item>
    <item>
      <title>代码缩进对齐用空格还是制表符？</title>
      <link>https://xcdd.pages.dev/blog/2022/2022-04-22/</link>
      <pubDate>Fri, 22 Apr 2022 18:05:29 +0000</pubDate>
      <guid>https://xcdd.pages.dev/blog/2022/2022-04-22/</guid>
      <description>&lt;p&gt;代码缩进对齐用空格还是制表符？&#xA;这是一个一直都存在争议的问题，C、C++语言没有要求。&#xA;而python作为一门新兴语言，它规定了必须保持一致的缩进，不能混用空格和制表进行缩进。&lt;/p&gt;&#xA;&lt;hr&gt;&#xA;&lt;h4 id=&#34;我的看法&#34;&gt;&lt;strong&gt;我的看法&lt;/strong&gt;&lt;/h4&gt;&#xA;&lt;p&gt;&lt;strong&gt;首先：空格和制表符的特点&lt;/strong&gt;&#xA;空格是可显示的空白字符，固定占用1个字符的宽度。&#xA;制表符是控制字符，占用的宽度与编辑器的设置相关，占用宽度不固定。&lt;/p&gt;&#xA;&lt;p&gt;为什么有的程序员很歧视制表符，就是因为用制表符做代码对齐的时候，在不同的编辑器下面会得到不同的对齐效果。&lt;/p&gt;&#xA;&lt;p&gt;比如下面的代码：&#xA;使用制表符，制表宽度为4的时候代码是对齐的。&lt;/p&gt;&#xA;&lt;div style=&#34;text-align:center;&#34;&gt;&lt;img alt=&#34;&#34; class=&#34;left&#34; src=&#34;https://i-blog.csdnimg.cn/blog_migrate/b1b9537b50141ee54d7ef4882a336b00.png&#34;&gt;&lt;/div&gt;&#xD;&#xA;&lt;p&gt;但是如果编辑器的制表宽度为8的时候，代码是不对齐了。&lt;/p&gt;&#xA;&lt;div style=&#34;text-align:center;&#34;&gt;&lt;img alt=&#34;&#34; class=&#34;left&#34; src=&#34;https://i-blog.csdnimg.cn/blog_migrate/f6969ff749c74976678b5ca6967b2d32.png&#34;&gt;&lt;/div&gt;&#xD;&#xA;&lt;p&gt;&lt;strong&gt;其次：代码缩进和对齐是两个不同的概念&lt;/strong&gt;&#xA;缩进: 针对行首，向右缩进，让代码有层次感；&#xA;对齐: 行首以外的地方，让代码纵向对齐；&lt;/p&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;python要求代码必须缩进，但是并没有要求一定要对齐。&#xA;python没有花括号，只能用缩进的方式来判断代码层次。&#xA;缩进如果用空格，其建议值是4个空格，或者直接采用制表符缩进。&lt;/p&gt;&lt;/blockquote&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-cpp&#34; data-lang=&#34;cpp&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;void&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;main&lt;/span&gt;(&lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt; argc, &lt;span style=&#34;color:#66d9ef&#34;&gt;char&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;**&lt;/span&gt;argv)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;{ &lt;span style=&#34;color:#75715e&#34;&gt;/* 缩进：花括号顶格，下面的代码缩进1级 */&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt;   a;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;short&lt;/span&gt; ab;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;char&lt;/span&gt;  abc; &lt;span style=&#34;color:#75715e&#34;&gt;/* 对齐：变量名左对齐 */&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;for&lt;/span&gt;(a &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;; a &lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;100&lt;/span&gt;; a&lt;span style=&#34;color:#f92672&#34;&gt;++&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    {   &lt;span style=&#34;color:#75715e&#34;&gt;/* 缩进：花括号下面的代码缩进2级 */&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        ab  &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; a &lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;10&lt;/span&gt;; &lt;span style=&#34;color:#75715e&#34;&gt;/* 对齐：操作符中间对齐 */&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        abc &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; a &lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;10&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;结论：到底用空格还是制表符？&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;这个问题，缩进和对齐我们要分开来讨论&#xA;对于代码缩进，我推荐用 &lt;strong&gt;制表符。&lt;/strong&gt;&#xA;对于代码对齐，我推荐用 &lt;strong&gt;空格。&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;代码对齐不能用制表符，而必须使用空格，&#xA;因为不同的编辑器制表符宽度可能不一样，不能保证代码严格对齐，而空格没有这个问题。&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;原因：&lt;/strong&gt;&#xA;1.制表符输入方便，空格需要多敲几次，有可能出现空格数量不是4的倍数的情况；&lt;/p&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;有人会说，现在的编辑器，都可以自动把TAB键变为4个空格啊？&#xA;是的，输入TAB变4个空格没毛病，但是回退就不行啊。&#xA;对于制表符缩进，只要按一次回退就可以，而空格方式要按4次回退键！&#xA;&lt;strong&gt;我见过一段代码被多人频繁修改后，采用4个空格缩进，在第2层for循环时，本来应该是缩进12个空格，但最后变成了11个空格。&lt;/strong&gt;&lt;/p&gt;&lt;/blockquote&gt;&#xA;&lt;p&gt;2.修改编辑器设置可以实现不同缩进宽度的视觉效果；&#xA;3.制表符生成的源码文件要比空格体积小，因为制表符只占1个字节，而4个空格占4个字节；&lt;/p&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;源码文件变小了，理论上还可以略微提高编译速度；&lt;/p&gt;&lt;/blockquote&gt;</description>
    </item>
    <item>
      <title>使用空驱动消除设备管理器里面的未知设备</title>
      <link>https://xcdd.pages.dev/blog/2022/2022-04-12/</link>
      <pubDate>Tue, 12 Apr 2022 09:27:38 +0000</pubDate>
      <guid>https://xcdd.pages.dev/blog/2022/2022-04-12/</guid>
      <description>&lt;h2 id=&#34;前言&#34;&gt;前言&lt;/h2&gt;&#xA;&lt;p&gt;全新重装Windows系统之后，安装完声卡，网卡，显卡，USB设备等驱动之后。&#xA;还是会在设备管理器里面看到一些未知的PCI设备。&#xA;这些PCI设备大多数是主板芯片组的一些特殊控制设备，&#xA;&lt;strong&gt;一般情况下：不给它们安装驱动，也不会影响系统使用。&lt;/strong&gt;&#xA;但是每次打开设备管理器，看到一堆感叹号，还是很不舒服。&#xA;正常情况都是去下载对应主板的chipset驱动，可以解决。&lt;/p&gt;&#xA;&lt;hr&gt;&#xA;&lt;p&gt;今天介绍一种通用的方法，制作空驱动，消除未知设备。&lt;/p&gt;&#xA;&lt;h4 id=&#34;1找到这个设备&#34;&gt;1.找到这个设备&lt;/h4&gt;&#xA;&lt;h4 id=&#34;如下图的pci-简单通讯控制器&#34;&gt;如下图的：PCI 简单通讯控制器&lt;/h4&gt;&#xA;&lt;h4&gt;&lt;img src=&#34;./186_1.png&#34; alt=&#34;&#34;&gt;&lt;/h4&gt;&#xA;&lt;h4 id=&#34;2找到设备的硬件id&#34;&gt;2.找到设备的硬件ID&lt;/h4&gt;&#xA;&lt;h4 id=&#34;一般只要记住pciven_xxxxdev_xxxx就行&#34;&gt;一般只要记住PCI\VEN_XXXX&amp;amp;DEV_XXXX就行。&lt;/h4&gt;&#xA;&lt;h4&gt;&lt;img src=&#34;./186_2.png&#34; alt=&#34;&#34;&gt;&lt;/h4&gt;&#xA;&lt;h4 id=&#34;3制作空的驱动安装文件&#34;&gt;3.制作空的驱动安装文件&lt;/h4&gt;&#xA;&lt;h4 id=&#34;按照下面的模板修改对应的设备id就可以&#34;&gt;按照下面的模板，修改对应的设备ID就可以。&lt;/h4&gt;&#xA;&lt;h4 id=&#34;最后两行vendor和product的名字也是可以随便修改的&#34;&gt;最后两行，VENDOR和PRODUCT的名字也是可以随便修改的。&lt;/h4&gt;&#xA;&lt;h4 id=&#34;另存为xxxxinf&#34;&gt;另存为xxxx.inf&lt;/h4&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;[Version]&#xD;&#xA;Signature=$WINDOWS NT$&#xD;&#xA;Class=System&#xD;&#xA;ClassGUID={4D36E97D-E325-11CE-BFC1-08002BE10318}&#xD;&#xA;Provider=%VENDOR%&#xD;&#xA;DriverVer=01/01/1970, 1.0.0.0&#xD;&#xA;PnpLockDown=1&#xD;&#xA;&#xD;&#xA;[SourceDisksNames]&#xD;&#xA;&#xD;&#xA;[SourceDisksFiles]&#xD;&#xA;&#xD;&#xA;[ControlFlags]&#xD;&#xA;ExcludeFromSelect=*&#xD;&#xA;&#xD;&#xA;[Manufacturer]&#xD;&#xA;%VENDOR%=VENDOR,NTx86,NTamd64&#xD;&#xA;&#xD;&#xA;[VENDOR.NTx86]&#xD;&#xA;%PRODUCT%=Needs_NO_DRV,PCI\VEN_8086&amp;amp;DEV_A360&#xD;&#xA;&#xD;&#xA;[VENDOR.NTamd64]&#xD;&#xA;%PRODUCT%=Needs_NO_DRV,PCI\VEN_8086&amp;amp;DEV_A360&#xD;&#xA;&#xD;&#xA;[Needs_NO_DRV]&#xD;&#xA;Include=machine.inf&#xD;&#xA;Needs=NO_DRV&#xD;&#xA;&#xD;&#xA;[Needs_NO_DRV.Services]&#xD;&#xA;Include=machine.inf&#xD;&#xA;Needs=NO_DRV.Services&#xD;&#xA;&#xD;&#xA;[Strings]&#xD;&#xA;VENDOR=&amp;#34;INTEL&amp;#34;&#xD;&#xA;PRODUCT=&amp;#34;PCI_8086_A360&amp;#34;&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;h4 id=&#34;4-手动安装驱动&#34;&gt;4. 手动安装驱动&lt;/h4&gt;&#xA;&lt;h4 id=&#34;依次点击更新驱动程序-浏览-选中xxxxinf文件的路径-下一步&#34;&gt;依次点击：更新驱动程序-&amp;gt;浏览-&amp;gt;选中xxxx.inf文件的路径-&amp;gt;下一步。&lt;/h4&gt;&#xA;&lt;p&gt;&lt;strong&gt;注意：我们制作的空inf驱动，没有数字签名，可能会被系统拒绝。&#xA;如何给驱动签名，又是另外一个问题了。&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;div style=&#34;text-align:center;&#34;&gt;&lt;img alt=&#34;&#34; class=&#34;left&#34; src=&#34;https://i-blog.csdnimg.cn/blog_migrate/e4e501a8c8d686fe4928e8d196026431.png&#34;&gt;&lt;/div&gt;&#xD;&#xA;&lt;p&gt;&lt;img src=&#34;./186_4.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;&#xA;&lt;div style=&#34;text-align:center;&#34;&gt;&lt;img alt=&#34;&#34; class=&#34;left&#34; src=&#34;https://i-blog.csdnimg.cn/blog_migrate/dfb41f8898f4848330117a3fd9f155e9.png&#34;&gt;&lt;/div&gt;&#xD;&#xA;&lt;h4 id=&#34;5安装完成&#34;&gt;5.安装完成&lt;/h4&gt;&#xA;&lt;p&gt;再次查看设备管理器，未知设备消失。它被列入了系统设备。&lt;/p&gt;&#xA;&lt;div style=&#34;text-align:center;&#34;&gt;&amp;nbsp;&lt;img alt=&#34;&#34; class=&#34;left&#34; src=&#34;https://i-blog.csdnimg.cn/blog_migrate/4f7cc4cd0897602bd2e35c6bb2f37fc8.png&#34;&gt;&lt;/div&gt;</description>
    </item>
    <item>
      <title>调用约定不一致引发“error LNK2019: 无法解析的外部符号“</title>
      <link>https://xcdd.pages.dev/blog/2022/2022-03-24/</link>
      <pubDate>Thu, 24 Mar 2022 11:34:06 +0000</pubDate>
      <guid>https://xcdd.pages.dev/blog/2022/2022-03-24/</guid>
      <description>&lt;h2 id=&#34;前言&#34;&gt;&lt;strong&gt;前言&lt;/strong&gt;&lt;/h2&gt;&#xA;&lt;p&gt;Visual Studio 编译选项有3种调用约定：__cdecl、__stdcall、__fastcall&lt;/p&gt;&#xA;&lt;p&gt;__cdecl是默认的调用约定，也是C语言的标准调用约定。&#xA;__stdcall是Windows API使用的调用约定。&#xA;__fastcall用得比较少。&lt;/p&gt;&#xA;&lt;p&gt;三种调用约定的细节，在网上有更详细的说明，这里就不解释了。&#xA;参考官方文档：&lt;a href=&#34;https://docs.microsoft.com/zh-cn/cpp/cpp/argument-passing-and-naming-conventions?view=msvc-170&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;https://docs.microsoft.com/zh-cn/cpp/cpp/argument-passing-and-naming-conventions?view=msvc-170&lt;/a&gt;&lt;/p&gt;&#xA;&lt;hr&gt;&#xA;&lt;h2 id=&#34;问题还原&#34;&gt;&lt;strong&gt;问题还原：&lt;/strong&gt;&lt;/h2&gt;&#xA;&lt;p&gt;现在有这样一个VC++工程，有3个源文件：&lt;/p&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;main.c&#xA;api.h&#xA;api.c&lt;/p&gt;&lt;/blockquote&gt;&#xA;&lt;p&gt;main.c的源码如下：&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;#include &amp;#34;api.h&amp;#34;&#xD;&#xA;int main(void)&#xD;&#xA;{&#xD;&#xA;    int ret;&#xD;&#xA;&#x9;ret = api_call(0);&#xD;&#xA;&#x9;return ret;&#xD;&#xA;}&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;api.h的源码如下：&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;#pragma once&#xD;&#xA;&#xD;&#xA;int api_call(int a);&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;api.c的源码如下：&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;#include &amp;#34;api.h&amp;#34;&#xD;&#xA;int api_call(int a)&#xD;&#xA;{&#xD;&#xA;&#x9;int b;&#xD;&#xA;&#x9;b = a + 1;&#xD;&#xA;&#x9;return b;&#xD;&#xA;}&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;这是一个非常简单的演示程序，在main函数调用api.c提供的接口。&#xA;正常情况下编译也不会有任何问题。&lt;/p&gt;&#xA;&lt;p&gt;问题在于有一次不小心修改了编译选项：&#xA;在VS工程目录上点击api.c右键 -&amp;gt; 属性 -&amp;gt; C/C++ -&amp;gt; 高级 -&amp;gt; 调用约定 -&amp;gt; 选择__stdcall&#xA;并且保存后忘记改回去，过了很久很久之后，重新打开这个工程，编译报错了：&lt;/p&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;无法解析的外部符号 &amp;ldquo;int __cdecl api_call(int)&amp;rdquo; (?api_call@@YAHH@Z)，该符号在函数 _main 中被引用&lt;/p&gt;</description>
    </item>
    <item>
      <title>ANSI终端常用控制字符</title>
      <link>https://xcdd.pages.dev/blog/2022/2022-03-22/</link>
      <pubDate>Tue, 22 Mar 2022 18:07:33 +0000</pubDate>
      <guid>https://xcdd.pages.dev/blog/2022/2022-03-22/</guid>
      <description>&lt;p&gt;以前收藏了一篇关于ANSI终端的介绍[http://www.termsys.demon.co.uk/vtansi.htm]&#xA;最近发现这个链接已经打不开了！于是将相关的内容记录到博客当作备份。&#xA;这里记录的是常用的控制字符，还有一些不常用的就没有列出来了。&lt;/p&gt;&#xA;&lt;table&gt;&#xA;  &lt;thead&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;th style=&#34;text-align: center&#34;&gt;&lt;strong&gt;控制字符&lt;/strong&gt;&lt;/th&gt;&#xA;          &lt;th style=&#34;text-align: center&#34;&gt;功能&lt;/th&gt;&#xA;      &lt;/tr&gt;&#xA;  &lt;/thead&gt;&#xA;  &lt;tbody&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;0x08&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;回退(\b)，光标向左移动1格&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;0x0A&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;换行(\n)，光标向下移动1行&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;0x0D&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;回车(\r)，光标向左移动到行首&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;0x1B,0x5B,0x41&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;光标向上移动1格&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;0x1B,0x5B,0x42&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;光标向下移动1格&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;0x1B,0x5B,0x43&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;光标向右移动1格&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;0x1B,0x5B,0x44&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;光标向左移动1格&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;0x1B,0x5B,0x4B&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;清除光标右边的所有文字&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;0x1B,0x5B,0x31,0x4B&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;清除光标左边的所有文字&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;0x1B,0x5B,0x32,0x4B&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;清除光标行的所有文字&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;0x1B,0x5B,0x30,0x6D&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;设置文字显示为默认方式&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;0x1B,0x5B,0x31,0x6D&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;设置文字加高亮&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;0x1B,0x5B,0x34,0x6D&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;设置文字加下划线&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;0x1B,0x5B,0x37,0x6D&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;设置文字反色显示&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;0x1B,0x5B,0x33,0x3N,0x6D&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;设置文字颜色（N:0-7）&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;0x1B,0x5B,0x34,0x3N,0x6D&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;设置文字背景色(N:0-7)&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;  &lt;/tbody&gt;&#xA;&lt;/table&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;N：颜色定义&#xA;0：黑色&#xA;1：红色&#xA;2：绿色&#xA;3：黄色&#xA;4：蓝色&#xA;5：紫色&#xA;6：青色&#xA;7：白色&lt;/p&gt;&lt;/blockquote&gt;</description>
    </item>
    <item>
      <title>全志F1C100S的BROM研究</title>
      <link>https://xcdd.pages.dev/blog/2022/2022-03-04/</link>
      <pubDate>Fri, 04 Mar 2022 00:33:33 +0000</pubDate>
      <guid>https://xcdd.pages.dev/blog/2022/2022-03-04/</guid>
      <description>&lt;p&gt;全志f1c100s是个性价比很高的芯片，但是对一般人不太友好的是它的资料开放的太少了。&#xA;网上找不到完整版的用户手册，只能从有限的手册文档和参考代码旁敲侧击，反向猜测。&#xA;关于它的BROM网上的手册内容很少。&lt;/p&gt;&#xA;&lt;hr&gt;&#xA;&lt;p&gt;&lt;strong&gt;手册上只有短短3句话：&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;&lt;img src=&#34;./183_1.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;具体怎么个启动流程，完全没有描述。&lt;/p&gt;&#xA;&lt;p&gt;但是从网上的代码和开发板资料来看，它启动是按照顺序自动选择。&lt;/p&gt;&#xA;&lt;p&gt;我用的开发板只有SPI FLASH，它是先从SPI NOR FLASH启动，无法读到有效的SPL，则进入USB下载模式。&lt;/p&gt;&#xA;&lt;p&gt;而进入USB模式的按键，其实就是把SPI的片选拉低，让它无法读FLASH内的数据，从而进入USB模式。&lt;/p&gt;&#xA;&lt;p&gt;USB下载模式官方提供一个sunxi-fel.exe的工具，很方便，它支持下载image到RAM，同时也支持直接下载到SPI-FLASH，还能读回数据。&lt;/p&gt;&#xA;&lt;hr&gt;&#xA;&lt;p&gt;&lt;strong&gt;如何判断SPL的有效性？&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;文档没有描述，也是通过参考代码，代到线索。&lt;/p&gt;&#xA;&lt;p&gt;启动文件是这样写的，生成的BIN头部必须包含下面的内容。&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;;/* Boot head information for BROM booting */&#xD;&#xA;BROM_BHI        B       Reset_Handler&#xD;&#xA;&#x9;&#x9;&#x9;&#x9;DCB     &amp;#34;eGON.BT0&amp;#34;&#xD;&#xA;&#x9;&#x9;&#x9;&#x9;DCD     0, 0x4000&#xD;&#xA;&#x9;&#x9;&#x9;&#x9;DCB     &amp;#39;S&amp;#39;, &amp;#39;P&amp;#39;, &amp;#39;L&amp;#39;, 2&#xD;&#xA;&#x9;&#x9;&#x9;&#x9;DCD     0, 0&#xD;&#xA;&#x9;&#x9;&#x9;&#x9;DCD     0, 0, 0, 0, 0, 0, 0, 0&#xD;&#xA;&#x9;&#x9;&#x9;&#x9;DCD     0, 0, 0, 0, 0, 0, 0, 0&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;编译生成的SPL.bin内容如下格式：&lt;/p&gt;&#xA;&lt;p&gt;&lt;img src=&#34;./183_2.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;除了编译生成的文件头信息外，还需要后期修改如下内容：&lt;/p&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;偏移000C：此SPL.bin的校验，用mksunxi.exe生成。&#xA;偏移0010：此SPL.bin的长度，必须256字节对齐。&lt;/p&gt;&lt;/blockquote&gt;&#xA;&lt;hr&gt;&#xA;&lt;p&gt;&lt;strong&gt;SPL是在哪里运行的？&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;我们怎么确定SPL的运行环境？&#xA;文档也是没有任何描述。&lt;/p&gt;&#xA;&lt;p&gt;下面文档的内存映射表：&lt;/p&gt;&#xA;&lt;p&gt;BROM在0地址有32KB，内部SRAM在0x10000有40KB。&#xA;&lt;strong&gt;那事实真的如此吗？&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;&lt;img src=&#34;./183_3.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;</description>
    </item>
    <item>
      <title>解决SecureCRT串口日志突然出现乱码的问题</title>
      <link>https://xcdd.pages.dev/blog/2022/2022-01-10/</link>
      <pubDate>Mon, 10 Jan 2022 17:28:11 +0000</pubDate>
      <guid>https://xcdd.pages.dev/blog/2022/2022-01-10/</guid>
      <description>&lt;p&gt;用SecureCRT这个软件来查看串口日志很多年了，很早就发现了这个问题。&#xA;但一直没有去追究原因，今天终于抽出时间来研究一下这个问题。&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;问题现象：&lt;/strong&gt;&#xA;用SecureCRT打印串口日志，一开始正常，突然就变成乱码了。&#xA;必须要关闭串口再重新打开才能恢复。&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;问题原因：&lt;/strong&gt;&#xA;SecureCRT默认的终端是VT100。&#xA;这个终端收到0x0E会进入这种乱码模式，收到0x0F退出乱码模式。&#xA;参考链接： &lt;a href=&#34;https://ask.csdn.net/questions/7484090&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;secureCRT 串口显示乱码&amp;ndash;必须要重启串口才能恢复-嵌入式-CSDN问答&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;解决办法：&lt;/strong&gt;&#xA;修改SecureCRT的终端类型为ANSI或者Dumb。&#xA;&lt;img src=&#34;./182_1.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;这个遗留多年的问题，终于找到解决办法了。&lt;/p&gt;</description>
    </item>
    <item>
      <title>Cortex-M处理器中断向量表</title>
      <link>https://xcdd.pages.dev/blog/2021/2021-12-31-1806/</link>
      <pubDate>Fri, 31 Dec 2021 18:06:25 +0000</pubDate>
      <guid>https://xcdd.pages.dev/blog/2021/2021-12-31-1806/</guid>
      <description>&lt;p&gt;这是Cortex-M3手册里面截取出来的中断向量表：&lt;/p&gt;&#xA;&lt;p&gt;&lt;img src=&#34;./181_1.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;系统复位后中断向量表始终是在0x00000000地址。&#xA;系统启动后可以对中断向量表进行重定向:&#xA;SCB-&amp;gt;VTOR ＝ vector_addr;&lt;/p&gt;&lt;/blockquote&gt;&#xA;&lt;p&gt;中断向量表可以看做一个uint32_t类型的数组，数组长度取决于芯片厂商定义多少个中断。&#xA;从IRQ0开始属于芯片厂商自定义的中断。&lt;/p&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;Cortex-M0最多32个中断&#xA;Cortex-M3/M4/M7最多240个中断&lt;/p&gt;&lt;/blockquote&gt;&#xA;&lt;p&gt;&lt;strong&gt;系统上电时：&lt;/strong&gt;&#xA;第1个成员用于初始化SP寄存器&#xA;第2个成员用于初始化PC寄存器&#xA;其余成员都指向对应的中断处理程序的地址。&lt;/p&gt;&#xA;&lt;p&gt;当发生中断的时候，MCU从中断向量表中找到该中断服务程序的地址，跳转过去。&#xA;跳转之前，MCU会自动完成部分寄存器的入栈，入栈顺序如下图所示。&#xA;中断服务程序返回时，MCU自动完成这部分寄存器的出栈。&lt;/p&gt;&#xA;&lt;p&gt;&lt;img src=&#34;./181_2.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;&#xA;&lt;hr&gt;&#xA;&lt;p&gt;&lt;strong&gt;关于中断优先级：&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;中断最多可以用8bit来控制优先级，且数值越小优先级越高&#xA;有三个特殊值：HardFault = -1、NMI=-2、RESET=-3&#xA;这8个bit又可以分成2组：抢占优先级和子优先级。&#xA;下图是优先级的分组方式：&#xA;&lt;img src=&#34;./181_3.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;抢占优先级高的，可以打断正在执行的低优先级中断，先执行高优先级中断。&#xA;抢占优先级相同的情况下，子优先级之间不会发生抢占。&lt;/p&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;当多个中断同时发生时，按照以下顺序比较优先级：&#xA;&lt;strong&gt;抢占优先级 -&amp;gt; 子优先级 -&amp;gt; 中断号&lt;/strong&gt;&lt;/p&gt;&lt;/blockquote&gt;&#xA;&lt;hr&gt;&#xA;&lt;p&gt;&lt;strong&gt;中断向量表实例：&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;中断向量表是在start.s里面定义好的，编译器会把它放到BIN文件的起始位置。&#xA;随便打开一个编译出来的BIN文件进行查看：&lt;/p&gt;&#xA;&lt;p&gt;&lt;img src=&#34;./181_4.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;因为Cortex-M一般是小端格式，所以每4个字节要倒过来。&#xA;前4个字节就是0x1000EA68，它表示上电后的SP值。&#xA;接下来4个字节是0x00000101，它表示ResetHandler，它表示上电后的PC值。&#xA;PC＝0x00000101，所对应的第一条指令就是0x5088F64E。&lt;/p&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;备注：&#xA;PC最低位为1表示是Thumb模式，并不是真实的地址偏移。&#xA;指令0x5088F64E的第[15:11]位为11110B，表示这是一条32位Thumb指令。&lt;/p&gt;&lt;/blockquote&gt;&#xA;&lt;p&gt;从这个文件我们还能反向推断出其它的信息：&#xA;ROM起始地址是0x00000000&#xA;RAM起始地址(可能)是0x10000000&#xA;目标MCU肯定不是Cortex-M0&#xA;这段代码可能使用了RTOS&lt;/p&gt;</description>
    </item>
    <item>
      <title>Cortex-M核心寄存器</title>
      <link>https://xcdd.pages.dev/blog/2021/2021-12-31-1757/</link>
      <pubDate>Fri, 31 Dec 2021 17:57:57 +0000</pubDate>
      <guid>https://xcdd.pages.dev/blog/2021/2021-12-31-1757/</guid>
      <description>&lt;p&gt;下面是Cortex-M3手册截图，核心寄存器一共有21个：&lt;/p&gt;&#xA;&lt;p&gt;&lt;img src=&#34;./180_1.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;Cortex-M0没有FAULTMASK&#xA;Cortex-M0没有BASEPRI&#xA;Cortex-M3/M4/M7寄存器相同&lt;/p&gt;&lt;/blockquote&gt;&#xA;&lt;p&gt;&lt;strong&gt;R0–R12：通用寄存器&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;在AAPCS(过程调用标准)中R0-R3用于传递函数参数，如果参数超过4个则将参数压栈传递。&#xA;R0用于传递函数返回值。&#xA;R4-R11则用于临时变量&lt;/p&gt;&lt;/blockquote&gt;&#xA;&lt;p&gt;&lt;strong&gt;R13(SP)：栈指针&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;SP背后有2个物理寄存器MSP和PSP，上电默认MSP。&#xA;可以用CONTROL寄存器来选择使用MSP或PSP。&#xA;Cortex-M使用的是满递减栈。&lt;/p&gt;&lt;/blockquote&gt;&#xA;&lt;p&gt;&lt;strong&gt;R14(LR)：链接寄存器&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;LR在调用函数时保存函数的返回地址。&#xA;在中断服务程序中用作EXC_RETURN，用于确定中断结束后恢复状态。&#xA;&lt;img src=&#34;./180_2.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;&lt;/blockquote&gt;&#xA;&lt;p&gt;&lt;strong&gt;R15(PC)：程序计数器&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;PC保存的是当前运行指令的地址，直接修改PC可以改变运行指令。&#xA;PC的最低位并不是地址，而是Thumb状态位，会被写到到EPSR的T位，读回的总是0。&lt;/p&gt;&lt;/blockquote&gt;&#xA;&lt;p&gt;&lt;strong&gt;PSR：程序状态寄存器&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;PSR寄存器实际上是由APSR、IPSR、EPSR合并而来，所以一般用xPSR表示。&#xA;&lt;img src=&#34;./180_3.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;NZCVQ分别表示负数、零、进位或借位、溢出、DSP溢出或饱和标志位。&#xA;ISR_NUMBER表示当前的运行的是哪个中断，0表示在主线程模式。&#xA;ICI 可中断后继续运行的指令状态，IT指示IT指令的状态，T指示Thumb指令模式。&lt;/p&gt;&lt;/blockquote&gt;&#xA;&lt;p&gt;&lt;strong&gt;CONTROL：控制寄存器&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;&lt;img src=&#34;./180_4.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;FPCA指示当前FPU状态，1=FPU使用中，0=FPU未使用&#xA;SPSEL指示当前SP用的是哪个，1=PSP，0=MSP&#xA;nPRIV指示当前特权等级，1=非特权模式，0=特权模式&lt;/p&gt;&lt;/blockquote&gt;&#xA;&lt;p&gt;&lt;strong&gt;BASEPRI：起始优先级寄存器&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;&lt;img src=&#34;./180_5.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;中断优先级的数值小于BASEPRI才能响应，优先级数值越低，优先级越高&#xA;BASEPRI=0x00时此寄存器无效&lt;/p&gt;&lt;/blockquote&gt;&#xA;&lt;p&gt;&lt;strong&gt;PRIMASK：优先级屏蔽寄存器&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;&lt;img src=&#34;./180_6.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;PRIMASK置为1时，除了NMI和HardFault以外，其它中断都被屏蔽。&#xA;通常用它来控制系统的全局总中断，写1相当于关闭中断，清0相当于打开中断。&lt;/p&gt;&lt;/blockquote&gt;&#xA;&lt;p&gt;&lt;strong&gt;FAULTMASK：错误屏蔽寄存器&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;&lt;img src=&#34;./180_7.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;FAULTMASK置1后可以屏蔽HardFault，只有NMI中断能正常响应。&#xA;在任何中断服务程序退出时会自动清0。&lt;/p&gt;&lt;/blockquote&gt;</description>
    </item>
    <item>
      <title>Cortex-M系列处理器对比</title>
      <link>https://xcdd.pages.dev/blog/2021/2021-12-31/</link>
      <pubDate>Fri, 31 Dec 2021 16:26:40 +0000</pubDate>
      <guid>https://xcdd.pages.dev/blog/2021/2021-12-31/</guid>
      <description>&lt;p&gt;ARM发展至今，已经设计了9代处理器构架，每一代架构又设计了不同的处理器核心。&#xA;下表并没有把全部的处理器核心列举出来，只做为参考。&#xA;&lt;img src=&#34;./179_1.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;从第6代开始，ARM11以后的处理器命名方式改为3个系列：&lt;/p&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;Cortex-A：面向性能密集型系统的应用处理器内核&#xA;Cortex-R：面向实时应用的高性能内核&#xA;Cortex-M：面向各类嵌入式应用的微控制器内核&lt;/p&gt;&lt;/blockquote&gt;&#xA;&lt;p&gt;目前市面上主流的微控制器主要还是Cortex-M0，M3，M4和M7。&#xA;Cortex-M33,M35等新一代微控制器内核应该还要几年才会普及开来。&lt;/p&gt;&#xA;&lt;hr&gt;&#xA;&lt;p&gt;目前所有Cortex-M内核的ARM官方提供的功能对比如下：&lt;/p&gt;&#xA;&lt;p&gt;&lt;img src=&#34;./179_2.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;官方提供的表内容很多，但是有一些参数并没有出现在这个表里面。&#xA;因此我自己整理了一个我们平常比较关心的几个参数：&lt;/p&gt;&#xA;&lt;table&gt;&#xA;  &lt;thead&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;th style=&#34;text-align: center&#34;&gt;&lt;/th&gt;&#xA;          &lt;th style=&#34;text-align: center&#34;&gt;&lt;strong&gt;架构&lt;/strong&gt;&lt;/th&gt;&#xA;          &lt;th style=&#34;text-align: center&#34;&gt;DMIPS&lt;/th&gt;&#xA;          &lt;th style=&#34;text-align: center&#34;&gt;FPU&lt;/th&gt;&#xA;          &lt;th style=&#34;text-align: center&#34;&gt;硬件除法&lt;/th&gt;&#xA;          &lt;th style=&#34;text-align: center&#34;&gt;中断数&lt;/th&gt;&#xA;          &lt;th style=&#34;text-align: center&#34;&gt;中断优先级&lt;/th&gt;&#xA;      &lt;/tr&gt;&#xA;  &lt;/thead&gt;&#xA;  &lt;tbody&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;&lt;strong&gt;Cortex-M0&lt;/strong&gt;&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;ARMv6-M&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;0.87/MHz&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;无&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;无&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;32&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;4&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;&lt;strong&gt;Cortex-M0+&lt;/strong&gt;&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;ARMv6-M&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;0.95/MHz&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;无&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;无&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;32&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;4&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;&lt;strong&gt;Cortex-M3&lt;/strong&gt;&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;ARMv7-M&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;1.25/MHz&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;无&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;有&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;240&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;256&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;&lt;strong&gt;Cortex-M4&lt;/strong&gt;&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;ARMv7-M&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;1.25/MHz&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;单精度&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;有&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;240&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;256&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;&lt;strong&gt;Cortex-M7&lt;/strong&gt;&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;ARMv7-M&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;2.14/MHz&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;双精度&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;有&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;240&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;256&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;  &lt;/tbody&gt;&#xA;&lt;/table&gt;&#xA;&lt;p&gt;Cortex-M3和Cortex-M4基本上只有FPU的区别，其实M4还多了一些DSP扩展指令。&#xA;Cortex-M7性能爆表，DMIPS跑分已经超过了Cortex-A8。&lt;/p&gt;&#xA;&lt;p&gt;虽然它们之间存在这么多差异，但是向上兼容性却做的很好。&#xA;Cortex-M0向上兼容M3，M3向上兼容M4，M4向上兼容M7。&#xA;这种兼容是二进制级别的兼容，也就是说用Cortex-M0编译出来的代码，可以直接在M3运行。&#xA;只不过由于指令集的原因，不能发挥M3全部的性能。&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;为什么这么说呢？&lt;/strong&gt;&#xA;因为Cortex-M0只支持Thumb基础指令集，大量16位指令，和少数几条32位指令。&#xA;其中大部分16位指令只能访问R0 - R7寄存器，比如LDR/STR。&#xA;要访问R8－R12只能使用MOV指令。&lt;/p&gt;&#xA;&lt;p&gt;而Cortex-M3则支持Thumb2扩展指令，包含了大量的32位指令，运行效率可以极大提升。&#xA;比如LDRD指令，可以一次性读取64位数据到2个寄存器。&lt;/p&gt;&#xA;&lt;p&gt;此外由于架构的原因，Cortex-M0不支持非4字节对齐的32位整数访问，而Cortex-M3则可以。&lt;/p&gt;</description>
    </item>
    <item>
      <title>聊聊MCU的困惑</title>
      <link>https://xcdd.pages.dev/blog/2021/2021-12-24/</link>
      <pubDate>Fri, 24 Dec 2021 18:11:51 +0000</pubDate>
      <guid>https://xcdd.pages.dev/blog/2021/2021-12-24/</guid>
      <description>&lt;p&gt;不知道有没有人心中有这种困惑：&lt;/p&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;什么是MCU？&#xA;MCU和MPU有什么区别？&#xA;MCU和SOC有什么关系？&#xA;MCU和单片机有什么关系？&lt;/p&gt;&lt;/blockquote&gt;&#xA;&lt;p&gt;相关名词概念缩写：&lt;/p&gt;&#xA;&lt;p&gt;&lt;img src=&#34;./178_1.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;&#xA;&lt;hr&gt;&#xA;&lt;p&gt;要搞清楚这些呢，这一切还是要从处理器说起。&#xA;我们平时见到的所有处理器，都是属于微处理器架构。&#xA;这些微处理器根据不同的功能和性能，大概可以分成4类：&lt;/p&gt;&#xA;&lt;p&gt;&lt;img src=&#34;./178_2.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;通用高性能微处理器：&lt;/strong&gt; 也就是我们平时说的CPU，用在个人电脑和服务器上，AMD和INTEL这2个典型代表芯片，应该说得上是目前地表最强的处理器了。&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;嵌入式微处理器：&lt;/strong&gt; 也就是文档里面会看到的MPU，性能虽然比不上 &lt;strong&gt;通用高性能微处理器&lt;/strong&gt; ，但芯片集成度高，外设功能很丰富，主要用在移动设备和多媒体相关应用。&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;数字信号处理器：&lt;/strong&gt; 简称DSP，这一类处理器性能比较弱，但是同时功耗也降下来了。DSP比较擅长做数学运算，应用在需要大量实时计算的场合，比如音频编解码。德洲仪器TI的通用DSP应该具有典型代表性。&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;微控制器：&lt;/strong&gt; 英文缩写称MCU，江湖人称单片机。顾名思义这类处理器，就是用来做信号控制，也可以做一些简单的运算，它低成本，低功耗，对性能要求不高的地方都可以用得上。比如智能家居，工业控制，物联网等等应用非常的广泛。&lt;/p&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;MCU最大的一个特点就是没有MMU，没有MMU就不能运行像linux一样的操作系统。&#xA;MMU：内存管理器，主要负责物理地址和虚拟地址的相互转换。&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;所以从目前来看有没有MMU是MCU和MPU最大的区别。&lt;/strong&gt;&lt;/p&gt;&lt;/blockquote&gt;&#xA;&lt;hr&gt;&#xA;&lt;p&gt;AP和BP的叫法主要是从手机行业里流行起来的。&#xA;因为传统的手机系统里面主要由AP和BP两个处理器组成。&#xA;&lt;strong&gt;AP&lt;/strong&gt; &lt;strong&gt;：&lt;/strong&gt; 负责运行操作系统和多媒体应用的处理器，通常是MPU类型的处理器。&#xA;&lt;strong&gt;BP&lt;/strong&gt; &lt;strong&gt;：&lt;/strong&gt; 负责射频通信的处理器，通常是MCU或DSP类型的处理器。&lt;/p&gt;&#xA;&lt;hr&gt;&#xA;&lt;p&gt;&lt;strong&gt;SOC&lt;/strong&gt; &lt;strong&gt;：&lt;/strong&gt; 片上系统，就是芯片上有一个系统。把一个系统的核心功能集成到一个芯片上。这个系统并没有明确规定是何种系统，可以是手机系统、通信系统等等 &lt;strong&gt;。&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;比如：&#xA;蓝牙SOC：nRF52832，集成了MCU和BLE。&#xA;手机SOC：高通骁龙888，集成了AP(MPU+GPU)和BP。&lt;/p&gt;&lt;/blockquote&gt;&#xA;&lt;p&gt;&lt;strong&gt;单片机&lt;/strong&gt; ：单芯片微型计算机。就是把计算机缩小之后，集成到一个芯片上。一个芯片就是一个计算机。麻雀虽小，五脏俱全。一个芯片上有CPU、内存、定时器、中断控制、输入输出等设备。&lt;/p&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;计算机本身就是一种系统，所以单片机是一种典型的SOC。&lt;/p&gt;&lt;/blockquote&gt;&#xA;&lt;hr&gt;&#xA;&lt;p&gt;&lt;strong&gt;那么单片机和MCU之间到底有何恩怨？&lt;/strong&gt;&#xA;从严格意义上讲：&#xA;单片机是站在芯片的角度定义了一种计算机系统的形态。&#xA;MCU是站在处理器的角度定义了一种处理器类型。&lt;/p&gt;&#xA;&lt;p&gt;但是我发现单片机这个说法只在国内流行，国外几乎看不到它的存在。&#xA;为了搞清楚它们之间的关系，我翻遍几个主流大厂商的官网，都是以MPU和MCU进行分类。&lt;/p&gt;&#xA;&lt;p&gt;&lt;img src=&#34;./178_3.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;&lt;img src=&#34;./178_4.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;&lt;img src=&#34;./178_5.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;&#xA;&lt;hr&gt;&#xA;&lt;p&gt;&lt;strong&gt;那目前市面上有没有界限比较模糊的处理器产品？&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;最近几年随着芯片技术的发展和市场需要，也确实出现了一些比较独特的产品：&lt;/p&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;&lt;strong&gt;全志F1C100S：多媒体处理器&lt;/strong&gt;&#xA;ARM9核心，集成32MB DDR，支持SD/EMMC接口，支持linux系统。&#xA;成本大约10块钱（浮动）。&lt;/p&gt;&#xA;&lt;p&gt;&lt;img src=&#34;./178_6.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;恩智浦RT1170：跨界处理器&lt;/strong&gt;&#xA;Cortex-M7+M4双核心，集成2MB SRAM，无FLASH，支持SD/EMMC接口，不支持linux。&#xA;成本大约60块（浮动）。&lt;/p&gt;&#xA;&lt;p&gt;&lt;img src=&#34;./178_7.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;&lt;/blockquote&gt;&#xA;&lt;p&gt;&lt;strong&gt;我相信随着芯片技术的不断发展，MCU与MPU的界限以后会越来越模糊。&#xA;这些名词术语也会消失在芯片发展历史的洪流之中。&lt;/strong&gt;&lt;/p&gt;</description>
    </item>
    <item>
      <title>Ambiq Apollo3使用内建SBL进行固件升级</title>
      <link>https://xcdd.pages.dev/blog/2021/2021-12-16/</link>
      <pubDate>Thu, 16 Dec 2021 14:23:17 +0000</pubDate>
      <guid>https://xcdd.pages.dev/blog/2021/2021-12-16/</guid>
      <description>&lt;p&gt;Apollo3系列MCU出厂时内置了一段代码，官方名叫：SBL(Secure BootLoader)&#xA;这段代码在片上FLASH的0x0000地址，占用空间48KB。&#xA;这就是为什么我们在KEIL里面看到的IROM起始地址是0xC000。&#xA;这段代码实现了开机通过UART、I2C、SPI下载用户程序的功能，同时还实现了IAP固件升级功能。&lt;/p&gt;&#xA;&lt;p&gt;今天研究的就是它的IAP固件升级功能。&#xA;在阅读了大量文档和SDK代码之后，工作过程大概是这样的：&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;1.在MCU的内部FLASH规划出至少3个区域：&#xD;&#xA;        固件区: 正常跑的固件程序，起始地址0xC000&#xD;&#xA;        升级区: 新固件下载到这里。&#xD;&#xA;        描述区: 记录新固件在FLASH的地址，只需要1个扇区：8KB&#xD;&#xA;2.准备好编译出来的固件文件firmware&#xD;&#xA;3.使用create_cust_image_blob.py脚本对firmware进行处理，生成新文件image&#xD;&#xA;4.把image下载到规划的升级区&#xD;&#xA;5.把升级区的地址写到描述区&#xD;&#xA;6.把描述区的地址写到OTACTRL_OTAPOINTER寄存器，并把OTA标志位写1&#xD;&#xA;7.软件重启MCU后，SBL会根据OTACTRL_OTAPOINTER的信息进行固件升级。&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;hr&gt;&#xA;&lt;p&gt;知道大概流程之后就来看一看实现的细节：&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;1.MCUCTRL_OTAPOINTER寄存器&lt;/strong&gt;&#xA;贴个文档里的图：&#xA;&lt;img src=&#34;./177_1.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;OTAPOINTER[31:2] = 描述区的地址，此地址必须为FLASH地址8KB对齐，忽略低2位&#xA;OTAPOINTER[1]      = 1，表示SBL升级，下次重启后会升级SBL自身&#xA;OTAPOINTER[0]      = 1，表示OTA有效，下次重启后会触发升级&lt;/p&gt;&#xA;&lt;hr&gt;&#xA;&lt;p&gt;&lt;strong&gt;2.升级描述区&lt;/strong&gt;&#xA;升级描述区占用1个FLASH扇区，1个扇区＝8KB&#xA;贴个文档里的图：&lt;/p&gt;&#xA;&lt;p&gt;&lt;img src=&#34;./177_2.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;描述区是一个32bit为单位的数组，每个单位是一个描述符，如果有多个描述符，就是可以一次性升级多个文件，最后一个描述符为0xFFFFFFFF表示结束。一般情况下固件升级我们只需要一个文件，所以只需要填写一个描述符就够了。&#xA;描述符BIT[31:2]表示升级文件所在的地址.&#xA;描述符BIT[1]表示升级结果，1=失败，0=成功&#xA;描述符BIT[0]表示升级状态，1=挂起，0=完成&#xA;升级之前，BIT1和BIT0都要置1，这样SBL才会处理这条升级描述。&lt;/p&gt;&#xA;&lt;hr&gt;&#xA;&lt;p&gt;&lt;strong&gt;3.制作升级文件&lt;/strong&gt;&#xA;编译器生成的binary文件是不能直接用于升级的，SBL只能识别包含特定文件头的文件。&#xA;这个文件的格式如文档中描述，下图是NonSecure Main格式：&#xA;&lt;img src=&#34;./177_3.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;从图中可以看出来，头件头部多了很多字段，还支持数据加密，一般情况下使用这种格式已经完全满足项目需要了。&#xA;Secure Main的文件头更复杂一些，已经没有兴趣再看下去了。&#xA;官方SDK中已经提供了一个python脚本来制作这种文件。&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;文件路径：/sdk/tools/apollo3_scripts/create_cust_image_blob.py&#xD;&#xA;调用参数：--bin input.bin -o output.bin --version 0xEFFF --magic-num 0xcb --load-address 0xc000&#xD;&#xA;--bin指定编译器生成的原始bin文件&#xD;&#xA;-o指定输出的新文件名&#xD;&#xA;--load-address指定升级文件的目标地址（编译器配置的IROM起始地址）&#xD;&#xA;--magic-num指定文件类型，0xcb表示主程序固件&#xD;&#xA;--version这个参数为可选参数，可以指定固件版本，范围0-0x7FFF，保存在W29的低15bit，&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;hr&gt;&#xA;&lt;p&gt;&lt;strong&gt;4.代码实现&lt;/strong&gt;&#xA;官方SDK中提供了一些有用的代码来实现我们的固件升级。&#xA;下面两个是实现内部FLASH的擦除与编程的接口，下载新固件的时候会用到。&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-cpp&#34; data-lang=&#34;cpp&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;//擦除，以8KB为单位进行擦除&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;am_hal_flash_page_erase&lt;/span&gt;(&lt;span style=&#34;color:#66d9ef&#34;&gt;uint32_t&lt;/span&gt; ui32ProgramKey, &lt;span style=&#34;color:#66d9ef&#34;&gt;uint32_t&lt;/span&gt; ui32FlashInst, &lt;span style=&#34;color:#66d9ef&#34;&gt;uint32_t&lt;/span&gt; ui32PageNum);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;//写入，以4字节为单位写数据&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;am_hal_flash_program_main&lt;/span&gt;(&lt;span style=&#34;color:#66d9ef&#34;&gt;uint32_t&lt;/span&gt; ui32ProgramKey, &lt;span style=&#34;color:#66d9ef&#34;&gt;uint32_t&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;pSrc, &lt;span style=&#34;color:#66d9ef&#34;&gt;uint32_t&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;pDst, &lt;span style=&#34;color:#66d9ef&#34;&gt;uint32_t&lt;/span&gt;  NumberOfWords);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;下面两个是实现添加OTA描述符的接口，下载完新固件之后，需要用到&lt;/p&gt;</description>
    </item>
    <item>
      <title>蓝牙HID键盘码表</title>
      <link>https://xcdd.pages.dev/blog/2021/2021-09-23/</link>
      <pubDate>Thu, 23 Sep 2021 09:28:17 +0000</pubDate>
      <guid>https://xcdd.pages.dev/blog/2021/2021-09-23/</guid>
      <description>&lt;table&gt;&#xA;  &lt;thead&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;th style=&#34;text-align: center&#34;&gt;&lt;strong&gt;键名&lt;/strong&gt;&lt;/th&gt;&#xA;          &lt;th style=&#34;text-align: center&#34;&gt;键值&lt;/th&gt;&#xA;      &lt;/tr&gt;&#xA;  &lt;/thead&gt;&#xA;  &lt;tbody&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;A&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;0x04&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;B&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;0x05&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;C&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;0x06&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;D&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;0x07&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;E&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;0x08&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;F&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;0x09&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;G&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;0x0A&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;H&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;0x0B&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;I&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;0x0C&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;J&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;0x0D&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;K&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;0x0E&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;L&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;0x0F&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;M&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;0x10&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;N&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;0x11&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;O&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;0x12&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;P&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;0x13&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;Q&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;0x14&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;R&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;0x15&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;S&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;0x16&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;T&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;0x17&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;U&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;0x18&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;V&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;0x19&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;W&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;0x1A&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;X&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;0x1B&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;Y&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;0x1C&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;Z&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;0x1D&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;1&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;0x1E&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;2&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;0x1F&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;3&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;0x20&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;4&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;0x21&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;5&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;0x22&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;6&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;0x23&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;7&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;0x24&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;8&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;0x25&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;9&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;0x26&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;0&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;0x27&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;Enter&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;0x28&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;Esc&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;0x29&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;Backspace&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;0x2A&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;Tab&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;0x2B&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;Space&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;0x2C&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;-&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;0x2D&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;=&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;0x2E&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;[&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;0x2F&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;]&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;0x30&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;\&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;0x31&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;;&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;0x33&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;‘&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;0x34&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;`&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;0x35&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;,&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;0x36&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;.&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;0x37&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;/&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;0x38&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;CapsLock&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;0x39&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;F1&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;0x3A&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;F2&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;0x3B&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;F3&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;0x3C&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;F4&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;0x3D&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;F5&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;0x3E&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;F6&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;0x3F&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;F7&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;0x40&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;F8&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;0x41&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;F9&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;0x42&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;F10&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;0x43&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;F11&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;0x44&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;F12&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;0x45&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;PrintScreen&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;0x46&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;ScrollLock&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;0x47&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;Pause&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;0x48&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;Insert&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;0x49&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;Home&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;0x4A&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;PageUp&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;0x4B&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;Del&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;0x4C&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;Delete&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;0x4C&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;End&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;0x4D&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;PageDown&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;0x4E&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;→&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;0x4F&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;←&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;0x50&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;↓&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;0x51&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;↑&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;0x52&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;NumLock&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;0x53&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;Num/&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;0x54&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;Num*&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;0x55&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;Num-&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;0x56&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;Num+&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;0x57&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;NumEnter&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;0x58&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;Num1&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;0x59&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;Num2&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;0x5A&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;Num3&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;0x5B&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;Num4&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;0x5C&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;Num5&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;0x5D&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;Num6&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;0x5E&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;Num7&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;0x5F&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;Num8&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;0x60&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;Num9&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;0x61&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;Num0&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;0x62&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;Num.&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;0x63&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;Menu&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;0x76&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;Prev&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;0x80&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;Next&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;0x81&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;Stop&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;0x82&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;Play&amp;amp;Pause&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;0x83&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;Mute&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;0x84&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;VolUp&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;0x85&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;VolDown&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;0x86&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;Ctrl&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;0xE0&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;Shift&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;0xE1&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;Alt&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;0xE2&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;Win&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;0xE3&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;Ctrl&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;0xE4&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;Shift&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;0xE5&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;AltGr&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;0xE6&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;Win&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;0xE7&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;  &lt;/tbody&gt;&#xA;&lt;/table&gt;</description>
    </item>
    <item>
      <title>[蓝牙]nRF52840&#43;S340协议栈无法被iPhone连接的问题</title>
      <link>https://xcdd.pages.dev/blog/2021/2021-08-23/</link>
      <pubDate>Mon, 23 Aug 2021 15:47:36 +0000</pubDate>
      <guid>https://xcdd.pages.dev/blog/2021/2021-08-23/</guid>
      <description>&lt;p&gt;从官方SDK例程中，删掉了peer_manger模块，蓝牙设备不支持配对。&#xA;导致iPhone上面的测试APP无法正常连接到设备。&#xA;通过分析日志，发现手机与设备的connect过程其实是成功了。&#xA;只不过connect之后，手机端又发起了一些其它未知请求，没有被设备端处理，导致手机端又主动断开了连接，然后报错。&#xA;查阅资料后，解决方案如下：&lt;/p&gt;&#xA;&lt;p&gt;在on_ble_evt函数中添加以下代码：&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;static void on_ble_evt(ble_evt_t const * p_ble_evt)&#xD;&#xA;{&#xD;&#xA;&#x9;&#x9;......&#xD;&#xA;&#x9;&#x9;case BLE_GAP_EVT_SEC_INFO_REQUEST:&#xD;&#xA;&#x9;&#x9;&#x9;sd_ble_gap_sec_info_reply(p_ble_evt-&amp;gt;evt.gatts_evt.conn_handle, NULL, NULL, NULL);&#xD;&#xA;&#x9;&#x9;&#x9;break;&#xD;&#xA;&#x9;&#x9;case BLE_GATTS_EVT_SYS_ATTR_MISSING:&#xD;&#xA;&#x9;&#x9;&#x9;sd_ble_gatts_sys_attr_set(p_ble_evt-&amp;gt;evt.gatts_evt.conn_handle, NULL, 0, 0);&#xD;&#xA;&#x9;&#x9;&#x9;break;&#xD;&#xA;&#x9;&#x9;default:&#xD;&#xA;&#x9;&#x9;&#x9;break;&#xD;&#xA;}&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;重新测试，问题解决。&lt;/p&gt;</description>
    </item>
    <item>
      <title>HC32F460外设中断用法</title>
      <link>https://xcdd.pages.dev/blog/2021/2021-07-07/</link>
      <pubDate>Wed, 07 Jul 2021 16:25:33 +0000</pubDate>
      <guid>https://xcdd.pages.dev/blog/2021/2021-07-07/</guid>
      <description>&lt;p&gt;华大HC32F460的外设中断和STM32相比也是非常的个性！！！&#xA;先来看看HC32F460的启动文件startup.s，如下图所示：&lt;/p&gt;&#xA;&lt;p&gt;&lt;img src=&#34;./174_1.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;从这个文件可以看出来，它定义的中断向量表里，对中断名有只一个编号，没有写明具体是哪个外设的中断。&lt;/p&gt;&#xA;&lt;p&gt;这就非常有意思，因为HC32F460的外设中断的中断号是可以“任意”编程的，不过这个“任意”也并不是全部128个中断都可以随便选择，也有一定的小规则，查看手册INTC章节，有如下所示的表格：&#xA;&lt;img src=&#34;./174_2.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;比如GPIO中断，只能选择0-37或者128。&lt;/p&gt;&#xA;&lt;hr&gt;&#xA;&lt;p&gt;下面就来看看怎么把外设中断和中断号关联起来：&#xA;这里以UART１外设为例。&#xA;首先还是看手册的中断请求表，找到UART1，如下图，UART这个外设有5个中断事件。&#xA;&lt;img src=&#34;./174_3.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;我们知道，常规的MCU外设如STM32一样，通常是一个UART外设的所有中断请求都是共用同一个中断号，然后在该中断服务程序里面判断外设的标志位，得到中断源，并做出在相应和处理。&lt;/p&gt;&#xA;&lt;p&gt;但是HC32F460就完全不一样了，UART外设里的每个中断标志位，都是独立请求中断，必须单独给分配中断号，这样一来，一个UART就可以有5个中断服务程序了，编程其实更麻烦了。&lt;/p&gt;&#xA;&lt;p&gt;比如上面的USART1_REI表示串口接收错误，可以分配0-31/80-85/136这些中断号，如果要给它分配的中断号是80，那么需要往寄存器INT_SEL80里写入278，其中278就是USART1_REI的中断事件序号。当UART１发生接收错误时，就会触发278号中断事件，该事件绑定了80号中断请求，就会执行IRQ080_Handler中断函数，我们在这个函数里面去处理对应的数据就可以了。&lt;/p&gt;&#xA;&lt;p&gt;再比如USART1_RI表示接收到数据中断，我们给它分配中断号81，那么就要往INT_SEL81写入279，然后在IRQ081_Handler中断函数里面去处理接收数据。&lt;/p&gt;&#xA;&lt;hr&gt;&#xA;&lt;p&gt;上面是HC32F460的中断配置寄存器用法，华大提供了一个驱动库，&#xA;里面有一个hc32f460_interrupts.c文件，实现了中断管理，但是很坑，占用ROM空间巨大！&#xA;这个库提供了enIrqRegistration函数，用来绑定中断事件，以及中断处理函数。&#xA;但要注意，调用它之前最好先调用enIrqResign函数，用来删除中断绑定关系，否则注册中断有可能会失败！&lt;/p&gt;&#xA;&lt;p&gt;下面的代码，演示注册UART１的接收中断为81号中断，并指定中断处理函数为uart1_rx_handler&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-cpp&#34; data-lang=&#34;cpp&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;stc_irq_regi_conf_t irq_cfg;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;irq_cfg.enIRQn      &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; Int081_IRQn;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;irq_cfg.enIntSrc    &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; INT_USART1_RI;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;irq_cfg.pfnCallback &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; uart1_rx_handler;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;enIrqResign(Int081_IRQn);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;enIrqRegistration(&lt;span style=&#34;color:#f92672&#34;&gt;&amp;amp;&lt;/span&gt;irq_cfg);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;NVIC_EnableIRQ(Int081_IRQn);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;如果这个注册中断的时候可以给中断函数加上一个参数的话，实用性会大大提高，但是目前并不能，而一个中断事件绑定一个中断函数，又太占用ROM空间了，且很麻烦。&lt;/p&gt;</description>
    </item>
    <item>
      <title>HC32F460串口驱动的问题</title>
      <link>https://xcdd.pages.dev/blog/2021/2021-06-07/</link>
      <pubDate>Mon, 07 Jun 2021 16:28:05 +0000</pubDate>
      <guid>https://xcdd.pages.dev/blog/2021/2021-06-07/</guid>
      <description>&lt;p&gt;HC32F460片上有4路串口，驱动使用了HC32官方的库函数，一般初始化流程如下代码，一开始验证没有问题，能正常收发数据。&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;//HC32F460串口初始化&#xD;&#xA;{&#xD;&#xA;    stc_usart_uart_init_t init;&#xD;&#xA;&#x9;memset(&amp;amp;init, 0, sizeof(init));&#xD;&#xA;&#x9;&#xD;&#xA;    init.enClkMode   = UsartIntClkCkNoOutput;&#xD;&#xA;&#x9;init.enClkDiv    = UsartClkDiv_1;&#xD;&#xA;&#x9;init.enDataLength= UsartDataBits8;&#xD;&#xA;&#x9;init.enDirection = UsartDataLsbFirst;&#xD;&#xA;&#x9;init.enStopBit   = UsartOneStopBit;&#xD;&#xA;&#x9;init.enParity    = (en_usart_parity_t)parity;&#xD;&#xA;&#x9;init.enSampleMode= UsartSampleBit8;&#xD;&#xA;&#x9;init.enDetectMode= UsartStartBitFallEdge;&#xD;&#xA;&#x9;init.enHwFlow    = UsartRtsEnable;&#xD;&#xA;&#x9;USART_UART_Init(hw-&amp;gt;uart, &amp;amp;init);&#xD;&#xA;&#xD;&#xA;&#x9;USART_SetBaudrate(hw-&amp;gt;uart, baudrate);&#xD;&#xA;&#x9;USART_FuncCmd(hw-&amp;gt;uart, UsartTx, Enable);&#xD;&#xA;&#x9;USART_FuncCmd(hw-&amp;gt;uart, UsartRx, Enable);&#xD;&#xA;&#x9;USART_FuncCmd(hw-&amp;gt;uart, UsartRxInt, Enable);&#xD;&#xA;}&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;后来实际项目中，接入一个RS485设备，发现不能正常接收数据，故障表现是MCU不进接收中断。&#xA;检查了硬件，没有发现问题，外部设备-&amp;gt;板载485芯片-&amp;gt;MCU_RX，示波器都能看到引脚有波形过来。&#xA;最后通过Keil的外设查看窗口，看看UART的寄存器，发现SR-&amp;gt;FE标记置1。&#xA;这意味着接收发现帧错误。&lt;/p&gt;&#xA;&lt;p&gt;于是怀疑是波特率的问题了，用串口调试工具测试发现，果然UART在9600波特率下不能正常接收。&#xA;之前验证驱动用的是115200，波特率较高收发都正常。&#xA;问题发生在下面这一行代码，UART的时钟分频值太低，无法产生9600这么低的波特率。&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;init.enClkDiv    = UsartClkDiv_1;&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;将这个值改为16，结果可以通信了。&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;init.enClkDiv    = UsartClkDiv_16;&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;hr&gt;&#xA;&lt;p&gt;后来把常用的波特率低至1200，高至921600都试了一遍。&#xA;最终采取如下初始化代码：&#xA;如果波特率低于115200，则分频值取64，高于等于115200则分频值取1。&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;    stc_usart_uart_init_t init;&#xD;&#xA;&#x9;memset(&amp;amp;init, 0, sizeof(init));&#xD;&#xA;&#x9;init.enClkMode   = UsartIntClkCkNoOutput;&#xD;&#xA;&#x9;init.enClkDiv    = (baudrate &amp;lt; 115200) ? UsartClkDiv_64 : UsartClkDiv_1;&#xD;&#xA;&#x9;init.enDataLength= UsartDataBits8;&#xD;&#xA;&#x9;init.enDirection = UsartDataLsbFirst;&#xD;&#xA;&#x9;init.enStopBit   = UsartOneStopBit;&#xD;&#xA;&#x9;init.enParity    = (en_usart_parity_t)parity;&#xD;&#xA;&#x9;init.enSampleMode= UsartSampleBit8;&#xD;&#xA;&#x9;init.enDetectMode= UsartStartBitFallEdge;&#xD;&#xA;&#x9;init.enHwFlow    = UsartRtsEnable;&#xD;&#xA;&#x9;USART_UART_Init(hw-&amp;gt;uart, &amp;amp;init);&#xD;&#xA;&#x9;USART_SetBaudrate(hw-&amp;gt;uart, baudrate);&#xD;&#xA;&#x9;USART_FuncCmd(hw-&amp;gt;uart, UsartTx, Enable);&#xD;&#xA;&#x9;USART_FuncCmd(hw-&amp;gt;uart, UsartRx, Enable);&#xD;&#xA;&#x9;USART_FuncCmd(hw-&amp;gt;uart, UsartRxInt, Enable);&#xA;&lt;/code&gt;&lt;/pre&gt;</description>
    </item>
    <item>
      <title>C语言计算char/short/int的最大值和最小值</title>
      <link>https://xcdd.pages.dev/blog/2021/2021-06-03/</link>
      <pubDate>Thu, 03 Jun 2021 18:19:55 +0000</pubDate>
      <guid>https://xcdd.pages.dev/blog/2021/2021-06-03/</guid>
      <description>&lt;p&gt;假设我们不知道目标平台的char、short、int长度是多少个字节，如何得到这个类型的最大值和最小值？&lt;/p&gt;&#xA;&lt;p&gt;简单思考过后，我觉得可以采用无符号的最大值再右移1位的方式来得到有符号整数的最大值，把这个值取反又能得到最小值。&#xA;使用下面的C语言代码进行验证，发现打印值是正确的。&#xA;把代码中的 int 换成 char 和 short 都能正常打印出最大值和最小值。&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;void main(void)&#xD;&#xA;{&#xD;&#xA;&#x9;unsigned int tmp;&#xD;&#xA;&#x9;int max_val;&#xD;&#xA;&#x9;int min_val;&#xD;&#xA;&#x9;tmp = 0 - 1;&#xD;&#xA;&#x9;tmp = tmp &amp;gt;&amp;gt; 1;&#xD;&#xA;&#x9;max_val = tmp;&#xD;&#xA;&#x9;min_val = ~tmp;&#xD;&#xA;&#x9;printf(&amp;#34;min=%d, max=%d\n&amp;#34;, min_val, max_val);&#xD;&#xA;&#x9;system(&amp;#34;pause&amp;#34;);&#xD;&#xA;}&#xA;&lt;/code&gt;&lt;/pre&gt;</description>
    </item>
    <item>
      <title>华大HC32F460看门狗的使用</title>
      <link>https://xcdd.pages.dev/blog/2021/2021-05-21/</link>
      <pubDate>Fri, 21 May 2021 09:53:37 +0000</pubDate>
      <guid>https://xcdd.pages.dev/blog/2021/2021-05-21/</guid>
      <description>&lt;p&gt;由于STM32涨价，厂家纷纷换了国产MCU，现在用华大HC32系列已经是潮流了。&#xA;用惯了STM32，突然换其它MCU，总是要踩一些坑，来看看HC32的看门狗吧。&lt;/p&gt;&#xA;&lt;hr&gt;&#xA;&lt;p&gt;HC32F460有两个看门狗：SWDT和WDT&#xA;SWDT使用的是内部专用RC时钟源，大约为10KHz，精度低，不受外部晶振和PLL的影响，可靠性较高&#xA;WDT使用的是系统时钟PCLK3，精度高，但如果晶振或PLL故障，看门狗会停止计数。&lt;/p&gt;&#xA;&lt;p&gt;做为系统死机守护的看门狗，建议选用SWDT。&lt;/p&gt;&#xA;&lt;p&gt;SWDT是16位递减计数器，&#xA;计数值只能选择：256、4096、16384、65536这几种，不能任意设置。&#xA;时钟分频可选 ：1、16、32、64、128、256、4096。&#xA;看门狗复位时间(秒)=分频 * 计数值 / 10K&lt;/p&gt;&#xA;&lt;p&gt;下面就是HC32460的特别之处了：&#xA;SWDT的初始化和启动是完全由硬件完成的。&#xA;&lt;strong&gt;参数配置是由一个叫ICG的特殊FLASH区域来完成。&#xA;ICG地址0x00000400 - 0x0000041F，可以看作是8个32位的只读寄存器，其中只有前2个有作用。&lt;/strong&gt;&#xA;&lt;img src=&#34;./171_1.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;要启动SWDT看门狗，就要配置ICG0寄存器，ICG0的BIT[12:0]如图所示：&lt;/p&gt;&#xA;&lt;p&gt;&lt;img src=&#34;./171_2.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;&lt;img src=&#34;./171_3.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;只要把ICG0的最低位由1改为0，SWDT就会自动启动。&#xA;关于ICG寄存器的配置方法，官方SDK已经提供了一个文件：hc32f460_icg.c和hc32f460_icg.h&#xA;修改hc32f460_icg.h的如下内容：&lt;/p&gt;&#xA;&lt;p&gt;&lt;img src=&#34;./171_4.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;最后，还要记得修改ddl_config.h，打开配置开关。&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;#define DDL_ICG_ENABLE                              (DDL_ON)&#xD;&#xA;#define DDL_SWDT_ENABLE                             (DDL_ON)&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;至此，SWDT看门狗就会自动自动启动了，程序要运行的时候，需要定时刷新看门狗计数值，&#xA;刷新计数值使用以下函数就可以了：&#xA;SWDT_RefreshCounter();&lt;/p&gt;</description>
    </item>
    <item>
      <title>Win10PE纯64位无法重命名文件夹</title>
      <link>https://xcdd.pages.dev/blog/2021/2021-04-08/</link>
      <pubDate>Thu, 08 Apr 2021 11:02:34 +0000</pubDate>
      <guid>https://xcdd.pages.dev/blog/2021/2021-04-08/</guid>
      <description>&lt;p&gt;基于WIN10_x64系统制作的PE系统，完全删掉SysWOW64，只保留纯64位系统，注册表也删掉关于WOW64和32位相关的项。&#xA;结果进入PE发现无法给文件夹改名，但文件可以正常改名，用cmd命令ren也可以改名。&lt;/p&gt;&#xA;&lt;p&gt;&lt;img src=&#34;./170_1.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;经过一番测试，结果发现与如下注册表有关：&#xA;添加红框内的项，问题解决。&#xA;&lt;img src=&#34;./170_2.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;</description>
    </item>
    <item>
      <title>WinPE系统的自动打包和测试的批处理脚本</title>
      <link>https://xcdd.pages.dev/blog/2021/2021-04-02/</link>
      <pubDate>Fri, 02 Apr 2021 12:53:46 +0000</pubDate>
      <guid>https://xcdd.pages.dev/blog/2021/2021-04-02/</guid>
      <description>&lt;p&gt;在制作WINPE系统的时候，通常是用虚拟机来测试。&lt;/p&gt;&#xA;&lt;p&gt;纯手工操作有以下步骤：&lt;/p&gt;&#xA;&lt;p&gt;1.修改注册表或者修改文件等一系列增删改操作。&#xA;2.手动用wim工具打包成boot.wim&#xA;3.手动挂载虚拟机的VHD硬盘文件&#xA;4.把boot.wim复制到虚拟机硬盘的指定目录&#xA;5.卸载VHD硬盘文件&lt;/p&gt;&#xA;&lt;p&gt;手工操作确实很烦琐，点鼠标点到手抽筋。所以我们需要一个自动化脚本来完成以上操作。&lt;/p&gt;&#xA;&lt;p&gt;以下批处理脚本就是用来干这个事情的，内容仅供参考：&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;@echo off&#xD;&#xA;title WinPE镜像打包工具&#xD;&#xA;&#xD;&#xA;REM 设置工作环境变量&#xD;&#xA;set VHD_PATH=&amp;#34;D:\VBOX\BOOT\BOOT.VHD&amp;#34;&#xD;&#xA;set WIM_PATH=&amp;#34;G:\BOOT\BOOT.WIM&amp;#34;&#xD;&#xA;&#xD;&#xA;REM 生成挂载VHD的脚本&#xD;&#xA;echo select vdisk file=%VHD_PATH% &amp;gt; bin\mount.txt&#xD;&#xA;echo attach vdisk &amp;gt;&amp;gt; bin\mount.txt&#xD;&#xA;echo list disk &amp;gt;&amp;gt; bin\mount.txt&#xD;&#xA;REM 生成卸载VHD的脚本&#xD;&#xA;echo select vdisk file=%VHD_PATH% &amp;gt; bin\unmount.txt&#xD;&#xA;echo detach vdisk &amp;gt;&amp;gt; bin\unmount.txt&#xD;&#xA;&#xD;&#xA;:MENU&#xD;&#xA;echo ***********************************************************&#xD;&#xA;echo * WinPE制作主菜单&#xD;&#xA;echo ***********************************************************&#xD;&#xA;echo * VHD路径: %VHD_PATH%&#xD;&#xA;echo * WIM路径: %WIM_PATH%&#xD;&#xA;echo ***********************************************************&#xD;&#xA;echo * 1.导出注册表&#xD;&#xA;echo * 2.重建注册表&#xD;&#xA;echo * 3.打包WIM镜像&#xD;&#xA;echo * 4.挂载VHD磁盘&#xD;&#xA;echo * 5.卸载VHD磁盘&#xD;&#xA;echo * 6.复制WIM到VHD&#xD;&#xA;echo * 7.一键打包WIM+复制到VHD&#xD;&#xA;echo * 8.一键重建注册表+打包WIM+复制到VHD&#xD;&#xA;echo ***********************************************************&#xD;&#xA;set /p menu=请选择功能:&#xD;&#xA;&#xD;&#xA;if %menu%==1 (&#xD;&#xA;    call :DO_REG_DUMP&#xD;&#xA;    pause&#xD;&#xA;    cls&#xD;&#xA;)&#xD;&#xA;if %menu%==2 (&#xD;&#xA;    call :DO_REG_PACK&#xD;&#xA;    pause&#xD;&#xA;    cls&#xD;&#xA;)&#xD;&#xA;if %menu%==3 (&#xD;&#xA;    call :DO_VIM_PACK&#xD;&#xA;    pause&#xD;&#xA;    cls&#xD;&#xA;)&#xD;&#xA;if %menu%==4 (&#xD;&#xA;    call :DO_VHD_MOUNT&#xD;&#xA;    pause&#xD;&#xA;    cls&#xD;&#xA;)&#xD;&#xA;if %menu%==5 (&#xD;&#xA;    call :DO_VHD_UNMOUNT&#xD;&#xA;    pause&#xD;&#xA;    cls&#xD;&#xA;)&#xD;&#xA;if %menu%==6 (&#xD;&#xA;    call :DO_VHD_MOUNT&#xD;&#xA;    call :DO_VIM_COPY&#xD;&#xA;    call :DO_VHD_UNMOUNT&#xD;&#xA;    pause&#xD;&#xA;    cls&#xD;&#xA;)&#xD;&#xA;if %menu%==7 (&#xD;&#xA;    call :DO_VIM_PACK&#xD;&#xA;    call :DO_VHD_MOUNT&#xD;&#xA;    call :DO_VIM_COPY&#xD;&#xA;    call :DO_VHD_UNMOUNT&#xD;&#xA;    pause&#xD;&#xA;    cls&#xD;&#xA;)&#xD;&#xA;if %menu%==8 (&#xD;&#xA;    call :DO_REG_PACK&#xD;&#xA;    call :DO_VIM_PACK&#xD;&#xA;    call :DO_VHD_MOUNT&#xD;&#xA;    call :DO_VIM_COPY&#xD;&#xA;    call :DO_VHD_UNMOUNT&#xD;&#xA;    pause&#xD;&#xA;    cls&#xD;&#xA;)&#xD;&#xA;goto MENU&#xD;&#xA;&#xD;&#xA;:DO_REG_DUMP&#xD;&#xA;echo -----------------------------------------------------------&#xD;&#xA;echo 正在导出注册表...&#xD;&#xA;reg load HKLM\PE_DEFAULT &amp;#34;boot\windows\system32\config\DEFAULT&amp;#34;&#xD;&#xA;reg load HKLM\PE_SOFTWARE &amp;#34;boot\windows\system32\config\SOFTWARE&amp;#34;&#xD;&#xA;reg load HKLM\PE_SYSTEM &amp;#34;boot\windows\system32\config\SYSTEM&amp;#34;&#xD;&#xA;reg export HKLM\PE_SYSTEM &amp;#34;boot\windows\system32\config\SYSTEM.reg&amp;#34; /y&#xD;&#xA;reg export HKLM\PE_DEFAULT &amp;#34;boot\windows\system32\config\DEFAULT.reg&amp;#34; /y&#xD;&#xA;reg export HKLM\PE_SOFTWARE &amp;#34;boot\windows\system32\config\SOFTWARE.reg&amp;#34; /y&#xD;&#xA;reg unload HKLM\PE_DEFAULT&#xD;&#xA;reg unload HKLM\PE_SOFTWARE &#xD;&#xA;reg unload HKLM\PE_SYSTEM &#xD;&#xA;echo 操作完成&#xD;&#xA;echo -----------------------------------------------------------&#xD;&#xA;exit /b 0&#xD;&#xA;&#xD;&#xA;:DO_REG_PACK&#xD;&#xA;echo -----------------------------------------------------------&#xD;&#xA;echo 正在重建注册表...&#xD;&#xA;copy /y boot\windows\system32\config\SAM boot\windows\system32\config\DEFAULT&#xD;&#xA;copy /y boot\windows\system32\config\SAM boot\windows\system32\config\SOFTWARE&#xD;&#xA;copy /y boot\windows\system32\config\SAM boot\windows\system32\config\SYSTEM&#xD;&#xA;reg load HKLM\PE_DEFAULT &amp;#34;boot\windows\system32\config\DEFAULT&amp;#34;&#xD;&#xA;reg load HKLM\PE_SOFTWARE &amp;#34;boot\windows\system32\config\SOFTWARE&amp;#34;&#xD;&#xA;reg load HKLM\PE_SYSTEM &amp;#34;boot\windows\system32\config\SYSTEM&amp;#34;&#xD;&#xA;reg import &amp;#34;boot\windows\system32\config\SYSTEM.reg&amp;#34;&#xD;&#xA;reg import &amp;#34;boot\windows\system32\config\DEFAULT.reg&amp;#34;&#xD;&#xA;reg import &amp;#34;boot\windows\system32\config\SOFTWARE.reg&amp;#34;&#xD;&#xA;reg unload HKLM\PE_DEFAULT&#xD;&#xA;reg unload HKLM\PE_SOFTWARE &#xD;&#xA;reg unload HKLM\PE_SYSTEM &#xD;&#xA;echo 操作完成&#xD;&#xA;echo -----------------------------------------------------------&#xD;&#xA;exit /b 0&#xD;&#xA;&#xD;&#xA;:DO_VIM_PACK&#xD;&#xA;echo -----------------------------------------------------------&#xD;&#xA;echo 正在打包WIM......&#xD;&#xA;bin\wimlib.exe capture boot boot.wim --boot --wimboot &#xD;&#xA;echo 操作完成&#xD;&#xA;echo -----------------------------------------------------------&#xD;&#xA;exit /b 0&#xD;&#xA;&#xD;&#xA;:DO_VIM_COPY&#xD;&#xA;echo -----------------------------------------------------------&#xD;&#xA;echo 正在复制WIM到VHD...&#xD;&#xA;xcopy boot.wim %WIM_PATH% /Y&#xD;&#xA;echo 操作完成&#xD;&#xA;echo -----------------------------------------------------------&#xD;&#xA;exit /b 0&#xD;&#xA;&#xD;&#xA;:DO_VHD_MOUNT&#xD;&#xA;echo -----------------------------------------------------------&#xD;&#xA;echo 正在挂载VHD......&#xD;&#xA;diskpart /s bin\mount.txt&#xD;&#xA;echo 操作完成&#xD;&#xA;echo -----------------------------------------------------------&#xD;&#xA;exit /b 0&#xD;&#xA;&#xD;&#xA;:DO_VHD_UNMOUNT&#xD;&#xA;echo -----------------------------------------------------------&#xD;&#xA;echo 正在卸载VHD...&#xD;&#xA;diskpart /s bin/unmount.txt&#xD;&#xA;echo 操作完成&#xD;&#xA;echo -----------------------------------------------------------&#xD;&#xA;exit /b 0&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;使用说明：&lt;/p&gt;</description>
    </item>
    <item>
      <title>RS485-MODBUS协议总结</title>
      <link>https://xcdd.pages.dev/blog/2021/2021-02-26/</link>
      <pubDate>Fri, 26 Feb 2021 12:54:49 +0000</pubDate>
      <guid>https://xcdd.pages.dev/blog/2021/2021-02-26/</guid>
      <description>&lt;h4 id=&#34;简介&#34;&gt;简介&lt;/h4&gt;&#xA;&lt;p&gt;Modbus是一种串行通信协议，是Modicon公司（现施耐德电气）于1979年发表的。&#xA;目前Modbus已经成为工业领域通信协议的业界标准，并且是工业电子设备之间常用的连接方式。&lt;/p&gt;&#xA;&lt;p&gt;Modbus协议的通信机制是主从模式，在一条链路上可以挂载多个设备，其中有且只有一个主设备，其余设备均为从设备。&#xA;在通信过程中，所有命令均由主设备发起，从机设备只能被动接收并响应主设备发起的命令。&lt;/p&gt;&#xA;&lt;p&gt;Modbus协议的数据帧格式有两种类型：&#xA;一种是ASCII类型，数据类型使用字符串输出。&#xA;一种是RTU类型，数据类型使用二进制输出。&#xA;目前常用的是RTU类型，二进制方式通信数据量更小，更紧凑。&lt;/p&gt;&#xA;&lt;p&gt;Modbus协议并没有对链路层提出要求，它可以是RS485，也可以是RS232甚至是TCP/IP。&#xA;目前最常用的是RS485，因为RS485通信距离远，抗干扰能力强，成本低。&lt;/p&gt;&#xA;&lt;hr&gt;&#xA;&lt;h4 id=&#34;本文以下内容针对rs485-modbus-rtu做一些总结&#34;&gt;&lt;strong&gt;本文以下内容针对RS485-MODBUS-RTU做一些总结&lt;/strong&gt;&lt;/h4&gt;&#xA;&lt;p&gt;&lt;strong&gt;RTU数据帧格式&lt;/strong&gt; ：&lt;/p&gt;&#xA;&lt;table&gt;&#xA;  &lt;thead&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;th style=&#34;text-align: center&#34;&gt;子地址&lt;/th&gt;&#xA;          &lt;th style=&#34;text-align: center&#34;&gt;功能码&lt;/th&gt;&#xA;          &lt;th style=&#34;text-align: center&#34;&gt;数据包&lt;/th&gt;&#xA;          &lt;th style=&#34;text-align: center&#34;&gt;校验字&lt;/th&gt;&#xA;      &lt;/tr&gt;&#xA;  &lt;/thead&gt;&#xA;  &lt;tbody&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;1字节&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;1字节&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;N字节&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;2字节&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;  &lt;/tbody&gt;&#xA;&lt;/table&gt;&#xA;&lt;p&gt;示例数据：0x110x010x00 0x00 0x00 0x060xBE 0x98&lt;/p&gt;&#xA;&lt;p&gt;子地址：0x00表示广播地址，0x01-0xF7表示从机地址，0xF8-0xFF用户自定义。&#xA;功能码：表示此次通信需要使用从机的哪些功能，具体含义因设备而异。&#xA;数据包：表示此次通信需要用到的数据，具体含义因设备和功能而异。&#xA;校验字：表示CRC16计算的校验结果，低字节在前，高字节在后。参与CRC16计算的为：子地址+功能码+数据包&lt;/p&gt;&#xA;&lt;p&gt;1.从帧格式可以看出来，没有固定帧头，也没有帧长字段，那么接收程序怎么判定帧起始和结束？&#xA;协议规定两个字节之间的传输间隔大于传输4个字节所需的时长，则认为当前帧结束。&#xA;注意：由于接收端需要用字节间隔时间来判断帧层，因此在发送数据时，最好关闭MCU中断，或者使用硬件DMA发送，避免发送中过程中被其它任务打断。&#xA;传输时的波特率越高，间隔时长则越短。&lt;/p&gt;&#xA;&lt;p&gt;2.接收到完整数据后要怎么验证完整性？&#xA;验证CRC16校验值，crc16(子地址+功能码+数据包)，计算结果与最后2个字节进行对比，如果相同则认为数据包完整，进行下一步处理。&#xA;否则数据包有误，应该丢弃这包数据。&lt;/p&gt;&#xA;&lt;p&gt;3.CRC16具体是怎么计算的呢？&#xA;参考如下代码：&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-cpp&#34; data-lang=&#34;cpp&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;unsigned&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;modbus_crc16&lt;/span&gt;(&lt;span style=&#34;color:#66d9ef&#34;&gt;unsigned&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;char&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;buff, &lt;span style=&#34;color:#66d9ef&#34;&gt;unsigned&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt; len)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;{&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&lt;span style=&#34;color:#66d9ef&#34;&gt;unsigned&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt; crc &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;0xFFFF&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&lt;span style=&#34;color:#66d9ef&#34;&gt;unsigned&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt; i, j;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&lt;span style=&#34;color:#66d9ef&#34;&gt;for&lt;/span&gt; ( j &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;; j &lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;&lt;/span&gt; len; j &lt;span style=&#34;color:#f92672&#34;&gt;++&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;{&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&#x9;crc &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; crc &lt;span style=&#34;color:#f92672&#34;&gt;^&lt;/span&gt; buff[j];&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&#x9;&lt;span style=&#34;color:#66d9ef&#34;&gt;for&lt;/span&gt; ( i &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;; i &lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;8&lt;/span&gt;; i&lt;span style=&#34;color:#f92672&#34;&gt;++&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&#x9;{&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&#x9;&#x9;&lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt;( ( crc &lt;span style=&#34;color:#f92672&#34;&gt;&amp;amp;&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;0x0001&lt;/span&gt;) &lt;span style=&#34;color:#f92672&#34;&gt;&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&#x9;&#x9;{&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&#x9;&#x9;&#x9;crc &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; crc &lt;span style=&#34;color:#f92672&#34;&gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&#x9;&#x9;&#x9;crc &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; crc &lt;span style=&#34;color:#f92672&#34;&gt;^&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;0xa001&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&#x9;&#x9;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&#x9;&#x9;&lt;span style=&#34;color:#66d9ef&#34;&gt;else&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&#x9;&#x9;{&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&#x9;&#x9;&#x9;crc &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; crc &lt;span style=&#34;color:#f92672&#34;&gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&#x9;&#x9;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&#x9;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt; crc;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description>
    </item>
    <item>
      <title>监控远程桌面连接并通过python发送提醒邮件</title>
      <link>https://xcdd.pages.dev/blog/2021/2021-01-19/</link>
      <pubDate>Tue, 19 Jan 2021 13:00:45 +0000</pubDate>
      <guid>https://xcdd.pages.dev/blog/2021/2021-01-19/</guid>
      <description>&lt;p&gt;由于RDP远程桌面功能非常方便，但又存在较高风险，只能通过提高安全防护，避免造成损失。&#xA;本文记录一种邮件提醒远程登陆的方法和过程。&#xA;工作原理：&#xA;1.利用windows的计划任务功能，当远程登陆的时候，调用指定的程序；&#xA;2.此处调用的是python脚本，利用python来完成发送邮件的功能；&#xA;3.在python脚本中调用一个EXE小程序来获取登陆信息（用户名，客户端名称等信息），&lt;/p&gt;&#xA;&lt;hr&gt;&#xA;&lt;h4 id=&#34;第一步&#34;&gt;&lt;strong&gt;第一步：&lt;/strong&gt;&lt;/h4&gt;&#xA;&lt;p&gt;写一个EXE小工具，获取远程登陆信息&#xA;使用C语言编写，通过win32底层API读取客户端信息；&#xA;并把信息打印到标准输出以便后面python读取。&#xA;这个方法不能获取到准确的客户端IP地址，这里的IP地址其实是内网地址。&#xA;暂时还没有找到如何获取客户端公网IP的办法。&#xA;完整的C语言源码如下（只支持Windows Vista及以上系统版本）：&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-cpp&#34; data-lang=&#34;cpp&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;#include&lt;/span&gt; &lt;span style=&#34;color:#75715e&#34;&gt;&amp;lt;stdio.h&amp;gt;&lt;/span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;#include&lt;/span&gt; &lt;span style=&#34;color:#75715e&#34;&gt;&amp;lt;Windows.h&amp;gt;&lt;/span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;#include&lt;/span&gt; &lt;span style=&#34;color:#75715e&#34;&gt;&amp;lt;wtsapi32.h&amp;gt;&lt;/span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;#pragma comment(lib, &amp;#34;wtsapi32.lib&amp;#34;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;static&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;const&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;char&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;af_str[]&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;{&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;AF_UNSPEC&amp;#34;&lt;/span&gt;,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;AF_UNIX&amp;#34;&lt;/span&gt;,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;AF_INET&amp;#34;&lt;/span&gt;,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;AF_IMPLINK&amp;#34;&lt;/span&gt;,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;AF_PUP&amp;#34;&lt;/span&gt;,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;AF_CHAOS&amp;#34;&lt;/span&gt;,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;AF_IPX&amp;#34;&lt;/span&gt;,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;AF_NS&amp;#34;&lt;/span&gt;,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;AF_ISO&amp;#34;&lt;/span&gt;,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;AF_OSI&amp;#34;&lt;/span&gt;,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;AF_ECMA&amp;#34;&lt;/span&gt;,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;AF_DATAKIT&amp;#34;&lt;/span&gt;,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;AF_CCITT&amp;#34;&lt;/span&gt;,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;AF_SNA&amp;#34;&lt;/span&gt;,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;AF_DECnet&amp;#34;&lt;/span&gt;,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;AF_DLI&amp;#34;&lt;/span&gt;,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;AF_LAT&amp;#34;&lt;/span&gt;,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;AF_HYLINK&amp;#34;&lt;/span&gt;,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;AF_APPLETALK&amp;#34;&lt;/span&gt;,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;AF_NETBIOS&amp;#34;&lt;/span&gt;,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;AF_VOICEVIEW&amp;#34;&lt;/span&gt;,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;AF_FIREFOX&amp;#34;&lt;/span&gt;,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;AF_UNKNOWN1&amp;#34;&lt;/span&gt;,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;AF_BAN&amp;#34;&lt;/span&gt;,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;};&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;void&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;main&lt;/span&gt;(&lt;span style=&#34;color:#66d9ef&#34;&gt;void&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;{&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;DWORD cbReturned; &#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;PWTSCLIENTA pData;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt;(WTSQuerySessionInformationA(WTS_CURRENT_SERVER_HANDLE, WTS_CURRENT_SESSION, WTSClientInfo, (LPSTR&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;)&lt;span style=&#34;color:#f92672&#34;&gt;&amp;amp;&lt;/span&gt;pData, &lt;span style=&#34;color:#f92672&#34;&gt;&amp;amp;&lt;/span&gt;cbReturned))&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;{&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&#x9;printf(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;UserName:%s&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;\r\n&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&lt;/span&gt;, pData&lt;span style=&#34;color:#f92672&#34;&gt;-&amp;gt;&lt;/span&gt;UserName);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&#x9;printf(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;ClientName:%s&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;\r\n&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&lt;/span&gt;, pData&lt;span style=&#34;color:#f92672&#34;&gt;-&amp;gt;&lt;/span&gt;ClientName);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&#x9;printf(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;ClientBuildNumber:%d&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;\r\n&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&lt;/span&gt;, pData&lt;span style=&#34;color:#f92672&#34;&gt;-&amp;gt;&lt;/span&gt;ClientBuildNumber);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&#x9;printf(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;ClientAddressFamily:%s&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;\r\n&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&lt;/span&gt;, af_str[pData&lt;span style=&#34;color:#f92672&#34;&gt;-&amp;gt;&lt;/span&gt;ClientAddressFamily]);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&#x9;printf(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;ClientAddress(raw):%d.%d.%d.%d&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;\r\n&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&lt;/span&gt;, pData&lt;span style=&#34;color:#f92672&#34;&gt;-&amp;gt;&lt;/span&gt;ClientAddress[&lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;],pData&lt;span style=&#34;color:#f92672&#34;&gt;-&amp;gt;&lt;/span&gt;ClientAddress[&lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;],pData&lt;span style=&#34;color:#f92672&#34;&gt;-&amp;gt;&lt;/span&gt;ClientAddress[&lt;span style=&#34;color:#ae81ff&#34;&gt;2&lt;/span&gt;],pData&lt;span style=&#34;color:#f92672&#34;&gt;-&amp;gt;&lt;/span&gt;ClientAddress[&lt;span style=&#34;color:#ae81ff&#34;&gt;3&lt;/span&gt;]);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&#x9;printf(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;ClientAddress(str):%ls&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;\r\n&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&lt;/span&gt;, pData&lt;span style=&#34;color:#f92672&#34;&gt;-&amp;gt;&lt;/span&gt;ClientAddress);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&#x9;WTSFreeMemory(pData);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&#x9;&lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;printf(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;WTSQuerySessionInformationA Failed!&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;\r\n&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&lt;/span&gt;);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;printf(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Error:%08X&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;\r\n&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&lt;/span&gt;, GetLastError());&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&lt;span style=&#34;color:#75715e&#34;&gt;//system(&amp;#34;pause&amp;#34;);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;hr&gt;&#xA;&lt;h4 id=&#34;第二步&#34;&gt;&lt;strong&gt;第二步：&lt;/strong&gt;&lt;/h4&gt;&#xA;&lt;p&gt;写一个python脚本，调用上面的小工具，并读取输出，然后发送邮件。&#xA;发送邮件使用了网易的STMP服务，用自己的邮箱账号给自己的另一个邮箱发。&#xA;接收邮件最好用QQ邮箱，QQ邮件手机可以及时接收到邮件。&#xA;完整python源码如下：&lt;/p&gt;</description>
    </item>
    <item>
      <title>MDK安装包的精简以及绿化方法</title>
      <link>https://xcdd.pages.dev/blog/2021/2021-01-15/</link>
      <pubDate>Fri, 15 Jan 2021 15:12:27 +0000</pubDate>
      <guid>https://xcdd.pages.dev/blog/2021/2021-01-15/</guid>
      <description>&lt;p&gt;Keil MDK5 安装包越来越大, 全新安装非常耗时.&#xA;但实际上MDK5完全不写注册表,明明解压就可用.&#xA;安装过程主要是在解压文件.只需要设置好TOOLS.INI中的路径就可以了.&#xA;把它做成精简绿色优化版.以后重装系统都不用重装MDK.&#xA;软件版本基于MDK5.18&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;1.绿化&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;解压到任意英文目录后,修改TOOLS.INI中的路径配置即可运行UV4.exe.&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;[UV2]&#xD;&#xA;ARMSEL=1&#xD;&#xA;USERTE=1&#xD;&#xA;RTEPATH=这里是设备支持包的路径&#xD;&#xA;[ARM]&#xD;&#xA;LIC0=&#xD;&#xA;[ARMADS]&#xD;&#xA;PATH=这里是ARM路径&#xD;&#xA;PATH1=这里是编译器路径&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;strong&gt;2.优化&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;关于MDK的菜单栏也吐槽很久了,官方原版的菜单字体和风格都不跟随系统主题,&#xA;所以给它打个补丁让它的菜单和系统主题保持一致.&lt;/p&gt;&#xA;&lt;p&gt;下图左边是原版菜单, 右边是修改后的菜单.&#xA;&lt;img src=&#34;./165_1.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;&amp;lt;左&amp;mdash;右&amp;gt; &lt;img src=&#34;./165_2.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;除了菜单栏,还有一个问题,就是MDK默认仿真器是ULINK,而我使用的是JLINK.&#xA;每次修改目标CPU后,又被重置为ULINK,很麻烦.&#xA;所以我把JLINK设置为默认仿真器,并且删除了ULINK.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;3.精简&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;MDK完整安装后,有很多文件其实是用不到的.比如一些帮助文件&amp;hellip;.&#xA;删除了帮助文件和一些不相干的文件.&#xA;删除了C++库和头文件.&#xA;删除了JLink以外的仿真器.&#xA;删除了自带的CMSIS软件包.&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://download.csdn.net/download/qq446252221/11783333?spm=1001.2014.3001.5503&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;精简绿色版Keil.MDK.V5.18_keil5绿色版-C工具类资源-CSDN下载&lt;/a&gt;&lt;/p&gt;</description>
    </item>
    <item>
      <title>记一次勒索病毒的遭遇</title>
      <link>https://xcdd.pages.dev/blog/2021/2021-01-14/</link>
      <pubDate>Thu, 14 Jan 2021 14:10:07 +0000</pubDate>
      <guid>https://xcdd.pages.dev/blog/2021/2021-01-14/</guid>
      <description>&lt;p&gt;快放假了，为了方便用手机远程电脑抢火车票，就在电脑上开启了远程桌面连接，并且做了内网端口映射。&#xA;但是抢完票又是周末，忘记关机，周一大早发现电脑登陆不进去了，而且屏幕显示用户已远程登陆&amp;hellip;（心中感觉不妙）&#xA;邓上重启电脑，发现BOOTMGR is missing&amp;hellip;&#xA;马上U盘启动，进入WinPE一看，啊，完蛋了！&#xA;本地硬盘上的所有文件全部被加密了！&#xA;文件后缀全部变为了id[828CB570-2700].[helpbackup@email.tg].Devos&#xA;这太TM过分了啊！&#xA;我的资料和代码全没了啊！&#xA;去年的wannacry勒索病毒的新闻还历历在目，没想到这就让我遇上了，哎！！！&#xA;因为电脑屏幕是锁屏状态，我无法登陆，所以我连勒索我的那个弹窗都没看到，不知道他到底要多少比特币&amp;hellip;&amp;hellip;&#xA;不过所幸的是一些重要的文件我已经备份到网盘里了，但是还有很多没有备份的文件丢失了，只能慢慢重头再来了。&lt;/p&gt;&#xA;&lt;p&gt;花了一整天时间，重做系统，格式化硬盘，找回那些已备份的文件&amp;hellip;&amp;hellip;&lt;/p&gt;&#xA;&lt;hr&gt;&#xA;&lt;p&gt;&lt;strong&gt;事后反思：&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;我的系统虽然是win7，但已经打了永恒之蓝和RDP漏洞补丁。&#xA;所以这病毒大概率是利用RDP远程扫描工具，找到了我的端口，并且使用密码字典进行爆破，拿到了登陆账号和密码，然后手动投毒。&#xA;因为我的登陆密码真是太弱了！&#xA;本来就是打算临时用一下，用完就关闭，结果却发生了最坏的情况。&#xA;暴露在公网的资源，真的是大意不得，稍有不慎，便会带来严重的损失！！！&#xA;&lt;strong&gt;1.无论如何不要使用弱密码；&#xA;2.尽可能开启IP访问白名单，特别是要拉黑国外的IP地址；&#xA;3.不使用的时候，尽量关机；&#xA;4.要提高文件备份的频率和覆盖面；&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;hr&gt;&#xA;&lt;p&gt;事已至此，虽然这种文件暂时还没有解密的办法，但我还是要稍微对它了解一下.&lt;/p&gt;&#xA;&lt;p&gt;从文件的修改时间来看，加密过程是从凌晨3点到4点，整个过程只花了1个小时！&#xA;这加密速度也太快了吧，电脑硬盘文件估计有几百个GB，全部加密只花了1个小时？&lt;/p&gt;&#xA;&lt;p&gt;所有文件都在原始文件名末尾添加了一串用于解密的信息：id[828CB570-2700].[helpbackup@email.tg].Devos&#xA;828CB570-2700应该是机器码一类的&#xA;&lt;a href=&#34;mailto:helpbackup@email.tg&#34;&gt;helpbackup@email.tg&lt;/a&gt;应该是黑客的邮箱&#xA;devos应该是特征后缀名&lt;/p&gt;&#xA;&lt;p&gt;通过奇安信的在线查询网页，显示此勒索病毒是phobos，暂时无法解密！&lt;/p&gt;&#xA;&lt;p&gt;&lt;img src=&#34;./164_1.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;再看看文件内容，找一个已知内容的文件进行对比，发现文件内容变成面貌全非，并且文件长度也发生了变化。&#xA;文件长度增加了258字节，应该是添加了一串解密的信息在里面。&lt;/p&gt;&#xA;&lt;p&gt;&lt;img src=&#34;./164_2.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;再找一个比较大一点的文件 ，这个文件有20MB。&#xA;发现文件前面256KB的内容全变为了00，中间也有一段变为了00，末尾又有一段全为00的数据，&#xA;而其余部分的内容并没有改变？嘻嘻，这样的话似乎还能还原一小部分文件内容？&#xA;在末尾又新增加了一段数据，猜测是变为了00的这三段数据加密后的内容。&lt;/p&gt;&#xA;&lt;p&gt;&lt;img src=&#34;./164_3.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;通过多次测试，发现文件大于2MB的，全部采用部分加密的算法，而小于2MB的文件 ，则采取整体加密的算法，&#xA;所以这就是实现快速全盘加密的方案？不然有一些1GB以上的超大文件，加密肯定会很耗时。&lt;/p&gt;&#xA;&lt;p&gt;完。&lt;/p&gt;&#xA;&lt;hr&gt;&#xA;&lt;p&gt;补充：&#xA;后来在整理被加密的文件时，发一个隐藏目录下发现了2个高度可疑的未加密EXE文件，极有可能就是phobos病毒文件。&#xA;有兴趣的可以下载下来看看是不是：&#xA;链接: &lt;a href=&#34;https://pan.baidu.com/s/1eA6Y6lJzVCJ_VJfnm3fzTg&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;https://pan.baidu.com/s/1eA6Y6lJzVCJ_VJfnm3fzTg&lt;/a&gt; 提取码: tqpv&#xA;里面包fast.exe和ns.exe两个文件，fast.exe应该就是病毒本身，而ns.exe应该是用于搜索和挂载局域网内的SMB共享文件夹的小工具。&lt;/p&gt;</description>
    </item>
    <item>
      <title>Python_3.8.6_x86精简绿色版</title>
      <link>https://xcdd.pages.dev/blog/2021/2021-01-08/</link>
      <pubDate>Fri, 08 Jan 2021 11:53:41 +0000</pubDate>
      <guid>https://xcdd.pages.dev/blog/2021/2021-01-08/</guid>
      <description>&lt;p&gt;之前做的Python_3.6.8版本没有集成IDLE环境，这次重新使用官方3.8.6版本打包了一个带IDLE工具的绿色版本。&#xA;python 3.8版本比3.6版本有较大的性能提升，因此推荐使用3.8版本。&lt;/p&gt;&#xA;&lt;p&gt;&lt;img src=&#34;./163_1.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;说明：&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;用原版python3.8.6_x86安装后精简而成。&#xA;1.添加了绿色补丁，可正常使用pip工具。&#xA;2.自带IDLE开发学习环境。&#xA;3.使用时解压到任意非中文目录，无需设置环境变量。&#xA;4.运行prompt.bat可进入带python环境的控制台。&#xA;5.要使用IDLE直接运行idle.bat即可。&#xA;6.运行install.bat可添加python环境到右键菜单。&#xA;注意：需要安装VC++2015，否则提示缺少VCRUNTIME140.dll&lt;/p&gt;&#xA;&lt;hr&gt;&#xA;&lt;p&gt;本来打算传CSDN，设置零积分下载，竟然不让我传，只能传微云网盘了&#xA;下载地址： &lt;a href=&#34;https://share.weiyun.com/YmBfgEWm&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;https://share.weiyun.com/YmBfgEWm&lt;/a&gt;&lt;/p&gt;</description>
    </item>
    <item>
      <title>降低洛达1562方案AirPods声音延迟的办法</title>
      <link>https://xcdd.pages.dev/blog/2020/2020-12-30/</link>
      <pubDate>Wed, 30 Dec 2020 11:25:10 +0000</pubDate>
      <guid>https://xcdd.pages.dev/blog/2020/2020-12-30/</guid>
      <description>&lt;p&gt;最近入手了一款国产蓝牙耳机，采用洛达方案的二代”AirPods“算是性价比很高的蓝牙耳机了。&lt;/p&gt;&#xA;&lt;p&gt;老的1536U方案以及现在新的1562M方案实际使用效果都不错。&lt;/p&gt;&#xA;&lt;p&gt;1562M降低了功耗，耳机续航时间达到5-6小时，超越了原版。&lt;/p&gt;&#xA;&lt;hr&gt;&#xA;&lt;p&gt;蓝牙耳机会有声音延迟是正常现象。&lt;/p&gt;&#xA;&lt;p&gt;正常模式下声音延时，听歌是没有问题的，不过玩游戏时能感觉到轻微的延时，估计在200毫秒左右。&lt;/p&gt;&#xA;&lt;p&gt;1562的固件里面其实是有低延迟游戏模式的，只不过正常情况下并没有开启，使用洛达原厂的SDK工具，可以设置此模式。&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;此工具仅支持洛达芯片，可用于检测耳机是不是真洛达。&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;工具下载： &lt;a href=&#34;https://download.csdn.net/download/qq446252221/13984216&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;https://download.csdn.net/download/qq446252221/13984216&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;警告：使用原厂SDK工具设置参数有风险，请自行判断风险再下载使用！&lt;/p&gt;&#xA;&lt;hr&gt;&#xA;&lt;p&gt;使用工具连接前，先使用系统蓝牙与耳机配对并连接，才能正常使用工具。&lt;/p&gt;&#xA;&lt;p&gt;安装好工具软件后，打开界面如下：&lt;/p&gt;&#xA;&lt;p&gt;第1步：连接耳机，点击SPP，弹出耳机列表，选中你的AirPod&lt;/p&gt;&#xA;&lt;p&gt;第2步：点击CONNECT，连接成功会显示绿色的Target BDA: xx:xx:xx:xx:xx字样。&lt;/p&gt;&#xA;&lt;p&gt;&lt;img src=&#34;./162_1.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;&#xA;&lt;hr&gt;&#xA;&lt;p&gt;连接成功后，点击MMI UT，可以看到耳机信息和参数配置：&lt;/p&gt;&#xA;&lt;p&gt;如下图所示，芯片型号为AB1562M，固件版本130.1.1.32&lt;/p&gt;&#xA;&lt;p&gt;&lt;img src=&#34;./162_2.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;往下滑，翻到页面最底部，就可以看到低延时模式的设置选项：&lt;/p&gt;&#xA;&lt;p&gt;默认都是Normal Mode(正常模式)，&lt;/p&gt;&#xA;&lt;p&gt;手动切换为Low Latency Mode(低延时模式)，然后点SET LATENCY STATUS设置模式。&lt;/p&gt;&#xA;&lt;p&gt;设置完之后，退出软件，就会发现游戏声音延时稍微降低了，大约还是有100多毫秒。&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;注意：这个模式设置不能永久保存，每次从盒子里拿出来，都要重新设置一次。&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;&lt;img src=&#34;./162_3.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;</description>
    </item>
    <item>
      <title>用python代替批处理脚本调用ffmpeg批量转换文件</title>
      <link>https://xcdd.pages.dev/blog/2020/2020-12-25/</link>
      <pubDate>Fri, 25 Dec 2020 14:41:17 +0000</pubDate>
      <guid>https://xcdd.pages.dev/blog/2020/2020-12-25/</guid>
      <description>&lt;p&gt;&lt;strong&gt;需求：把指定文件夹下面的所有MP4文件无损转换为TS文件&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;用windows批处理脚本也能实现，不过为了学习python，当然要多写多用。&lt;/p&gt;&#xA;&lt;p&gt;脚本思路很简单：&#xA;1.先输入要处理的文件夹&#xA;2.读取该文件夹下面的所有文件&#xA;3.遍历文件名,检查后缀是不是mp4&#xA;4.如果后缀是mp4则调用ffmpeg进行文件转换&lt;/p&gt;&#xA;&lt;hr&gt;&#xA;&lt;p&gt;调用ffmpeg进行mp4转ts的参数：ffmpeg.exe -v error -y -i file.mp4 -c copy file.ts&#xA;其中：&#xA;-v error       表示只打印错误日志，不加这个ffmpeg会在控制台输出很多日志。&#xA;-y               表示如果输出文件已经存在则直接替换，不加这个ffmpeg会询问yes/no，需要手动输入。&#xA;-i file.mp4 指定要转换的mp4文件路径&#xA;-c copy     表示不进行重编码，仅容器格式转换&#xA;file.ts        表示输出TS文件的路径&lt;/p&gt;&#xA;&lt;hr&gt;&#xA;&lt;p&gt;参考代码如下：&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-python&#34; data-lang=&#34;python&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;#!python&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;#批量调用ffmpeg，转换MP4为TS格式&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;#蒋晓岗&amp;lt;kerndev@foxmail.com&amp;gt;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;import&lt;/span&gt; os&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;#设置ffmpeg路径&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;EXE_PATH&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;D:&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;\\&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;ANSI&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;\\&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;FFmpeg&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;\\&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;ffmpeg.exe&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;#调用ffmpeg&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;def&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;call_ffmpeg&lt;/span&gt;(exe_path, src_path, dst_path):&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;cmd_line &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;%s&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt; -v error -y -i &amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;%s&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34; -c copy &amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;%s&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&amp;#39;&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;%&lt;/span&gt; (exe_path, src_path, dst_path)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;ret &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; os&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;system(cmd_line)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt; ret &lt;span style=&#34;color:#f92672&#34;&gt;==&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;:&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&#x9;print(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;-转换成功.&amp;#34;&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&#x9;&lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;True&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&lt;span style=&#34;color:#66d9ef&#34;&gt;else&lt;/span&gt;:&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&#x9;print(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;-转换失败:&amp;#34;&lt;/span&gt;, ret)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&#x9;&lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;False&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;#转换目录内的所有文件&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;def&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;process_dir&lt;/span&gt;(exe_path, src_dir, dst_dir):&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;print(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;处理目录:&amp;#34;&lt;/span&gt;, src_dir)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;not&lt;/span&gt; os&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;path&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;exists(src_dir):&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&#x9;print(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;该目录不存在!&amp;#34;&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&#x9;&lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;not&lt;/span&gt; os&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;path&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;exists(dst_dir):&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&#x9;os&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;mkdir(dst_dir)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;mp4_list &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; os&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;listdir(src_dir)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&lt;span style=&#34;color:#66d9ef&#34;&gt;for&lt;/span&gt; file &lt;span style=&#34;color:#f92672&#34;&gt;in&lt;/span&gt; mp4_list:&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&#x9;&lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt; file&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;endswith(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;.mp4&amp;#34;&lt;/span&gt;):&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&#x9;&#x9;print(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;+转换文件:&amp;#34;&lt;/span&gt;, file)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&#x9;&#x9;src_path &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; src_dir &lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt; file&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&#x9;&#x9;dst_path &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; dst_dir &lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt; file &lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;.ts&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&#x9;&#x9;call_ffmpeg(exe_path, src_path, dst_path)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&#x9;&#x9;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;print(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;处理目录完成.&amp;#34;&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;#程序入口&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;src_dir &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; input(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;输入目录:&amp;#34;&lt;/span&gt;) &lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;\\&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;dst_dir &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; input(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;输出目录:&amp;#34;&lt;/span&gt;) &lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;\\&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;process_dir(EXE_PATH, src_dir, dst_dir)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;最后，python大法好！&lt;/p&gt;</description>
    </item>
    <item>
      <title>在Keil MDK中无法使用gmtime函数进行时间戳转换</title>
      <link>https://xcdd.pages.dev/blog/2020/2020-12-24/</link>
      <pubDate>Thu, 24 Dec 2020 14:17:14 +0000</pubDate>
      <guid>https://xcdd.pages.dev/blog/2020/2020-12-24/</guid>
      <description>&lt;p&gt;硬件平台STM32，软件平台Keil MDK 5.18&lt;/p&gt;&#xA;&lt;p&gt;由于项目中需要用到UNIX时间戳和日历的来回转换，于是想到C库函数&amp;lt;time.h&amp;gt;里面有现成的函数可以使用。&lt;/p&gt;&#xA;&lt;p&gt;于直接使用mktime和gmtime两个函数进行时间戳转换，前者把日历转为时间戳，后者把时间戳转为日历。&lt;/p&gt;&#xA;&lt;hr&gt;&#xA;&lt;p&gt;但是程序运行起来发现，gmtime得到的日历数据为乱码！！！&lt;/p&gt;&#xA;&lt;p&gt;经过调试才发现，这个函数返回值是NULL啊！！！&lt;/p&gt;&#xA;&lt;p&gt;查看反汇编代码，简直惊呆，这是什么鬼操作？&lt;/p&gt;&#xA;&lt;p&gt;&lt;img src=&#34;./160_1.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;汇编代码没有函数跳转，取而代之的是MOVS R0, #0x00，直接返回0。&lt;/p&gt;&#xA;&lt;p&gt;看到这一幕，气炸，搞了个假的库函数给我啊。&lt;/p&gt;&#xA;&lt;p&gt;于是马上又换成另一个时间戳转转函数localtime，经测试发现这个函数工作得很好！&lt;/p&gt;&#xA;&lt;hr&gt;&#xA;&lt;p&gt;gmtime和localtime的区别就是，gmtime返回的是GMT标准时间，而localtime返回的是本地时间。&lt;/p&gt;&#xA;&lt;p&gt;何为本地时间？那就是带时区转换的时间，比如北京时间是东8区，与GMT时间相差8小时。&lt;/p&gt;&#xA;&lt;p&gt;然而MDK库函数并没有直接设置时区的函数，因此locatime返回的仍然是GMT时间。&lt;/p&gt;&#xA;&lt;p&gt;所以在使时localtime的时候，要先把时间戳加上28800秒（8小时）再进行转换，就能得到北京时间。&lt;/p&gt;&#xA;&lt;hr&gt;&#xA;&lt;p&gt;最后附上日历和时间戳相互转换的代码：&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;日历转时间戳&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;日历转时间戳使用mktime函数，参考代码如下：&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-cpp&#34; data-lang=&#34;cpp&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;void&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;date_to_timestamp&lt;/span&gt;(&lt;span style=&#34;color:#66d9ef&#34;&gt;struct&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;date&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;date, &lt;span style=&#34;color:#66d9ef&#34;&gt;uint32_t&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;timestamp)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;{&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;time_t times;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&lt;span style=&#34;color:#66d9ef&#34;&gt;struct&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;tm&lt;/span&gt; tm;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;tm.tm_year &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; date&lt;span style=&#34;color:#f92672&#34;&gt;-&amp;gt;&lt;/span&gt;year &lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;1900&lt;/span&gt;; &lt;span style=&#34;color:#75715e&#34;&gt;//C库函数的年份是从1900开始计算&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;&#x9;tm.tm_mon  &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; date&lt;span style=&#34;color:#f92672&#34;&gt;-&amp;gt;&lt;/span&gt;month &lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;;   &lt;span style=&#34;color:#75715e&#34;&gt;//C库函数的月份是用0表示1月&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;&#x9;tm.tm_mday &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; date&lt;span style=&#34;color:#f92672&#34;&gt;-&amp;gt;&lt;/span&gt;day;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;tm.tm_hour &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; date&lt;span style=&#34;color:#f92672&#34;&gt;-&amp;gt;&lt;/span&gt;hour;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;tm.tm_min  &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; date&lt;span style=&#34;color:#f92672&#34;&gt;-&amp;gt;&lt;/span&gt;minute;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;tm.tm_sec  &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; date&lt;span style=&#34;color:#f92672&#34;&gt;-&amp;gt;&lt;/span&gt;second;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;times &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; mktime(&lt;span style=&#34;color:#f92672&#34;&gt;&amp;amp;&lt;/span&gt;tm);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;timestamp &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; times &lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;28800&lt;/span&gt;;    &lt;span style=&#34;color:#75715e&#34;&gt;//北京时间:东8区偏移值&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;时间戳转日历&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;时间戳转日历使用localtime函数，参考代码如下：&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-cpp&#34; data-lang=&#34;cpp&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;void&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;timestamp_to_date&lt;/span&gt;(&lt;span style=&#34;color:#66d9ef&#34;&gt;uint32_t&lt;/span&gt; timestamp, &lt;span style=&#34;color:#66d9ef&#34;&gt;struct&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;date&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;date)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;{&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;time_t times;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&lt;span style=&#34;color:#66d9ef&#34;&gt;struct&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;tm&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;tm;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;times &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; timestamp &lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;28800&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;tm &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; localtime(&lt;span style=&#34;color:#f92672&#34;&gt;&amp;amp;&lt;/span&gt;times);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;date&lt;span style=&#34;color:#f92672&#34;&gt;-&amp;gt;&lt;/span&gt;year   &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; tm&lt;span style=&#34;color:#f92672&#34;&gt;-&amp;gt;&lt;/span&gt;tm_year &lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;1900&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;date&lt;span style=&#34;color:#f92672&#34;&gt;-&amp;gt;&lt;/span&gt;month  &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; tm&lt;span style=&#34;color:#f92672&#34;&gt;-&amp;gt;&lt;/span&gt;tm_mon &lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;date&lt;span style=&#34;color:#f92672&#34;&gt;-&amp;gt;&lt;/span&gt;day    &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; tm&lt;span style=&#34;color:#f92672&#34;&gt;-&amp;gt;&lt;/span&gt;tm_mday;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;date&lt;span style=&#34;color:#f92672&#34;&gt;-&amp;gt;&lt;/span&gt;hour   &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; tm&lt;span style=&#34;color:#f92672&#34;&gt;-&amp;gt;&lt;/span&gt;tm_hour;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;date&lt;span style=&#34;color:#f92672&#34;&gt;-&amp;gt;&lt;/span&gt;minute &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; tm&lt;span style=&#34;color:#f92672&#34;&gt;-&amp;gt;&lt;/span&gt;tm_min;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;date&lt;span style=&#34;color:#f92672&#34;&gt;-&amp;gt;&lt;/span&gt;second &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; tm&lt;span style=&#34;color:#f92672&#34;&gt;-&amp;gt;&lt;/span&gt;tm_sec;&#x9;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;PS：如果需要使用毫秒级的时间戳，可以直接把这个秒级的时间戳乘以1000，倒过来则除以1000。&lt;/p&gt;</description>
    </item>
    <item>
      <title>如何从HardFault异常中定位到错误代码</title>
      <link>https://xcdd.pages.dev/blog/2020/2020-12-18/</link>
      <pubDate>Fri, 18 Dec 2020 16:43:28 +0000</pubDate>
      <guid>https://xcdd.pages.dev/blog/2020/2020-12-18/</guid>
      <description>&lt;p&gt;调试Cortex-M处理器的程序，最常见的异常就是HardFault错误，这种错误一般是因为非法访问内存或者非法指令引起的，比如写空指针，程序跑飞等情况。&#xA;但常常出现HardFault异常后，难以直接定位到出错代码，只能通过读取栈顶数据来定位错误代码。&#xA;那么发生HardFault异常的栈顶数据该怎么解读？&lt;/p&gt;&#xA;&lt;hr&gt;&#xA;&lt;p&gt;在Cortex-M相关文档中异常模型章节可以找到一张图表，下图是Cortex-M4当异常发生时，硬件会自动往栈顶写入的数据结构。&#xA;从图中可以看出Cortex-M4有两种模式，一种是带FPU指针的结构，另一种是不带FPU的结构，其中不带FPU的结构和Cortex-M3是完全一样的。&#xA;即便两种模式的栈结构稍有差异，但其实栈顶的前8个数据都是一样的，分别是R0,R1,R2,R3,R12,LR,PC。&#xA;在发生HardFault错误时，我们最关心的就是LR和PC的值，PC代表发生错误的那条指令，LR代表当前函数返回后的下一条指令地址。&lt;/p&gt;&#xA;&lt;p&gt;&lt;img src=&#34;./159_1.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;&#xA;&lt;hr&gt;&#xA;&lt;p&gt;下面用实例来说明如何从HardFault错误时的栈顶数据找到出错代码。&#xA;用Keil写一段测试代码如下，bad函数指针指向无效地址，会引起非法指令异常，进入HardFault。&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-cpp&#34; data-lang=&#34;cpp&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;/*&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;* HardFault错误演示&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;* 蒋晓岗&amp;lt;kerndev@foxmail.com&amp;gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;*/&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;#include&lt;/span&gt; &lt;span style=&#34;color:#75715e&#34;&gt;&amp;lt;string.h&amp;gt;&lt;/span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;typedef&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;void&lt;/span&gt; (&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;bad_func)(&lt;span style=&#34;color:#66d9ef&#34;&gt;void&lt;/span&gt;);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;//跳转到无效地址,程序跑飞&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;void&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;fault&lt;/span&gt;(&lt;span style=&#34;color:#66d9ef&#34;&gt;void&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;{&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;bad_func bad;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;bad &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; (bad_func)&lt;span style=&#34;color:#ae81ff&#34;&gt;0xDEADDEAD&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;bad();&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;memset(bad, &lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;, &lt;span style=&#34;color:#66d9ef&#34;&gt;sizeof&lt;/span&gt;(bad));&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;main&lt;/span&gt;(&lt;span style=&#34;color:#66d9ef&#34;&gt;void&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;{&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;fault();&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&lt;span style=&#34;color:#66d9ef&#34;&gt;while&lt;/span&gt;(&lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;hr&gt;&#xA;&lt;p&gt;看看运行时的效果，程序一运行，马上就进入HardFault_Handler，此时查看实时寄存器的值SP=0x200003F0，PC=0x08080236这是一条死循环指令；&#xA;然后在右边的内存查看窗口中输入SP，按回车可以看到栈顶的内存数据，第一个数据20000060就是发生异常时R0寄存器的值，下面依次是R1,R2,R3,R12,LR,PC。&#xA;要定位到出错的代码，重点关注PC和LR的值。&#xA;栈顶数据中 &lt;strong&gt;PC=0xDEADDEAC，LR=0x080802E7.&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;&lt;img src=&#34;./159_2.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;在得到HardFault异常发生时的PC和LR值之后，我们就可以去反汇编窗口，右键选择“Show Disassembly at Address”，手动输入地址直接定位到该错误指令。&#xA;首先看PC=0xDEADDEAC，这是一个无效地址。&#xA;即使我们用反汇编去查看这个地址也是看不到任何有效汇编指令的，由此断定我们的程序一定是跑飞了。&#xA;但是为什么跑飞呢，我们只能继续分析LR的值，来寻找答案。&lt;/p&gt;&#xA;&lt;p&gt;然后看LR=0x080802E7，幸好这是一个位于FLASH代码段的地址，在反汇编地址中输入0x080802E6。&#xA;注解：为什么不是输入0x080802E7呢？因为LR的最低位表示的是指令类型ARM/Thumb，通常最低位都是1，因此要减去1。&#xA;&lt;img src=&#34;./159_3.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;从汇编窗口可以看到，LR指向的指令是MOVS R0,#0x00，通常情况下引发异常的元凶是它的上一条指令，BLX R4，这是一个函数调用，&#xA;引发HardFault异常的元凶就是这个函数调用，跳转到R4寄存器所指示的地址。&#xA;由于R4寄存器的值不在栈里保存，只能查看实时寄存器的值，左侧显示R4=0xDEADDEAD。&#xA;那么这就真相大白了，BLX跳转到0xDEADDEAD地址，该地址是无效地址，从该地址读取不到合法的指令，因此引发HardFault异常。&lt;/p&gt;&#xA;&lt;p&gt;注：明明跳转的地址是0xDEADDEAD，而HardFault之后栈顶PC的值是0xDEADDEAC呢？&#xA;因为Cortex-M是Thumb2指令集，是2字节对齐的，跳转指令会自动进行字节对齐。实际传入PC的值就是0xDEADDEAC。&lt;/p&gt;&#xA;&lt;hr&gt;&#xA;&lt;p&gt;总结：&lt;/p&gt;&#xA;&lt;p&gt;当程序进入HardFault异常时，我们可以通过在线调试器，读取SP内存，找到引发异常的PC指针，定位到错误的指令。&lt;/p&gt;&#xA;&lt;p&gt;如果此时PC指针是无效地址，那么还可以通过LR返回地址，推测出现异常的函数调用。&lt;/p&gt;</description>
    </item>
    <item>
      <title>win32实现飘浮文字的一种实现方法</title>
      <link>https://xcdd.pages.dev/blog/2020/2020-12-02/</link>
      <pubDate>Wed, 02 Dec 2020 14:40:09 +0000</pubDate>
      <guid>https://xcdd.pages.dev/blog/2020/2020-12-02/</guid>
      <description>&lt;p&gt;飘浮文字效果如下图：不可点击，不可选中，任务栏不显示图标，文字背景完全透明。&lt;/p&gt;&#xA;&lt;p&gt;&lt;img src=&#34;./158_1.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;&#xA;&lt;hr&gt;&#xA;&lt;p&gt;实现方法是通过创建透明窗口来实现，在透明窗口上绘制文字。&lt;/p&gt;&#xA;&lt;p&gt;主要依靠系统提供的窗口扩展风格：&lt;/p&gt;&#xA;&lt;p&gt;WS_EX_LAYERED             实现层级窗口&#xA;WS_EX_TRANSPARENT  实现鼠标穿透&#xA;WS_EX_TOOLWINDOW    实现不在任务栏显示&#xA;WS_EX_TOPMOST            实现文本置顶&lt;/p&gt;&#xA;&lt;p&gt;还有一个关键函数SetLayeredWindowAttributes(hWnd,0,0,LWA_COLORKEY);&lt;/p&gt;&#xA;&lt;p&gt;这个函数设置层级窗口的透明模式为COLORKEY，第2个参数指定的COLORKEY的颜色。&lt;/p&gt;&#xA;&lt;p&gt;在该窗口上绘制的COLORKEY颜色会被显示为透明，其它颜色则正常显示。&lt;/p&gt;&#xA;&lt;hr&gt;&#xA;&lt;p&gt;代码如下：&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-cpp&#34; data-lang=&#34;cpp&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;/************************************************************************&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;* Windows桌面飘浮文字DEMO&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;* 实现类似于弹幕的透明文字&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;* kerndev@foxmail.com&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;************************************************************************/&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;#define WINVER       0x0501&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;#define _WIN32_WINNT 0x0501&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;#include&lt;/span&gt; &lt;span style=&#34;color:#75715e&#34;&gt;&amp;lt;windows.h&amp;gt;&lt;/span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;#include&lt;/span&gt; &lt;span style=&#34;color:#75715e&#34;&gt;&amp;lt;tchar.h&amp;gt;&lt;/span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;//全局变量&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;HINSTANCE hInst;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;UINT nDesktopWidth;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;UINT nDesktopHeight;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;//绘制文本&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;static&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;void&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;FLOATTEXT_OnPaint&lt;/span&gt;(HWND hWnd)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;{&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;HDC hdc;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt; len;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;TCHAR text[&lt;span style=&#34;color:#ae81ff&#34;&gt;256&lt;/span&gt;];&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;PAINTSTRUCT ps;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;hdc &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; BeginPaint(hWnd,&lt;span style=&#34;color:#f92672&#34;&gt;&amp;amp;&lt;/span&gt;ps);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;SetBkMode(hdc,TRANSPARENT);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;SetTextColor(hdc,RGB(&lt;span style=&#34;color:#ae81ff&#34;&gt;255&lt;/span&gt;,&lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;,&lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;));&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;SelectObject(hdc, GetStockObject(SYSTEM_FIXED_FONT));&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;len &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; GetWindowText(hWnd,text,&lt;span style=&#34;color:#ae81ff&#34;&gt;256&lt;/span&gt;);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;TextOut(hdc,&lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;,&lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;,text,len);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;EndPaint(hWnd,&lt;span style=&#34;color:#f92672&#34;&gt;&amp;amp;&lt;/span&gt;ps);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;//窗口定时器,移动窗口&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;static&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;void&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;FLOATTEXT_OnTimer&lt;/span&gt;(HWND hWnd)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;{&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;RECT rc;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;GetWindowRect(hWnd,&lt;span style=&#34;color:#f92672&#34;&gt;&amp;amp;&lt;/span&gt;rc);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt;(rc.right &lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;{&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&#x9;OffsetRect(&lt;span style=&#34;color:#f92672&#34;&gt;&amp;amp;&lt;/span&gt;rc,&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;rc.left,&lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&#x9;OffsetRect(&lt;span style=&#34;color:#f92672&#34;&gt;&amp;amp;&lt;/span&gt;rc,nDesktopWidth,&lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;OffsetRect(&lt;span style=&#34;color:#f92672&#34;&gt;&amp;amp;&lt;/span&gt;rc,&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;,&lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;MoveWindow(hWnd,rc.left,rc.top,rc.right&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;rc.left,rc.bottom&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;rc.top,&lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;//初始化窗口属性&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;static&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;void&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;FLOATTEXT_OnCreate&lt;/span&gt;(HWND hWnd, LPCREATESTRUCT cs)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;{&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;SetLayeredWindowAttributes(hWnd,&lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;,&lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;,LWA_COLORKEY);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;SetTimer(hWnd,&lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;,&lt;span style=&#34;color:#ae81ff&#34;&gt;25&lt;/span&gt;,NULL);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;//窗口回调函数&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;static&lt;/span&gt; LRESULT CALLBACK &lt;span style=&#34;color:#a6e22e&#34;&gt;FLOATTEXT_WindowProc&lt;/span&gt;(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;{&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&lt;span style=&#34;color:#66d9ef&#34;&gt;switch&lt;/span&gt;(Msg)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;{&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&lt;span style=&#34;color:#66d9ef&#34;&gt;case&lt;/span&gt; WM_CREATE:&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&#x9;FLOATTEXT_OnCreate(hWnd, (LPCREATESTRUCT)lParam);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&#x9;&lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&lt;span style=&#34;color:#66d9ef&#34;&gt;case&lt;/span&gt; WM_TIMER:&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&#x9;FLOATTEXT_OnTimer(hWnd);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&#x9;&lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&lt;span style=&#34;color:#66d9ef&#34;&gt;case&lt;/span&gt; WM_PAINT:&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&#x9;FLOATTEXT_OnPaint(hWnd);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&#x9;&lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&lt;span style=&#34;color:#66d9ef&#34;&gt;case&lt;/span&gt; WM_DESTROY:&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&#x9;PostQuitMessage(&lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&#x9;&lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt; DefWindowProc(hWnd,Msg,wParam,lParam);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;//注册窗口类&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;BOOL &lt;span style=&#34;color:#a6e22e&#34;&gt;FLOATTEXT_Init&lt;/span&gt;(&lt;span style=&#34;color:#66d9ef&#34;&gt;void&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;{&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;WNDCLASS wc;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;wc.cbClsExtra &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;wc.cbWndExtra &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;wc.hbrBackground &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; (HBRUSH)GetStockObject(BLACK_BRUSH);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;wc.hCursor &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; NULL;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;wc.hIcon   &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; NULL;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;wc.hInstance &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; hInst;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;wc.lpfnWndProc &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; FLOATTEXT_WindowProc;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;wc.lpszClassName &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; _T(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;FLOATTEXT&amp;#34;&lt;/span&gt;);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;wc.lpszMenuName &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; NULL;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;wc.style &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; NULL;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt; RegisterClass(&lt;span style=&#34;color:#f92672&#34;&gt;&amp;amp;&lt;/span&gt;wc);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;//创建窗口&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;//WS_EX_LAYERED      实现窗口背景透明&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;//WS_EX_TRANSPARENT  实现鼠标穿透&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;//WS_EX_TOOLWINDOW   实现不在任务栏显示&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;//WS_EX_TOPMOST      实现文本置顶&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;BOOL &lt;span style=&#34;color:#a6e22e&#34;&gt;FLOATTEXT_Create&lt;/span&gt;(LPCTSTR text, &lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt; y)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;{&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;HWND hWnd;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;DWORD dwStyle;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;DWORD dwExStyle;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;dwStyle &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; WS_POPUP;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;dwExStyle &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; WS_EX_LAYERED&lt;span style=&#34;color:#f92672&#34;&gt;|&lt;/span&gt;WS_EX_TRANSPARENT&lt;span style=&#34;color:#f92672&#34;&gt;|&lt;/span&gt;WS_EX_TOPMOST&lt;span style=&#34;color:#f92672&#34;&gt;|&lt;/span&gt;WS_EX_TOOLWINDOW;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;hWnd &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; CreateWindowEx(dwExStyle,_T(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;FLOATTEXT&amp;#34;&lt;/span&gt;),text,dwStyle,nDesktopWidth,y,&lt;span style=&#34;color:#ae81ff&#34;&gt;250&lt;/span&gt;,&lt;span style=&#34;color:#ae81ff&#34;&gt;20&lt;/span&gt;,NULL,&lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;,&lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;,&lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt;(hWnd &lt;span style=&#34;color:#f92672&#34;&gt;!=&lt;/span&gt; NULL)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;{&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&#x9;ShowWindow(hWnd,SW_SHOWNOACTIVATE);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&#x9;&lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt; TRUE;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt; FALSE;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;void&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;AppInit&lt;/span&gt;(&lt;span style=&#34;color:#66d9ef&#34;&gt;void&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;{&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;FLOATTEXT_Init();&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;FLOATTEXT_Create(_T(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;漂浮文字&amp;lt;kerndev@foxmail.com&amp;gt;&amp;#34;&lt;/span&gt;),&lt;span style=&#34;color:#ae81ff&#34;&gt;100&lt;/span&gt;);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;void&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;AppLoop&lt;/span&gt;(&lt;span style=&#34;color:#66d9ef&#34;&gt;void&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;{&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;MSG msg;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&lt;span style=&#34;color:#66d9ef&#34;&gt;while&lt;/span&gt;(GetMessage(&lt;span style=&#34;color:#f92672&#34;&gt;&amp;amp;&lt;/span&gt;msg, NULL, &lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;, &lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;))&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;{&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&#x9;DispatchMessage(&lt;span style=&#34;color:#f92672&#34;&gt;&amp;amp;&lt;/span&gt;msg);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt; APIENTRY &lt;span style=&#34;color:#a6e22e&#34;&gt;_tWinMain&lt;/span&gt;(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPTSTR lpCmdLine,&lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt; nCmdShow)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;{&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;hInst &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; hInstance;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;nDesktopWidth &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; GetSystemMetrics(SM_CXSCREEN);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;nDesktopHeight&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; GetSystemMetrics(SM_CYSCREEN);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;AppInit();&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;AppLoop();&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description>
    </item>
    <item>
      <title>LWIP使用TCP自带的KEEPALIVE功能</title>
      <link>https://xcdd.pages.dev/blog/2020/2020-12-01/</link>
      <pubDate>Tue, 01 Dec 2020 17:10:51 +0000</pubDate>
      <guid>https://xcdd.pages.dev/blog/2020/2020-12-01/</guid>
      <description>&lt;p&gt;TCP_KEEPALIVE功能可以用来检测或保持基于TCP协议的客户端和服务器之间的链路畅通。&lt;/p&gt;&#xA;&lt;p&gt;当客户端和服务器之间长时间没有数据通信时，协议栈会发送一个特殊的空数据包，用来检测链路是否正常。&lt;/p&gt;&#xA;&lt;p&gt;接收到这个空数据包的一方会自动发送一个应答包，表示网络链路通信正常。&lt;/p&gt;&#xA;&lt;p&gt;发送方如果在规定的时间内没有收到应答包，则表示链路中断，自动断开TCP连接，并通知应用层TCP连接断开。&lt;/p&gt;&#xA;&lt;p&gt;整个交互逻辑完全在协议栈内完成，不需要在应用层做额外的工作，比较方便。&lt;/p&gt;&#xA;&lt;hr&gt;&#xA;&lt;p&gt;应用示例：&lt;/p&gt;&#xA;&lt;p&gt;如下图所示，两个交换机中间的网线损坏，导致网络通信失败，客户端与服务器端均不知道网线已经断开。&lt;/p&gt;&#xA;&lt;p&gt;只能通过应用层心跳包或者开启TCP_KEEPALIVE来实现断线检测。&lt;/p&gt;&#xA;&lt;p&gt;&lt;img src=&#34;./157_1.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;&#xA;&lt;hr&gt;&#xA;&lt;p&gt;LWIP目前的版本也支持TCP_KEEPALIVE功能，但默认是关闭状态。&lt;/p&gt;&#xA;&lt;p&gt;要使用LWIP的TCP_KEEPALIVE功能，需要如下配置：&lt;/p&gt;&#xA;&lt;p&gt;1.修改lwipopts.h添加以下内容：&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-cpp&#34; data-lang=&#34;cpp&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;//KEEPALIVE&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;#define LWIP_TCP_KEEPALIVE              1&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;#define TCP_KEEPIDLE_DEFAULT            3000    &lt;/span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;//3秒内双方无数据则发起保活探测&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;#define TCP_KEEPINTVL_DEFAULT           1000    &lt;/span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;//1秒发送一次保活探测&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;#define TCP_KEEPCNT_DEFAULT             3       &lt;/span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;//3次探测无响应则断开&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;2.创建TCP连接时，需要添加以下代码：&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-cpp&#34; data-lang=&#34;cpp&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;......&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;struct&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;tcp_pcb&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;pcb;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;pcb &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; tcp_new();&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;pcb&lt;span style=&#34;color:#f92672&#34;&gt;-&amp;gt;&lt;/span&gt;so_options &lt;span style=&#34;color:#f92672&#34;&gt;|=&lt;/span&gt; SOF_KEEPALIVE; &lt;span style=&#34;color:#75715e&#34;&gt;//开启TCP_KEEPALIVE标记&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;err &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; tcp_connect(ctx&lt;span style=&#34;color:#f92672&#34;&gt;-&amp;gt;&lt;/span&gt;pcb, &lt;span style=&#34;color:#f92672&#34;&gt;&amp;amp;&lt;/span&gt;ip, port, lwip_tcp_connect_callback);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;......&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;3.按照以上1，2方法开启KEEPALIVE功能之后，如果长时间没有发送或接收到数据，则会发起KEEPALIVE检测。&lt;/p&gt;&#xA;&lt;p&gt;如果发送3次探测都没有收到应答，LWIP则会断开这条TCP连接，应用层会收到remote closed的回调事件。&lt;/p&gt;</description>
    </item>
    <item>
      <title>电子称专用ADC芯片HX711驱动</title>
      <link>https://xcdd.pages.dev/blog/2020/2020-11-23/</link>
      <pubDate>Mon, 23 Nov 2020 09:10:01 +0000</pubDate>
      <guid>https://xcdd.pages.dev/blog/2020/2020-11-23/</guid>
      <description>&lt;h3 id=&#34;简介&#34;&gt;&lt;strong&gt;简介&lt;/strong&gt;&lt;/h3&gt;&#xA;&lt;p&gt;HX711是一个用于电子称的ADC芯片，分辨率为24bit，内置2个通道的低噪放大器，可选增益32/64/128倍。&lt;/p&gt;&#xA;&lt;p&gt;通道A可选增益64倍或128倍。当增益为64倍时，满量程为±40mV；当增益为128倍时，满量程为±20mV。&lt;/p&gt;&#xA;&lt;p&gt;通道B固定增益32倍。满量程为±80mV。&lt;/p&gt;&#xA;&lt;hr&gt;&#xA;&lt;h3 id=&#34;通信&#34;&gt;通信&lt;/h3&gt;&#xA;&lt;p&gt;HX711与MCU通信采用的是2线串行数据通信，一条时钟线(PD_SCK)，一条数据线(DOUT)。时序和SPI类似，但不是标准的SPI协议。&lt;/p&gt;&#xA;&lt;p&gt;它要求每次通信至少25个时钟，至多27个时钟。前面24个时钟传送ADC采样数据，后面3个时钟决定下次采样的通道和增益。&lt;/p&gt;&#xA;&lt;p&gt;ADC采样数据为24位有符号整数。&lt;/p&gt;&#xA;&lt;p&gt;注意：&#xA;1.如果PD_SCK保持高电平超过60us，芯片会进入掉电模式。重新拉低PD_SCK芯片会重新上电并复位。&#xA;2.数据线DOUT必须使用上拉才能正常通信，可以使用MCU的上拉输入模式，也可以在硬件上连接外部上拉电阻。&lt;/p&gt;&#xA;&lt;p&gt;&lt;img src=&#34;./156_1.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;&#xA;&lt;hr&gt;&#xA;&lt;h3 id=&#34;代码&#34;&gt;代码&lt;/h3&gt;&#xA;&lt;p&gt;以下代码仅供参考：&lt;/p&gt;&#xA;&lt;p&gt;硬件平台使用STM32，使用2个GPIO模拟时序读取采样数据，此处固定使用通道A，增益128。&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;#include &amp;#34;bsp.h&amp;#34;&#xD;&#xA;#include &amp;#34;delay.h&amp;#34;&#xD;&#xA;&#xD;&#xA;#define PIN_SCK PA,2&#xD;&#xA;#define PIN_SDA PA,3&#xD;&#xA;&#xD;&#xA;//连续发送25个时钟,读取ADC并设置下次采样为通道A，增益128&#xD;&#xA;int hx711_recv(void)&#xD;&#xA;{&#xD;&#xA;&#x9;int i;&#xD;&#xA;&#x9;uint32_t data;&#xD;&#xA;&#x9;data = 0;&#xD;&#xA;&#x9;gpio_write(PIN_SCK, 0);&#xD;&#xA;&#x9;while(gpio_read(PIN_SDA));&#xD;&#xA;&#x9;for(i=0; i&amp;lt;24; i++)&#xD;&#xA;&#x9;{&#xD;&#xA;&#x9;&#x9;gpio_write(PIN_SCK, 1);&#xD;&#xA;&#x9;&#x9;delay_us(1);&#xD;&#xA;&#x9;&#x9;gpio_write(PIN_SCK, 0);&#xD;&#xA;&#x9;&#x9;delay_us(1);&#xD;&#xA;&#x9;&#x9;data &amp;lt;&amp;lt;= 1;&#xD;&#xA;&#x9;&#x9;data |= gpio_read(PIN_SDA);&#xD;&#xA;&#x9;}&#xD;&#xA;&#x9;gpio_write(PIN_SCK, 1);&#xD;&#xA;&#x9;delay_us(1);&#xD;&#xA;&#x9;gpio_write(PIN_SCK, 0);&#xD;&#xA;&#x9;data &amp;lt;&amp;lt;= 8;&#xD;&#xA;&#x9;return ((int)(data)) &amp;gt;&amp;gt; 8;&#xD;&#xA;}&#xD;&#xA;&#xD;&#xA;//初始化GPIO&#xD;&#xA;void hx711_init(void)&#xD;&#xA;{&#xD;&#xA;&#x9;gpio_open(PIN_SDA, GPIO_MODE_IN, GPIO_IN_PULLUP);&#xD;&#xA;&#x9;gpio_open(PIN_SCK, GPIO_MODE_OUT, GPIO_OUT_PP);&#xD;&#xA;&#x9;gpio_write(PIN_SCK, 0);&#xD;&#xA;}&#xA;&lt;/code&gt;&lt;/pre&gt;</description>
    </item>
    <item>
      <title>LWIP&#43;ENC28J60长时间运行后无法访问外网服务器</title>
      <link>https://xcdd.pages.dev/blog/2020/2020-11-17/</link>
      <pubDate>Tue, 17 Nov 2020 09:53:27 +0000</pubDate>
      <guid>https://xcdd.pages.dev/blog/2020/2020-11-17/</guid>
      <description>&lt;p&gt;一台设备，硬件使用STM32+ENC28J60，协议栈使用LWIP-2.1.2版本。&lt;/p&gt;&#xA;&lt;p&gt;作为TCP客户端与外网的服务器通信，正常运行了约2个月后，出现出法连接服务器的故障，&lt;/p&gt;&#xA;&lt;p&gt;查看UART日志发现：使用lwip的函数tcp_connect建立连接，返回成功。但在等待连接成功的回调时，发生了error异常，错误代码是ERR_ABRT(-13)，一般表示连接超时。&lt;/p&gt;&#xA;&lt;p&gt;1.重新插拔网线，可以正常检测到网线断开和连接，说明网口芯片工作正常，网口的绿灯和黄灯也正常点亮。&lt;/p&gt;&#xA;&lt;p&gt;2.使用同局域网的电脑调用ping命令，可以正常ping通设备，再次说明网卡芯片是正常工作的，协议栈也没有崩溃。&lt;/p&gt;&#xA;&lt;p&gt;3.使用参数配置工具，将设备内的服务器IP地址改为局域网内的电脑，并在该电脑上启动一个TCP服务器调试程序，发现设备可以正常连接到该电脑，通信也正常。&lt;/p&gt;&#xA;&lt;p&gt;4.再次将设备内的服务器IP地址恢复为外网服务器，故障依旧，仍无法连接。&lt;/p&gt;&#xA;&lt;p&gt;5.将设备的网线插入到用于调试电脑，该电脑可以正常访问外网服务器，说明外网服务器也没有问题。&lt;/p&gt;&#xA;&lt;p&gt;6.无奈，只得重启设备，故障消失！&lt;/p&gt;&#xA;&lt;p&gt;最终还是没能定位到问题所在，困扰中&amp;hellip;&amp;hellip;&amp;hellip;&amp;hellip;&amp;hellip;&amp;hellip;..&lt;/p&gt;&#xA;&lt;hr&gt;&#xA;&lt;p&gt;2020.12.29&lt;/p&gt;&#xA;&lt;p&gt;经过一个多月的待机观察，终于发现了问题所在！&lt;/p&gt;&#xA;&lt;p&gt;这个是应用层软件功能的设计缺陷，不是网卡问题，也不是LWIP协议栈问题。&lt;/p&gt;&#xA;&lt;p&gt;本地的网关地址被修改了，导致无法访问外网！&lt;/p&gt;</description>
    </item>
    <item>
      <title>C语言参考代码: 绘制直线、圆、椭圆、贝塞尔曲线(作者:Alois Zingl)</title>
      <link>https://xcdd.pages.dev/blog/2020/2020-10-22/</link>
      <pubDate>Thu, 22 Oct 2020 10:05:31 +0000</pubDate>
      <guid>https://xcdd.pages.dev/blog/2020/2020-10-22/</guid>
      <description>&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-cpp&#34; data-lang=&#34;cpp&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;/********************************************************************&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;*                                                                   *&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;*                    Curve Rasterizing Algorithm                    *&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;*                                                                   *&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;********************************************************************/&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;/**&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt; * @author Zingl Alois&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt; * @date 22.08.2016&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt; * @version 1.2&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;*/&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;void&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;plotLine&lt;/span&gt;(&lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt; x0, &lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt; y0, &lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt; x1, &lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt; y1)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;{&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt; dx &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;  abs(x1&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;x0), sx &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; x0&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;&lt;/span&gt;x1 &lt;span style=&#34;color:#f92672&#34;&gt;?&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt; dy &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;abs(y1&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;y0), sy &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; y0&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;&lt;/span&gt;y1 &lt;span style=&#34;color:#f92672&#34;&gt;?&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt; err &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; dx&lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt;dy, e2;                                  &lt;span style=&#34;color:#75715e&#34;&gt;/* error value e_xy */&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;for&lt;/span&gt; (;;) {                                                        &lt;span style=&#34;color:#75715e&#34;&gt;/* loop */&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        setPixel(x0,y0);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        e2 &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;2&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;err;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt; (e2 &lt;span style=&#34;color:#f92672&#34;&gt;&amp;gt;=&lt;/span&gt; dy) {                                       &lt;span style=&#34;color:#75715e&#34;&gt;/* e_xy+e_x &amp;gt; 0 */&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt; (x0 &lt;span style=&#34;color:#f92672&#34;&gt;==&lt;/span&gt; x1) &lt;span style=&#34;color:#66d9ef&#34;&gt;break&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            err &lt;span style=&#34;color:#f92672&#34;&gt;+=&lt;/span&gt; dy; x0 &lt;span style=&#34;color:#f92672&#34;&gt;+=&lt;/span&gt; sx;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt; (e2 &lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;=&lt;/span&gt; dx) {                                       &lt;span style=&#34;color:#75715e&#34;&gt;/* e_xy+e_y &amp;lt; 0 */&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt; (y0 &lt;span style=&#34;color:#f92672&#34;&gt;==&lt;/span&gt; y1) &lt;span style=&#34;color:#66d9ef&#34;&gt;break&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            err &lt;span style=&#34;color:#f92672&#34;&gt;+=&lt;/span&gt; dx; y0 &lt;span style=&#34;color:#f92672&#34;&gt;+=&lt;/span&gt; sy;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;void&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;plotLine3d&lt;/span&gt; (&lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt; x0, &lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt; y0, &lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt; z0, &lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt; x1, &lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt; y1, &lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt; z1)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;{&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt; dx &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; abs(x1&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;x0), sx &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; x0 &lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;&lt;/span&gt; x1 &lt;span style=&#34;color:#f92672&#34;&gt;?&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt; dy &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; abs(y1&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;y0), sy &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; y0 &lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;&lt;/span&gt; y1 &lt;span style=&#34;color:#f92672&#34;&gt;?&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt; dz &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; abs(z1&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;z0), sz &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; z0 &lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;&lt;/span&gt; z1 &lt;span style=&#34;color:#f92672&#34;&gt;?&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt; dm &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; dx &lt;span style=&#34;color:#f92672&#34;&gt;&amp;gt;&lt;/span&gt; dy &lt;span style=&#34;color:#f92672&#34;&gt;&amp;amp;&amp;amp;&lt;/span&gt; dx &lt;span style=&#34;color:#f92672&#34;&gt;&amp;gt;&lt;/span&gt; dz &lt;span style=&#34;color:#f92672&#34;&gt;?&lt;/span&gt; dx : dy &lt;span style=&#34;color:#f92672&#34;&gt;&amp;gt;&lt;/span&gt; dz &lt;span style=&#34;color:#f92672&#34;&gt;?&lt;/span&gt; dy : dz, i &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; dm; &lt;span style=&#34;color:#75715e&#34;&gt;/* max diff */&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    x1 &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; y1 &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; z1 &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; dm&lt;span style=&#34;color:#f92672&#34;&gt;/&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;2&lt;/span&gt;;                                      &lt;span style=&#34;color:#75715e&#34;&gt;/* error offset */&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;for&lt;/span&gt; (;;) {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        setPixel(x0,y0,z0);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt; (i&lt;span style=&#34;color:#f92672&#34;&gt;--&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;==&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;) &lt;span style=&#34;color:#66d9ef&#34;&gt;break&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        x1 &lt;span style=&#34;color:#f92672&#34;&gt;-=&lt;/span&gt; dx; &lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt; (x1 &lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;) { x1 &lt;span style=&#34;color:#f92672&#34;&gt;+=&lt;/span&gt; dm; x0 &lt;span style=&#34;color:#f92672&#34;&gt;+=&lt;/span&gt; sx; }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        y1 &lt;span style=&#34;color:#f92672&#34;&gt;-=&lt;/span&gt; dy; &lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt; (y1 &lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;) { y1 &lt;span style=&#34;color:#f92672&#34;&gt;+=&lt;/span&gt; dm; y0 &lt;span style=&#34;color:#f92672&#34;&gt;+=&lt;/span&gt; sy; }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        z1 &lt;span style=&#34;color:#f92672&#34;&gt;-=&lt;/span&gt; dz; &lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt; (z1 &lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;) { z1 &lt;span style=&#34;color:#f92672&#34;&gt;+=&lt;/span&gt; dm; z0 &lt;span style=&#34;color:#f92672&#34;&gt;+=&lt;/span&gt; sz; }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;void&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;plotEllipse&lt;/span&gt;(&lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt; xm, &lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt; ym, &lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt; a, &lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt; b)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;{&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   &lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt; x &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;a, y &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;;           &lt;span style=&#34;color:#75715e&#34;&gt;/* II. quadrant from bottom left to top right */&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   &lt;span style=&#34;color:#66d9ef&#34;&gt;long&lt;/span&gt; e2 &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; (&lt;span style=&#34;color:#66d9ef&#34;&gt;long&lt;/span&gt;)b&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;b, err &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; (&lt;span style=&#34;color:#66d9ef&#34;&gt;long&lt;/span&gt;)x&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;(&lt;span style=&#34;color:#ae81ff&#34;&gt;2&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;e2&lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt;x)&lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt;e2;         &lt;span style=&#34;color:#75715e&#34;&gt;/* error of 1.step */&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   &lt;span style=&#34;color:#66d9ef&#34;&gt;do&lt;/span&gt; {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;       setPixel(xm&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;x, ym&lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt;y);                                 &lt;span style=&#34;color:#75715e&#34;&gt;/*   I. Quadrant */&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;       setPixel(xm&lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt;x, ym&lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt;y);                                 &lt;span style=&#34;color:#75715e&#34;&gt;/*  II. Quadrant */&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;       setPixel(xm&lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt;x, ym&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;y);                                 &lt;span style=&#34;color:#75715e&#34;&gt;/* III. Quadrant */&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;       setPixel(xm&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;x, ym&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;y);                                 &lt;span style=&#34;color:#75715e&#34;&gt;/*  IV. Quadrant */&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;       e2 &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;2&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;err;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;       &lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt; (e2 &lt;span style=&#34;color:#f92672&#34;&gt;&amp;gt;=&lt;/span&gt; (x&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;2&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;)&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;(&lt;span style=&#34;color:#66d9ef&#34;&gt;long&lt;/span&gt;)b&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;b)                           &lt;span style=&#34;color:#75715e&#34;&gt;/* e_xy+e_x &amp;gt; 0 */&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;          err &lt;span style=&#34;color:#f92672&#34;&gt;+=&lt;/span&gt; (&lt;span style=&#34;color:#f92672&#34;&gt;++&lt;/span&gt;x&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;2&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;)&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;(&lt;span style=&#34;color:#66d9ef&#34;&gt;long&lt;/span&gt;)b&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;b;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;       &lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt; (e2 &lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;=&lt;/span&gt; (y&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;2&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;)&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;(&lt;span style=&#34;color:#66d9ef&#34;&gt;long&lt;/span&gt;)a&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;a)                           &lt;span style=&#34;color:#75715e&#34;&gt;/* e_xy+e_y &amp;lt; 0 */&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;          err &lt;span style=&#34;color:#f92672&#34;&gt;+=&lt;/span&gt; (&lt;span style=&#34;color:#f92672&#34;&gt;++&lt;/span&gt;y&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;2&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;)&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;(&lt;span style=&#34;color:#66d9ef&#34;&gt;long&lt;/span&gt;)a&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;a;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   } &lt;span style=&#34;color:#66d9ef&#34;&gt;while&lt;/span&gt; (x &lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;=&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   &lt;span style=&#34;color:#66d9ef&#34;&gt;while&lt;/span&gt; (y&lt;span style=&#34;color:#f92672&#34;&gt;++&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;&lt;/span&gt; b) {                  &lt;span style=&#34;color:#75715e&#34;&gt;/* too early stop of flat ellipses a=1, */&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;       setPixel(xm, ym&lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt;y);                        &lt;span style=&#34;color:#75715e&#34;&gt;/* -&amp;gt; finish tip of ellipse */&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;       setPixel(xm, ym&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;y);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;void&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;plotOptimizedEllipse&lt;/span&gt;(&lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt; xm, &lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt; ym, &lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt; a, &lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt; b)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;{&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   &lt;span style=&#34;color:#66d9ef&#34;&gt;long&lt;/span&gt; x &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;a, y &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;;          &lt;span style=&#34;color:#75715e&#34;&gt;/* II. quadrant from bottom left to top right */&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   &lt;span style=&#34;color:#66d9ef&#34;&gt;long&lt;/span&gt; e2 &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; b, dx &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; (&lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;2&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;x)&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;e2&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;e2;                       &lt;span style=&#34;color:#75715e&#34;&gt;/* error increment  */&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   &lt;span style=&#34;color:#66d9ef&#34;&gt;long&lt;/span&gt; dy &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; x&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;x, err &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; dx&lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt;dy;                             &lt;span style=&#34;color:#75715e&#34;&gt;/* error of 1.step */&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   &lt;span style=&#34;color:#66d9ef&#34;&gt;do&lt;/span&gt; {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;       setPixel(xm&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;x, ym&lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt;y);                                 &lt;span style=&#34;color:#75715e&#34;&gt;/*   I. Quadrant */&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;       setPixel(xm&lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt;x, ym&lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt;y);                                 &lt;span style=&#34;color:#75715e&#34;&gt;/*  II. Quadrant */&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;       setPixel(xm&lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt;x, ym&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;y);                                 &lt;span style=&#34;color:#75715e&#34;&gt;/* III. Quadrant */&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;       setPixel(xm&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;x, ym&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;y);                                 &lt;span style=&#34;color:#75715e&#34;&gt;/*  IV. Quadrant */&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;       e2 &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;2&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;err;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;       &lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt; (e2 &lt;span style=&#34;color:#f92672&#34;&gt;&amp;gt;=&lt;/span&gt; dx) { x&lt;span style=&#34;color:#f92672&#34;&gt;++&lt;/span&gt;; err &lt;span style=&#34;color:#f92672&#34;&gt;+=&lt;/span&gt; dx &lt;span style=&#34;color:#f92672&#34;&gt;+=&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;2&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;(&lt;span style=&#34;color:#66d9ef&#34;&gt;long&lt;/span&gt;)b&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;b; }             &lt;span style=&#34;color:#75715e&#34;&gt;/* x step */&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;       &lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt; (e2 &lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;=&lt;/span&gt; dy) { y&lt;span style=&#34;color:#f92672&#34;&gt;++&lt;/span&gt;; err &lt;span style=&#34;color:#f92672&#34;&gt;+=&lt;/span&gt; dy &lt;span style=&#34;color:#f92672&#34;&gt;+=&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;2&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;(&lt;span style=&#34;color:#66d9ef&#34;&gt;long&lt;/span&gt;)a&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;a; }             &lt;span style=&#34;color:#75715e&#34;&gt;/* y step */&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   } &lt;span style=&#34;color:#66d9ef&#34;&gt;while&lt;/span&gt; (x &lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;=&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   &lt;span style=&#34;color:#66d9ef&#34;&gt;while&lt;/span&gt; (y&lt;span style=&#34;color:#f92672&#34;&gt;++&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;&lt;/span&gt; b) {            &lt;span style=&#34;color:#75715e&#34;&gt;/* too early stop for flat ellipses with a=1, */&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;       setPixel(xm, ym&lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt;y);                        &lt;span style=&#34;color:#75715e&#34;&gt;/* -&amp;gt; finish tip of ellipse */&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;       setPixel(xm, ym&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;y);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;void&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;plotCircle&lt;/span&gt;(&lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt; xm, &lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt; ym, &lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt; r)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;{&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   &lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt; x &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;r, y &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;, err &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;2&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;2&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;r;                &lt;span style=&#34;color:#75715e&#34;&gt;/* bottom left to top right */&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   &lt;span style=&#34;color:#66d9ef&#34;&gt;do&lt;/span&gt; {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      setPixel(xm&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;x, ym&lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt;y);                            &lt;span style=&#34;color:#75715e&#34;&gt;/*   I. Quadrant +x +y */&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      setPixel(xm&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;y, ym&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;x);                            &lt;span style=&#34;color:#75715e&#34;&gt;/*  II. Quadrant -x +y */&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      setPixel(xm&lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt;x, ym&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;y);                            &lt;span style=&#34;color:#75715e&#34;&gt;/* III. Quadrant -x -y */&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      setPixel(xm&lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt;y, ym&lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt;x);                            &lt;span style=&#34;color:#75715e&#34;&gt;/*  IV. Quadrant +x -y */&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      r &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; err;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt; (r &lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;=&lt;/span&gt; y) err &lt;span style=&#34;color:#f92672&#34;&gt;+=&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;++&lt;/span&gt;y&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;2&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;;                             &lt;span style=&#34;color:#75715e&#34;&gt;/* e_xy+e_y &amp;lt; 0 */&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt; (r &lt;span style=&#34;color:#f92672&#34;&gt;&amp;gt;&lt;/span&gt; x &lt;span style=&#34;color:#f92672&#34;&gt;||&lt;/span&gt; err &lt;span style=&#34;color:#f92672&#34;&gt;&amp;gt;&lt;/span&gt; y)                  &lt;span style=&#34;color:#75715e&#34;&gt;/* e_xy+e_x &amp;gt; 0 or no 2nd y-step */&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;         err &lt;span style=&#34;color:#f92672&#34;&gt;+=&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;++&lt;/span&gt;x&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;2&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;;                                     &lt;span style=&#34;color:#75715e&#34;&gt;/* -&amp;gt; x-step now */&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   } &lt;span style=&#34;color:#66d9ef&#34;&gt;while&lt;/span&gt; (x &lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;void&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;plotEllipseRect&lt;/span&gt;(&lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt; x0, &lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt; y0, &lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt; x1, &lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt; y1)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;{                              &lt;span style=&#34;color:#75715e&#34;&gt;/* rectangular parameter enclosing the ellipse */&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   &lt;span style=&#34;color:#66d9ef&#34;&gt;long&lt;/span&gt; a &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; abs(x1&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;x0), b &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; abs(y1&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;y0), b1 &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; b&lt;span style=&#34;color:#f92672&#34;&gt;&amp;amp;&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;;                 &lt;span style=&#34;color:#75715e&#34;&gt;/* diameter */&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   &lt;span style=&#34;color:#66d9ef&#34;&gt;double&lt;/span&gt; dx &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;4&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;(&lt;span style=&#34;color:#ae81ff&#34;&gt;1.0&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;a)&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;b&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;b, dy &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;4&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;(b1&lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;)&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;a&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;a;           &lt;span style=&#34;color:#75715e&#34;&gt;/* error increment */&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   &lt;span style=&#34;color:#66d9ef&#34;&gt;double&lt;/span&gt; err &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; dx&lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt;dy&lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt;b1&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;a&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;a, e2;                          &lt;span style=&#34;color:#75715e&#34;&gt;/* error of 1.step */&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   &lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt; (x0 &lt;span style=&#34;color:#f92672&#34;&gt;&amp;gt;&lt;/span&gt; x1) { x0 &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; x1; x1 &lt;span style=&#34;color:#f92672&#34;&gt;+=&lt;/span&gt; a; }        &lt;span style=&#34;color:#75715e&#34;&gt;/* if called with swapped points */&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   &lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt; (y0 &lt;span style=&#34;color:#f92672&#34;&gt;&amp;gt;&lt;/span&gt; y1) y0 &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; y1;                                  &lt;span style=&#34;color:#75715e&#34;&gt;/* .. exchange them */&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   y0 &lt;span style=&#34;color:#f92672&#34;&gt;+=&lt;/span&gt; (b&lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;)&lt;span style=&#34;color:#f92672&#34;&gt;/&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;2&lt;/span&gt;; y1 &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; y0&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;b1;                               &lt;span style=&#34;color:#75715e&#34;&gt;/* starting pixel */&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   a &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;8&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;a&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;a; b1 &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;8&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;b&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;b;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   &lt;span style=&#34;color:#66d9ef&#34;&gt;do&lt;/span&gt; {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      setPixel(x1, y0);                                      &lt;span style=&#34;color:#75715e&#34;&gt;/*   I. Quadrant */&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      setPixel(x0, y0);                                      &lt;span style=&#34;color:#75715e&#34;&gt;/*  II. Quadrant */&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      setPixel(x0, y1);                                      &lt;span style=&#34;color:#75715e&#34;&gt;/* III. Quadrant */&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      setPixel(x1, y1);                                      &lt;span style=&#34;color:#75715e&#34;&gt;/*  IV. Quadrant */&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      e2 &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;2&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;err;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt; (e2 &lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;=&lt;/span&gt; dy) { y0&lt;span style=&#34;color:#f92672&#34;&gt;++&lt;/span&gt;; y1&lt;span style=&#34;color:#f92672&#34;&gt;--&lt;/span&gt;; err &lt;span style=&#34;color:#f92672&#34;&gt;+=&lt;/span&gt; dy &lt;span style=&#34;color:#f92672&#34;&gt;+=&lt;/span&gt; a; }                 &lt;span style=&#34;color:#75715e&#34;&gt;/* y step */&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt; (e2 &lt;span style=&#34;color:#f92672&#34;&gt;&amp;gt;=&lt;/span&gt; dx &lt;span style=&#34;color:#f92672&#34;&gt;||&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;2&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;err &lt;span style=&#34;color:#f92672&#34;&gt;&amp;gt;&lt;/span&gt; dy) { x0&lt;span style=&#34;color:#f92672&#34;&gt;++&lt;/span&gt;; x1&lt;span style=&#34;color:#f92672&#34;&gt;--&lt;/span&gt;; err &lt;span style=&#34;color:#f92672&#34;&gt;+=&lt;/span&gt; dx &lt;span style=&#34;color:#f92672&#34;&gt;+=&lt;/span&gt; b1; }  &lt;span style=&#34;color:#75715e&#34;&gt;/* x step */&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   } &lt;span style=&#34;color:#66d9ef&#34;&gt;while&lt;/span&gt; (x0 &lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;=&lt;/span&gt; x1);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   &lt;span style=&#34;color:#66d9ef&#34;&gt;while&lt;/span&gt; (y0&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;y1 &lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;=&lt;/span&gt; b) {                &lt;span style=&#34;color:#75715e&#34;&gt;/* too early stop of flat ellipses a=1 */&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      setPixel(x0&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;, y0);                         &lt;span style=&#34;color:#75715e&#34;&gt;/* -&amp;gt; finish tip of ellipse */&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      setPixel(x1&lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;, y0&lt;span style=&#34;color:#f92672&#34;&gt;++&lt;/span&gt;);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      setPixel(x0&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;, y1);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      setPixel(x1&lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;, y1&lt;span style=&#34;color:#f92672&#34;&gt;--&lt;/span&gt;);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;void&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;plotQuadBezierSeg&lt;/span&gt;(&lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt; x0, &lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt; y0, &lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt; x1, &lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt; y1, &lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt; x2, &lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt; y2)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;{                                  &lt;span style=&#34;color:#75715e&#34;&gt;/* plot a limited quadratic Bezier segment */&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt; sx &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; x2&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;x1, sy &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; y2&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;y1;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#66d9ef&#34;&gt;long&lt;/span&gt; xx &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; x0&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;x1, yy &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; y0&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;y1, xy;              &lt;span style=&#34;color:#75715e&#34;&gt;/* relative values for checks */&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#66d9ef&#34;&gt;double&lt;/span&gt; dx, dy, err, cur &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; xx&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;sy&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;yy&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;sx;                         &lt;span style=&#34;color:#75715e&#34;&gt;/* curvature */&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  assert(xx&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;sx &lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;=&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;&amp;amp;&amp;amp;&lt;/span&gt; yy&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;sy &lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;=&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;);       &lt;span style=&#34;color:#75715e&#34;&gt;/* sign of gradient must not change */&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt; (sx&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;(&lt;span style=&#34;color:#66d9ef&#34;&gt;long&lt;/span&gt;)sx&lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt;sy&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;(&lt;span style=&#34;color:#66d9ef&#34;&gt;long&lt;/span&gt;)sy &lt;span style=&#34;color:#f92672&#34;&gt;&amp;gt;&lt;/span&gt; xx&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;xx&lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt;yy&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;yy) {      &lt;span style=&#34;color:#75715e&#34;&gt;/* begin with longer part */&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    x2 &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; x0; x0 &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; sx&lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt;x1; y2 &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; y0; y0 &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; sy&lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt;y1; cur &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;cur;       &lt;span style=&#34;color:#75715e&#34;&gt;/* swap P0 P2 */&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt; (cur &lt;span style=&#34;color:#f92672&#34;&gt;!=&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;) {                                         &lt;span style=&#34;color:#75715e&#34;&gt;/* no straight line */&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    xx &lt;span style=&#34;color:#f92672&#34;&gt;+=&lt;/span&gt; sx; xx &lt;span style=&#34;color:#f92672&#34;&gt;*=&lt;/span&gt; sx &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; x0 &lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;&lt;/span&gt; x2 &lt;span style=&#34;color:#f92672&#34;&gt;?&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;;                &lt;span style=&#34;color:#75715e&#34;&gt;/* x step direction */&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    yy &lt;span style=&#34;color:#f92672&#34;&gt;+=&lt;/span&gt; sy; yy &lt;span style=&#34;color:#f92672&#34;&gt;*=&lt;/span&gt; sy &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; y0 &lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;&lt;/span&gt; y2 &lt;span style=&#34;color:#f92672&#34;&gt;?&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;;                &lt;span style=&#34;color:#75715e&#34;&gt;/* y step direction */&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    xy &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;2&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;xx&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;yy; xx &lt;span style=&#34;color:#f92672&#34;&gt;*=&lt;/span&gt; xx; yy &lt;span style=&#34;color:#f92672&#34;&gt;*=&lt;/span&gt; yy;               &lt;span style=&#34;color:#75715e&#34;&gt;/* differences 2nd degree */&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt; (cur&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;sx&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;sy &lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;) {                                &lt;span style=&#34;color:#75715e&#34;&gt;/* negated curvature? */&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      xx &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;xx; yy &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;yy; xy &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;xy; cur &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;cur;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    dx &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;4.0&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;sy&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;cur&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;(x1&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;x0)&lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt;xx&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;xy;                  &lt;span style=&#34;color:#75715e&#34;&gt;/* differences 1st degree */&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    dy &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;4.0&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;sx&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;cur&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;(y0&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;y1)&lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt;yy&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;xy;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    xx &lt;span style=&#34;color:#f92672&#34;&gt;+=&lt;/span&gt; xx; yy &lt;span style=&#34;color:#f92672&#34;&gt;+=&lt;/span&gt; yy; err &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; dx&lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt;dy&lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt;xy;                     &lt;span style=&#34;color:#75715e&#34;&gt;/* error 1st step */&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;do&lt;/span&gt; {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      setPixel(x0,y0);                                          &lt;span style=&#34;color:#75715e&#34;&gt;/* plot curve */&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt; (x0 &lt;span style=&#34;color:#f92672&#34;&gt;==&lt;/span&gt; x2 &lt;span style=&#34;color:#f92672&#34;&gt;&amp;amp;&amp;amp;&lt;/span&gt; y0 &lt;span style=&#34;color:#f92672&#34;&gt;==&lt;/span&gt; y2) &lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt;;       &lt;span style=&#34;color:#75715e&#34;&gt;/* last pixel -&amp;gt; curve finished */&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      y1 &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;2&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;err &lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;&lt;/span&gt; dx;                       &lt;span style=&#34;color:#75715e&#34;&gt;/* save value for test of y step */&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt; (&lt;span style=&#34;color:#ae81ff&#34;&gt;2&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;err &lt;span style=&#34;color:#f92672&#34;&gt;&amp;gt;&lt;/span&gt; dy) { x0 &lt;span style=&#34;color:#f92672&#34;&gt;+=&lt;/span&gt; sx; dx &lt;span style=&#34;color:#f92672&#34;&gt;-=&lt;/span&gt; xy; err &lt;span style=&#34;color:#f92672&#34;&gt;+=&lt;/span&gt; dy &lt;span style=&#34;color:#f92672&#34;&gt;+=&lt;/span&gt; yy; }      &lt;span style=&#34;color:#75715e&#34;&gt;/* x step */&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt; (    y1    ) { y0 &lt;span style=&#34;color:#f92672&#34;&gt;+=&lt;/span&gt; sy; dy &lt;span style=&#34;color:#f92672&#34;&gt;-=&lt;/span&gt; xy; err &lt;span style=&#34;color:#f92672&#34;&gt;+=&lt;/span&gt; dx &lt;span style=&#34;color:#f92672&#34;&gt;+=&lt;/span&gt; xx; }      &lt;span style=&#34;color:#75715e&#34;&gt;/* y step */&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    } &lt;span style=&#34;color:#66d9ef&#34;&gt;while&lt;/span&gt; (dy &lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;&amp;amp;&amp;amp;&lt;/span&gt; dx &lt;span style=&#34;color:#f92672&#34;&gt;&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;);        &lt;span style=&#34;color:#75715e&#34;&gt;/* gradient negates -&amp;gt; algorithm fails */&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  plotLine(x0,y0, x2,y2);                       &lt;span style=&#34;color:#75715e&#34;&gt;/* plot remaining part to end */&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;void&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;plotQuadBezier&lt;/span&gt;(&lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt; x0, &lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt; y0, &lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt; x1, &lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt; y1, &lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt; x2, &lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt; y2)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;{                                          &lt;span style=&#34;color:#75715e&#34;&gt;/* plot any quadratic Bezier curve */&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   &lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt; x &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; x0&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;x1, y &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; y0&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;y1;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   &lt;span style=&#34;color:#66d9ef&#34;&gt;double&lt;/span&gt; t &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; x0&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;2&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;x1&lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt;x2, r;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   &lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt; ((&lt;span style=&#34;color:#66d9ef&#34;&gt;long&lt;/span&gt;)x&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;(x2&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;x1) &lt;span style=&#34;color:#f92672&#34;&gt;&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;) {                        &lt;span style=&#34;color:#75715e&#34;&gt;/* horizontal cut at P4? */&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt; ((&lt;span style=&#34;color:#66d9ef&#34;&gt;long&lt;/span&gt;)y&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;(y2&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;y1) &lt;span style=&#34;color:#f92672&#34;&gt;&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;)                     &lt;span style=&#34;color:#75715e&#34;&gt;/* vertical cut at P6 too? */&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;         &lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt; (fabs((y0&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;2&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;y1&lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt;y2)&lt;span style=&#34;color:#f92672&#34;&gt;/&lt;/span&gt;t&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;x) &lt;span style=&#34;color:#f92672&#34;&gt;&amp;gt;&lt;/span&gt; abs(y)) {               &lt;span style=&#34;color:#75715e&#34;&gt;/* which first? */&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            x0 &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; x2; x2 &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; x&lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt;x1; y0 &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; y2; y2 &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; y&lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt;y1;            &lt;span style=&#34;color:#75715e&#34;&gt;/* swap points */&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;         }                            &lt;span style=&#34;color:#75715e&#34;&gt;/* now horizontal cut at P4 comes first */&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      t &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; (x0&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;x1)&lt;span style=&#34;color:#f92672&#34;&gt;/&lt;/span&gt;t;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      r &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; (&lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;t)&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;((&lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;t)&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;y0&lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;2.0&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;t&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;y1)&lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt;t&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;t&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;y2;                       &lt;span style=&#34;color:#75715e&#34;&gt;/* By(t=P4) */&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      t &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; (x0&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;x2&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;x1&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;x1)&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;t&lt;span style=&#34;color:#f92672&#34;&gt;/&lt;/span&gt;(x0&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;x1);                       &lt;span style=&#34;color:#75715e&#34;&gt;/* gradient dP4/dx=0 */&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      x &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; floor(t&lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;0.5&lt;/span&gt;); y &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; floor(r&lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;0.5&lt;/span&gt;);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      r &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; (y1&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;y0)&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;(t&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;x0)&lt;span style=&#34;color:#f92672&#34;&gt;/&lt;/span&gt;(x1&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;x0)&lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt;y0;                  &lt;span style=&#34;color:#75715e&#34;&gt;/* intersect P3 | P0 P1 */&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      plotQuadBezierSeg(x0,y0, x,floor(r&lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;0.5&lt;/span&gt;), x,y);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      r &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; (y1&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;y2)&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;(t&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;x2)&lt;span style=&#34;color:#f92672&#34;&gt;/&lt;/span&gt;(x1&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;x2)&lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt;y2;                  &lt;span style=&#34;color:#75715e&#34;&gt;/* intersect P4 | P1 P2 */&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      x0 &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; x1 &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; x; y0 &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; y; y1 &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; floor(r&lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;0.5&lt;/span&gt;);             &lt;span style=&#34;color:#75715e&#34;&gt;/* P0 = P4, P1 = P8 */&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   &lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt; ((&lt;span style=&#34;color:#66d9ef&#34;&gt;long&lt;/span&gt;)(y0&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;y1)&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;(y2&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;y1) &lt;span style=&#34;color:#f92672&#34;&gt;&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;) {                    &lt;span style=&#34;color:#75715e&#34;&gt;/* vertical cut at P6? */&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      t &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; y0&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;2&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;y1&lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt;y2; t &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; (y0&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;y1)&lt;span style=&#34;color:#f92672&#34;&gt;/&lt;/span&gt;t;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      r &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; (&lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;t)&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;((&lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;t)&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;x0&lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;2.0&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;t&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;x1)&lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt;t&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;t&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;x2;                       &lt;span style=&#34;color:#75715e&#34;&gt;/* Bx(t=P6) */&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      t &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; (y0&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;y2&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;y1&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;y1)&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;t&lt;span style=&#34;color:#f92672&#34;&gt;/&lt;/span&gt;(y0&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;y1);                       &lt;span style=&#34;color:#75715e&#34;&gt;/* gradient dP6/dy=0 */&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      x &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; floor(r&lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;0.5&lt;/span&gt;); y &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; floor(t&lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;0.5&lt;/span&gt;);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      r &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; (x1&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;x0)&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;(t&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;y0)&lt;span style=&#34;color:#f92672&#34;&gt;/&lt;/span&gt;(y1&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;y0)&lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt;x0;                  &lt;span style=&#34;color:#75715e&#34;&gt;/* intersect P6 | P0 P1 */&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      plotQuadBezierSeg(x0,y0, floor(r&lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;0.5&lt;/span&gt;),y, x,y);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      r &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; (x1&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;x2)&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;(t&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;y2)&lt;span style=&#34;color:#f92672&#34;&gt;/&lt;/span&gt;(y1&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;y2)&lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt;x2;                  &lt;span style=&#34;color:#75715e&#34;&gt;/* intersect P7 | P1 P2 */&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      x0 &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; x; x1 &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; floor(r&lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;0.5&lt;/span&gt;); y0 &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; y1 &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; y;             &lt;span style=&#34;color:#75715e&#34;&gt;/* P0 = P6, P1 = P7 */&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   plotQuadBezierSeg(x0,y0, x1,y1, x2,y2);                  &lt;span style=&#34;color:#75715e&#34;&gt;/* remaining part */&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;void&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;plotQuadRationalBezierSeg&lt;/span&gt;(&lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt; x0, &lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt; y0, &lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt; x1, &lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt; y1,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                               &lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt; x2, &lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt; y2, &lt;span style=&#34;color:#66d9ef&#34;&gt;float&lt;/span&gt; w)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;{                   &lt;span style=&#34;color:#75715e&#34;&gt;/* plot a limited rational Bezier segment, squared weight */&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt; sx &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; x2&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;x1, sy &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; y2&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;y1;                   &lt;span style=&#34;color:#75715e&#34;&gt;/* relative values for checks */&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#66d9ef&#34;&gt;double&lt;/span&gt; dx &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; x0&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;x2, dy &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; y0&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;y2, xx &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; x0&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;x1, yy &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; y0&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;y1;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#66d9ef&#34;&gt;double&lt;/span&gt; xy &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; xx&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;sy&lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt;yy&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;sx, cur &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; xx&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;sy&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;yy&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;sx, err;               &lt;span style=&#34;color:#75715e&#34;&gt;/* curvature */&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  assert(xx&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;sx &lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;=&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;0.0&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;&amp;amp;&amp;amp;&lt;/span&gt; yy&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;sy &lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;=&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;0.0&lt;/span&gt;);   &lt;span style=&#34;color:#75715e&#34;&gt;/* sign of gradient must not change */&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt; (cur &lt;span style=&#34;color:#f92672&#34;&gt;!=&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;0.0&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;&amp;amp;&amp;amp;&lt;/span&gt; w &lt;span style=&#34;color:#f92672&#34;&gt;&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;0.0&lt;/span&gt;) {                            &lt;span style=&#34;color:#75715e&#34;&gt;/* no straight line */&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt; (sx&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;(&lt;span style=&#34;color:#66d9ef&#34;&gt;long&lt;/span&gt;)sx&lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt;sy&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;(&lt;span style=&#34;color:#66d9ef&#34;&gt;long&lt;/span&gt;)sy &lt;span style=&#34;color:#f92672&#34;&gt;&amp;gt;&lt;/span&gt; xx&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;xx&lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt;yy&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;yy) {    &lt;span style=&#34;color:#75715e&#34;&gt;/* begin with longer part */&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      x2 &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; x0; x0 &lt;span style=&#34;color:#f92672&#34;&gt;-=&lt;/span&gt; dx; y2 &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; y0; y0 &lt;span style=&#34;color:#f92672&#34;&gt;-=&lt;/span&gt; dy; cur &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;cur;         &lt;span style=&#34;color:#75715e&#34;&gt;/* swap P0 P2 */&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    xx &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;2.0&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;(&lt;span style=&#34;color:#ae81ff&#34;&gt;4.0&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;w&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;sx&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;xx&lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt;dx&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;dx);                   &lt;span style=&#34;color:#75715e&#34;&gt;/* differences 2nd degree */&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    yy &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;2.0&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;(&lt;span style=&#34;color:#ae81ff&#34;&gt;4.0&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;w&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;sy&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;yy&lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt;dy&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;dy);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    sx &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; x0 &lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;&lt;/span&gt; x2 &lt;span style=&#34;color:#f92672&#34;&gt;?&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;;                                &lt;span style=&#34;color:#75715e&#34;&gt;/* x step direction */&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    sy &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; y0 &lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;&lt;/span&gt; y2 &lt;span style=&#34;color:#f92672&#34;&gt;?&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;;                                &lt;span style=&#34;color:#75715e&#34;&gt;/* y step direction */&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    xy &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;2.0&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;sx&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;sy&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;(&lt;span style=&#34;color:#ae81ff&#34;&gt;2.0&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;w&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;xy&lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt;dx&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;dy);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt; (cur&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;sx&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;sy &lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;0.0&lt;/span&gt;) {                              &lt;span style=&#34;color:#75715e&#34;&gt;/* negated curvature? */&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      xx &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;xx; yy &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;yy; xy &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;xy; cur &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;cur;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    dx &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;4.0&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;w&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;(x1&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;x0)&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;sy&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;cur&lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt;xx&lt;span style=&#34;color:#f92672&#34;&gt;/&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;2.0&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt;xy;            &lt;span style=&#34;color:#75715e&#34;&gt;/* differences 1st degree */&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    dy &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;4.0&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;w&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;(y0&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;y1)&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;sx&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;cur&lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt;yy&lt;span style=&#34;color:#f92672&#34;&gt;/&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;2.0&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt;xy;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt; (w &lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;0.5&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;&amp;amp;&amp;amp;&lt;/span&gt; (dy &lt;span style=&#34;color:#f92672&#34;&gt;&amp;gt;&lt;/span&gt; xy &lt;span style=&#34;color:#f92672&#34;&gt;||&lt;/span&gt; dx &lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;&lt;/span&gt; xy)) {   &lt;span style=&#34;color:#75715e&#34;&gt;/* flat ellipse, algorithm fails */&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;       cur &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; (w&lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;1.0&lt;/span&gt;)&lt;span style=&#34;color:#f92672&#34;&gt;/&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;2.0&lt;/span&gt;; w &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; sqrt(w); xy &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;1.0&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;/&lt;/span&gt;(w&lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;1.0&lt;/span&gt;);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;       sx &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; floor((x0&lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;2.0&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;w&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;x1&lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt;x2)&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;xy&lt;span style=&#34;color:#f92672&#34;&gt;/&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;2.0&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;0.5&lt;/span&gt;);    &lt;span style=&#34;color:#75715e&#34;&gt;/* subdivide curve in half */&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;       sy &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; floor((y0&lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;2.0&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;w&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;y1&lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt;y2)&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;xy&lt;span style=&#34;color:#f92672&#34;&gt;/&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;2.0&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;0.5&lt;/span&gt;);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;       dx &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; floor((w&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;x1&lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt;x0)&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;xy&lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;0.5&lt;/span&gt;); dy &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; floor((y1&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;w&lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt;y0)&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;xy&lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;0.5&lt;/span&gt;);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;       plotQuadRationalBezierSeg(x0,y0, dx,dy, sx,sy, cur);&lt;span style=&#34;color:#75715e&#34;&gt;/* plot separately */&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;       dx &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; floor((w&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;x1&lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt;x2)&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;xy&lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;0.5&lt;/span&gt;); dy &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; floor((y1&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;w&lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt;y2)&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;xy&lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;0.5&lt;/span&gt;);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;       plotQuadRationalBezierSeg(sx,sy, dx,dy, x2,y2, cur);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;       &lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    err &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; dx&lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt;dy&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;xy;                                           &lt;span style=&#34;color:#75715e&#34;&gt;/* error 1.step */&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;do&lt;/span&gt; {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      setPixel(x0,y0);                                          &lt;span style=&#34;color:#75715e&#34;&gt;/* plot curve */&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt; (x0 &lt;span style=&#34;color:#f92672&#34;&gt;==&lt;/span&gt; x2 &lt;span style=&#34;color:#f92672&#34;&gt;&amp;amp;&amp;amp;&lt;/span&gt; y0 &lt;span style=&#34;color:#f92672&#34;&gt;==&lt;/span&gt; y2) &lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt;;       &lt;span style=&#34;color:#75715e&#34;&gt;/* last pixel -&amp;gt; curve finished */&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      x1 &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;2&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;err &lt;span style=&#34;color:#f92672&#34;&gt;&amp;gt;&lt;/span&gt; dy; y1 &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;2&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;(err&lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt;yy) &lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;dy;&lt;span style=&#34;color:#75715e&#34;&gt;/* save value for test of x step */&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt; (&lt;span style=&#34;color:#ae81ff&#34;&gt;2&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;err &lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;&lt;/span&gt; dx &lt;span style=&#34;color:#f92672&#34;&gt;||&lt;/span&gt; y1) { y0 &lt;span style=&#34;color:#f92672&#34;&gt;+=&lt;/span&gt; sy; dy &lt;span style=&#34;color:#f92672&#34;&gt;+=&lt;/span&gt; xy; err &lt;span style=&#34;color:#f92672&#34;&gt;+=&lt;/span&gt; dx &lt;span style=&#34;color:#f92672&#34;&gt;+=&lt;/span&gt; xx; }&lt;span style=&#34;color:#75715e&#34;&gt;/* y step */&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt; (&lt;span style=&#34;color:#ae81ff&#34;&gt;2&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;err &lt;span style=&#34;color:#f92672&#34;&gt;&amp;gt;&lt;/span&gt; dx &lt;span style=&#34;color:#f92672&#34;&gt;||&lt;/span&gt; x1) { x0 &lt;span style=&#34;color:#f92672&#34;&gt;+=&lt;/span&gt; sx; dx &lt;span style=&#34;color:#f92672&#34;&gt;+=&lt;/span&gt; xy; err &lt;span style=&#34;color:#f92672&#34;&gt;+=&lt;/span&gt; dy &lt;span style=&#34;color:#f92672&#34;&gt;+=&lt;/span&gt; yy; }&lt;span style=&#34;color:#75715e&#34;&gt;/* x step */&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    } &lt;span style=&#34;color:#66d9ef&#34;&gt;while&lt;/span&gt; (dy &lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;=&lt;/span&gt; xy &lt;span style=&#34;color:#f92672&#34;&gt;&amp;amp;&amp;amp;&lt;/span&gt; dx &lt;span style=&#34;color:#f92672&#34;&gt;&amp;gt;=&lt;/span&gt; xy);    &lt;span style=&#34;color:#75715e&#34;&gt;/* gradient negates -&amp;gt; algorithm fails */&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  plotLine(x0,y0, x2,y2);                     &lt;span style=&#34;color:#75715e&#34;&gt;/* plot remaining needle to end */&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;void&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;plotQuadRationalBezier&lt;/span&gt;(&lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt; x0, &lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt; y0, &lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt; x1, &lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt; y1,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                            &lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt; x2, &lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt; y2, &lt;span style=&#34;color:#66d9ef&#34;&gt;float&lt;/span&gt; w)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;{                                 &lt;span style=&#34;color:#75715e&#34;&gt;/* plot any quadratic rational Bezier curve */&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   &lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt; x &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; x0&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;2&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;x1&lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt;x2, y &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; y0&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;2&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;y1&lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt;y2;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   &lt;span style=&#34;color:#66d9ef&#34;&gt;double&lt;/span&gt; xx &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; x0&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;x1, yy &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; y0&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;y1, ww, t, q;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   assert(w &lt;span style=&#34;color:#f92672&#34;&gt;&amp;gt;=&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;0.0&lt;/span&gt;);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   &lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt; (xx&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;(x2&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;x1) &lt;span style=&#34;color:#f92672&#34;&gt;&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;) {                             &lt;span style=&#34;color:#75715e&#34;&gt;/* horizontal cut at P4? */&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt; (yy&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;(y2&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;y1) &lt;span style=&#34;color:#f92672&#34;&gt;&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;)                          &lt;span style=&#34;color:#75715e&#34;&gt;/* vertical cut at P6 too? */&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;         &lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt; (fabs(xx&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;y) &lt;span style=&#34;color:#f92672&#34;&gt;&amp;gt;&lt;/span&gt; fabs(yy&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;x)) {                       &lt;span style=&#34;color:#75715e&#34;&gt;/* which first? */&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            x0 &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; x2; x2 &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; xx&lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt;x1; y0 &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; y2; y2 &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; yy&lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt;y1;          &lt;span style=&#34;color:#75715e&#34;&gt;/* swap points */&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;         }                            &lt;span style=&#34;color:#75715e&#34;&gt;/* now horizontal cut at P4 comes first */&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt; (x0 &lt;span style=&#34;color:#f92672&#34;&gt;==&lt;/span&gt; x2 &lt;span style=&#34;color:#f92672&#34;&gt;||&lt;/span&gt; w &lt;span style=&#34;color:#f92672&#34;&gt;==&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;1.0&lt;/span&gt;) t &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; (x0&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;x1)&lt;span style=&#34;color:#f92672&#34;&gt;/&lt;/span&gt;(&lt;span style=&#34;color:#66d9ef&#34;&gt;double&lt;/span&gt;)x;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#66d9ef&#34;&gt;else&lt;/span&gt; {                                 &lt;span style=&#34;color:#75715e&#34;&gt;/* non-rational or rational case */&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;         q &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; sqrt(&lt;span style=&#34;color:#ae81ff&#34;&gt;4.0&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;w&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;w&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;(x0&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;x1)&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;(x2&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;x1)&lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt;(x2&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;x0)&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;(&lt;span style=&#34;color:#66d9ef&#34;&gt;long&lt;/span&gt;)(x2&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;x0));&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;         &lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt; (x1 &lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;&lt;/span&gt; x0) q &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;q;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;         t &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; (&lt;span style=&#34;color:#ae81ff&#34;&gt;2.0&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;w&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;(x0&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;x1)&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;x0&lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt;x2&lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt;q)&lt;span style=&#34;color:#f92672&#34;&gt;/&lt;/span&gt;(&lt;span style=&#34;color:#ae81ff&#34;&gt;2.0&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;(&lt;span style=&#34;color:#ae81ff&#34;&gt;1.0&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;w)&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;(x2&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;x0));        &lt;span style=&#34;color:#75715e&#34;&gt;/* t at P4 */&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      q &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;1.0&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;/&lt;/span&gt;(&lt;span style=&#34;color:#ae81ff&#34;&gt;2.0&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;t&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;(&lt;span style=&#34;color:#ae81ff&#34;&gt;1.0&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;t)&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;(w&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;1.0&lt;/span&gt;)&lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;1.0&lt;/span&gt;);                 &lt;span style=&#34;color:#75715e&#34;&gt;/* sub-divide at t */&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      xx &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; (t&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;t&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;(x0&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;2.0&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;w&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;x1&lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt;x2)&lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;2.0&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;t&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;(w&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;x1&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;x0)&lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt;x0)&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;q;               &lt;span style=&#34;color:#75715e&#34;&gt;/* = P4 */&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      yy &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; (t&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;t&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;(y0&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;2.0&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;w&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;y1&lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt;y2)&lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;2.0&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;t&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;(w&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;y1&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;y0)&lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt;y0)&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;q;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      ww &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; t&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;(w&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;1.0&lt;/span&gt;)&lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;1.0&lt;/span&gt;; ww &lt;span style=&#34;color:#f92672&#34;&gt;*=&lt;/span&gt; ww&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;q;                    &lt;span style=&#34;color:#75715e&#34;&gt;/* squared weight P3 */&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      w &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; ((&lt;span style=&#34;color:#ae81ff&#34;&gt;1.0&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;t)&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;(w&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;1.0&lt;/span&gt;)&lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;1.0&lt;/span&gt;)&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;sqrt(q);                         &lt;span style=&#34;color:#75715e&#34;&gt;/* weight P8 */&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      x &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; floor(xx&lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;0.5&lt;/span&gt;); y &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; floor(yy&lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;0.5&lt;/span&gt;);                             &lt;span style=&#34;color:#75715e&#34;&gt;/* P4 */&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      yy &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; (xx&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;x0)&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;(y1&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;y0)&lt;span style=&#34;color:#f92672&#34;&gt;/&lt;/span&gt;(x1&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;x0)&lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt;y0;                &lt;span style=&#34;color:#75715e&#34;&gt;/* intersect P3 | P0 P1 */&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      plotQuadRationalBezierSeg(x0,y0, x,floor(yy&lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;0.5&lt;/span&gt;), x,y, ww);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      yy &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; (xx&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;x2)&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;(y1&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;y2)&lt;span style=&#34;color:#f92672&#34;&gt;/&lt;/span&gt;(x1&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;x2)&lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt;y2;                &lt;span style=&#34;color:#75715e&#34;&gt;/* intersect P4 | P1 P2 */&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      y1 &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; floor(yy&lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;0.5&lt;/span&gt;); x0 &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; x1 &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; x; y0 &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; y;            &lt;span style=&#34;color:#75715e&#34;&gt;/* P0 = P4, P1 = P8 */&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   &lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt; ((y0&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;y1)&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;(&lt;span style=&#34;color:#66d9ef&#34;&gt;long&lt;/span&gt;)(y2&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;y1) &lt;span style=&#34;color:#f92672&#34;&gt;&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;) {                    &lt;span style=&#34;color:#75715e&#34;&gt;/* vertical cut at P6? */&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt; (y0 &lt;span style=&#34;color:#f92672&#34;&gt;==&lt;/span&gt; y2 &lt;span style=&#34;color:#f92672&#34;&gt;||&lt;/span&gt; w &lt;span style=&#34;color:#f92672&#34;&gt;==&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;1.0&lt;/span&gt;) t &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; (y0&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;y1)&lt;span style=&#34;color:#f92672&#34;&gt;/&lt;/span&gt;(y0&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;2.0&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;y1&lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt;y2);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#66d9ef&#34;&gt;else&lt;/span&gt; {                                 &lt;span style=&#34;color:#75715e&#34;&gt;/* non-rational or rational case */&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;         q &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; sqrt(&lt;span style=&#34;color:#ae81ff&#34;&gt;4.0&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;w&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;w&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;(y0&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;y1)&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;(y2&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;y1)&lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt;(y2&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;y0)&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;(&lt;span style=&#34;color:#66d9ef&#34;&gt;long&lt;/span&gt;)(y2&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;y0));&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;         &lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt; (y1 &lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;&lt;/span&gt; y0) q &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;q;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;         t &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; (&lt;span style=&#34;color:#ae81ff&#34;&gt;2.0&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;w&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;(y0&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;y1)&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;y0&lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt;y2&lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt;q)&lt;span style=&#34;color:#f92672&#34;&gt;/&lt;/span&gt;(&lt;span style=&#34;color:#ae81ff&#34;&gt;2.0&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;(&lt;span style=&#34;color:#ae81ff&#34;&gt;1.0&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;w)&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;(y2&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;y0));        &lt;span style=&#34;color:#75715e&#34;&gt;/* t at P6 */&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      q &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;1.0&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;/&lt;/span&gt;(&lt;span style=&#34;color:#ae81ff&#34;&gt;2.0&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;t&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;(&lt;span style=&#34;color:#ae81ff&#34;&gt;1.0&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;t)&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;(w&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;1.0&lt;/span&gt;)&lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;1.0&lt;/span&gt;);                 &lt;span style=&#34;color:#75715e&#34;&gt;/* sub-divide at t */&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      xx &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; (t&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;t&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;(x0&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;2.0&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;w&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;x1&lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt;x2)&lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;2.0&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;t&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;(w&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;x1&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;x0)&lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt;x0)&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;q;               &lt;span style=&#34;color:#75715e&#34;&gt;/* = P6 */&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      yy &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; (t&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;t&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;(y0&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;2.0&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;w&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;y1&lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt;y2)&lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;2.0&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;t&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;(w&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;y1&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;y0)&lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt;y0)&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;q;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      ww &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; t&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;(w&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;1.0&lt;/span&gt;)&lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;1.0&lt;/span&gt;; ww &lt;span style=&#34;color:#f92672&#34;&gt;*=&lt;/span&gt; ww&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;q;                    &lt;span style=&#34;color:#75715e&#34;&gt;/* squared weight P5 */&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      w &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; ((&lt;span style=&#34;color:#ae81ff&#34;&gt;1.0&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;t)&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;(w&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;1.0&lt;/span&gt;)&lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;1.0&lt;/span&gt;)&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;sqrt(q);                         &lt;span style=&#34;color:#75715e&#34;&gt;/* weight P7 */&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      x &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; floor(xx&lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;0.5&lt;/span&gt;); y &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; floor(yy&lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;0.5&lt;/span&gt;);                             &lt;span style=&#34;color:#75715e&#34;&gt;/* P6 */&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      xx &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; (x1&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;x0)&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;(yy&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;y0)&lt;span style=&#34;color:#f92672&#34;&gt;/&lt;/span&gt;(y1&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;y0)&lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt;x0;                &lt;span style=&#34;color:#75715e&#34;&gt;/* intersect P6 | P0 P1 */&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      plotQuadRationalBezierSeg(x0,y0, floor(xx&lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;0.5&lt;/span&gt;),y, x,y, ww);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      xx &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; (x1&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;x2)&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;(yy&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;y2)&lt;span style=&#34;color:#f92672&#34;&gt;/&lt;/span&gt;(y1&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;y2)&lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt;x2;                &lt;span style=&#34;color:#75715e&#34;&gt;/* intersect P7 | P1 P2 */&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      x1 &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; floor(xx&lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;0.5&lt;/span&gt;); x0 &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; x; y0 &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; y1 &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; y;            &lt;span style=&#34;color:#75715e&#34;&gt;/* P0 = P6, P1 = P7 */&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   plotQuadRationalBezierSeg(x0,y0, x1,y1, x2,y2, w&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;w);          &lt;span style=&#34;color:#75715e&#34;&gt;/* remaining */&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;void&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;plotRotatedEllipse&lt;/span&gt;(&lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt; x, &lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt; y, &lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt; a, &lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt; b, &lt;span style=&#34;color:#66d9ef&#34;&gt;float&lt;/span&gt; angle)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;{                                   &lt;span style=&#34;color:#75715e&#34;&gt;/* plot ellipse rotated by angle (radian) */&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   &lt;span style=&#34;color:#66d9ef&#34;&gt;float&lt;/span&gt; xd &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; (&lt;span style=&#34;color:#66d9ef&#34;&gt;long&lt;/span&gt;)a&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;a, yd &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; (&lt;span style=&#34;color:#66d9ef&#34;&gt;long&lt;/span&gt;)b&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;b;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   &lt;span style=&#34;color:#66d9ef&#34;&gt;float&lt;/span&gt; s &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; sin(angle), zd &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; (xd&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;yd)&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;s;                  &lt;span style=&#34;color:#75715e&#34;&gt;/* ellipse rotation */&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   xd &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; sqrt(xd&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;zd&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;s), yd &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; sqrt(yd&lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt;zd&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;s);           &lt;span style=&#34;color:#75715e&#34;&gt;/* surrounding rectangle */&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   a &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; xd&lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;0.5&lt;/span&gt;; b &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; yd&lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;0.5&lt;/span&gt;; zd &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; zd&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;a&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;b&lt;span style=&#34;color:#f92672&#34;&gt;/&lt;/span&gt;(xd&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;yd);           &lt;span style=&#34;color:#75715e&#34;&gt;/* scale to integer */&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   plotRotatedEllipseRect(x&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;a,y&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;b, x&lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt;a,y&lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt;b, (&lt;span style=&#34;color:#66d9ef&#34;&gt;long&lt;/span&gt;)(&lt;span style=&#34;color:#ae81ff&#34;&gt;4&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;zd&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;cos(angle)));&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;void&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;plotRotatedEllipseRect&lt;/span&gt;(&lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt; x0, &lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt; y0, &lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt; x1, &lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt; y1, &lt;span style=&#34;color:#66d9ef&#34;&gt;long&lt;/span&gt; zd)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;{                  &lt;span style=&#34;color:#75715e&#34;&gt;/* rectangle enclosing the ellipse, integer rotation angle */&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   &lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt; xd &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; x1&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;x0, yd &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; y1&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;y0;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   &lt;span style=&#34;color:#66d9ef&#34;&gt;float&lt;/span&gt; w &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; xd&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;(&lt;span style=&#34;color:#66d9ef&#34;&gt;long&lt;/span&gt;)yd;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   &lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt; (zd &lt;span style=&#34;color:#f92672&#34;&gt;==&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;) &lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt; plotEllipseRect(x0,y0, x1,y1);          &lt;span style=&#34;color:#75715e&#34;&gt;/* looks nicer */&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   &lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt; (w &lt;span style=&#34;color:#f92672&#34;&gt;!=&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;0.0&lt;/span&gt;) w &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; (w&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;zd)&lt;span style=&#34;color:#f92672&#34;&gt;/&lt;/span&gt;(w&lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt;w);                    &lt;span style=&#34;color:#75715e&#34;&gt;/* squared weight of P1 */&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   assert(w &lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;=&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;1.0&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;&amp;amp;&amp;amp;&lt;/span&gt; w &lt;span style=&#34;color:#f92672&#34;&gt;&amp;gt;=&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;0.0&lt;/span&gt;);                &lt;span style=&#34;color:#75715e&#34;&gt;/* limit angle to |zd|&amp;lt;=xd*yd */&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   xd &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; floor(xd&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;w&lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;0.5&lt;/span&gt;); yd &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; floor(yd&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;w&lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;0.5&lt;/span&gt;);           &lt;span style=&#34;color:#75715e&#34;&gt;/* snap xe,ye to int */&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   plotQuadRationalBezierSeg(x0,y0&lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt;yd, x0,y0, x0&lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt;xd,y0, &lt;span style=&#34;color:#ae81ff&#34;&gt;1.0&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;w);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   plotQuadRationalBezierSeg(x0,y0&lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt;yd, x0,y1, x1&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;xd,y1, w);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   plotQuadRationalBezierSeg(x1,y1&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;yd, x1,y1, x1&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;xd,y1, &lt;span style=&#34;color:#ae81ff&#34;&gt;1.0&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;w);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   plotQuadRationalBezierSeg(x1,y1&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;yd, x1,y0, x0&lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt;xd,y0, w);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;void&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;plotCubicBezierSeg&lt;/span&gt;(&lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt; x0, &lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt; y0, &lt;span style=&#34;color:#66d9ef&#34;&gt;float&lt;/span&gt; x1, &lt;span style=&#34;color:#66d9ef&#34;&gt;float&lt;/span&gt; y1,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                        &lt;span style=&#34;color:#66d9ef&#34;&gt;float&lt;/span&gt; x2, &lt;span style=&#34;color:#66d9ef&#34;&gt;float&lt;/span&gt; y2, &lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt; x3, &lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt; y3)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;{                                        &lt;span style=&#34;color:#75715e&#34;&gt;/* plot limited cubic Bezier segment */&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   &lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt; f, fx, fy, leg &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   &lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt; sx &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; x0 &lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;&lt;/span&gt; x3 &lt;span style=&#34;color:#f92672&#34;&gt;?&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;, sy &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; y0 &lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;&lt;/span&gt; y3 &lt;span style=&#34;color:#f92672&#34;&gt;?&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;;        &lt;span style=&#34;color:#75715e&#34;&gt;/* step direction */&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   &lt;span style=&#34;color:#66d9ef&#34;&gt;float&lt;/span&gt; xc &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;fabs(x0&lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt;x1&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;x2&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;x3), xa &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; xc&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;4&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;sx&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;(x1&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;x2), xb &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; sx&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;(x0&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;x1&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;x2&lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt;x3);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   &lt;span style=&#34;color:#66d9ef&#34;&gt;float&lt;/span&gt; yc &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;fabs(y0&lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt;y1&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;y2&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;y3), ya &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; yc&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;4&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;sy&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;(y1&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;y2), yb &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; sy&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;(y0&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;y1&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;y2&lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt;y3);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   &lt;span style=&#34;color:#66d9ef&#34;&gt;double&lt;/span&gt; ab, ac, bc, cb, xx, xy, yy, dx, dy, ex, &lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;pxy, EP &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;0.01&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                                                 &lt;span style=&#34;color:#75715e&#34;&gt;/* check for curve restrains */&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   &lt;span style=&#34;color:#75715e&#34;&gt;/* slope P0-P1 == P2-P3    and  (P0-P3 == P1-P2      or   no slope change) */&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   assert((x1&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;x0)&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;(x2&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;x3) &lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;&lt;/span&gt; EP &lt;span style=&#34;color:#f92672&#34;&gt;&amp;amp;&amp;amp;&lt;/span&gt; ((x3&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;x0)&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;(x1&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;x2) &lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;&lt;/span&gt; EP &lt;span style=&#34;color:#f92672&#34;&gt;||&lt;/span&gt; xb&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;xb &lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;&lt;/span&gt; xa&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;xc&lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt;EP));&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   assert((y1&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;y0)&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;(y2&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;y3) &lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;&lt;/span&gt; EP &lt;span style=&#34;color:#f92672&#34;&gt;&amp;amp;&amp;amp;&lt;/span&gt; ((y3&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;y0)&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;(y1&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;y2) &lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;&lt;/span&gt; EP &lt;span style=&#34;color:#f92672&#34;&gt;||&lt;/span&gt; yb&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;yb &lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;&lt;/span&gt; ya&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;yc&lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt;EP));&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   &lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt; (xa &lt;span style=&#34;color:#f92672&#34;&gt;==&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;&amp;amp;&amp;amp;&lt;/span&gt; ya &lt;span style=&#34;color:#f92672&#34;&gt;==&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;) {                              &lt;span style=&#34;color:#75715e&#34;&gt;/* quadratic Bezier */&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      sx &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; floor((&lt;span style=&#34;color:#ae81ff&#34;&gt;3&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;x1&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;x0&lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;)&lt;span style=&#34;color:#f92672&#34;&gt;/&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;2&lt;/span&gt;); sy &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; floor((&lt;span style=&#34;color:#ae81ff&#34;&gt;3&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;y1&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;y0&lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;)&lt;span style=&#34;color:#f92672&#34;&gt;/&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;2&lt;/span&gt;);   &lt;span style=&#34;color:#75715e&#34;&gt;/* new midpoint */&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt; plotQuadBezierSeg(x0,y0, sx,sy, x3,y3);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   x1 &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; (x1&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;x0)&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;(x1&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;x0)&lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt;(y1&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;y0)&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;(y1&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;y0)&lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;;                    &lt;span style=&#34;color:#75715e&#34;&gt;/* line lengths */&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   x2 &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; (x2&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;x3)&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;(x2&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;x3)&lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt;(y2&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;y3)&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;(y2&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;y3)&lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   &lt;span style=&#34;color:#66d9ef&#34;&gt;do&lt;/span&gt; {                                                &lt;span style=&#34;color:#75715e&#34;&gt;/* loop over both ends */&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      ab &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; xa&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;yb&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;xb&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;ya; ac &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; xa&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;yc&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;xc&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;ya; bc &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; xb&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;yc&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;xc&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;yb;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      ex &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; ab&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;(ab&lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt;ac&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;3&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;bc)&lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt;ac&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;ac;       &lt;span style=&#34;color:#75715e&#34;&gt;/* P0 part of self-intersection loop? */&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      f &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; ex &lt;span style=&#34;color:#f92672&#34;&gt;&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;?&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; sqrt(&lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;1024&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;/&lt;/span&gt;x1);               &lt;span style=&#34;color:#75715e&#34;&gt;/* calculate resolution */&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      ab &lt;span style=&#34;color:#f92672&#34;&gt;*=&lt;/span&gt; f; ac &lt;span style=&#34;color:#f92672&#34;&gt;*=&lt;/span&gt; f; bc &lt;span style=&#34;color:#f92672&#34;&gt;*=&lt;/span&gt; f; ex &lt;span style=&#34;color:#f92672&#34;&gt;*=&lt;/span&gt; f&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;f;            &lt;span style=&#34;color:#75715e&#34;&gt;/* increase resolution */&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      xy &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;9&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;(ab&lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt;ac&lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt;bc)&lt;span style=&#34;color:#f92672&#34;&gt;/&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;8&lt;/span&gt;; cb &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;8&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;(xa&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;ya);  &lt;span style=&#34;color:#75715e&#34;&gt;/* init differences of 1st degree */&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      dx &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;27&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;(&lt;span style=&#34;color:#ae81ff&#34;&gt;8&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;ab&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;(yb&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;yb&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;ya&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;yc)&lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt;ex&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;(ya&lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;2&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;yb&lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt;yc))&lt;span style=&#34;color:#f92672&#34;&gt;/&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;64&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;ya&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;ya&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;(xy&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;ya);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      dy &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;27&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;(&lt;span style=&#34;color:#ae81ff&#34;&gt;8&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;ab&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;(xb&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;xb&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;xa&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;xc)&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;ex&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;(xa&lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;2&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;xb&lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt;xc))&lt;span style=&#34;color:#f92672&#34;&gt;/&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;64&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;xa&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;xa&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;(xy&lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt;xa);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                                            &lt;span style=&#34;color:#75715e&#34;&gt;/* init differences of 2nd degree */&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      xx &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;3&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;(&lt;span style=&#34;color:#ae81ff&#34;&gt;3&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;ab&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;(&lt;span style=&#34;color:#ae81ff&#34;&gt;3&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;yb&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;yb&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;ya&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;ya&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;2&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;ya&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;yc)&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;ya&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;(&lt;span style=&#34;color:#ae81ff&#34;&gt;3&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;ac&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;(ya&lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt;yb)&lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt;ya&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;cb))&lt;span style=&#34;color:#f92672&#34;&gt;/&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;4&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      yy &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;3&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;(&lt;span style=&#34;color:#ae81ff&#34;&gt;3&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;ab&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;(&lt;span style=&#34;color:#ae81ff&#34;&gt;3&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;xb&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;xb&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;xa&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;xa&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;2&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;xa&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;xc)&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;xa&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;(&lt;span style=&#34;color:#ae81ff&#34;&gt;3&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;ac&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;(xa&lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt;xb)&lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt;xa&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;cb))&lt;span style=&#34;color:#f92672&#34;&gt;/&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;4&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      xy &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; xa&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;ya&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;(&lt;span style=&#34;color:#ae81ff&#34;&gt;6&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;ab&lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;6&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;ac&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;3&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;bc&lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt;cb); ac &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; ya&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;ya; cb &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; xa&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;xa;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      xy &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;3&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;(xy&lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;9&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;f&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;(cb&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;yb&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;yc&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;xb&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;xc&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;ac)&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;18&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;xb&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;yb&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;ab)&lt;span style=&#34;color:#f92672&#34;&gt;/&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;8&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt; (ex &lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;) {         &lt;span style=&#34;color:#75715e&#34;&gt;/* negate values if inside self-intersection loop */&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;         dx &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;dx; dy &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;dy; xx &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;xx; yy &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;yy; xy &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;xy; ac &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;ac; cb &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;cb;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      }                                     &lt;span style=&#34;color:#75715e&#34;&gt;/* init differences of 3rd degree */&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      ab &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;6&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;ya&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;ac; ac &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;6&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;xa&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;ac; bc &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;6&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;ya&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;cb; cb &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;6&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;xa&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;cb;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      dx &lt;span style=&#34;color:#f92672&#34;&gt;+=&lt;/span&gt; xy; ex &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; dx&lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt;dy; dy &lt;span style=&#34;color:#f92672&#34;&gt;+=&lt;/span&gt; xy;                    &lt;span style=&#34;color:#75715e&#34;&gt;/* error of 1st step */&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#66d9ef&#34;&gt;for&lt;/span&gt; (pxy &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;&amp;amp;&lt;/span&gt;xy, fx &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; fy &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; f; x0 &lt;span style=&#34;color:#f92672&#34;&gt;!=&lt;/span&gt; x3 &lt;span style=&#34;color:#f92672&#34;&gt;&amp;amp;&amp;amp;&lt;/span&gt; y0 &lt;span style=&#34;color:#f92672&#34;&gt;!=&lt;/span&gt; y3; ) {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;         setPixel(x0,y0);                                       &lt;span style=&#34;color:#75715e&#34;&gt;/* plot curve */&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;         &lt;span style=&#34;color:#66d9ef&#34;&gt;do&lt;/span&gt; {                                  &lt;span style=&#34;color:#75715e&#34;&gt;/* move sub-steps of one pixel */&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt; (dx &lt;span style=&#34;color:#f92672&#34;&gt;&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;pxy &lt;span style=&#34;color:#f92672&#34;&gt;||&lt;/span&gt; dy &lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;pxy) &lt;span style=&#34;color:#66d9ef&#34;&gt;goto&lt;/span&gt; exit;       &lt;span style=&#34;color:#75715e&#34;&gt;/* confusing values */&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            y1 &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;2&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;ex&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;dy;                    &lt;span style=&#34;color:#75715e&#34;&gt;/* save value for test of y step */&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt; (&lt;span style=&#34;color:#ae81ff&#34;&gt;2&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;ex &lt;span style=&#34;color:#f92672&#34;&gt;&amp;gt;=&lt;/span&gt; dx) {                                   &lt;span style=&#34;color:#75715e&#34;&gt;/* x sub-step */&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;               fx&lt;span style=&#34;color:#f92672&#34;&gt;--&lt;/span&gt;; ex &lt;span style=&#34;color:#f92672&#34;&gt;+=&lt;/span&gt; dx &lt;span style=&#34;color:#f92672&#34;&gt;+=&lt;/span&gt; xx; dy &lt;span style=&#34;color:#f92672&#34;&gt;+=&lt;/span&gt; xy &lt;span style=&#34;color:#f92672&#34;&gt;+=&lt;/span&gt; ac; yy &lt;span style=&#34;color:#f92672&#34;&gt;+=&lt;/span&gt; bc; xx &lt;span style=&#34;color:#f92672&#34;&gt;+=&lt;/span&gt; ab;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt; (y1 &lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;=&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;) {                                      &lt;span style=&#34;color:#75715e&#34;&gt;/* y sub-step */&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;               fy&lt;span style=&#34;color:#f92672&#34;&gt;--&lt;/span&gt;; ex &lt;span style=&#34;color:#f92672&#34;&gt;+=&lt;/span&gt; dy &lt;span style=&#34;color:#f92672&#34;&gt;+=&lt;/span&gt; yy; dx &lt;span style=&#34;color:#f92672&#34;&gt;+=&lt;/span&gt; xy &lt;span style=&#34;color:#f92672&#34;&gt;+=&lt;/span&gt; bc; xx &lt;span style=&#34;color:#f92672&#34;&gt;+=&lt;/span&gt; ac; yy &lt;span style=&#34;color:#f92672&#34;&gt;+=&lt;/span&gt; cb;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;         } &lt;span style=&#34;color:#66d9ef&#34;&gt;while&lt;/span&gt; (fx &lt;span style=&#34;color:#f92672&#34;&gt;&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;&amp;amp;&amp;amp;&lt;/span&gt; fy &lt;span style=&#34;color:#f92672&#34;&gt;&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;);                       &lt;span style=&#34;color:#75715e&#34;&gt;/* pixel complete? */&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;         &lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt; (&lt;span style=&#34;color:#ae81ff&#34;&gt;2&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;fx &lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;=&lt;/span&gt; f) { x0 &lt;span style=&#34;color:#f92672&#34;&gt;+=&lt;/span&gt; sx; fx &lt;span style=&#34;color:#f92672&#34;&gt;+=&lt;/span&gt; f; }                      &lt;span style=&#34;color:#75715e&#34;&gt;/* x step */&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;         &lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt; (&lt;span style=&#34;color:#ae81ff&#34;&gt;2&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;fy &lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;=&lt;/span&gt; f) { y0 &lt;span style=&#34;color:#f92672&#34;&gt;+=&lt;/span&gt; sy; fy &lt;span style=&#34;color:#f92672&#34;&gt;+=&lt;/span&gt; f; }                      &lt;span style=&#34;color:#75715e&#34;&gt;/* y step */&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;         &lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt; (pxy &lt;span style=&#34;color:#f92672&#34;&gt;==&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;&amp;amp;&lt;/span&gt;xy &lt;span style=&#34;color:#f92672&#34;&gt;&amp;amp;&amp;amp;&lt;/span&gt; dx &lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;&amp;amp;&amp;amp;&lt;/span&gt; dy &lt;span style=&#34;color:#f92672&#34;&gt;&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;) pxy &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;&amp;amp;&lt;/span&gt;EP;  &lt;span style=&#34;color:#75715e&#34;&gt;/* pixel ahead valid */&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;exit: xx &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; x0; x0 &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; x3; x3 &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; xx; sx &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;sx; xb &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;xb;             &lt;span style=&#34;color:#75715e&#34;&gt;/* swap legs */&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      yy &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; y0; y0 &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; y3; y3 &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; yy; sy &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;sy; yb &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;yb; x1 &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; x2;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   } &lt;span style=&#34;color:#66d9ef&#34;&gt;while&lt;/span&gt; (leg&lt;span style=&#34;color:#f92672&#34;&gt;--&lt;/span&gt;);                                          &lt;span style=&#34;color:#75715e&#34;&gt;/* try other end */&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   plotLine(x0,y0, x3,y3);       &lt;span style=&#34;color:#75715e&#34;&gt;/* remaining part in case of cusp or crunode */&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;void&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;plotCubicBezier&lt;/span&gt;(&lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt; x0, &lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt; y0, &lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt; x1, &lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt; y1,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                     &lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt; x2, &lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt; y2, &lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt; x3, &lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt; y3)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;{                                              &lt;span style=&#34;color:#75715e&#34;&gt;/* plot any cubic Bezier curve */&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   &lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt; n &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;, i &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   &lt;span style=&#34;color:#66d9ef&#34;&gt;long&lt;/span&gt; xc &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; x0&lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt;x1&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;x2&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;x3, xa &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; xc&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;4&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;(x1&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;x2);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   &lt;span style=&#34;color:#66d9ef&#34;&gt;long&lt;/span&gt; xb &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; x0&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;x1&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;x2&lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt;x3, xd &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; xb&lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;4&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;(x1&lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt;x2);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   &lt;span style=&#34;color:#66d9ef&#34;&gt;long&lt;/span&gt; yc &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; y0&lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt;y1&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;y2&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;y3, ya &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; yc&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;4&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;(y1&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;y2);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   &lt;span style=&#34;color:#66d9ef&#34;&gt;long&lt;/span&gt; yb &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; y0&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;y1&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;y2&lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt;y3, yd &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; yb&lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;4&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;(y1&lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt;y2);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   &lt;span style=&#34;color:#66d9ef&#34;&gt;float&lt;/span&gt; fx0 &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; x0, fx1, fx2, fx3, fy0 &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; y0, fy1, fy2, fy3;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   &lt;span style=&#34;color:#66d9ef&#34;&gt;double&lt;/span&gt; t1 &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; xb&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;xb&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;xa&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;xc, t2, t[&lt;span style=&#34;color:#ae81ff&#34;&gt;5&lt;/span&gt;];&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                                 &lt;span style=&#34;color:#75715e&#34;&gt;/* sub-divide curve at gradient sign changes */&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   &lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt; (xa &lt;span style=&#34;color:#f92672&#34;&gt;==&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;) {                                               &lt;span style=&#34;color:#75715e&#34;&gt;/* horizontal */&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt; (abs(xc) &lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;2&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;abs(xb)) t[n&lt;span style=&#34;color:#f92672&#34;&gt;++&lt;/span&gt;] &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; xc&lt;span style=&#34;color:#f92672&#34;&gt;/&lt;/span&gt;(&lt;span style=&#34;color:#ae81ff&#34;&gt;2.0&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;xb);            &lt;span style=&#34;color:#75715e&#34;&gt;/* one change */&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   } &lt;span style=&#34;color:#66d9ef&#34;&gt;else&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt; (t1 &lt;span style=&#34;color:#f92672&#34;&gt;&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;0.0&lt;/span&gt;) {                                      &lt;span style=&#34;color:#75715e&#34;&gt;/* two changes */&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      t2 &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; sqrt(t1);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      t1 &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; (xb&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;t2)&lt;span style=&#34;color:#f92672&#34;&gt;/&lt;/span&gt;xa; &lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt; (fabs(t1) &lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;1.0&lt;/span&gt;) t[n&lt;span style=&#34;color:#f92672&#34;&gt;++&lt;/span&gt;] &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; t1;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      t1 &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; (xb&lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt;t2)&lt;span style=&#34;color:#f92672&#34;&gt;/&lt;/span&gt;xa; &lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt; (fabs(t1) &lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;1.0&lt;/span&gt;) t[n&lt;span style=&#34;color:#f92672&#34;&gt;++&lt;/span&gt;] &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; t1;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   t1 &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; yb&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;yb&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;ya&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;yc;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   &lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt; (ya &lt;span style=&#34;color:#f92672&#34;&gt;==&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;) {                                                 &lt;span style=&#34;color:#75715e&#34;&gt;/* vertical */&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt; (abs(yc) &lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;2&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;abs(yb)) t[n&lt;span style=&#34;color:#f92672&#34;&gt;++&lt;/span&gt;] &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; yc&lt;span style=&#34;color:#f92672&#34;&gt;/&lt;/span&gt;(&lt;span style=&#34;color:#ae81ff&#34;&gt;2.0&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;yb);            &lt;span style=&#34;color:#75715e&#34;&gt;/* one change */&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   } &lt;span style=&#34;color:#66d9ef&#34;&gt;else&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt; (t1 &lt;span style=&#34;color:#f92672&#34;&gt;&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;0.0&lt;/span&gt;) {                                      &lt;span style=&#34;color:#75715e&#34;&gt;/* two changes */&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      t2 &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; sqrt(t1);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      t1 &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; (yb&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;t2)&lt;span style=&#34;color:#f92672&#34;&gt;/&lt;/span&gt;ya; &lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt; (fabs(t1) &lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;1.0&lt;/span&gt;) t[n&lt;span style=&#34;color:#f92672&#34;&gt;++&lt;/span&gt;] &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; t1;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      t1 &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; (yb&lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt;t2)&lt;span style=&#34;color:#f92672&#34;&gt;/&lt;/span&gt;ya; &lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt; (fabs(t1) &lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;1.0&lt;/span&gt;) t[n&lt;span style=&#34;color:#f92672&#34;&gt;++&lt;/span&gt;] &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; t1;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   &lt;span style=&#34;color:#66d9ef&#34;&gt;for&lt;/span&gt; (i &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;; i &lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;&lt;/span&gt; n; i&lt;span style=&#34;color:#f92672&#34;&gt;++&lt;/span&gt;)                         &lt;span style=&#34;color:#75715e&#34;&gt;/* bubble sort of 4 points */&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt; ((t1 &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; t[i&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;]) &lt;span style=&#34;color:#f92672&#34;&gt;&amp;gt;&lt;/span&gt; t[i]) { t[i&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;] &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; t[i]; t[i] &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; t1; i &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;; }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   t1 &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;1.0&lt;/span&gt;; t[n] &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;1.0&lt;/span&gt;;                                &lt;span style=&#34;color:#75715e&#34;&gt;/* begin / end point */&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   &lt;span style=&#34;color:#66d9ef&#34;&gt;for&lt;/span&gt; (i &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;; i &lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;=&lt;/span&gt; n; i&lt;span style=&#34;color:#f92672&#34;&gt;++&lt;/span&gt;) {                 &lt;span style=&#34;color:#75715e&#34;&gt;/* plot each segment separately */&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      t2 &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; t[i];                                &lt;span style=&#34;color:#75715e&#34;&gt;/* sub-divide at t[i-1], t[i] */&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      fx1 &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; (t1&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;(t1&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;xb&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;2&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;xc)&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;t2&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;(t1&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;(t1&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;xa&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;2&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;xb)&lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt;xc)&lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt;xd)&lt;span style=&#34;color:#f92672&#34;&gt;/&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;8&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;fx0;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      fy1 &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; (t1&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;(t1&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;yb&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;2&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;yc)&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;t2&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;(t1&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;(t1&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;ya&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;2&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;yb)&lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt;yc)&lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt;yd)&lt;span style=&#34;color:#f92672&#34;&gt;/&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;8&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;fy0;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      fx2 &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; (t2&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;(t2&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;xb&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;2&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;xc)&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;t1&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;(t2&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;(t2&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;xa&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;2&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;xb)&lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt;xc)&lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt;xd)&lt;span style=&#34;color:#f92672&#34;&gt;/&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;8&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;fx0;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      fy2 &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; (t2&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;(t2&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;yb&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;2&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;yc)&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;t1&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;(t2&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;(t2&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;ya&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;2&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;yb)&lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt;yc)&lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt;yd)&lt;span style=&#34;color:#f92672&#34;&gt;/&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;8&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;fy0;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      fx0 &lt;span style=&#34;color:#f92672&#34;&gt;-=&lt;/span&gt; fx3 &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; (t2&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;(t2&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;(&lt;span style=&#34;color:#ae81ff&#34;&gt;3&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;xb&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;t2&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;xa)&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;3&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;xc)&lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt;xd)&lt;span style=&#34;color:#f92672&#34;&gt;/&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;8&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      fy0 &lt;span style=&#34;color:#f92672&#34;&gt;-=&lt;/span&gt; fy3 &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; (t2&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;(t2&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;(&lt;span style=&#34;color:#ae81ff&#34;&gt;3&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;yb&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;t2&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;ya)&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;3&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;yc)&lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt;yd)&lt;span style=&#34;color:#f92672&#34;&gt;/&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;8&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      x3 &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; floor(fx3&lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;0.5&lt;/span&gt;); y3 &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; floor(fy3&lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;0.5&lt;/span&gt;);        &lt;span style=&#34;color:#75715e&#34;&gt;/* scale bounds to int */&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt; (fx0 &lt;span style=&#34;color:#f92672&#34;&gt;!=&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;0.0&lt;/span&gt;) { fx1 &lt;span style=&#34;color:#f92672&#34;&gt;*=&lt;/span&gt; fx0 &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; (x0&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;x3)&lt;span style=&#34;color:#f92672&#34;&gt;/&lt;/span&gt;fx0; fx2 &lt;span style=&#34;color:#f92672&#34;&gt;*=&lt;/span&gt; fx0; }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt; (fy0 &lt;span style=&#34;color:#f92672&#34;&gt;!=&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;0.0&lt;/span&gt;) { fy1 &lt;span style=&#34;color:#f92672&#34;&gt;*=&lt;/span&gt; fy0 &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; (y0&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;y3)&lt;span style=&#34;color:#f92672&#34;&gt;/&lt;/span&gt;fy0; fy2 &lt;span style=&#34;color:#f92672&#34;&gt;*=&lt;/span&gt; fy0; }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt; (x0 &lt;span style=&#34;color:#f92672&#34;&gt;!=&lt;/span&gt; x3 &lt;span style=&#34;color:#f92672&#34;&gt;||&lt;/span&gt; y0 &lt;span style=&#34;color:#f92672&#34;&gt;!=&lt;/span&gt; y3)                            &lt;span style=&#34;color:#75715e&#34;&gt;/* segment t1 - t2 */&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;         plotCubicBezierSeg(x0,y0, x0&lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt;fx1,y0&lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt;fy1, x0&lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt;fx2,y0&lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt;fy2, x3,y3);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      x0 &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; x3; y0 &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; y3; fx0 &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; fx3; fy0 &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; fy3; t1 &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; t2;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;void&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;plotLineAA&lt;/span&gt;(&lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt; x0, &lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt; y0, &lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt; x1, &lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt; y1)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;{             &lt;span style=&#34;color:#75715e&#34;&gt;/* draw a black (0) anti-aliased line on white (255) background */&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   &lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt; sx &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; x0 &lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;&lt;/span&gt; x1 &lt;span style=&#34;color:#f92672&#34;&gt;?&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;, sy &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; y0 &lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;&lt;/span&gt; y1 &lt;span style=&#34;color:#f92672&#34;&gt;?&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;, x2;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   &lt;span style=&#34;color:#66d9ef&#34;&gt;long&lt;/span&gt; dx &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; abs(x1&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;x0), dy &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; abs(y1&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;y0), err &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; dx&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;dx&lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt;dy&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;dy;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   &lt;span style=&#34;color:#66d9ef&#34;&gt;long&lt;/span&gt; e2 &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; err &lt;span style=&#34;color:#f92672&#34;&gt;==&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;?&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;0xffff7fl&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;/&lt;/span&gt;sqrt(err);     &lt;span style=&#34;color:#75715e&#34;&gt;/* multiplication factor */&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   dx &lt;span style=&#34;color:#f92672&#34;&gt;*=&lt;/span&gt; e2; dy &lt;span style=&#34;color:#f92672&#34;&gt;*=&lt;/span&gt; e2; err &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; dx&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;dy;                       &lt;span style=&#34;color:#75715e&#34;&gt;/* error value e_xy */&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   &lt;span style=&#34;color:#66d9ef&#34;&gt;for&lt;/span&gt; ( ; ; ){                                                 &lt;span style=&#34;color:#75715e&#34;&gt;/* pixel loop */&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      setPixelAA(x0,y0,abs(err&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;dx&lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt;dy)&lt;span style=&#34;color:#f92672&#34;&gt;&amp;gt;&amp;gt;&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;16&lt;/span&gt;);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      e2 &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; err; x2 &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; x0;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt; (&lt;span style=&#34;color:#ae81ff&#34;&gt;2&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;e2 &lt;span style=&#34;color:#f92672&#34;&gt;&amp;gt;=&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;dx) {                                            &lt;span style=&#34;color:#75715e&#34;&gt;/* x step */&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;         &lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt; (x0 &lt;span style=&#34;color:#f92672&#34;&gt;==&lt;/span&gt; x1) &lt;span style=&#34;color:#66d9ef&#34;&gt;break&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;         &lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt; (e2&lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt;dy &lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;0xff0000l&lt;/span&gt;) setPixelAA(x0,y0&lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt;sy,(e2&lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt;dy)&lt;span style=&#34;color:#f92672&#34;&gt;&amp;gt;&amp;gt;&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;16&lt;/span&gt;);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;         err &lt;span style=&#34;color:#f92672&#34;&gt;-=&lt;/span&gt; dy; x0 &lt;span style=&#34;color:#f92672&#34;&gt;+=&lt;/span&gt; sx;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt; (&lt;span style=&#34;color:#ae81ff&#34;&gt;2&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;e2 &lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;=&lt;/span&gt; dy) {                                             &lt;span style=&#34;color:#75715e&#34;&gt;/* y step */&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;         &lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt; (y0 &lt;span style=&#34;color:#f92672&#34;&gt;==&lt;/span&gt; y1) &lt;span style=&#34;color:#66d9ef&#34;&gt;break&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;         &lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt; (dx&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;e2 &lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;0xff0000l&lt;/span&gt;) setPixelAA(x2&lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt;sx,y0,(dx&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;e2)&lt;span style=&#34;color:#f92672&#34;&gt;&amp;gt;&amp;gt;&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;16&lt;/span&gt;);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;         err &lt;span style=&#34;color:#f92672&#34;&gt;+=&lt;/span&gt; dx; y0 &lt;span style=&#34;color:#f92672&#34;&gt;+=&lt;/span&gt; sy;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;void&lt;/span&gt; plotCircleAA(&lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt; xm, &lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt; ym, &lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt; r)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;{                     &lt;span style=&#34;color:#75715e&#34;&gt;/* draw a black anti-aliased circle on white background */&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   &lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt; x &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;r, y &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;;           &lt;span style=&#34;color:#75715e&#34;&gt;/* II. quadrant from bottom left to top right */&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   &lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt; i, x2, e2, err &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;2&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;2&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;r;                             &lt;span style=&#34;color:#75715e&#34;&gt;/* error of 1.step */&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   r &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;err;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   &lt;span style=&#34;color:#66d9ef&#34;&gt;do&lt;/span&gt; {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      i &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;255&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;abs(err&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;2&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;(x&lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt;y)&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;2&lt;/span&gt;)&lt;span style=&#34;color:#f92672&#34;&gt;/&lt;/span&gt;r;               &lt;span style=&#34;color:#75715e&#34;&gt;/* get blend value of pixel */&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      setPixelAA(xm&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;x, ym&lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt;y, i);                             &lt;span style=&#34;color:#75715e&#34;&gt;/*   I. Quadrant */&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      setPixelAA(xm&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;y, ym&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;x, i);                             &lt;span style=&#34;color:#75715e&#34;&gt;/*  II. Quadrant */&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      setPixelAA(xm&lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt;x, ym&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;y, i);                             &lt;span style=&#34;color:#75715e&#34;&gt;/* III. Quadrant */&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      setPixelAA(xm&lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt;y, ym&lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt;x, i);                             &lt;span style=&#34;color:#75715e&#34;&gt;/*  IV. Quadrant */&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      e2 &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; err; x2 &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; x;                                    &lt;span style=&#34;color:#75715e&#34;&gt;/* remember values */&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt; (err&lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt;y &lt;span style=&#34;color:#f92672&#34;&gt;&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;) {                                              &lt;span style=&#34;color:#75715e&#34;&gt;/* x step */&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;         i &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;255&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;(err&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;2&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;x&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;)&lt;span style=&#34;color:#f92672&#34;&gt;/&lt;/span&gt;r;                              &lt;span style=&#34;color:#75715e&#34;&gt;/* outward pixel */&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;         &lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt; (i &lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;256&lt;/span&gt;) {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            setPixelAA(xm&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;x, ym&lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt;y&lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;, i);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            setPixelAA(xm&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;y&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;, ym&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;x, i);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            setPixelAA(xm&lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt;x, ym&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;y&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;, i);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            setPixelAA(xm&lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt;y&lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;, ym&lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt;x, i);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;         }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;         err &lt;span style=&#34;color:#f92672&#34;&gt;+=&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;++&lt;/span&gt;x&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;2&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt; (e2&lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt;x2 &lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;=&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;) {                                             &lt;span style=&#34;color:#75715e&#34;&gt;/* y step */&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;         i &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;255&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;(&lt;span style=&#34;color:#ae81ff&#34;&gt;2&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;y&lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;3&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;e2)&lt;span style=&#34;color:#f92672&#34;&gt;/&lt;/span&gt;r;                                &lt;span style=&#34;color:#75715e&#34;&gt;/* inward pixel */&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;         &lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt; (i &lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;256&lt;/span&gt;) {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            setPixelAA(xm&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;x2&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;, ym&lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt;y, i);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            setPixelAA(xm&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;y, ym&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;x2&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;, i);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            setPixelAA(xm&lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt;x2&lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;, ym&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;y, i);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            setPixelAA(xm&lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt;y, ym&lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt;x2&lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;, i);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;         }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;         err &lt;span style=&#34;color:#f92672&#34;&gt;+=&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;++&lt;/span&gt;y&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;2&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   } &lt;span style=&#34;color:#66d9ef&#34;&gt;while&lt;/span&gt; (x &lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;void&lt;/span&gt; plotEllipseRectAA(&lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt; x0, &lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt; y0, &lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt; x1, &lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt; y1)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;{        &lt;span style=&#34;color:#75715e&#34;&gt;/* draw a black anti-aliased rectangular ellipse on white background */&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   &lt;span style=&#34;color:#66d9ef&#34;&gt;long&lt;/span&gt; a &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; abs(x1&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;x0), b &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; abs(y1&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;y0), b1 &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; b&lt;span style=&#34;color:#f92672&#34;&gt;&amp;amp;&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;;                 &lt;span style=&#34;color:#75715e&#34;&gt;/* diameter */&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   &lt;span style=&#34;color:#66d9ef&#34;&gt;float&lt;/span&gt; dx &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;4&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;(a&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;1.0&lt;/span&gt;)&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;b&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;b, dy &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;4&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;(b1&lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;)&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;a&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;a;            &lt;span style=&#34;color:#75715e&#34;&gt;/* error increment */&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   &lt;span style=&#34;color:#66d9ef&#34;&gt;float&lt;/span&gt; ed, i, err &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; b1&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;a&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;a&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;dx&lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt;dy;                        &lt;span style=&#34;color:#75715e&#34;&gt;/* error of 1.step */&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   &lt;span style=&#34;color:#66d9ef&#34;&gt;bool&lt;/span&gt; f;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   &lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt; (a &lt;span style=&#34;color:#f92672&#34;&gt;==&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;||&lt;/span&gt; b &lt;span style=&#34;color:#f92672&#34;&gt;==&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;) &lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt; plotLine(x0,y0, x1,y1);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   &lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt; (x0 &lt;span style=&#34;color:#f92672&#34;&gt;&amp;gt;&lt;/span&gt; x1) { x0 &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; x1; x1 &lt;span style=&#34;color:#f92672&#34;&gt;+=&lt;/span&gt; a; }        &lt;span style=&#34;color:#75715e&#34;&gt;/* if called with swapped points */&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   &lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt; (y0 &lt;span style=&#34;color:#f92672&#34;&gt;&amp;gt;&lt;/span&gt; y1) y0 &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; y1;                                  &lt;span style=&#34;color:#75715e&#34;&gt;/* .. exchange them */&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   y0 &lt;span style=&#34;color:#f92672&#34;&gt;+=&lt;/span&gt; (b&lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;)&lt;span style=&#34;color:#f92672&#34;&gt;/&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;2&lt;/span&gt;; y1 &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; y0&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;b1;                               &lt;span style=&#34;color:#75715e&#34;&gt;/* starting pixel */&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   a &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;8&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;a&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;a; b1 &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;8&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;b&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;b;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   &lt;span style=&#34;color:#66d9ef&#34;&gt;for&lt;/span&gt; (;;) {                             &lt;span style=&#34;color:#75715e&#34;&gt;/* approximate ed=sqrt(dx*dx+dy*dy) */&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      i &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; min(dx,dy); ed &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; max(dx,dy);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt; (y0 &lt;span style=&#34;color:#f92672&#34;&gt;==&lt;/span&gt; y1&lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;&amp;amp;&amp;amp;&lt;/span&gt; err &lt;span style=&#34;color:#f92672&#34;&gt;&amp;gt;&lt;/span&gt; dy &lt;span style=&#34;color:#f92672&#34;&gt;&amp;amp;&amp;amp;&lt;/span&gt; a &lt;span style=&#34;color:#f92672&#34;&gt;&amp;gt;&lt;/span&gt; b1) ed &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;255&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;4.&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;/&lt;/span&gt;a;           &lt;span style=&#34;color:#75715e&#34;&gt;/* x-tip */&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#66d9ef&#34;&gt;else&lt;/span&gt; ed &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;255&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;/&lt;/span&gt;(ed&lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;2&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;ed&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;i&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;i&lt;span style=&#34;color:#f92672&#34;&gt;/&lt;/span&gt;(&lt;span style=&#34;color:#ae81ff&#34;&gt;4&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;ed&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;ed&lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt;i&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;i));             &lt;span style=&#34;color:#75715e&#34;&gt;/* approximation */&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      i &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; ed&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;fabs(err&lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt;dx&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;dy);           &lt;span style=&#34;color:#75715e&#34;&gt;/* get intensity value by pixel error */&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      setPixelAA(x0,y0, i); setPixelAA(x0,y1, i);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      setPixelAA(x1,y0, i); setPixelAA(x1,y1, i);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt; (f &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;2&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;err&lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt;dy &lt;span style=&#34;color:#f92672&#34;&gt;&amp;gt;=&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;) {                  &lt;span style=&#34;color:#75715e&#34;&gt;/* x step, remember condition */&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;         &lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt; (x0 &lt;span style=&#34;color:#f92672&#34;&gt;&amp;gt;=&lt;/span&gt; x1) &lt;span style=&#34;color:#66d9ef&#34;&gt;break&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;         i &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; ed&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;(err&lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt;dx);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;         &lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt; (i &lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;255&lt;/span&gt;) {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            setPixelAA(x0,y0&lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;, i); setPixelAA(x0,y1&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;, i);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            setPixelAA(x1,y0&lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;, i); setPixelAA(x1,y1&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;, i);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;         }          &lt;span style=&#34;color:#75715e&#34;&gt;/* do error increment later since values are still needed */&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt; (&lt;span style=&#34;color:#ae81ff&#34;&gt;2&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;err &lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;=&lt;/span&gt; dx) {                                            &lt;span style=&#34;color:#75715e&#34;&gt;/* y step */&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;         i &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; ed&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;(dy&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;err);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;         &lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt; (i &lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;255&lt;/span&gt;) {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            setPixelAA(x0&lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;,y0, i); setPixelAA(x1&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;,y0, i);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            setPixelAA(x0&lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;,y1, i); setPixelAA(x1&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;,y1, i);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;         }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;         y0&lt;span style=&#34;color:#f92672&#34;&gt;++&lt;/span&gt;; y1&lt;span style=&#34;color:#f92672&#34;&gt;--&lt;/span&gt;; err &lt;span style=&#34;color:#f92672&#34;&gt;+=&lt;/span&gt; dy &lt;span style=&#34;color:#f92672&#34;&gt;+=&lt;/span&gt; a;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt; (f) { x0&lt;span style=&#34;color:#f92672&#34;&gt;++&lt;/span&gt;; x1&lt;span style=&#34;color:#f92672&#34;&gt;--&lt;/span&gt;; err &lt;span style=&#34;color:#f92672&#34;&gt;-=&lt;/span&gt; dx &lt;span style=&#34;color:#f92672&#34;&gt;-=&lt;/span&gt; b1; }            &lt;span style=&#34;color:#75715e&#34;&gt;/* x error increment */&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   &lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt; (&lt;span style=&#34;color:#f92672&#34;&gt;--&lt;/span&gt;x0 &lt;span style=&#34;color:#f92672&#34;&gt;==&lt;/span&gt; x1&lt;span style=&#34;color:#f92672&#34;&gt;++&lt;/span&gt;)                       &lt;span style=&#34;color:#75715e&#34;&gt;/* too early stop of flat ellipses */&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#66d9ef&#34;&gt;while&lt;/span&gt; (y0&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;y1 &lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;&lt;/span&gt; b) {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;         i &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;255&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;4&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;fabs(err&lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt;dx)&lt;span style=&#34;color:#f92672&#34;&gt;/&lt;/span&gt;b1;               &lt;span style=&#34;color:#75715e&#34;&gt;/* -&amp;gt; finish tip of ellipse */&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;         setPixelAA(x0,&lt;span style=&#34;color:#f92672&#34;&gt;++&lt;/span&gt;y0, i); setPixelAA(x1,y0, i);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;         setPixelAA(x0,&lt;span style=&#34;color:#f92672&#34;&gt;--&lt;/span&gt;y1, i); setPixelAA(x1,y1, i);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;         err &lt;span style=&#34;color:#f92672&#34;&gt;+=&lt;/span&gt; dy &lt;span style=&#34;color:#f92672&#34;&gt;+=&lt;/span&gt; a;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;void&lt;/span&gt; plotQuadBezierSegAA(&lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt; x0, &lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt; y0, &lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt; x1, &lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt; y1, &lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt; x2, &lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt; y2)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;{                    &lt;span style=&#34;color:#75715e&#34;&gt;/* draw an limited anti-aliased quadratic Bezier segment */&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   &lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt; sx &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; x2&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;x1, sy &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; y2&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;y1;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   &lt;span style=&#34;color:#66d9ef&#34;&gt;long&lt;/span&gt; xx &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; x0&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;x1, yy &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; y0&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;y1, xy;             &lt;span style=&#34;color:#75715e&#34;&gt;/* relative values for checks */&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   &lt;span style=&#34;color:#66d9ef&#34;&gt;double&lt;/span&gt; dx, dy, err, ed, cur &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; xx&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;sy&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;yy&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;sx;                    &lt;span style=&#34;color:#75715e&#34;&gt;/* curvature */&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   assert(xx&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;sx &lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;=&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;&amp;amp;&amp;amp;&lt;/span&gt; yy&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;sy &lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;=&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;);      &lt;span style=&#34;color:#75715e&#34;&gt;/* sign of gradient must not change */&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   &lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt; (sx&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;(&lt;span style=&#34;color:#66d9ef&#34;&gt;long&lt;/span&gt;)sx&lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt;sy&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;(&lt;span style=&#34;color:#66d9ef&#34;&gt;long&lt;/span&gt;)sy &lt;span style=&#34;color:#f92672&#34;&gt;&amp;gt;&lt;/span&gt; xx&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;xx&lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt;yy&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;yy) {     &lt;span style=&#34;color:#75715e&#34;&gt;/* begin with longer part */&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      x2 &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; x0; x0 &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; sx&lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt;x1; y2 &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; y0; y0 &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; sy&lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt;y1; cur &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;cur;     &lt;span style=&#34;color:#75715e&#34;&gt;/* swap P0 P2 */&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   &lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt; (cur &lt;span style=&#34;color:#f92672&#34;&gt;!=&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   {                                                      &lt;span style=&#34;color:#75715e&#34;&gt;/* no straight line */&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      xx &lt;span style=&#34;color:#f92672&#34;&gt;+=&lt;/span&gt; sx; xx &lt;span style=&#34;color:#f92672&#34;&gt;*=&lt;/span&gt; sx &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; x0 &lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;&lt;/span&gt; x2 &lt;span style=&#34;color:#f92672&#34;&gt;?&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;;              &lt;span style=&#34;color:#75715e&#34;&gt;/* x step direction */&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      yy &lt;span style=&#34;color:#f92672&#34;&gt;+=&lt;/span&gt; sy; yy &lt;span style=&#34;color:#f92672&#34;&gt;*=&lt;/span&gt; sy &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; y0 &lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;&lt;/span&gt; y2 &lt;span style=&#34;color:#f92672&#34;&gt;?&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;;              &lt;span style=&#34;color:#75715e&#34;&gt;/* y step direction */&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      xy &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;2&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;xx&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;yy; xx &lt;span style=&#34;color:#f92672&#34;&gt;*=&lt;/span&gt; xx; yy &lt;span style=&#34;color:#f92672&#34;&gt;*=&lt;/span&gt; yy;             &lt;span style=&#34;color:#75715e&#34;&gt;/* differences 2nd degree */&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt; (cur&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;sx&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;sy &lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;) {                              &lt;span style=&#34;color:#75715e&#34;&gt;/* negated curvature? */&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;         xx &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;xx; yy &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;yy; xy &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;xy; cur &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;cur;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      dx &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;4.0&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;sy&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;(x1&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;x0)&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;cur&lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt;xx&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;xy;                &lt;span style=&#34;color:#75715e&#34;&gt;/* differences 1st degree */&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      dy &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;4.0&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;sx&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;(y0&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;y1)&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;cur&lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt;yy&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;xy;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      xx &lt;span style=&#34;color:#f92672&#34;&gt;+=&lt;/span&gt; xx; yy &lt;span style=&#34;color:#f92672&#34;&gt;+=&lt;/span&gt; yy; err &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; dx&lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt;dy&lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt;xy;                   &lt;span style=&#34;color:#75715e&#34;&gt;/* error 1st step */&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#66d9ef&#34;&gt;do&lt;/span&gt; {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;         cur &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; fmin(dx&lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt;xy,&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;xy&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;dy);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;         ed &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; fmax(dx&lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt;xy,&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;xy&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;dy);               &lt;span style=&#34;color:#75715e&#34;&gt;/* approximate error distance */&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;         ed &lt;span style=&#34;color:#f92672&#34;&gt;+=&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;2&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;ed&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;cur&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;cur&lt;span style=&#34;color:#f92672&#34;&gt;/&lt;/span&gt;(&lt;span style=&#34;color:#ae81ff&#34;&gt;4&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;ed&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;ed&lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt;cur&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;cur);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;         setPixelAA(x0,y0, &lt;span style=&#34;color:#ae81ff&#34;&gt;255&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;fabs(err&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;dx&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;dy&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;xy)&lt;span style=&#34;color:#f92672&#34;&gt;/&lt;/span&gt;ed);          &lt;span style=&#34;color:#75715e&#34;&gt;/* plot curve */&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;         &lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt; (x0 &lt;span style=&#34;color:#f92672&#34;&gt;==&lt;/span&gt; x2 &lt;span style=&#34;color:#f92672&#34;&gt;||&lt;/span&gt; y0 &lt;span style=&#34;color:#f92672&#34;&gt;==&lt;/span&gt; y2) &lt;span style=&#34;color:#66d9ef&#34;&gt;break&lt;/span&gt;;     &lt;span style=&#34;color:#75715e&#34;&gt;/* last pixel -&amp;gt; curve finished */&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;         x1 &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; x0; cur &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; dx&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;err; y1 &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;2&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;err&lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt;dy &lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;         &lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt; (&lt;span style=&#34;color:#ae81ff&#34;&gt;2&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;err&lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt;dx &lt;span style=&#34;color:#f92672&#34;&gt;&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;) {                                        &lt;span style=&#34;color:#75715e&#34;&gt;/* x step */&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt; (err&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;dy &lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;&lt;/span&gt; ed) setPixelAA(x0,y0&lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt;sy, &lt;span style=&#34;color:#ae81ff&#34;&gt;255&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;fabs(err&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;dy)&lt;span style=&#34;color:#f92672&#34;&gt;/&lt;/span&gt;ed);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            x0 &lt;span style=&#34;color:#f92672&#34;&gt;+=&lt;/span&gt; sx; dx &lt;span style=&#34;color:#f92672&#34;&gt;-=&lt;/span&gt; xy; err &lt;span style=&#34;color:#f92672&#34;&gt;+=&lt;/span&gt; dy &lt;span style=&#34;color:#f92672&#34;&gt;+=&lt;/span&gt; yy;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;         }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;         &lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt; (y1) {                                                  &lt;span style=&#34;color:#75715e&#34;&gt;/* y step */&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt; (cur &lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;&lt;/span&gt; ed) setPixelAA(x1&lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt;sx,y0, &lt;span style=&#34;color:#ae81ff&#34;&gt;255&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;fabs(cur)&lt;span style=&#34;color:#f92672&#34;&gt;/&lt;/span&gt;ed);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            y0 &lt;span style=&#34;color:#f92672&#34;&gt;+=&lt;/span&gt; sy; dy &lt;span style=&#34;color:#f92672&#34;&gt;-=&lt;/span&gt; xy; err &lt;span style=&#34;color:#f92672&#34;&gt;+=&lt;/span&gt; dx &lt;span style=&#34;color:#f92672&#34;&gt;+=&lt;/span&gt; xx;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;         }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      } &lt;span style=&#34;color:#66d9ef&#34;&gt;while&lt;/span&gt; (dy &lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;&lt;/span&gt; dx);                  &lt;span style=&#34;color:#75715e&#34;&gt;/* gradient negates -&amp;gt; close curves */&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   plotLineAA(x0,y0, x2,y2);                  &lt;span style=&#34;color:#75715e&#34;&gt;/* plot remaining needle to end */&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;void&lt;/span&gt; plotQuadRationalBezierSegAA(&lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt; x0, &lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt; y0, &lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt; x1, &lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt; y1,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                                 &lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt; x2, &lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt; y2, &lt;span style=&#34;color:#66d9ef&#34;&gt;float&lt;/span&gt; w)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;{   &lt;span style=&#34;color:#75715e&#34;&gt;/* draw an anti-aliased rational quadratic Bezier segment, squared weight */&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   &lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt; sx &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; x2&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;x1, sy &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; y2&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;y1;                  &lt;span style=&#34;color:#75715e&#34;&gt;/* relative values for checks */&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   &lt;span style=&#34;color:#66d9ef&#34;&gt;double&lt;/span&gt; dx &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; x0&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;x2, dy &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; y0&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;y2, xx &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; x0&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;x1, yy &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; y0&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;y1;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   &lt;span style=&#34;color:#66d9ef&#34;&gt;double&lt;/span&gt; xy &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; xx&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;sy&lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt;yy&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;sx, cur &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; xx&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;sy&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;yy&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;sx, err, ed;          &lt;span style=&#34;color:#75715e&#34;&gt;/* curvature */&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   &lt;span style=&#34;color:#66d9ef&#34;&gt;bool&lt;/span&gt; f;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   assert(xx&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;sx &lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;=&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;0.0&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;&amp;amp;&amp;amp;&lt;/span&gt; yy&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;sy &lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;=&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;0.0&lt;/span&gt;);  &lt;span style=&#34;color:#75715e&#34;&gt;/* sign of gradient must not change */&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   &lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt; (cur &lt;span style=&#34;color:#f92672&#34;&gt;!=&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;0.0&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;&amp;amp;&amp;amp;&lt;/span&gt; w &lt;span style=&#34;color:#f92672&#34;&gt;&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;0.0&lt;/span&gt;) {                           &lt;span style=&#34;color:#75715e&#34;&gt;/* no straight line */&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt; (sx&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;(&lt;span style=&#34;color:#66d9ef&#34;&gt;long&lt;/span&gt;)sx&lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt;sy&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;(&lt;span style=&#34;color:#66d9ef&#34;&gt;long&lt;/span&gt;)sy &lt;span style=&#34;color:#f92672&#34;&gt;&amp;gt;&lt;/span&gt; xx&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;xx&lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt;yy&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;yy) {  &lt;span style=&#34;color:#75715e&#34;&gt;/* begin with longer part */&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;         x2 &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; x0; x0 &lt;span style=&#34;color:#f92672&#34;&gt;-=&lt;/span&gt; dx; y2 &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; y0; y0 &lt;span style=&#34;color:#f92672&#34;&gt;-=&lt;/span&gt; dy; cur &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;cur;      &lt;span style=&#34;color:#75715e&#34;&gt;/* swap P0 P2 */&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      xx &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;2.0&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;(&lt;span style=&#34;color:#ae81ff&#34;&gt;4.0&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;w&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;sx&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;xx&lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt;dx&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;dx);                 &lt;span style=&#34;color:#75715e&#34;&gt;/* differences 2nd degree */&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      yy &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;2.0&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;(&lt;span style=&#34;color:#ae81ff&#34;&gt;4.0&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;w&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;sy&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;yy&lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt;dy&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;dy);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      sx &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; x0 &lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;&lt;/span&gt; x2 &lt;span style=&#34;color:#f92672&#34;&gt;?&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;;                              &lt;span style=&#34;color:#75715e&#34;&gt;/* x step direction */&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      sy &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; y0 &lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;&lt;/span&gt; y2 &lt;span style=&#34;color:#f92672&#34;&gt;?&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;;                              &lt;span style=&#34;color:#75715e&#34;&gt;/* y step direction */&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      xy &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;2.0&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;sx&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;sy&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;(&lt;span style=&#34;color:#ae81ff&#34;&gt;2.0&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;w&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;xy&lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt;dx&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;dy);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt; (cur&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;sx&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;sy &lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;) {                              &lt;span style=&#34;color:#75715e&#34;&gt;/* negated curvature? */&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;         xx &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;xx; yy &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;yy; cur &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;cur; xy &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;xy;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      dx &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;4.0&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;w&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;(x1&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;x0)&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;sy&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;cur&lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt;xx&lt;span style=&#34;color:#f92672&#34;&gt;/&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;2.0&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt;xy;          &lt;span style=&#34;color:#75715e&#34;&gt;/* differences 1st degree */&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      dy &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;4.0&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;w&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;(y0&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;y1)&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;sx&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;cur&lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt;yy&lt;span style=&#34;color:#f92672&#34;&gt;/&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;2.0&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt;xy;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt; (w &lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;0.5&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;&amp;amp;&amp;amp;&lt;/span&gt; dy &lt;span style=&#34;color:#f92672&#34;&gt;&amp;gt;&lt;/span&gt; dx) {              &lt;span style=&#34;color:#75715e&#34;&gt;/* flat ellipse, algorithm fails */&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;         cur &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; (w&lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;1.0&lt;/span&gt;)&lt;span style=&#34;color:#f92672&#34;&gt;/&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;2.0&lt;/span&gt;; w &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; sqrt(w); xy &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;1.0&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;/&lt;/span&gt;(w&lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;1.0&lt;/span&gt;);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;         sx &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; floor((x0&lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;2.0&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;w&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;x1&lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt;x2)&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;xy&lt;span style=&#34;color:#f92672&#34;&gt;/&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;2.0&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;0.5&lt;/span&gt;); &lt;span style=&#34;color:#75715e&#34;&gt;/* subdivide curve in half  */&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;         sy &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; floor((y0&lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;2.0&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;w&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;y1&lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt;y2)&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;xy&lt;span style=&#34;color:#f92672&#34;&gt;/&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;2.0&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;0.5&lt;/span&gt;);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;         dx &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; floor((w&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;x1&lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt;x0)&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;xy&lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;0.5&lt;/span&gt;); dy &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; floor((y1&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;w&lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt;y0)&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;xy&lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;0.5&lt;/span&gt;);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;         plotQuadRationalBezierSegAA(x0,y0, dx,dy, sx,sy, cur); &lt;span style=&#34;color:#75715e&#34;&gt;/* plot apart */&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;         dx &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; floor((w&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;x1&lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt;x2)&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;xy&lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;0.5&lt;/span&gt;); dy &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; floor((y1&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;w&lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt;y2)&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;xy&lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;0.5&lt;/span&gt;);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;         &lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt; plotQuadRationalBezierSegAA(sx,sy, dx,dy, x2,y2, cur);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      err &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; dx&lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt;dy&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;xy;                                       &lt;span style=&#34;color:#75715e&#34;&gt;/* error 1st step */&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#66d9ef&#34;&gt;do&lt;/span&gt; {                                                      &lt;span style=&#34;color:#75715e&#34;&gt;/* pixel loop */&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;         cur &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; fmin(dx&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;xy,xy&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;dy); ed &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; fmax(dx&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;xy,xy&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;dy);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;         ed &lt;span style=&#34;color:#f92672&#34;&gt;+=&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;2&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;ed&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;cur&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;cur&lt;span style=&#34;color:#f92672&#34;&gt;/&lt;/span&gt;(&lt;span style=&#34;color:#ae81ff&#34;&gt;4.&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;ed&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;ed&lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt;cur&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;cur); &lt;span style=&#34;color:#75715e&#34;&gt;/* approximate error distance */&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;         x1 &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;255&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;fabs(err&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;dx&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;dy&lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt;xy)&lt;span style=&#34;color:#f92672&#34;&gt;/&lt;/span&gt;ed;    &lt;span style=&#34;color:#75715e&#34;&gt;/* get blend value by pixel error */&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;         &lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt; (x1 &lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;256&lt;/span&gt;) setPixelAA(x0,y0, x1);                   &lt;span style=&#34;color:#75715e&#34;&gt;/* plot curve */&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;         &lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt; (f &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;2&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;err&lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt;dy &lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;) {                                    &lt;span style=&#34;color:#75715e&#34;&gt;/* y step */&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt; (y0 &lt;span style=&#34;color:#f92672&#34;&gt;==&lt;/span&gt; y2) &lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt;;             &lt;span style=&#34;color:#75715e&#34;&gt;/* last pixel -&amp;gt; curve finished */&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt; (dx&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;err &lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;&lt;/span&gt; ed) setPixelAA(x0&lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt;sx,y0, &lt;span style=&#34;color:#ae81ff&#34;&gt;255&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;fabs(dx&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;err)&lt;span style=&#34;color:#f92672&#34;&gt;/&lt;/span&gt;ed);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;         }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;         &lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt; (&lt;span style=&#34;color:#ae81ff&#34;&gt;2&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;err&lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt;dx &lt;span style=&#34;color:#f92672&#34;&gt;&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;) {                                        &lt;span style=&#34;color:#75715e&#34;&gt;/* x step */&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt; (x0 &lt;span style=&#34;color:#f92672&#34;&gt;==&lt;/span&gt; x2) &lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt;;             &lt;span style=&#34;color:#75715e&#34;&gt;/* last pixel -&amp;gt; curve finished */&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt; (err&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;dy &lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;&lt;/span&gt; ed) setPixelAA(x0,y0&lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt;sy, &lt;span style=&#34;color:#ae81ff&#34;&gt;255&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;fabs(err&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;dy)&lt;span style=&#34;color:#f92672&#34;&gt;/&lt;/span&gt;ed);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            x0 &lt;span style=&#34;color:#f92672&#34;&gt;+=&lt;/span&gt; sx; dx &lt;span style=&#34;color:#f92672&#34;&gt;+=&lt;/span&gt; xy; err &lt;span style=&#34;color:#f92672&#34;&gt;+=&lt;/span&gt; dy &lt;span style=&#34;color:#f92672&#34;&gt;+=&lt;/span&gt; yy;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;         }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;         &lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt; (f) { y0 &lt;span style=&#34;color:#f92672&#34;&gt;+=&lt;/span&gt; sy; dy &lt;span style=&#34;color:#f92672&#34;&gt;+=&lt;/span&gt; xy; err &lt;span style=&#34;color:#f92672&#34;&gt;+=&lt;/span&gt; dx &lt;span style=&#34;color:#f92672&#34;&gt;+=&lt;/span&gt; xx; }            &lt;span style=&#34;color:#75715e&#34;&gt;/* y step */&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      } &lt;span style=&#34;color:#66d9ef&#34;&gt;while&lt;/span&gt; (dy &lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;&lt;/span&gt; dx);               &lt;span style=&#34;color:#75715e&#34;&gt;/* gradient negates -&amp;gt; algorithm fails */&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   plotLineAA(x0,y0, x2,y2);                  &lt;span style=&#34;color:#75715e&#34;&gt;/* plot remaining needle to end */&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;void&lt;/span&gt; plotCubicBezierSegAA(&lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt; x0, &lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt; y0, &lt;span style=&#34;color:#66d9ef&#34;&gt;float&lt;/span&gt; x1, &lt;span style=&#34;color:#66d9ef&#34;&gt;float&lt;/span&gt; y1,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                          &lt;span style=&#34;color:#66d9ef&#34;&gt;float&lt;/span&gt; x2, &lt;span style=&#34;color:#66d9ef&#34;&gt;float&lt;/span&gt; y2, &lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt; x3, &lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt; y3)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;{                           &lt;span style=&#34;color:#75715e&#34;&gt;/* plot limited anti-aliased cubic Bezier segment */&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   &lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt; f, fx, fy, leg &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   &lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt; sx &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; x0 &lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;&lt;/span&gt; x3 &lt;span style=&#34;color:#f92672&#34;&gt;?&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;, sy &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; y0 &lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;&lt;/span&gt; y3 &lt;span style=&#34;color:#f92672&#34;&gt;?&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;;        &lt;span style=&#34;color:#75715e&#34;&gt;/* step direction */&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   &lt;span style=&#34;color:#66d9ef&#34;&gt;float&lt;/span&gt; xc &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;fabs(x0&lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt;x1&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;x2&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;x3), xa &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; xc&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;4&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;sx&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;(x1&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;x2), xb &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; sx&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;(x0&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;x1&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;x2&lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt;x3);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   &lt;span style=&#34;color:#66d9ef&#34;&gt;float&lt;/span&gt; yc &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;fabs(y0&lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt;y1&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;y2&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;y3), ya &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; yc&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;4&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;sy&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;(y1&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;y2), yb &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; sy&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;(y0&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;y1&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;y2&lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt;y3);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   &lt;span style=&#34;color:#66d9ef&#34;&gt;double&lt;/span&gt; ab, ac, bc, ba, xx, xy, yy, dx, dy, ex, px, py, ed, ip, EP &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;0.01&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                                                 &lt;span style=&#34;color:#75715e&#34;&gt;/* check for curve restrains */&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   &lt;span style=&#34;color:#75715e&#34;&gt;/* slope P0-P1 == P2-P3     and  (P0-P3 == P1-P2      or  no slope change) */&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   assert((x1&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;x0)&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;(x2&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;x3) &lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;&lt;/span&gt; EP &lt;span style=&#34;color:#f92672&#34;&gt;&amp;amp;&amp;amp;&lt;/span&gt; ((x3&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;x0)&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;(x1&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;x2) &lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;&lt;/span&gt; EP &lt;span style=&#34;color:#f92672&#34;&gt;||&lt;/span&gt; xb&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;xb &lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;&lt;/span&gt; xa&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;xc&lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt;EP));&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   assert((y1&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;y0)&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;(y2&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;y3) &lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;&lt;/span&gt; EP &lt;span style=&#34;color:#f92672&#34;&gt;&amp;amp;&amp;amp;&lt;/span&gt; ((y3&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;y0)&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;(y1&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;y2) &lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;&lt;/span&gt; EP &lt;span style=&#34;color:#f92672&#34;&gt;||&lt;/span&gt; yb&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;yb &lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;&lt;/span&gt; ya&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;yc&lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt;EP));&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   &lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt; (xa &lt;span style=&#34;color:#f92672&#34;&gt;==&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;&amp;amp;&amp;amp;&lt;/span&gt; ya &lt;span style=&#34;color:#f92672&#34;&gt;==&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;) {                              &lt;span style=&#34;color:#75715e&#34;&gt;/* quadratic Bezier */&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      sx &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; floor((&lt;span style=&#34;color:#ae81ff&#34;&gt;3&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;x1&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;x0&lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;)&lt;span style=&#34;color:#f92672&#34;&gt;/&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;2&lt;/span&gt;); sy &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; floor((&lt;span style=&#34;color:#ae81ff&#34;&gt;3&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;y1&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;y0&lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;)&lt;span style=&#34;color:#f92672&#34;&gt;/&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;2&lt;/span&gt;);   &lt;span style=&#34;color:#75715e&#34;&gt;/* new midpoint */&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt; plotQuadBezierSegAA(x0,y0, sx,sy, x3,y3);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   x1 &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; (x1&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;x0)&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;(x1&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;x0)&lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt;(y1&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;y0)&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;(y1&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;y0)&lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;;                    &lt;span style=&#34;color:#75715e&#34;&gt;/* line lengths */&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   x2 &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; (x2&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;x3)&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;(x2&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;x3)&lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt;(y2&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;y3)&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;(y2&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;y3)&lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   &lt;span style=&#34;color:#66d9ef&#34;&gt;do&lt;/span&gt; {                                                &lt;span style=&#34;color:#75715e&#34;&gt;/* loop over both ends */&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      ab &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; xa&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;yb&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;xb&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;ya; ac &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; xa&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;yc&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;xc&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;ya; bc &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; xb&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;yc&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;xc&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;yb;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      ip &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;4&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;ab&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;bc&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;ac&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;ac;                   &lt;span style=&#34;color:#75715e&#34;&gt;/* self intersection loop at all? */&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      ex &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; ab&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;(ab&lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt;ac&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;3&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;bc)&lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt;ac&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;ac;       &lt;span style=&#34;color:#75715e&#34;&gt;/* P0 part of self-intersection loop? */&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      f &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; ex &lt;span style=&#34;color:#f92672&#34;&gt;&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;?&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; sqrt(&lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;1024&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;/&lt;/span&gt;x1);               &lt;span style=&#34;color:#75715e&#34;&gt;/* calculate resolution */&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      ab &lt;span style=&#34;color:#f92672&#34;&gt;*=&lt;/span&gt; f; ac &lt;span style=&#34;color:#f92672&#34;&gt;*=&lt;/span&gt; f; bc &lt;span style=&#34;color:#f92672&#34;&gt;*=&lt;/span&gt; f; ex &lt;span style=&#34;color:#f92672&#34;&gt;*=&lt;/span&gt; f&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;f;            &lt;span style=&#34;color:#75715e&#34;&gt;/* increase resolution */&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      xy &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;9&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;(ab&lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt;ac&lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt;bc)&lt;span style=&#34;color:#f92672&#34;&gt;/&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;8&lt;/span&gt;; ba &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;8&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;(xa&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;ya);  &lt;span style=&#34;color:#75715e&#34;&gt;/* init differences of 1st degree */&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      dx &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;27&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;(&lt;span style=&#34;color:#ae81ff&#34;&gt;8&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;ab&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;(yb&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;yb&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;ya&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;yc)&lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt;ex&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;(ya&lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;2&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;yb&lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt;yc))&lt;span style=&#34;color:#f92672&#34;&gt;/&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;64&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;ya&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;ya&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;(xy&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;ya);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      dy &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;27&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;(&lt;span style=&#34;color:#ae81ff&#34;&gt;8&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;ab&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;(xb&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;xb&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;xa&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;xc)&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;ex&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;(xa&lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;2&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;xb&lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt;xc))&lt;span style=&#34;color:#f92672&#34;&gt;/&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;64&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;xa&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;xa&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;(xy&lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt;xa);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                                            &lt;span style=&#34;color:#75715e&#34;&gt;/* init differences of 2nd degree */&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      xx &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;3&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;(&lt;span style=&#34;color:#ae81ff&#34;&gt;3&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;ab&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;(&lt;span style=&#34;color:#ae81ff&#34;&gt;3&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;yb&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;yb&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;ya&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;ya&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;2&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;ya&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;yc)&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;ya&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;(&lt;span style=&#34;color:#ae81ff&#34;&gt;3&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;ac&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;(ya&lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt;yb)&lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt;ya&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;ba))&lt;span style=&#34;color:#f92672&#34;&gt;/&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;4&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      yy &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;3&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;(&lt;span style=&#34;color:#ae81ff&#34;&gt;3&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;ab&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;(&lt;span style=&#34;color:#ae81ff&#34;&gt;3&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;xb&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;xb&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;xa&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;xa&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;2&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;xa&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;xc)&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;xa&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;(&lt;span style=&#34;color:#ae81ff&#34;&gt;3&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;ac&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;(xa&lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt;xb)&lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt;xa&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;ba))&lt;span style=&#34;color:#f92672&#34;&gt;/&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;4&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      xy &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; xa&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;ya&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;(&lt;span style=&#34;color:#ae81ff&#34;&gt;6&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;ab&lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;6&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;ac&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;3&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;bc&lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt;ba); ac &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; ya&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;ya; ba &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; xa&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;xa;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      xy &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;3&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;(xy&lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;9&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;f&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;(ba&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;yb&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;yc&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;xb&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;xc&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;ac)&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;18&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;xb&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;yb&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;ab)&lt;span style=&#34;color:#f92672&#34;&gt;/&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;8&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt; (ex &lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;) {         &lt;span style=&#34;color:#75715e&#34;&gt;/* negate values if inside self-intersection loop */&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;         dx &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;dx; dy &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;dy; xx &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;xx; yy &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;yy; xy &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;xy; ac &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;ac; ba &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;ba;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      }                                     &lt;span style=&#34;color:#75715e&#34;&gt;/* init differences of 3rd degree */&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      ab &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;6&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;ya&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;ac; ac &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;6&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;xa&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;ac; bc &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;6&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;ya&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;ba; ba &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;6&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;xa&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;ba;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      dx &lt;span style=&#34;color:#f92672&#34;&gt;+=&lt;/span&gt; xy; ex &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; dx&lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt;dy; dy &lt;span style=&#34;color:#f92672&#34;&gt;+=&lt;/span&gt; xy;                    &lt;span style=&#34;color:#75715e&#34;&gt;/* error of 1st step */&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#66d9ef&#34;&gt;for&lt;/span&gt; (fx &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; fy &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; f; x0 &lt;span style=&#34;color:#f92672&#34;&gt;!=&lt;/span&gt; x3 &lt;span style=&#34;color:#f92672&#34;&gt;&amp;amp;&amp;amp;&lt;/span&gt; y0 &lt;span style=&#34;color:#f92672&#34;&gt;!=&lt;/span&gt; y3; ) {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;         y1 &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; fmin(fabs(xy&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;dx),fabs(dy&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;xy));&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;         ed &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; fmax(fabs(xy&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;dx),fabs(dy&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;xy));    &lt;span style=&#34;color:#75715e&#34;&gt;/* approximate error distance */&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;         ed &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; f&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;(ed&lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;2&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;ed&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;y1&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;y1&lt;span style=&#34;color:#f92672&#34;&gt;/&lt;/span&gt;(&lt;span style=&#34;color:#ae81ff&#34;&gt;4&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;ed&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;ed&lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt;y1&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;y1));&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;         y1 &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;255&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;fabs(ex&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;(f&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;fx&lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;)&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;dx&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;(f&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;fy&lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;)&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;dy&lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt;f&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;xy)&lt;span style=&#34;color:#f92672&#34;&gt;/&lt;/span&gt;ed;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;         &lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt; (y1 &lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;256&lt;/span&gt;) setPixelAA(x0, y0, y1);                  &lt;span style=&#34;color:#75715e&#34;&gt;/* plot curve */&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;         px &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; fabs(ex&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;(f&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;fx&lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;)&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;dx&lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt;(fy&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;)&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;dy);       &lt;span style=&#34;color:#75715e&#34;&gt;/* pixel intensity x move */&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;         py &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; fabs(ex&lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt;(fx&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;)&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;dx&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;(f&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;fy&lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;)&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;dy);       &lt;span style=&#34;color:#75715e&#34;&gt;/* pixel intensity y move */&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;         y2 &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; y0;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;         &lt;span style=&#34;color:#66d9ef&#34;&gt;do&lt;/span&gt; {                                  &lt;span style=&#34;color:#75715e&#34;&gt;/* move sub-steps of one pixel */&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt; (ip &lt;span style=&#34;color:#f92672&#34;&gt;&amp;gt;=&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;EP)               &lt;span style=&#34;color:#75715e&#34;&gt;/* intersection possible? -&amp;gt; check.. */&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;               &lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt; (dx&lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt;xx &lt;span style=&#34;color:#f92672&#34;&gt;&amp;gt;&lt;/span&gt; xy &lt;span style=&#34;color:#f92672&#34;&gt;||&lt;/span&gt; dy&lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt;yy &lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;&lt;/span&gt; xy) &lt;span style=&#34;color:#66d9ef&#34;&gt;goto&lt;/span&gt; exit;   &lt;span style=&#34;color:#75715e&#34;&gt;/* two x or y steps */&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            y1 &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;2&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;ex&lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt;dx;                    &lt;span style=&#34;color:#75715e&#34;&gt;/* save value for test of y step */&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt; (&lt;span style=&#34;color:#ae81ff&#34;&gt;2&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;ex&lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt;dy &lt;span style=&#34;color:#f92672&#34;&gt;&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;) {                                  &lt;span style=&#34;color:#75715e&#34;&gt;/* x sub-step */&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;               fx&lt;span style=&#34;color:#f92672&#34;&gt;--&lt;/span&gt;; ex &lt;span style=&#34;color:#f92672&#34;&gt;+=&lt;/span&gt; dx &lt;span style=&#34;color:#f92672&#34;&gt;+=&lt;/span&gt; xx; dy &lt;span style=&#34;color:#f92672&#34;&gt;+=&lt;/span&gt; xy &lt;span style=&#34;color:#f92672&#34;&gt;+=&lt;/span&gt; ac; yy &lt;span style=&#34;color:#f92672&#34;&gt;+=&lt;/span&gt; bc; xx &lt;span style=&#34;color:#f92672&#34;&gt;+=&lt;/span&gt; ab;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            } &lt;span style=&#34;color:#66d9ef&#34;&gt;else&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt; (y1 &lt;span style=&#34;color:#f92672&#34;&gt;&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;) &lt;span style=&#34;color:#66d9ef&#34;&gt;goto&lt;/span&gt; exit;                 &lt;span style=&#34;color:#75715e&#34;&gt;/* tiny nearly cusp */&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt; (y1 &lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;=&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;) {                                      &lt;span style=&#34;color:#75715e&#34;&gt;/* y sub-step */&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;               fy&lt;span style=&#34;color:#f92672&#34;&gt;--&lt;/span&gt;; ex &lt;span style=&#34;color:#f92672&#34;&gt;+=&lt;/span&gt; dy &lt;span style=&#34;color:#f92672&#34;&gt;+=&lt;/span&gt; yy; dx &lt;span style=&#34;color:#f92672&#34;&gt;+=&lt;/span&gt; xy &lt;span style=&#34;color:#f92672&#34;&gt;+=&lt;/span&gt; bc; xx &lt;span style=&#34;color:#f92672&#34;&gt;+=&lt;/span&gt; ac; yy &lt;span style=&#34;color:#f92672&#34;&gt;+=&lt;/span&gt; ba;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;         } &lt;span style=&#34;color:#66d9ef&#34;&gt;while&lt;/span&gt; (fx &lt;span style=&#34;color:#f92672&#34;&gt;&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;&amp;amp;&amp;amp;&lt;/span&gt; fy &lt;span style=&#34;color:#f92672&#34;&gt;&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;);                       &lt;span style=&#34;color:#75715e&#34;&gt;/* pixel complete? */&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;         &lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt; (&lt;span style=&#34;color:#ae81ff&#34;&gt;2&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;fy &lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;=&lt;/span&gt; f) {                           &lt;span style=&#34;color:#75715e&#34;&gt;/* x+ anti-aliasing pixel */&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt; (py &lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;&lt;/span&gt; ed) setPixelAA(x0&lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt;sx, y0, &lt;span style=&#34;color:#ae81ff&#34;&gt;255&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;py&lt;span style=&#34;color:#f92672&#34;&gt;/&lt;/span&gt;ed);      &lt;span style=&#34;color:#75715e&#34;&gt;/* plot curve */&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            y0 &lt;span style=&#34;color:#f92672&#34;&gt;+=&lt;/span&gt; sy; fy &lt;span style=&#34;color:#f92672&#34;&gt;+=&lt;/span&gt; f;                                      &lt;span style=&#34;color:#75715e&#34;&gt;/* y step */&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;         }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;         &lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt; (&lt;span style=&#34;color:#ae81ff&#34;&gt;2&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;fx &lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;=&lt;/span&gt; f) {                           &lt;span style=&#34;color:#75715e&#34;&gt;/* y+ anti-aliasing pixel */&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt; (px &lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;&lt;/span&gt; ed) setPixelAA(x0, y2&lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt;sy, &lt;span style=&#34;color:#ae81ff&#34;&gt;255&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;px&lt;span style=&#34;color:#f92672&#34;&gt;/&lt;/span&gt;ed);      &lt;span style=&#34;color:#75715e&#34;&gt;/* plot curve */&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            x0 &lt;span style=&#34;color:#f92672&#34;&gt;+=&lt;/span&gt; sx; fx &lt;span style=&#34;color:#f92672&#34;&gt;+=&lt;/span&gt; f;                                      &lt;span style=&#34;color:#75715e&#34;&gt;/* x step */&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;         }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#66d9ef&#34;&gt;break&lt;/span&gt;;                                          &lt;span style=&#34;color:#75715e&#34;&gt;/* finish curve by line */&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;exit:&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt; (&lt;span style=&#34;color:#ae81ff&#34;&gt;2&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;ex &lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;&lt;/span&gt; dy &lt;span style=&#34;color:#f92672&#34;&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;2&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;fy &lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;=&lt;/span&gt; f&lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;2&lt;/span&gt;) {         &lt;span style=&#34;color:#75715e&#34;&gt;/* round x+ approximation pixel */&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;         &lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt; (py &lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;&lt;/span&gt; ed) setPixelAA(x0&lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt;sx, y0, &lt;span style=&#34;color:#ae81ff&#34;&gt;255&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;py&lt;span style=&#34;color:#f92672&#34;&gt;/&lt;/span&gt;ed);         &lt;span style=&#34;color:#75715e&#34;&gt;/* plot curve */&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;         y0 &lt;span style=&#34;color:#f92672&#34;&gt;+=&lt;/span&gt; sy;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt; (&lt;span style=&#34;color:#ae81ff&#34;&gt;2&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;ex &lt;span style=&#34;color:#f92672&#34;&gt;&amp;gt;&lt;/span&gt; dx &lt;span style=&#34;color:#f92672&#34;&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;2&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;fx &lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;=&lt;/span&gt; f&lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;2&lt;/span&gt;) {         &lt;span style=&#34;color:#75715e&#34;&gt;/* round y+ approximation pixel */&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;         &lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt; (px &lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;&lt;/span&gt; ed) setPixelAA(x0, y2&lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt;sy, &lt;span style=&#34;color:#ae81ff&#34;&gt;255&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;px&lt;span style=&#34;color:#f92672&#34;&gt;/&lt;/span&gt;ed);         &lt;span style=&#34;color:#75715e&#34;&gt;/* plot curve */&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;         x0 &lt;span style=&#34;color:#f92672&#34;&gt;+=&lt;/span&gt; sx;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      xx &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; x0; x0 &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; x3; x3 &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; xx; sx &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;sx; xb &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;xb;             &lt;span style=&#34;color:#75715e&#34;&gt;/* swap legs */&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      yy &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; y0; y0 &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; y3; y3 &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; yy; sy &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;sy; yb &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;yb; x1 &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; x2;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   } &lt;span style=&#34;color:#66d9ef&#34;&gt;while&lt;/span&gt; (leg&lt;span style=&#34;color:#f92672&#34;&gt;--&lt;/span&gt;);                                          &lt;span style=&#34;color:#75715e&#34;&gt;/* try other end */&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   plotLineAA(x0,y0, x3,y3);     &lt;span style=&#34;color:#75715e&#34;&gt;/* remaining part in case of cusp or crunode */&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;void&lt;/span&gt; plotLineWidth(&lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt; x0, &lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt; y0, &lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt; x1, &lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt; y1, &lt;span style=&#34;color:#66d9ef&#34;&gt;float&lt;/span&gt; wd)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;{                                    &lt;span style=&#34;color:#75715e&#34;&gt;/* plot an anti-aliased line of width wd */&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   &lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt; dx &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; abs(x1&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;x0), sx &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; x0 &lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;&lt;/span&gt; x1 &lt;span style=&#34;color:#f92672&#34;&gt;?&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   &lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt; dy &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; abs(y1&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;y0), sy &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; y0 &lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;&lt;/span&gt; y1 &lt;span style=&#34;color:#f92672&#34;&gt;?&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   &lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt; err &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; dx&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;dy, e2, x2, y2;                           &lt;span style=&#34;color:#75715e&#34;&gt;/* error value e_xy */&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   &lt;span style=&#34;color:#66d9ef&#34;&gt;float&lt;/span&gt; ed &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; dx&lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt;dy &lt;span style=&#34;color:#f92672&#34;&gt;==&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;?&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; sqrt((&lt;span style=&#34;color:#66d9ef&#34;&gt;float&lt;/span&gt;)dx&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;dx&lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt;(&lt;span style=&#34;color:#66d9ef&#34;&gt;float&lt;/span&gt;)dy&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;dy);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   &lt;span style=&#34;color:#66d9ef&#34;&gt;for&lt;/span&gt; (wd &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; (wd&lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;)&lt;span style=&#34;color:#f92672&#34;&gt;/&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;2&lt;/span&gt;; ; ) {                                    &lt;span style=&#34;color:#75715e&#34;&gt;/* pixel loop */&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      setPixelColor(x0, y0, max(&lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;,&lt;span style=&#34;color:#ae81ff&#34;&gt;255&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;(abs(err&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;dx&lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt;dy)&lt;span style=&#34;color:#f92672&#34;&gt;/&lt;/span&gt;ed&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;wd&lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;)));&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      e2 &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; err; x2 &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; x0;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt; (&lt;span style=&#34;color:#ae81ff&#34;&gt;2&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;e2 &lt;span style=&#34;color:#f92672&#34;&gt;&amp;gt;=&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;dx) {                                            &lt;span style=&#34;color:#75715e&#34;&gt;/* x step */&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;         &lt;span style=&#34;color:#66d9ef&#34;&gt;for&lt;/span&gt; (e2 &lt;span style=&#34;color:#f92672&#34;&gt;+=&lt;/span&gt; dy, y2 &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; y0; e2 &lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;&lt;/span&gt; ed&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;wd &lt;span style=&#34;color:#f92672&#34;&gt;&amp;amp;&amp;amp;&lt;/span&gt; (y1 &lt;span style=&#34;color:#f92672&#34;&gt;!=&lt;/span&gt; y2 &lt;span style=&#34;color:#f92672&#34;&gt;||&lt;/span&gt; dx &lt;span style=&#34;color:#f92672&#34;&gt;&amp;gt;&lt;/span&gt; dy); e2 &lt;span style=&#34;color:#f92672&#34;&gt;+=&lt;/span&gt; dx)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            setPixelColor(x0, y2 &lt;span style=&#34;color:#f92672&#34;&gt;+=&lt;/span&gt; sy, max(&lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;,&lt;span style=&#34;color:#ae81ff&#34;&gt;255&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;(abs(e2)&lt;span style=&#34;color:#f92672&#34;&gt;/&lt;/span&gt;ed&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;wd&lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;)));&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;         &lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt; (x0 &lt;span style=&#34;color:#f92672&#34;&gt;==&lt;/span&gt; x1) &lt;span style=&#34;color:#66d9ef&#34;&gt;break&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;         e2 &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; err; err &lt;span style=&#34;color:#f92672&#34;&gt;-=&lt;/span&gt; dy; x0 &lt;span style=&#34;color:#f92672&#34;&gt;+=&lt;/span&gt; sx;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt; (&lt;span style=&#34;color:#ae81ff&#34;&gt;2&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;e2 &lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;=&lt;/span&gt; dy) {                                             &lt;span style=&#34;color:#75715e&#34;&gt;/* y step */&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;         &lt;span style=&#34;color:#66d9ef&#34;&gt;for&lt;/span&gt; (e2 &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; dx&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;e2; e2 &lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;&lt;/span&gt; ed&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;wd &lt;span style=&#34;color:#f92672&#34;&gt;&amp;amp;&amp;amp;&lt;/span&gt; (x1 &lt;span style=&#34;color:#f92672&#34;&gt;!=&lt;/span&gt; x2 &lt;span style=&#34;color:#f92672&#34;&gt;||&lt;/span&gt; dx &lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;&lt;/span&gt; dy); e2 &lt;span style=&#34;color:#f92672&#34;&gt;+=&lt;/span&gt; dy)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            setPixelColor(x2 &lt;span style=&#34;color:#f92672&#34;&gt;+=&lt;/span&gt; sx, y0, max(&lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;,&lt;span style=&#34;color:#ae81ff&#34;&gt;255&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;(abs(e2)&lt;span style=&#34;color:#f92672&#34;&gt;/&lt;/span&gt;ed&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;wd&lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;)));&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;         &lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt; (y0 &lt;span style=&#34;color:#f92672&#34;&gt;==&lt;/span&gt; y1) &lt;span style=&#34;color:#66d9ef&#34;&gt;break&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;         err &lt;span style=&#34;color:#f92672&#34;&gt;+=&lt;/span&gt; dx; y0 &lt;span style=&#34;color:#f92672&#34;&gt;+=&lt;/span&gt; sy;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;void&lt;/span&gt; plotQuadSpline(&lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt; n, &lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt; x[], &lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt; y[])&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;{                         &lt;span style=&#34;color:#75715e&#34;&gt;/* plot quadratic spline, destroys input arrays x,y */&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   &lt;span style=&#34;color:#75715e&#34;&gt;#define M_MAX 6&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;   &lt;span style=&#34;color:#66d9ef&#34;&gt;float&lt;/span&gt; mi &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;, m[M_MAX];                    &lt;span style=&#34;color:#75715e&#34;&gt;/* diagonal constants of matrix */&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   &lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt; i, x0, y0, x1, y1, x2 &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; x[n], y2 &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; y[n];&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   assert(n &lt;span style=&#34;color:#f92672&#34;&gt;&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;);                        &lt;span style=&#34;color:#75715e&#34;&gt;/* need at least 3 points P[0]..P[n] */&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   x[&lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;] &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; x0 &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;8&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;x[&lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;]&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;2&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;x[&lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;];                          &lt;span style=&#34;color:#75715e&#34;&gt;/* first row of matrix */&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   y[&lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;] &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; y0 &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;8&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;y[&lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;]&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;2&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;y[&lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;];&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   &lt;span style=&#34;color:#66d9ef&#34;&gt;for&lt;/span&gt; (i &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;2&lt;/span&gt;; i &lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;&lt;/span&gt; n; i&lt;span style=&#34;color:#f92672&#34;&gt;++&lt;/span&gt;) {                                 &lt;span style=&#34;color:#75715e&#34;&gt;/* forward sweep */&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt; (i&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;2&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;&lt;/span&gt; M_MAX) m[i&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;2&lt;/span&gt;] &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; mi &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;1.0&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;/&lt;/span&gt;(&lt;span style=&#34;color:#ae81ff&#34;&gt;6.0&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;mi);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      x[i] &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; x0 &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; floor(&lt;span style=&#34;color:#ae81ff&#34;&gt;8&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;x[i]&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;x0&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;mi&lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;0.5&lt;/span&gt;);                        &lt;span style=&#34;color:#75715e&#34;&gt;/* store yi */&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      y[i] &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; y0 &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; floor(&lt;span style=&#34;color:#ae81ff&#34;&gt;8&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;y[i]&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;y0&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;mi&lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;0.5&lt;/span&gt;);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   x1 &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; floor((x0&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;2&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;x2)&lt;span style=&#34;color:#f92672&#34;&gt;/&lt;/span&gt;(&lt;span style=&#34;color:#ae81ff&#34;&gt;5.0&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;mi)&lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;0.5&lt;/span&gt;);                 &lt;span style=&#34;color:#75715e&#34;&gt;/* correction last row */&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   y1 &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; floor((y0&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;2&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;y2)&lt;span style=&#34;color:#f92672&#34;&gt;/&lt;/span&gt;(&lt;span style=&#34;color:#ae81ff&#34;&gt;5.0&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;mi)&lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;0.5&lt;/span&gt;);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   &lt;span style=&#34;color:#66d9ef&#34;&gt;for&lt;/span&gt; (i &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; n&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;2&lt;/span&gt;; i &lt;span style=&#34;color:#f92672&#34;&gt;&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;; i&lt;span style=&#34;color:#f92672&#34;&gt;--&lt;/span&gt;) {                           &lt;span style=&#34;color:#75715e&#34;&gt;/* back substitution */&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt; (i &lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;=&lt;/span&gt; M_MAX) mi &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; m[i&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;];&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      x0 &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; floor((x[i]&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;x1)&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;mi&lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;0.5&lt;/span&gt;);                            &lt;span style=&#34;color:#75715e&#34;&gt;/* next corner */&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      y0 &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; floor((y[i]&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;y1)&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;mi&lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;0.5&lt;/span&gt;);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      plotQuadBezier((x0&lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt;x1)&lt;span style=&#34;color:#f92672&#34;&gt;/&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;2&lt;/span&gt;,(y0&lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt;y1)&lt;span style=&#34;color:#f92672&#34;&gt;/&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;2&lt;/span&gt;, x1,y1, x2,y2);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      x2 &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; (x0&lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt;x1)&lt;span style=&#34;color:#f92672&#34;&gt;/&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;2&lt;/span&gt;; x1 &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; x0;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      y2 &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; (y0&lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt;y1)&lt;span style=&#34;color:#f92672&#34;&gt;/&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;2&lt;/span&gt;; y1 &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; y0;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   plotQuadBezier(x[&lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;],y[&lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;], x1,y1, x2,y2);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;void&lt;/span&gt; plotCubicSpline(&lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt; n, &lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt; x[], &lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt; y[])&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;{                             &lt;span style=&#34;color:#75715e&#34;&gt;/* plot cubic spline, destroys input arrays x,y */&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   &lt;span style=&#34;color:#75715e&#34;&gt;#define M_MAX 6&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;   &lt;span style=&#34;color:#66d9ef&#34;&gt;float&lt;/span&gt; mi &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;0.25&lt;/span&gt;, m[M_MAX];                 &lt;span style=&#34;color:#75715e&#34;&gt;/* diagonal constants of matrix */&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   &lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt; x3 &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; x[n&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;], y3 &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; y[n&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;], x4 &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; x[n], y4 &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; y[n];&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   &lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt; i, x0, y0, x1, y1, x2, y2;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   assert(n &lt;span style=&#34;color:#f92672&#34;&gt;&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;2&lt;/span&gt;);                        &lt;span style=&#34;color:#75715e&#34;&gt;/* need at least 4 points P[0]..P[n] */&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   x[&lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;] &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; x0 &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;12&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;x[&lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;]&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;3&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;x[&lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;];                         &lt;span style=&#34;color:#75715e&#34;&gt;/* first row of matrix */&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   y[&lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;] &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; y0 &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;12&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;y[&lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;]&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;3&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;y[&lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;];&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   &lt;span style=&#34;color:#66d9ef&#34;&gt;for&lt;/span&gt; (i &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;2&lt;/span&gt;; i &lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;&lt;/span&gt; n; i&lt;span style=&#34;color:#f92672&#34;&gt;++&lt;/span&gt;) {                                &lt;span style=&#34;color:#75715e&#34;&gt;/* foreward sweep */&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt; (i&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;2&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;&lt;/span&gt; M_MAX) m[i&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;2&lt;/span&gt;] &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; mi &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;0.25&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;/&lt;/span&gt;(&lt;span style=&#34;color:#ae81ff&#34;&gt;2.0&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;mi);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      x[i] &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; x0 &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; floor(&lt;span style=&#34;color:#ae81ff&#34;&gt;12&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;x[i]&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;2&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;x0&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;mi&lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;0.5&lt;/span&gt;);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      y[i] &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; y0 &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; floor(&lt;span style=&#34;color:#ae81ff&#34;&gt;12&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;y[i]&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;2&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;y0&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;mi&lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;0.5&lt;/span&gt;);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   x2 &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; floor((x0&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;3&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;x4)&lt;span style=&#34;color:#f92672&#34;&gt;/&lt;/span&gt;(&lt;span style=&#34;color:#ae81ff&#34;&gt;7&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;4&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;mi)&lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;0.5&lt;/span&gt;);                    &lt;span style=&#34;color:#75715e&#34;&gt;/* correct last row */&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   y2 &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; floor((y0&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;3&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;y4)&lt;span style=&#34;color:#f92672&#34;&gt;/&lt;/span&gt;(&lt;span style=&#34;color:#ae81ff&#34;&gt;7&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;4&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;mi)&lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;0.5&lt;/span&gt;);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   plotCubicBezier(x3,y3, (x2&lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt;x4)&lt;span style=&#34;color:#f92672&#34;&gt;/&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;2&lt;/span&gt;,(y2&lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt;y4)&lt;span style=&#34;color:#f92672&#34;&gt;/&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;2&lt;/span&gt;, x4,y4, x4,y4);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   &lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt; (n&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;3&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;&lt;/span&gt; M_MAX) mi &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; m[n&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;3&lt;/span&gt;];&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   x1 &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; floor((x[n&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;2&lt;/span&gt;]&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;2&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;x2)&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;mi&lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;0.5&lt;/span&gt;);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   y1 &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; floor((y[n&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;2&lt;/span&gt;]&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;2&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;y2)&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;mi&lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;0.5&lt;/span&gt;);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   &lt;span style=&#34;color:#66d9ef&#34;&gt;for&lt;/span&gt; (i &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; n&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;3&lt;/span&gt;; i &lt;span style=&#34;color:#f92672&#34;&gt;&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;; i&lt;span style=&#34;color:#f92672&#34;&gt;--&lt;/span&gt;) {                           &lt;span style=&#34;color:#75715e&#34;&gt;/* back substitution */&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt; (i &lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;=&lt;/span&gt; M_MAX) mi &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; m[i&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;];&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      x0 &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; floor((x[i]&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;2&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;x1)&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;mi&lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;0.5&lt;/span&gt;);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      y0 &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; floor((y[i]&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;2&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;y1)&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;mi&lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;0.5&lt;/span&gt;);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      x4 &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; floor((x0&lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;4&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;x1&lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt;x2&lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;3&lt;/span&gt;)&lt;span style=&#34;color:#f92672&#34;&gt;/&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;6.0&lt;/span&gt;);                     &lt;span style=&#34;color:#75715e&#34;&gt;/* reconstruct P[i] */&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      y4 &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; floor((y0&lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;4&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;y1&lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt;y2&lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;3&lt;/span&gt;)&lt;span style=&#34;color:#f92672&#34;&gt;/&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;6.0&lt;/span&gt;);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      plotCubicBezier(x4,y4,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                      floor((&lt;span style=&#34;color:#ae81ff&#34;&gt;2&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;x1&lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt;x2)&lt;span style=&#34;color:#f92672&#34;&gt;/&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;3&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;0.5&lt;/span&gt;),floor((&lt;span style=&#34;color:#ae81ff&#34;&gt;2&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;y1&lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt;y2)&lt;span style=&#34;color:#f92672&#34;&gt;/&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;3&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;0.5&lt;/span&gt;),&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                      floor((x1&lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;2&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;x2)&lt;span style=&#34;color:#f92672&#34;&gt;/&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;3&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;0.5&lt;/span&gt;),floor((y1&lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;2&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;y2)&lt;span style=&#34;color:#f92672&#34;&gt;/&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;3&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;0.5&lt;/span&gt;),&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                      x3,y3);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      x3 &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; x4; y3 &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; y4; x2 &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; x1; y2 &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; y1; x1 &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; x0; y1 &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; y0;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   x0 &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; x[&lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;]; x4 &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; floor((&lt;span style=&#34;color:#ae81ff&#34;&gt;3&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;x0&lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;7&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;x1&lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;2&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;x2&lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;6&lt;/span&gt;)&lt;span style=&#34;color:#f92672&#34;&gt;/&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;12.0&lt;/span&gt;);        &lt;span style=&#34;color:#75715e&#34;&gt;/* reconstruct P[1] */&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   y0 &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; y[&lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;]; y4 &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; floor((&lt;span style=&#34;color:#ae81ff&#34;&gt;3&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;y0&lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;7&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;y1&lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;2&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;y2&lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;6&lt;/span&gt;)&lt;span style=&#34;color:#f92672&#34;&gt;/&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;12.0&lt;/span&gt;);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   plotCubicBezier(x4,y4, floor((&lt;span style=&#34;color:#ae81ff&#34;&gt;2&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;x1&lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt;x2)&lt;span style=&#34;color:#f92672&#34;&gt;/&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;3&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;0.5&lt;/span&gt;),floor((&lt;span style=&#34;color:#ae81ff&#34;&gt;2&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;y1&lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt;y2)&lt;span style=&#34;color:#f92672&#34;&gt;/&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;3&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;0.5&lt;/span&gt;),&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                   floor((x1&lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;2&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;x2)&lt;span style=&#34;color:#f92672&#34;&gt;/&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;3&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;0.5&lt;/span&gt;),floor((y1&lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;2&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;y2)&lt;span style=&#34;color:#f92672&#34;&gt;/&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;3&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;0.5&lt;/span&gt;), x3,y3);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   plotCubicBezier(x0,y0, x0,y0, (x0&lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt;x1)&lt;span style=&#34;color:#f92672&#34;&gt;/&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;2&lt;/span&gt;,(y0&lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt;y1)&lt;span style=&#34;color:#f92672&#34;&gt;/&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;2&lt;/span&gt;, x4,y4);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description>
    </item>
    <item>
      <title>FM17550读不到身份证UID的问题</title>
      <link>https://xcdd.pages.dev/blog/2020/2020-10-16/</link>
      <pubDate>Fri, 16 Oct 2020 10:25:07 +0000</pubDate>
      <guid>https://xcdd.pages.dev/blog/2020/2020-10-16/</guid>
      <description>&lt;p&gt;项目需要读身份证UID，用的是复旦微FM17550芯片，这款芯片封装是QFN32，管脚兼容RC522、SI522。&#xA;RC522只支持ISO/IEC-14443-A类卡片，&#xA;FM17550同时支持A类和B类，身份证是ISO/IEC-14443-B类卡片。&lt;/p&gt;&#xA;&lt;p&gt;软件驱动用的是复亘微官方提供的DEMO程序，该程序是基于STM32F103平台。&#xA;简单更换GPIO和SPI接口后，移植到STM32F429平台。&#xA;测试能读到A类卡的UID，但刷身份证没有反应，ReaderB_Request返回244(FM175XX_TIMER_ERR)，表示请求超时。&lt;/p&gt;&#xA;&lt;p&gt;经过一番摸索后，修改JREG_GSN和JREG_MODGSP寄存器解决问题。&#xA;初始化B类接收器的代码如下：&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-cpp&#34; data-lang=&#34;cpp&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;void&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;FM175XX_Initial_ReaderB&lt;/span&gt;(&lt;span style=&#34;color:#66d9ef&#34;&gt;void&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;{&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;ModifyReg(JREG_STATUS2,BIT3,RESET);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;SetReg(JREG_TXMODE,BIT7&lt;span style=&#34;color:#f92672&#34;&gt;|&lt;/span&gt;BIT1&lt;span style=&#34;color:#f92672&#34;&gt;|&lt;/span&gt;BIT0);&lt;span style=&#34;color:#75715e&#34;&gt;//BIT1~0 = 11 :ISO/IEC 14443B&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;&#x9;SetReg(JREG_RXMODE,BIT7&lt;span style=&#34;color:#f92672&#34;&gt;|&lt;/span&gt;BIT1&lt;span style=&#34;color:#f92672&#34;&gt;|&lt;/span&gt;BIT0);&lt;span style=&#34;color:#75715e&#34;&gt;//BIT1~0 = 11 :ISO/IEC 14443B&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;&#x9;SetReg(JREG_TXAUTO,&lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;SetReg(JREG_MODWIDTH,&lt;span style=&#34;color:#ae81ff&#34;&gt;0x26&lt;/span&gt;);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;SetReg(JREG_RXTRESHOLD,&lt;span style=&#34;color:#ae81ff&#34;&gt;0x55&lt;/span&gt;);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;SetReg(JREG_GSN,&lt;span style=&#34;color:#ae81ff&#34;&gt;0xF8&lt;/span&gt;);  &lt;span style=&#34;color:#75715e&#34;&gt;//低4位值越小，调制度越深，原值是0xF8未修改。&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;&#x9;SetReg(JREG_CWGSP,&lt;span style=&#34;color:#ae81ff&#34;&gt;0x3F&lt;/span&gt;);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;SetReg(JREG_MODGSP,&lt;span style=&#34;color:#ae81ff&#34;&gt;0x08&lt;/span&gt;); &lt;span style=&#34;color:#75715e&#34;&gt;//低6位值越小，调制度越深。原值是0x20读不到身份证。&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;&#x9;SetReg(JREG_CONTROL,&lt;span style=&#34;color:#ae81ff&#34;&gt;0x10&lt;/span&gt;);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;SetReg(JREG_RFCFG,&lt;span style=&#34;color:#ae81ff&#34;&gt;0x48&lt;/span&gt;);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;hr&gt;&#xA;&lt;p&gt;经过上面的修改后，刷身份证可以成功识别到了，但是还不能读UID。&#xA;因为身份证不是标准的B类卡，需要使用下面的流程读取UID：&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-cpp&#34; data-lang=&#34;cpp&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;1.&lt;/span&gt; REQB&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;发&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;05&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;00&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;00&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;收&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;50&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;00&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;00&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;00&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;00&lt;/span&gt; d1 &lt;span style=&#34;color:#ae81ff&#34;&gt;03&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;86&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;c &lt;span style=&#34;color:#ae81ff&#34;&gt;00&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;80&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;80&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;2.&lt;/span&gt; ATTRIB&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;发&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;d &lt;span style=&#34;color:#ae81ff&#34;&gt;00&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;00&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;00&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;00&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;00&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;08&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;01&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;08&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;收&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;08&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;3.&lt;/span&gt; UID&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;发&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;00&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;36&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;00&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;00&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;08&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;收&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; xx xx xx xx xx xx xx xx &lt;span style=&#34;color:#ae81ff&#34;&gt;90&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;00&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;UID是前面8个字节&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description>
    </item>
    <item>
      <title>C语言快速画直线和画圆的代码</title>
      <link>https://xcdd.pages.dev/blog/2020/2020-10-15/</link>
      <pubDate>Thu, 15 Oct 2020 08:44:29 +0000</pubDate>
      <guid>https://xcdd.pages.dev/blog/2020/2020-10-15/</guid>
      <description>&lt;p&gt;具体算法的原理我没有深入研究，总之用来快速画直线和画圆是目前很成熟的算法，拿来就用了^-^&#xA;整个算法过程中只用了整数加减和移位，非常适用于运算能力有限的单片机系统。&#xA;以下代码只需要把SetPixel替换为目标平台的画点函数就可以了。&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-cpp&#34; data-lang=&#34;cpp&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;//-------------------------------------------------------------------------------------------------&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;//画直线(x1,y1为起点坐标，x2,y2为终点坐标，绘制的直线包括起点，但不包括终点)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;void&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;DrawLine&lt;/span&gt;(&lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt; x1, &lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt; y1, &lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt; x2, &lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt; y2, &lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt; color)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;{&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt; di;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt; dx;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt; dy;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt; gx;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt; gy;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;di &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;gx &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; (x2 &lt;span style=&#34;color:#f92672&#34;&gt;&amp;gt;&lt;/span&gt; x1) &lt;span style=&#34;color:#f92672&#34;&gt;?&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;gy &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; (y2 &lt;span style=&#34;color:#f92672&#34;&gt;&amp;gt;&lt;/span&gt; y1) &lt;span style=&#34;color:#f92672&#34;&gt;?&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;dx &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; (x2 &lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt; x1) &lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt; gx &lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;dy &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; (y2 &lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt; y1) &lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt; gy &lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt;(dx &lt;span style=&#34;color:#f92672&#34;&gt;&amp;gt;=&lt;/span&gt; dy)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;{&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&#x9;&lt;span style=&#34;color:#66d9ef&#34;&gt;for&lt;/span&gt;(&lt;span style=&#34;color:#75715e&#34;&gt;/*x2 += gx*/&lt;/span&gt;; x1 &lt;span style=&#34;color:#f92672&#34;&gt;!=&lt;/span&gt; x2; x1 &lt;span style=&#34;color:#f92672&#34;&gt;+=&lt;/span&gt; gx)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&#x9;{&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&#x9;&#x9;di &lt;span style=&#34;color:#f92672&#34;&gt;+=&lt;/span&gt; dy;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&#x9;&#x9;&lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt;(di &lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;=&lt;/span&gt; dx)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&#x9;&#x9;{&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&#x9;&#x9;&#x9;SetPixel(dc, x1, y1, color);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&#x9;&#x9;&#x9;&lt;span style=&#34;color:#66d9ef&#34;&gt;continue&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&#x9;&#x9;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&#x9;&#x9;&lt;span style=&#34;color:#66d9ef&#34;&gt;while&lt;/span&gt;((di &lt;span style=&#34;color:#f92672&#34;&gt;&amp;gt;&lt;/span&gt; dx) &lt;span style=&#34;color:#f92672&#34;&gt;&amp;amp;&amp;amp;&lt;/span&gt; (y1 &lt;span style=&#34;color:#f92672&#34;&gt;!=&lt;/span&gt; y2))&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&#x9;&#x9;{&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&#x9;&#x9;&#x9;di &lt;span style=&#34;color:#f92672&#34;&gt;-=&lt;/span&gt; dx;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&#x9;&#x9;&#x9;y1 &lt;span style=&#34;color:#f92672&#34;&gt;+=&lt;/span&gt; gy;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&#x9;&#x9;&#x9;SetPixel(dc, x1, y1, color);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&#x9;&#x9;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&#x9;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&lt;span style=&#34;color:#66d9ef&#34;&gt;else&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;{&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&#x9;&lt;span style=&#34;color:#66d9ef&#34;&gt;for&lt;/span&gt;(&lt;span style=&#34;color:#75715e&#34;&gt;/*y2 += gw*/&lt;/span&gt;; y1 &lt;span style=&#34;color:#f92672&#34;&gt;!=&lt;/span&gt; y2; y1 &lt;span style=&#34;color:#f92672&#34;&gt;+=&lt;/span&gt; gy)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&#x9;{&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&#x9;&#x9;di &lt;span style=&#34;color:#f92672&#34;&gt;+=&lt;/span&gt; dx;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&#x9;&#x9;&lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt;(di &lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;=&lt;/span&gt; dy)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&#x9;&#x9;{&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&#x9;&#x9;&#x9;SetPixel(dc, x1, y1, color);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&#x9;&#x9;&#x9;&lt;span style=&#34;color:#66d9ef&#34;&gt;continue&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&#x9;&#x9;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&#x9;&#x9;&lt;span style=&#34;color:#66d9ef&#34;&gt;while&lt;/span&gt;((di &lt;span style=&#34;color:#f92672&#34;&gt;&amp;gt;&lt;/span&gt; dy) &lt;span style=&#34;color:#f92672&#34;&gt;&amp;amp;&amp;amp;&lt;/span&gt; (x1 &lt;span style=&#34;color:#f92672&#34;&gt;!=&lt;/span&gt; x2))&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&#x9;&#x9;{&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&#x9;&#x9;&#x9;di &lt;span style=&#34;color:#f92672&#34;&gt;-=&lt;/span&gt; dy;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&#x9;&#x9;&#x9;x1 &lt;span style=&#34;color:#f92672&#34;&gt;+=&lt;/span&gt; gx;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&#x9;&#x9;&#x9;SetPixel(dc, x1, y1, color);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&#x9;&#x9;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&#x9;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;//-------------------------------------------------------------------------------------------------&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;//画圆(x,y为圆心坐标，r为圆的半径，圆心的真实物理位置是x,y这个像素的左上角)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;void&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;DrawCircle&lt;/span&gt;(&lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt; x, &lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt; y, &lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt; r, &lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt; color)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;{&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt;  xi;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt;  yi;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt;  di;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;di &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt; (r &lt;span style=&#34;color:#f92672&#34;&gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;xi &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;yi &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; r;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&lt;span style=&#34;color:#66d9ef&#34;&gt;while&lt;/span&gt;(yi &lt;span style=&#34;color:#f92672&#34;&gt;&amp;gt;=&lt;/span&gt; xi)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;{&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&#x9;SetPixel(x &lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt; xi &lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;, y &lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt; yi &lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;, color);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&#x9;SetPixel(x &lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt; yi &lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;, y &lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt; xi &lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;, color);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&#x9;SetPixel(x &lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt; xi, y &lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt; yi &lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;, color);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&#x9;SetPixel(x &lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt; yi, y &lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt; xi &lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;, color);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&#x9;SetPixel(x &lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt; xi, y &lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt; yi, color);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&#x9;SetPixel(x &lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt; yi, y &lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt; xi, color);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&#x9;SetPixel(x &lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt; xi &lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;, y &lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt; yi, color);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&#x9;SetPixel(x &lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt; yi &lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;, y &lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt; xi, color);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&#x9;xi&lt;span style=&#34;color:#f92672&#34;&gt;++&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&#x9;&lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt; (di &lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&#x9;{&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&#x9;&#x9;di &lt;span style=&#34;color:#f92672&#34;&gt;+=&lt;/span&gt; xi;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&#x9;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&#x9;&lt;span style=&#34;color:#66d9ef&#34;&gt;else&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&#x9;{&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&#x9;&#x9;yi&lt;span style=&#34;color:#f92672&#34;&gt;--&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&#x9;&#x9;di &lt;span style=&#34;color:#f92672&#34;&gt;+=&lt;/span&gt; xi &lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt; yi;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&#x9;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;已知问题：画圆时会有一些像素点被重复绘制。&lt;/strong&gt;&lt;/p&gt;</description>
    </item>
    <item>
      <title>经过验证的GPIO模拟I2C时序代码</title>
      <link>https://xcdd.pages.dev/blog/2020/2020-09-22/</link>
      <pubDate>Tue, 22 Sep 2020 12:04:24 +0000</pubDate>
      <guid>https://xcdd.pages.dev/blog/2020/2020-09-22/</guid>
      <description>&lt;p&gt;使用STM32的GPIO模拟I2C总线时序，GPIO设置为开漏模式，SDA和SCK外部必须使用上拉电阻，一般是4.7K。&lt;/p&gt;&#xA;&lt;p&gt;开漏模式的好处是，可以同时读取输入电平，而无需切换输入/输出模式。&lt;/p&gt;&#xA;&lt;p&gt;注意事项：在开漏模式输出高电平，是释放总线，从机可以拉低；而输出低电平，则是锁住总线，从机无法拉高。&lt;/p&gt;&#xA;&lt;p&gt;下面是代码：&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-cpp&#34; data-lang=&#34;cpp&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;/******************************************************************************&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;* I2C驱动(GPIO模拟)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;* 蒋晓岗&amp;lt;kerndev@foxmail.com&amp;gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;* 2020.09.22&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;******************************************************************************/&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;#include&lt;/span&gt; &lt;span style=&#34;color:#75715e&#34;&gt;&amp;lt;stdint.h&amp;gt;&lt;/span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;#include&lt;/span&gt; &lt;span style=&#34;color:#75715e&#34;&gt;&amp;#34;delay.h&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;#include&lt;/span&gt; &lt;span style=&#34;color:#75715e&#34;&gt;&amp;#34;gpio.h&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;#include&lt;/span&gt; &lt;span style=&#34;color:#75715e&#34;&gt;&amp;#34;i2c.h&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;#define&#x9;SCK_SET(ctx,x)&#x9;gpio_write((ctx)-&amp;gt;sck_port,(ctx)-&amp;gt;sck_pin,(x))&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;#define&#x9;SCK_GET(ctx)&#x9;gpio_read((ctx)-&amp;gt;sck_port,(ctx)-&amp;gt;sck_pin)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;#define&#x9;SDA_SET(ctx,x)&#x9;gpio_write((ctx)-&amp;gt;sda_port,(ctx)-&amp;gt;sda_pin,(x))&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;#define&#x9;SDA_GET(ctx)&#x9;gpio_read((ctx)-&amp;gt;sda_port,(ctx)-&amp;gt;sda_pin)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;#define DELAY(x)        delay_us(x)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;struct&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;i2c_contex&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;{&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt; sck_port;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt; sck_pin;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt; sda_port;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt; sda_pin;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;};&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;#define GET_HW_CTX(id)  (&amp;amp;m_i2c_ctx[id])&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;static&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;struct&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;i2c_contex&lt;/span&gt; m_i2c_ctx[&lt;span style=&#34;color:#ae81ff&#34;&gt;4&lt;/span&gt;]&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;{&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&lt;span style=&#34;color:#75715e&#34;&gt;//SCK   SDA&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;    {PA,&lt;span style=&#34;color:#ae81ff&#34;&gt;12&lt;/span&gt;, PA,&lt;span style=&#34;color:#ae81ff&#34;&gt;11&lt;/span&gt;},&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    {PA, &lt;span style=&#34;color:#ae81ff&#34;&gt;8&lt;/span&gt;, PC, &lt;span style=&#34;color:#ae81ff&#34;&gt;9&lt;/span&gt;},&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;{PC,&lt;span style=&#34;color:#ae81ff&#34;&gt;10&lt;/span&gt;, PC,&lt;span style=&#34;color:#ae81ff&#34;&gt;12&lt;/span&gt;},&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;};&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;//初始化GPIO&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;static&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;void&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;i2c_gpio_init&lt;/span&gt;(&lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt; id)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;{&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&lt;span style=&#34;color:#66d9ef&#34;&gt;struct&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;i2c_contex&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;ctx;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;ctx &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; GET_HW_CTX(id);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;gpio_open(ctx&lt;span style=&#34;color:#f92672&#34;&gt;-&amp;gt;&lt;/span&gt;sck_port, ctx&lt;span style=&#34;color:#f92672&#34;&gt;-&amp;gt;&lt;/span&gt;sck_pin, GPIO_MODE_OUT, GPIO_OUT_OD);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;gpio_open(ctx&lt;span style=&#34;color:#f92672&#34;&gt;-&amp;gt;&lt;/span&gt;sda_port, ctx&lt;span style=&#34;color:#f92672&#34;&gt;-&amp;gt;&lt;/span&gt;sda_pin, GPIO_MODE_OUT, GPIO_OUT_OD);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;SDA_SET(ctx, &lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;SCK_SET(ctx, &lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;//产生起始条件&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;static&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;void&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;i2c_start&lt;/span&gt;(&lt;span style=&#34;color:#66d9ef&#34;&gt;struct&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;i2c_contex&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;ctx)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;{&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;SDA_SET(ctx, &lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;SCK_SET(ctx, &lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;DELAY(&lt;span style=&#34;color:#ae81ff&#34;&gt;2&lt;/span&gt;);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;SDA_SET(ctx, &lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;DELAY(&lt;span style=&#34;color:#ae81ff&#34;&gt;2&lt;/span&gt;);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;SCK_SET(ctx, &lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;//产生停止条件&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;static&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;void&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;i2c_stop&lt;/span&gt;(&lt;span style=&#34;color:#66d9ef&#34;&gt;struct&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;i2c_contex&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;ctx)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;{&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;SCK_SET(ctx, &lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;SDA_SET(ctx, &lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;DELAY(&lt;span style=&#34;color:#ae81ff&#34;&gt;2&lt;/span&gt;);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;SCK_SET(ctx, &lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;DELAY(&lt;span style=&#34;color:#ae81ff&#34;&gt;2&lt;/span&gt;);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;SDA_SET(ctx, &lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;//等待应答&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;static&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;uint8_t&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;i2c_wait_ack&lt;/span&gt;(&lt;span style=&#34;color:#66d9ef&#34;&gt;struct&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;i2c_contex&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;ctx)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;{&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&lt;span style=&#34;color:#66d9ef&#34;&gt;uint8_t&lt;/span&gt; ack;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;SDA_SET(ctx, &lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;SCK_SET(ctx, &lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;DELAY(&lt;span style=&#34;color:#ae81ff&#34;&gt;2&lt;/span&gt;);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;ack &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;!&lt;/span&gt;SDA_GET(ctx);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;SCK_SET(ctx, &lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt; ack;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;//发送应答&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;static&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;void&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;i2c_send_ack&lt;/span&gt;(&lt;span style=&#34;color:#66d9ef&#34;&gt;struct&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;i2c_contex&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;ctx, &lt;span style=&#34;color:#66d9ef&#34;&gt;uint8_t&lt;/span&gt; ack)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;{&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;SCK_SET(ctx, &lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;SDA_SET(ctx, &lt;span style=&#34;color:#f92672&#34;&gt;!&lt;/span&gt;ack);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;DELAY(&lt;span style=&#34;color:#ae81ff&#34;&gt;2&lt;/span&gt;);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;SCK_SET(ctx, &lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;DELAY(&lt;span style=&#34;color:#ae81ff&#34;&gt;2&lt;/span&gt;);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;SCK_SET(ctx, &lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;//发送字节&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;static&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;void&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;i2c_send_byte&lt;/span&gt;(&lt;span style=&#34;color:#66d9ef&#34;&gt;struct&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;i2c_contex&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;ctx, &lt;span style=&#34;color:#66d9ef&#34;&gt;uint8_t&lt;/span&gt; data)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;{&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt; i;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&lt;span style=&#34;color:#66d9ef&#34;&gt;for&lt;/span&gt;(i&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;; i&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;8&lt;/span&gt;; i&lt;span style=&#34;color:#f92672&#34;&gt;++&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;{&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&#x9;SDA_SET(ctx, (data &lt;span style=&#34;color:#f92672&#34;&gt;&amp;amp;&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;0x80&lt;/span&gt;) &lt;span style=&#34;color:#f92672&#34;&gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;7&lt;/span&gt;);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&#x9;data &lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;&amp;lt;=&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&#x9;DELAY(&lt;span style=&#34;color:#ae81ff&#34;&gt;2&lt;/span&gt;);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&#x9;SCK_SET(ctx, &lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&#x9;DELAY(&lt;span style=&#34;color:#ae81ff&#34;&gt;2&lt;/span&gt;);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&#x9;SCK_SET(ctx, &lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;//接收字节&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;static&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;uint8_t&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;i2c_recv_byte&lt;/span&gt;(&lt;span style=&#34;color:#66d9ef&#34;&gt;struct&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;i2c_contex&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;ctx)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;{&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt; i;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&lt;span style=&#34;color:#66d9ef&#34;&gt;uint8_t&lt;/span&gt; data;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;data &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;SDA_SET(ctx, &lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&lt;span style=&#34;color:#66d9ef&#34;&gt;for&lt;/span&gt;(i&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;; i&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;8&lt;/span&gt;; i&lt;span style=&#34;color:#f92672&#34;&gt;++&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;{&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&#x9;SCK_SET(ctx, &lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&#x9;DELAY(&lt;span style=&#34;color:#ae81ff&#34;&gt;2&lt;/span&gt;);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&#x9;SCK_SET(ctx, &lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&#x9;data &lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;&amp;lt;=&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        data &lt;span style=&#34;color:#f92672&#34;&gt;|=&lt;/span&gt; SDA_GET(ctx);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&#x9;DELAY(&lt;span style=&#34;color:#ae81ff&#34;&gt;2&lt;/span&gt;);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt; data;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;//写从机数据&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;i2c_xfer_tx&lt;/span&gt;(&lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt; id, &lt;span style=&#34;color:#66d9ef&#34;&gt;uint8_t&lt;/span&gt; addr, &lt;span style=&#34;color:#66d9ef&#34;&gt;uint8_t&lt;/span&gt; reg, &lt;span style=&#34;color:#66d9ef&#34;&gt;uint8_t&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;buf, &lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt; size)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;{&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt; i;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt; ret;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;struct&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;i2c_contex&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;ctx;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    ctx &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; GET_HW_CTX(id);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;i2c_start(ctx);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;i2c_send_byte(ctx, addr&lt;span style=&#34;color:#f92672&#34;&gt;&amp;amp;&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;0xfe&lt;/span&gt;);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;ret &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; i2c_wait_ack(ctx);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt;(&lt;span style=&#34;color:#f92672&#34;&gt;!&lt;/span&gt;ret)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;{&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&#x9;i2c_stop(ctx);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&#x9;&lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;i2c_send_byte(ctx, reg);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;ret &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; i2c_wait_ack(ctx);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt;(&lt;span style=&#34;color:#f92672&#34;&gt;!&lt;/span&gt;ret)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;{&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&#x9;i2c_stop(ctx);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&#x9;&lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;2&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;for&lt;/span&gt;(i&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;; i&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;&lt;/span&gt;size; i&lt;span style=&#34;color:#f92672&#34;&gt;++&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        i2c_send_byte(ctx, buf[i]);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&#x9;ret &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; i2c_wait_ack(ctx);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&#x9;&lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt;(&lt;span style=&#34;color:#f92672&#34;&gt;!&lt;/span&gt;ret)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&#x9;{&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&#x9;&#x9;i2c_stop(ctx);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&#x9;&#x9;&lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;3&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&#x9;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;i2c_stop(ctx);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;//读从机数据&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;i2c_xfer_rx&lt;/span&gt;(&lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt; id, &lt;span style=&#34;color:#66d9ef&#34;&gt;uint8_t&lt;/span&gt; addr, &lt;span style=&#34;color:#66d9ef&#34;&gt;uint8_t&lt;/span&gt; reg, &lt;span style=&#34;color:#66d9ef&#34;&gt;uint8_t&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;buf, &lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt; size)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;{&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt; i;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt; ret;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;struct&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;i2c_contex&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;ctx;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    ctx &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; GET_HW_CTX(id);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;i2c_start(ctx);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;i2c_send_byte(ctx, addr&lt;span style=&#34;color:#f92672&#34;&gt;&amp;amp;&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;0xfe&lt;/span&gt;);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;ret &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; i2c_wait_ack(ctx);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt;(&lt;span style=&#34;color:#f92672&#34;&gt;!&lt;/span&gt;ret)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;{&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&#x9;i2c_stop(ctx);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&#x9;&lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;i2c_send_byte(ctx, reg);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;ret &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; i2c_wait_ack(ctx);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt;(&lt;span style=&#34;color:#f92672&#34;&gt;!&lt;/span&gt;ret)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;{&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&#x9;i2c_stop(ctx);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&#x9;&lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;2&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;i2c_start(ctx);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;i2c_send_byte(ctx, addr&lt;span style=&#34;color:#f92672&#34;&gt;|&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;0x01&lt;/span&gt;);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;ret &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; i2c_wait_ack(ctx);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt;(&lt;span style=&#34;color:#f92672&#34;&gt;!&lt;/span&gt;ret)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;{&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&#x9;i2c_stop(ctx);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&#x9;&lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;3&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;for&lt;/span&gt;(i&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;; i&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;&lt;/span&gt;size; i&lt;span style=&#34;color:#f92672&#34;&gt;++&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        buf[i] &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; i2c_recv_byte(ctx);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&#x9;i2c_send_ack(ctx, i&lt;span style=&#34;color:#f92672&#34;&gt;!=&lt;/span&gt;(size&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;));&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;i2c_stop(ctx);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;//初始化&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;void&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;i2c_init&lt;/span&gt;(&lt;span style=&#34;color:#66d9ef&#34;&gt;void&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;{&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    i2c_gpio_init(&lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    i2c_gpio_init(&lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;i2c_gpio_init(&lt;span style=&#34;color:#ae81ff&#34;&gt;2&lt;/span&gt;);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;下面是头文件 ：&lt;/p&gt;</description>
    </item>
    <item>
      <title>记录QQ群管理页面无法正常打开的问题</title>
      <link>https://xcdd.pages.dev/blog/2020/2020-09-02/</link>
      <pubDate>Wed, 02 Sep 2020 17:31:35 +0000</pubDate>
      <guid>https://xcdd.pages.dev/blog/2020/2020-09-02/</guid>
      <description>&lt;p&gt;今日发现qun.qq.com页面不能正常打开，网页上的QQ群相关功能均无法正常使用，如下图：&lt;/p&gt;&#xA;&lt;p&gt;&lt;img src=&#34;./150_1.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;用浏览器调试页面发现原来是css和js资源均无法加载。&lt;/p&gt;&#xA;&lt;p&gt;查看css和js的链接，它们都是来自同一个域名：s1.url.cn&lt;/p&gt;&#xA;&lt;p&gt;直接在浏览器中访问此域名，也是无法打开，得到拒绝连接的回复。&lt;/p&gt;&#xA;&lt;p&gt;联系QQ好友，发现外省的朋友可以正常访问这个页面，但本地无法访问。&lt;/p&gt;&#xA;&lt;p&gt;于是我在电脑上ping了一下这个域名，惊人地发现？？？？？？？&lt;/p&gt;&#xA;&lt;p&gt;&lt;img src=&#34;./150_2.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;WTF？？？&lt;/p&gt;&#xA;&lt;p&gt;这是什么鬼？？？&lt;/p&gt;&#xA;&lt;p&gt;这个域名解析竟然到了127.0.0.1？？？&lt;/p&gt;&#xA;&lt;p&gt;通过在线DNS检测工具，可以看到这个域名有很多个IP，怀疑是本地网络运营商的DNS被污染或者攻击了，返回了错误的IP地址，修改本地DNS为114.114.114.114之后，再次测试，可以得到正确的IP地址了，网页也能正常打开了。&lt;/p&gt;&#xA;&lt;p&gt;&lt;img src=&#34;./150_3.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;</description>
    </item>
    <item>
      <title>用PYTHON脚本拆分M3U文件</title>
      <link>https://xcdd.pages.dev/blog/2020/2020-08-18/</link>
      <pubDate>Tue, 18 Aug 2020 08:39:25 +0000</pubDate>
      <guid>https://xcdd.pages.dev/blog/2020/2020-08-18/</guid>
      <description>&lt;p&gt;M3U文件是播放列表文件，里面记录的是一条一条的音频或视频资源地址。&lt;/p&gt;&#xA;&lt;p&gt;最近从网上收集了一些在线电视的资源列表，这M3U文件的形式，但这个列表长度达到1000多项内容。&lt;/p&gt;&#xA;&lt;p&gt;而且这里面包含了太多已经失效的资源地址，手机上的APP又没有单独删除某一条地址的功能，&lt;/p&gt;&#xA;&lt;p&gt;于是只能把它拆分为一个M3U文件一个资源，方便在手机上管理和删除。&lt;/p&gt;&#xA;&lt;p&gt;先看看这个M3U文件长什么样：&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;#EXTM3U&#xD;&#xA;#EXTINF:-1 ,CCTV-1蓝光&#xD;&#xA;http://111.13.111.242/otttv.bj.chinamobile.com/PLTV/88888888/224/3221226226/1.m3u8&#xD;&#xA;#EXTINF:-1 ,CCTV-1蓝光 &#xD;&#xA;http://112.50.243.8/PLTV/88888888/224/3221225922/1.m3u8&#xD;&#xA;#EXTINF:-1 ,CCTV-2蓝光 &#xD;&#xA;http://111.13.111.242/otttv.bj.chinamobile.com/PLTV/88888888/224/3221226230/1.m3u8&#xD;&#xA;#EXTINF:-1 ,CCTV-2蓝光 &#xD;&#xA;http://112.50.243.8/PLTV/88888888/224/3221225923/1.m3u8&#xD;&#xA;#EXTINF:-1 ,CCTV-3蓝光 &#xD;&#xA;http://117.169.124.36:6610/ysten-businessmobile/live/cctv-3/1.m3u8&#xD;&#xA;#EXTINF:-1 ,CCTV-3蓝光 &#xD;&#xA;http://223.110.241.130:6610/gitv/live1/G_CCTV-3-HQ/.m3u8&#xD;&#xA;#EXTINF:-1 ,CCTV-4蓝光 &#xD;&#xA;http://111.13.111.242/otttv.bj.chinamobile.com/PLTV/88888888/224/3221226314/1.m3u8&#xD;&#xA;#EXTINF:-1 ,CCTV-4蓝光 &#xD;&#xA;http://112.50.243.8/PLTV/88888888/224/3221225802/1.m3u8&#xD;&#xA;#EXTINF:-1 ,CCTV-5蓝光 &#xD;&#xA;http://223.110.241.130:6610/gitv/live1/G_CCTV-5-HQ/G_CCTV-5-HQ/&#xD;&#xA;#EXTINF:-1 ,CCTV-5蓝光 &#xD;&#xA;http://112.17.40.145/PLTV/88888888/224/3221226687/index.m3u8&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;第一行是#EXTM3U表明文件类型。&lt;/p&gt;&#xA;&lt;p&gt;第二行#EXTINF后面跟的是视频长度和视频名称。&lt;/p&gt;&#xA;&lt;p&gt;第三行http开头的是视频在线播放的地址。&lt;/p&gt;&#xA;&lt;p&gt;可以看出来这是个比较简单的文本格式，可以写个简单的PYTHON脚本把它进行拆分。&lt;/p&gt;&#xA;&lt;hr&gt;&#xA;&lt;p&gt;下面是我写好的脚本：&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-python&#34; data-lang=&#34;python&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;#从A.M3U读取文本,导出A1,A2...An.M3U.&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;import&lt;/span&gt; io&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;import&lt;/span&gt; os&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;#生成文件&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;def&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;make_m3u_file&lt;/span&gt;(name, link):&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;obj &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; open(name, mode&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;w+&amp;#34;&lt;/span&gt;, encoding&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;utf8&amp;#34;&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;obj&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;write(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;#EXTM3U&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;\n&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;#EXTINF:-1,&amp;#34;&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;obj&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;write(name&lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;\n&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;obj&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;write(link)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;obj&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;close&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;#获取文件名,并去除非法字符&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;def&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;get_item_name&lt;/span&gt;(extinf):&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;name &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; extinf&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;split(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;,&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;)[&lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;]&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;name &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; name&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;replace(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34; &amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;name &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; name&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;replace(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;:&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;.&amp;#34;&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;name &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; name&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;replace(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;/&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;.&amp;#34;&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;name &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; name&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;replace(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;\\&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;.&amp;#34;&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;name &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; name&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;replace(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;|&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;.&amp;#34;&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;name &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; name&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;replace(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;?&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;.&amp;#34;&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;name &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; name&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;replace(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;*&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;.&amp;#34;&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;name &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; name&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;replace(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&amp;lt;&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;.&amp;#34;&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;name &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; name&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;replace(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&amp;gt;&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;.&amp;#34;&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt; name&lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;.m3u&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;#处理输入的文本文件&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;def&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;m3u_dump&lt;/span&gt;(m3u_file):&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;item_name &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;item_link &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;lines &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; m3u_file&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;readlines()&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&lt;span style=&#34;color:#66d9ef&#34;&gt;for&lt;/span&gt; line &lt;span style=&#34;color:#f92672&#34;&gt;in&lt;/span&gt; lines:&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&#x9;line &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; line&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;rstrip(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;\r\n&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&#x9;&lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt; line&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;startswith(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;#EXTINF&amp;#34;&lt;/span&gt;):&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&#x9;&#x9;item_name &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; get_item_name(line)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&#x9;&lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt; line&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;startswith(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;http&amp;#34;&lt;/span&gt;):&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&#x9;&#x9;item_link &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; line&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&#x9;&#x9;print(item_name, item_link);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&#x9;&#x9;make_m3u_file(item_name, item_link)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;###################################################&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;#程序入口&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;m3u_file_name &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; input(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;输入文件名:&amp;#34;&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;m3u_file_obj &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; open(m3u_file_name, &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;r&amp;#34;&lt;/span&gt;, encoding&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;utf8&amp;#34;&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;m3u_dump(m3u_file_obj)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;m3u_file_obj&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;close()&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;print(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;处理完成!&amp;#34;&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;启动这个脚本后，输入M3U文件的路径，会在当前工作目录，生成一大堆单个的M3U文件。&lt;/p&gt;</description>
    </item>
    <item>
      <title>MQTT协议基础资料</title>
      <link>https://xcdd.pages.dev/blog/2020/2020-07-09/</link>
      <pubDate>Thu, 09 Jul 2020 16:34:42 +0000</pubDate>
      <guid>https://xcdd.pages.dev/blog/2020/2020-07-09/</guid>
      <description>&lt;p&gt;&lt;strong&gt;MQTT（Message Queuing Telemetry Transport）&lt;/strong&gt;&#xA;是ISO 标准(ISO/IEC PRF 20922)下基于发布/订阅范式的消息协议。&#xA;它工作在TCP协议之上，与HTTP同属于应用层协议，默认端口号是1883，通常情况下使用TCP长连接进行通信。&lt;/p&gt;&#xA;&lt;p&gt;MQTT是一个C/S架构的发布/订阅模式的消息传输协议。&#xA;服务器端称为 &lt;strong&gt;broker&lt;/strong&gt; ，broker不负责具体业务，只负责转发客户端的消息，将客户端 &lt;strong&gt;发布&lt;/strong&gt; 的数据，转发到所有 &lt;strong&gt;订阅&lt;/strong&gt; 了该 &lt;strong&gt;主题&lt;/strong&gt; 的客户端。&lt;/p&gt;&#xA;&lt;p&gt;MQTT的应用模式是多个客户端之间的通信，某个客户端订阅了主题后，它将会收到所有客户端发布到该主题下面的数据。&#xA;这个“主题”和HTTP协议中的URI类似，是一串标识符。&#xA;在MQTT的协议框架下，实际处理业务数据的服务器本质上也是一个MQTT客户端。&#xA;业务服务器只需要实现一个MQTT客户端，而broker已经有大量成熟的软件可以直接使用，大大降低了传统服务器软件的开发难度。因此使得MQTT在物联网场景广泛应用。&lt;/p&gt;&#xA;&lt;hr&gt;&#xA;&lt;p&gt;MQTT客户端一般工作流程：&#xA;1.建立TCP连接（1883端口）；&#xA;2.发送连接请求（附带客户端ID、用户名、密码等信息，进行登陆和认证），等待响应；&#xA;3.订阅一个或多个主题（还可以使用通配符）；&#xA;4.发布一个或多个主题（附带有效载荷数据）；&#xA;5.空闲时发起心跳请求，保有活连接；&#xA;6.接收已订阅的主题数据；&#xA;7.发送断开请求；&#xA;8.断开TCP连接；&lt;/p&gt;&#xA;&lt;hr&gt;&#xA;&lt;p&gt;MQTT协议使用2进制数据模式，数据包格式为：&lt;/p&gt;&#xA;&lt;table&gt;&#xA;  &lt;thead&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;th style=&#34;text-align: center&#34;&gt;固定包头&lt;/th&gt;&#xA;          &lt;th style=&#34;text-align: center&#34;&gt;可变包头&lt;/th&gt;&#xA;          &lt;th style=&#34;text-align: center&#34;&gt;有效载荷&lt;/th&gt;&#xA;      &lt;/tr&gt;&#xA;  &lt;/thead&gt;&#xA;  &lt;tbody&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;最小2字节，最大5字节&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;可选长度&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;可选长度&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;  &lt;/tbody&gt;&#xA;&lt;/table&gt;&#xA;&lt;p&gt;固定包头包含控制类型和包长度：&lt;/p&gt;&#xA;&lt;table&gt;&#xA;  &lt;thead&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;th style=&#34;text-align: center&#34;&gt;&lt;strong&gt;Bit&lt;/strong&gt;&lt;/th&gt;&#xA;          &lt;th style=&#34;text-align: center&#34;&gt;7&lt;/th&gt;&#xA;          &lt;th style=&#34;text-align: center&#34;&gt;6&lt;/th&gt;&#xA;          &lt;th style=&#34;text-align: center&#34;&gt;5&lt;/th&gt;&#xA;          &lt;th style=&#34;text-align: center&#34;&gt;4&lt;/th&gt;&#xA;          &lt;th style=&#34;text-align: center&#34;&gt;3&lt;/th&gt;&#xA;          &lt;th style=&#34;text-align: center&#34;&gt;2&lt;/th&gt;&#xA;          &lt;th style=&#34;text-align: center&#34;&gt;1&lt;/th&gt;&#xA;          &lt;th style=&#34;text-align: center&#34;&gt;0&lt;/th&gt;&#xA;      &lt;/tr&gt;&#xA;  &lt;/thead&gt;&#xA;  &lt;tbody&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;BYTE1&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;MQTT控制报文的类型&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;用于指定控制报文类型的标志位&lt;/td&gt;&#xA;          &lt;td&gt;&lt;/td&gt;&#xA;          &lt;td&gt;&lt;/td&gt;&#xA;          &lt;td&gt;&lt;/td&gt;&#xA;          &lt;td&gt;&lt;/td&gt;&#xA;          &lt;td&gt;&lt;/td&gt;&#xA;          &lt;td&gt;&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;BYTE2&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;剩余长度&lt;/td&gt;&#xA;          &lt;td&gt;&lt;/td&gt;&#xA;          &lt;td&gt;&lt;/td&gt;&#xA;          &lt;td&gt;&lt;/td&gt;&#xA;          &lt;td&gt;&lt;/td&gt;&#xA;          &lt;td&gt;&lt;/td&gt;&#xA;          &lt;td&gt;&lt;/td&gt;&#xA;          &lt;td&gt;&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;BYTE3&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;剩余长度(可选，当BYTE2大于0x80时有效)&lt;/td&gt;&#xA;          &lt;td&gt;&lt;/td&gt;&#xA;          &lt;td&gt;&lt;/td&gt;&#xA;          &lt;td&gt;&lt;/td&gt;&#xA;          &lt;td&gt;&lt;/td&gt;&#xA;          &lt;td&gt;&lt;/td&gt;&#xA;          &lt;td&gt;&lt;/td&gt;&#xA;          &lt;td&gt;&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;BYTE4&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;剩余长度(可选，当BYTE3大于0x80时有效)&lt;/td&gt;&#xA;          &lt;td&gt;&lt;/td&gt;&#xA;          &lt;td&gt;&lt;/td&gt;&#xA;          &lt;td&gt;&lt;/td&gt;&#xA;          &lt;td&gt;&lt;/td&gt;&#xA;          &lt;td&gt;&lt;/td&gt;&#xA;          &lt;td&gt;&lt;/td&gt;&#xA;          &lt;td&gt;&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;BYTE5&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;剩余长度(可选，当BYTE4大于0x80时有效)&lt;/td&gt;&#xA;          &lt;td&gt;&lt;/td&gt;&#xA;          &lt;td&gt;&lt;/td&gt;&#xA;          &lt;td&gt;&lt;/td&gt;&#xA;          &lt;td&gt;&lt;/td&gt;&#xA;          &lt;td&gt;&lt;/td&gt;&#xA;          &lt;td&gt;&lt;/td&gt;&#xA;          &lt;td&gt;&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;  &lt;/tbody&gt;&#xA;&lt;/table&gt;&#xA;&lt;p&gt;可变包头和有效载荷在此不详述，详见参考资料。&lt;/p&gt;</description>
    </item>
    <item>
      <title>使用RC522(SI522)写UID卡0扇区0块</title>
      <link>https://xcdd.pages.dev/blog/2020/2020-07-03/</link>
      <pubDate>Fri, 03 Jul 2020 14:40:01 +0000</pubDate>
      <guid>https://xcdd.pages.dev/blog/2020/2020-07-03/</guid>
      <description>&lt;p&gt;在淘宝买的UID白卡，可以使用特殊指令写0扇区0块，达到修改卡号的目的。&lt;/p&gt;&#xA;&lt;p&gt;一开始淘宝白卡各类繁多，没搞明白，查了查以下几个关键词：&lt;/p&gt;&#xA;&lt;p&gt;IC卡：普通的S50卡，0扇区0块不可更改。&lt;/p&gt;&#xA;&lt;p&gt;UID： 0扇区0块可以更改（使用特殊指令）。&lt;/p&gt;&#xA;&lt;p&gt;CUID：0扇区0块可以更改（使用标准扇区读写指令）。&lt;/p&gt;&#xA;&lt;p&gt;FUID：0扇区0块可以更改（与UID类似，但只能写一次）。&lt;/p&gt;&#xA;&lt;p&gt;S50资料参考: &lt;a href=&#34;https://www.cnblogs.com/SCPlatform/p/5116180.html&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;https://www.cnblogs.com/SCPlatform/p/5116180.html&lt;/a&gt;&lt;/p&gt;&#xA;&lt;hr&gt;&#xA;&lt;p&gt;手上刚好有一块SI522的板子，SI522据说完全兼容MFRC522，拿来测试。&lt;/p&gt;&#xA;&lt;p&gt;通过查阅资料，得知写UID的流程是这样的：&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;#1.寻卡&#xD;&#xA;send:26 &#xD;&#xA;recv:04 00 &#xD;&#xA;#2.防冲突&#xD;&#xA;send:93 20 &#xD;&#xA;recv:B0 6A BC 3B 5D &#xD;&#xA;#3.选卡&#xD;&#xA;send:93 70 B0 6A BC 3B 5D D9 36 &#xD;&#xA;recv:08 B6 DD &#xD;&#xA;#4.休眠&#xD;&#xA;send:50 00 57 CD &#xD;&#xA;#5.写0块后门指令1(7bit模式)&#xD;&#xA;send:40&#xD;&#xA;recv:0A &#xD;&#xA;#6.写0块后门指令2&#xD;&#xA;send:43 &#xD;&#xA;recv:0A &#xD;&#xA;#7.写块数据&#xD;&#xA;send:A0 00 5F B1 &#xD;&#xA;recv:0A &#xD;&#xA;#8.写入16字节的块数据&#xD;&#xA;send:75 C5 48 37 CF 08 04 00 62 63 64 65 66 67 68 69 5C BB &#xD;&#xA;recv:0A &#xD;&#xA;&#xD;&#xA;#块0数据注解&#xD;&#xA;75 C5 48 37: 4字节卡号&#xD;&#xA;CF         : XOR卡号校验&#xD;&#xA;08         : 卡容量&#xD;&#xA;04 00      : 卡类型&#xD;&#xA;62 63 64 65: 其它&#xD;&#xA;66 67 68 69: 其它&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;那么，搞清楚通信数据流程后，如何实现这个流程呢？&lt;/p&gt;</description>
    </item>
    <item>
      <title>MFC调用winhttp实现简易的HTTP服务器程序</title>
      <link>https://xcdd.pages.dev/blog/2020/2020-07-01/</link>
      <pubDate>Wed, 01 Jul 2020 16:30:35 +0000</pubDate>
      <guid>https://xcdd.pages.dev/blog/2020/2020-07-01/</guid>
      <description>&lt;p&gt;Windows提供的winhttp函数库用来快速实现HTTP协议的应用程序，包括客户端和服务器端。&lt;/p&gt;&#xA;&lt;p&gt;服务器开发一般流程是这样的：&lt;/p&gt;&#xA;&lt;p&gt;1.HttpInitialize 初始化WinHTTP函数库；&lt;/p&gt;&#xA;&lt;p&gt;2.HttpCreateHttpHandle 创建一个HTTP队列句柄，用来接收HTTP请求；&lt;/p&gt;&#xA;&lt;p&gt;3.HttpAddUrl 绑定要监听的URL，写为http://&lt;em&gt;:80/表示所有网卡80端口的HTTP请求都处理，其中的&lt;/em&gt;号可以改为IP地址；&lt;/p&gt;&#xA;&lt;p&gt;4.创建一个线程用来处理HTTP请求队列；&lt;/p&gt;&#xA;&lt;p&gt;5.HttpReceiveHttpRequest 在线程中调用此函数，接收HTTP请求，在返回的PHTTP_REQUEST结构中有我们想要的各种数据；&lt;/p&gt;&#xA;&lt;p&gt;6.HttpReceiveRequestEntityBody 这个函数用来接收HTTP请求的BODY部分，如果数据很长需要多次调用；&lt;/p&gt;&#xA;&lt;p&gt;7.HttpSendHttpResponse 这个函数返回响应请求的数据，可以自行设置Header和Body；&lt;/p&gt;&#xA;&lt;p&gt;8.要结束HTTP服务器，调用CloseHandle关闭HttpCreateHttpHandle返回的队列句柄；再调用HttpTerminate清理WinHTTP函数库；&lt;/p&gt;&#xA;&lt;hr&gt;&#xA;&lt;p&gt;下面的代码实现了一个最简单的HTTP服务器程序，仅供参考。&lt;/p&gt;&#xA;&lt;p&gt;用法：&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;创建IHttpServiceListener的派生类，实现该虚基类的OnRecvRequest函数，该函数是用于收到客户端请求时的回调函数。在回调函数中处理请求数据，如果要读取客户端POST的数据，则调用inst-&amp;gt;RecvRequestBody；最后调用inst-&amp;gt;SendRequestResp返回响应数据。&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;p&gt;2.创建CHttpService类的实例，调用Create函数，提供监听端口和回调接口。&lt;/p&gt;&#xA;&lt;hr&gt;&#xA;&lt;p&gt;头文件:HttpService.h&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-cpp&#34; data-lang=&#34;cpp&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;#pragma once&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;#include&lt;/span&gt; &lt;span style=&#34;color:#75715e&#34;&gt;&amp;lt;http.h&amp;gt;&lt;/span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;class&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;CHttpService&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;class&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;IHttpServiceListener&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;{&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;public&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&lt;span style=&#34;color:#66d9ef&#34;&gt;virtual&lt;/span&gt; BOOL OnRecvRequest(CHttpService &lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;inst, PHTTP_REQUEST request)&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;};&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;class&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;CHttpService&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;{&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;public&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;CHttpService();&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;BOOL &lt;span style=&#34;color:#a6e22e&#34;&gt;Create&lt;/span&gt;(INT port, IHttpServiceListener &lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;listener);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;BOOL &lt;span style=&#34;color:#a6e22e&#34;&gt;Delete&lt;/span&gt;(&lt;span style=&#34;color:#66d9ef&#34;&gt;void&lt;/span&gt;);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;BOOL &lt;span style=&#34;color:#a6e22e&#34;&gt;SendRequestResp&lt;/span&gt;(HTTP_REQUEST_ID req_id, INT status, LPCSTR reason, LPCSTR type, HANDLE file, LPVOID mem, DWORD mem_size);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;BOOL &lt;span style=&#34;color:#a6e22e&#34;&gt;RecvRequestBody&lt;/span&gt;(HTTP_REQUEST_ID req_id, HANDLE file, &lt;span style=&#34;color:#66d9ef&#34;&gt;char&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;mem, DWORD mem_size);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;BOOL &lt;span style=&#34;color:#a6e22e&#34;&gt;DoReceiveRequests&lt;/span&gt;();&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;BOOL &lt;span style=&#34;color:#a6e22e&#34;&gt;GetRemoteAddr&lt;/span&gt;(PHTTP_REQUEST request, CString &lt;span style=&#34;color:#f92672&#34;&gt;&amp;amp;&lt;/span&gt;text);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;public&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&lt;span style=&#34;color:#66d9ef&#34;&gt;static&lt;/span&gt; UINT AFX_CDECL RecvRequestThread(LPVOID param);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;private&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;HANDLE m_req_queue;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;LPBYTE m_req_buffer;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;UINT   m_req_buffer_size;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;CWinThread &lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;m_thread;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;IHttpServiceListener &lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;m_listener;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;};&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;源文件:HttpService.cpp&lt;/p&gt;</description>
    </item>
    <item>
      <title>二维码版本与容量</title>
      <link>https://xcdd.pages.dev/blog/2020/2020-05-20-1647/</link>
      <pubDate>Wed, 20 May 2020 16:47:50 +0000</pubDate>
      <guid>https://xcdd.pages.dev/blog/2020/2020-05-20-1647/</guid>
      <description>&lt;table&gt;&#xA;  &lt;thead&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;th style=&#34;text-align: center&#34;&gt;&lt;strong&gt;二维码 QR - 版本与容量&lt;/strong&gt;&lt;/th&gt;&#xA;          &lt;th style=&#34;text-align: center&#34;&gt;&lt;/th&gt;&#xA;          &lt;th style=&#34;text-align: center&#34;&gt;&lt;/th&gt;&#xA;          &lt;th style=&#34;text-align: center&#34;&gt;&lt;/th&gt;&#xA;      &lt;/tr&gt;&#xA;  &lt;/thead&gt;&#xA;  &lt;tbody&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;版本&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;矩阵大小&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;纠错等级&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;八位字节&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;&lt;/td&gt;&#xA;          &lt;td&gt;&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;1&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;21&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;L&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;17&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;M&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;14&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;34&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;20&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;Q&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;11&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;27&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;16&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;H&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;7&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;17&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;10&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;2&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;25&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;L&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;32&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;M&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;26&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;63&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;38&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;Q&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;20&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;48&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;29&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;H&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;14&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;34&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;20&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;3&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;29&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;L&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;53&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;M&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;42&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;101&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;61&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;Q&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;32&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;77&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;47&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;H&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;24&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;58&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;35&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;4&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;33&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;L&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;78&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;M&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;62&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;149&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;90&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;Q&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;46&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;111&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;67&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;H&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;34&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;82&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;50&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;5&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;37&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;L&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;106&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;M&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;84&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;202&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;122&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;Q&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;60&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;144&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;87&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;H&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;44&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;106&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;64&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;6&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;41&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;L&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;134&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;M&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;106&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;255&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;154&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;Q&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;74&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;178&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;108&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;H&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;58&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;139&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;84&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;7&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;45&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;L&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;154&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;M&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;122&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;293&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;178&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;Q&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;86&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;207&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;125&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;H&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;64&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;154&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;93&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;8&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;49&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;L&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;192&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;M&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;152&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;365&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;221&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;Q&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;108&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;259&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;157&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;H&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;84&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;202&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;122&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;9&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;53&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;L&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;230&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;M&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;180&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;432&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;262&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;Q&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;130&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;312&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;189&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;H&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;98&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;235&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;143&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;10&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;57&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;L&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;271&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;M&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;213&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;513&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;311&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;Q&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;151&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;364&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;221&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;H&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;119&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;288&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;174&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;  &lt;/tbody&gt;&#xA;&lt;/table&gt;</description>
    </item>
    <item>
      <title>C语言在Windows控制台生成二维码</title>
      <link>https://xcdd.pages.dev/blog/2020/2020-05-20/</link>
      <pubDate>Wed, 20 May 2020 10:10:37 +0000</pubDate>
      <guid>https://xcdd.pages.dev/blog/2020/2020-05-20/</guid>
      <description>&lt;p&gt;近期为了研究C语言生成二维码，实现了一个简单的工具，在windows的控制台显示二维码，效果如下：&lt;/p&gt;&#xA;&lt;p&gt;&lt;img src=&#34;./143_1.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;生成二维码的代码是从网上找的；&lt;/p&gt;&#xA;&lt;p&gt;控制台显示二维码的主要原理是改变控制台的字符背景颜色来实现。&lt;/p&gt;&#xA;&lt;p&gt;黑块是默认颜色，白块是修改字符背景色为白色，并输出空格来实现。&lt;/p&gt;&#xA;&lt;p&gt;由于默认字体是8*16的，所以为了保持比例正常，一个方块要输出两个空格字符。&lt;/p&gt;&#xA;&lt;p&gt;下面是在控制台输出色块的关键代码：&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-cpp&#34; data-lang=&#34;cpp&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;//在控制台画色块&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;//蒋晓岗&amp;lt;kerndev@foxmail.com&amp;gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;#include&lt;/span&gt; &lt;span style=&#34;color:#75715e&#34;&gt;&amp;lt;Windows.h&amp;gt;&lt;/span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;#include&lt;/span&gt; &lt;span style=&#34;color:#75715e&#34;&gt;&amp;#34;paint.h&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;static&lt;/span&gt; HANDLE m_stdout;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;static&lt;/span&gt; CONSOLE_SCREEN_BUFFER_INFO m_csbi;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;void&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;begin_paint&lt;/span&gt;(&lt;span style=&#34;color:#66d9ef&#34;&gt;void&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;{&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;m_stdout &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; GetStdHandle(STD_OUTPUT_HANDLE);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;GetConsoleScreenBufferInfo(m_stdout, &lt;span style=&#34;color:#f92672&#34;&gt;&amp;amp;&lt;/span&gt;m_csbi);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;void&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;end_paint&lt;/span&gt;(&lt;span style=&#34;color:#66d9ef&#34;&gt;void&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;{&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;SetConsoleTextAttribute(m_stdout, m_csbi.wAttributes);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;void&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;draw_block&lt;/span&gt;(&lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt; color)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;{&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;WORD attr;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;attr &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; color &lt;span style=&#34;color:#f92672&#34;&gt;?&lt;/span&gt; (BACKGROUND_BLUE &lt;span style=&#34;color:#f92672&#34;&gt;|&lt;/span&gt; BACKGROUND_RED &lt;span style=&#34;color:#f92672&#34;&gt;|&lt;/span&gt; BACKGROUND_GREEN &lt;span style=&#34;color:#f92672&#34;&gt;|&lt;/span&gt; BACKGROUND_INTENSITY) &lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;SetConsoleTextAttribute(m_stdout, attr);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;WriteConsoleA(m_stdout, &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;  &amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#ae81ff&#34;&gt;2&lt;/span&gt;, NULL, NULL);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;void&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;new_line&lt;/span&gt;(&lt;span style=&#34;color:#66d9ef&#34;&gt;void&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;{&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;WriteConsoleA(m_stdout, &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;\r\n&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#ae81ff&#34;&gt;2&lt;/span&gt;, NULL, NULL);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;完整源码我也上传到码云了，工程是用VS2005建立的。&lt;/p&gt;&#xA;&lt;p&gt;需要完整源码的可以扫上面的二维码，或者点击下面的链接：&lt;/p&gt;&#xA;&lt;p&gt;源码下载： &lt;a href=&#34;https://gitee.com/kerndev/qrencode&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;https://gitee.com/kerndev/qrencode&lt;/a&gt;&lt;/p&gt;</description>
    </item>
    <item>
      <title>JHM3000体温传感器驱动</title>
      <link>https://xcdd.pages.dev/blog/2020/2020-04-21/</link>
      <pubDate>Tue, 21 Apr 2020 08:35:30 +0000</pubDate>
      <guid>https://xcdd.pages.dev/blog/2020/2020-04-21/</guid>
      <description>&lt;p&gt;因2020疫情影响，国内突然就冒出来一堆做体温计的厂商。。。&lt;/p&gt;&#xA;&lt;p&gt;硬件平台：nRF52832 + JHM3000&lt;/p&gt;&#xA;&lt;p&gt;JHM3000是个单线通信的体温传感器芯片，线性度较好，校准后精度可达0.1度。&lt;/p&gt;&#xA;&lt;p&gt;主要问题是通信是单IO输出，芯片上电后，IO就会不停地输出脉冲信号，需要MCU计算脉宽来解码数据。&lt;/p&gt;&#xA;&lt;p&gt;每个采样周期为：2.8ms间隔 + 6ms数据传输&lt;/p&gt;&#xA;&lt;p&gt;相邻两个高脉宽之比决定数据类型，START=3:3， BIT0=5:1， BIT1=1:5&#xA;数据样本：91,3,3,1,6,1,5,5,1,1,5,5,1,1,5,1,5,6,1,1,5,6,1,1,5,5,2,1,5,5,1,91,3,4,&amp;hellip;&#xA;每次采样共1个START+14个BIT数据：S+BBBBBBBBBBBBB&lt;/p&gt;&#xA;&lt;p&gt;解码数据的时候，需要先找到START数据，然后才开始解析采样数据。&lt;/p&gt;&#xA;&lt;p&gt;下面是主要源码：&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-cpp&#34; data-lang=&#34;cpp&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;/*&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;* JHM3000 体温传感器驱动程序&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;* 每次采样2.8ms + 数据传输6ms&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;* 单线IO输出,相邻两个高脉宽之比决定数据,START=3:3, BIT0=5:1, BIT1=1:5&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;* 数据样本：61,4,3,1,5,1,6,5,1,1,6,5,1,1,5,1,5,1,5,6,1,1,5,6,1,5,1,1,6,1,5,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;*           91,3,3,1,6,1,5,5,1,1,5,5,1,1,5,1,5,6,1,1,5,6,1,1,5,5,2,1,5,5,1,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;*           91,3,4,...&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;* 每次采样共1个START+14个BIT数据：S+BBBBBBBBBBBBB&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;* 蒋晓岗&amp;lt;kerndev@foxmail.com&amp;gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;* 2020.03.06&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;*/&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;#include&lt;/span&gt; &lt;span style=&#34;color:#75715e&#34;&gt;&amp;lt;stdint.h&amp;gt;&lt;/span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;#include&lt;/span&gt; &lt;span style=&#34;color:#75715e&#34;&gt;&amp;lt;stdbool.h&amp;gt;&lt;/span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;#include&lt;/span&gt; &lt;span style=&#34;color:#75715e&#34;&gt;&amp;#34;log.h&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;#include&lt;/span&gt; &lt;span style=&#34;color:#75715e&#34;&gt;&amp;#34;bsp.h&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;#include&lt;/span&gt; &lt;span style=&#34;color:#75715e&#34;&gt;&amp;#34;sdk.h&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;//判断数据类型，错误返回0, 成功返回1，S位bit=-1，BIT10，BIT1返回1&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;static&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;decode_one_bit&lt;/span&gt;(&lt;span style=&#34;color:#66d9ef&#34;&gt;uint32_t&lt;/span&gt; t1, &lt;span style=&#34;color:#66d9ef&#34;&gt;uint32_t&lt;/span&gt; t2, &lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;bit)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;{&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&lt;span style=&#34;color:#66d9ef&#34;&gt;uint32_t&lt;/span&gt; diff;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt;((t1 &lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt; t2) &lt;span style=&#34;color:#f92672&#34;&gt;&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;10&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;{&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&#x9;LOG(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;t1=%d, t2=%d&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;\r\n&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&lt;/span&gt;, t1, t2);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&#x9;&lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt;(t1 &lt;span style=&#34;color:#f92672&#34;&gt;&amp;gt;&lt;/span&gt; t2)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;{&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&#x9;diff &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; t1 &lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt; t2;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&#x9;&lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt;(diff &lt;span style=&#34;color:#f92672&#34;&gt;&amp;gt;&lt;/span&gt; t2)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&#x9;{&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&#x9;&#x9;&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;bit &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&#x9;&#x9;&lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&#x9;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt;(t2 &lt;span style=&#34;color:#f92672&#34;&gt;&amp;gt;&lt;/span&gt; t1)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;{&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&#x9;diff &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; t2 &lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt; t1;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&#x9;&lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt;(diff &lt;span style=&#34;color:#f92672&#34;&gt;&amp;gt;&lt;/span&gt; t1)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&#x9;{&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&#x9;&#x9;&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;bit &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&#x9;&#x9;&lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&#x9;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;bit &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;//等待管脚电平跳变&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;static&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;wait_pin_state&lt;/span&gt;(&lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt; state, &lt;span style=&#34;color:#66d9ef&#34;&gt;uint32_t&lt;/span&gt; timeout)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;{&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&lt;span style=&#34;color:#66d9ef&#34;&gt;uint32_t&lt;/span&gt; diff;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&lt;span style=&#34;color:#66d9ef&#34;&gt;uint32_t&lt;/span&gt; tick;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;diff &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;tick &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; app_timer_cnt_get();&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;timeout &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; timeout &lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;5&lt;/span&gt;; &lt;span style=&#34;color:#75715e&#34;&gt;//1毫秒约等于32个时钟&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;&#x9;&lt;span style=&#34;color:#66d9ef&#34;&gt;while&lt;/span&gt;(diff &lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;&lt;/span&gt; timeout)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;{&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&#x9;&lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt;(nrf_gpio_pin_read(HM3000_PIN_DATA) &lt;span style=&#34;color:#f92672&#34;&gt;==&lt;/span&gt; state)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&#x9;{&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&#x9;&#x9;&lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&#x9;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&#x9;&lt;span style=&#34;color:#66d9ef&#34;&gt;else&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&#x9;{&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&#x9;&#x9;app_timer_cnt_diff_compute(app_timer_cnt_get(), tick, &lt;span style=&#34;color:#f92672&#34;&gt;&amp;amp;&lt;/span&gt;diff);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&#x9;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;//计算高电平时长&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;static&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;calc_pulse_width&lt;/span&gt;(&lt;span style=&#34;color:#66d9ef&#34;&gt;uint32_t&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;pw)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;{&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt; ret;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&lt;span style=&#34;color:#66d9ef&#34;&gt;uint32_t&lt;/span&gt; diff;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&lt;span style=&#34;color:#66d9ef&#34;&gt;uint32_t&lt;/span&gt; tick;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;ret &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; wait_pin_state(&lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;, &lt;span style=&#34;color:#ae81ff&#34;&gt;5&lt;/span&gt;);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt;(&lt;span style=&#34;color:#f92672&#34;&gt;!&lt;/span&gt;ret)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;{&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&#x9;&lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;tick &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; app_timer_cnt_get();&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;ret &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; wait_pin_state(&lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;, &lt;span style=&#34;color:#ae81ff&#34;&gt;5&lt;/span&gt;);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt;(&lt;span style=&#34;color:#f92672&#34;&gt;!&lt;/span&gt;ret)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;{&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&#x9;&lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;app_timer_cnt_diff_compute(app_timer_cnt_get(), tick, &lt;span style=&#34;color:#f92672&#34;&gt;&amp;amp;&lt;/span&gt;diff);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;pw &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; diff;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;//等待高电平结束&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;static&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;wait_for_idle&lt;/span&gt;(&lt;span style=&#34;color:#66d9ef&#34;&gt;void&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;{&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt; wait_pin_state(&lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;, &lt;span style=&#34;color:#ae81ff&#34;&gt;5&lt;/span&gt;);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;//等待ADC采样开始&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;//ADC采样有2.5ms高电平&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;static&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;wait_for_adc&lt;/span&gt;(&lt;span style=&#34;color:#66d9ef&#34;&gt;void&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;{&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt; i;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt; ret;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&lt;span style=&#34;color:#66d9ef&#34;&gt;uint32_t&lt;/span&gt; pw;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&lt;span style=&#34;color:#66d9ef&#34;&gt;for&lt;/span&gt;(i&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;; i&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;32&lt;/span&gt;; i&lt;span style=&#34;color:#f92672&#34;&gt;++&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;{&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&#x9;ret &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; calc_pulse_width(&lt;span style=&#34;color:#f92672&#34;&gt;&amp;amp;&lt;/span&gt;pw);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&#x9;&lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt;(&lt;span style=&#34;color:#f92672&#34;&gt;!&lt;/span&gt;ret)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&#x9;{&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&#x9;&#x9;&lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&#x9;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&#x9;&lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt;(pw &lt;span style=&#34;color:#f92672&#34;&gt;&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;30&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&#x9;{&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&#x9;&#x9;&lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&#x9;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;//接收一位数据&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;static&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;recv_one_bit&lt;/span&gt;(&lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;bit)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;{&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt; ret;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&lt;span style=&#34;color:#66d9ef&#34;&gt;uint32_t&lt;/span&gt; t1;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&lt;span style=&#34;color:#66d9ef&#34;&gt;uint32_t&lt;/span&gt; t2;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;ret &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; calc_pulse_width(&lt;span style=&#34;color:#f92672&#34;&gt;&amp;amp;&lt;/span&gt;t1);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt;(&lt;span style=&#34;color:#f92672&#34;&gt;!&lt;/span&gt;ret)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;{&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&#x9;&lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;ret &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; calc_pulse_width(&lt;span style=&#34;color:#f92672&#34;&gt;&amp;amp;&lt;/span&gt;t2);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt;(&lt;span style=&#34;color:#f92672&#34;&gt;!&lt;/span&gt;ret)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;{&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&#x9;&lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt; decode_one_bit(t1, t2, bit);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;//接收采样起始信号&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;static&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;recv_start_bit&lt;/span&gt;(&lt;span style=&#34;color:#66d9ef&#34;&gt;void&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;{&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt; ret;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt; bit;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;ret &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; recv_one_bit(&lt;span style=&#34;color:#f92672&#34;&gt;&amp;amp;&lt;/span&gt;bit);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt;(&lt;span style=&#34;color:#f92672&#34;&gt;!&lt;/span&gt;ret)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;{&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&#x9;&lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt; bit &lt;span style=&#34;color:#f92672&#34;&gt;==&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;//接收采样数据&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;//数据=1位符号+13位数据&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;static&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;recv_adc_data&lt;/span&gt;(&lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;data)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;{&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt; i;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt; bit;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt; ret;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&lt;span style=&#34;color:#66d9ef&#34;&gt;int16_t&lt;/span&gt; tmp;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;tmp &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&lt;span style=&#34;color:#66d9ef&#34;&gt;for&lt;/span&gt;(i&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;; i&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;14&lt;/span&gt;; i&lt;span style=&#34;color:#f92672&#34;&gt;++&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;{&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&#x9;ret &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; recv_one_bit(&lt;span style=&#34;color:#f92672&#34;&gt;&amp;amp;&lt;/span&gt;bit);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&#x9;&lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt;(&lt;span style=&#34;color:#f92672&#34;&gt;!&lt;/span&gt;ret)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&#x9;{&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&#x9;&#x9;LOG(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;drv_hm3000: recv bit%d failed!&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;\r\n&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&lt;/span&gt;, i);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&#x9;&#x9;&lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&#x9;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&#x9;&lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt;(bit &lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&#x9;{&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&#x9;&#x9;LOG(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;drv_hm3000: recv bit%d invalid!&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;\r\n&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&lt;/span&gt;, i);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&#x9;&#x9;&lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&#x9;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&#x9;&lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt;(bit)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&#x9;{&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&#x9;&#x9;tmp &lt;span style=&#34;color:#f92672&#34;&gt;|=&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;&amp;lt;&lt;/span&gt; (&lt;span style=&#34;color:#ae81ff&#34;&gt;15&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt; i);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&#x9;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&lt;span style=&#34;color:#75715e&#34;&gt;//LOG(&amp;#34;drv_hm3000: raw=%d\r\n&amp;#34;, tmp);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;&#x9;&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;data &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; tmp &lt;span style=&#34;color:#f92672&#34;&gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;2&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;//采样数据&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;static&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;sample_data&lt;/span&gt;(&lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;data)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;{&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt; ret;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;ret &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; wait_for_idle();&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt;(&lt;span style=&#34;color:#f92672&#34;&gt;!&lt;/span&gt;ret)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;{&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&#x9;LOG(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;drv_hm3000: wait idle timeout!&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;\r\n&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&lt;/span&gt;);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&#x9;&lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;ret &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; wait_for_adc();&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt;(&lt;span style=&#34;color:#f92672&#34;&gt;!&lt;/span&gt;ret)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;{&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&#x9;LOG(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;drv_hm3000: wait adc timeout!&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;\r\n&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&lt;/span&gt;);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&#x9;&lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;ret &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; recv_start_bit();&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt;(&lt;span style=&#34;color:#f92672&#34;&gt;!&lt;/span&gt;ret)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;{&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&#x9;LOG(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;drv_hm3000: recv start failed!&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;\r\n&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&lt;/span&gt;);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&#x9;&lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;ret &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; recv_adc_data(data);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt;(&lt;span style=&#34;color:#f92672&#34;&gt;!&lt;/span&gt;ret)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;{&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&#x9;LOG(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;drv_hm3000: recv data failed!&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;\r\n&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&lt;/span&gt;);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&#x9;&lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt; ret;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;#if 0&lt;/span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;//调试数据&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;static void dump_data(void)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;{&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&#x9;int i;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&#x9;static uint32_t time[100];&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&#x9;for(i=0; i&amp;lt;64; i++)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&#x9;{&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&#x9;&#x9;calc_pulse_width(&amp;amp;time[i]);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&#x9;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&#x9;for(i=0; i&amp;lt;64; i++)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&#x9;{&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&#x9;&#x9;LOG(&amp;#34;%d,&amp;#34;, time[i]);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&#x9;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&#x9;LOG(&amp;#34;\r\n&amp;#34;);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;#endif&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;//读取采样数据&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;drv_hm3000_read&lt;/span&gt;(&lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;data)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;{&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&lt;span style=&#34;color:#75715e&#34;&gt;//dump_data();&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;&#x9;&lt;span style=&#34;color:#75715e&#34;&gt;//return 0;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;&#x9;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt; ret;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&lt;span style=&#34;color:#75715e&#34;&gt;//uint8_t sr;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;&#x9;&lt;span style=&#34;color:#75715e&#34;&gt;//sd_nvic_critical_region_enter(&amp;amp;sr);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;&#x9;ret &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; sample_data(data);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&lt;span style=&#34;color:#75715e&#34;&gt;//sd_nvic_critical_region_exit(sr);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;&#x9;&lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt; ret;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;//打开芯片电源&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;void&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;drv_hm3000_enable&lt;/span&gt;(&lt;span style=&#34;color:#66d9ef&#34;&gt;void&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;{&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;nrf_gpio_pin_write(HM3000_PIN_PWR, &lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;//关闭芯片电源&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;void&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;drv_hm3000_disable&lt;/span&gt;(&lt;span style=&#34;color:#66d9ef&#34;&gt;void&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;{&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;nrf_gpio_pin_write(HM3000_PIN_PWR, &lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;//初始化驱动&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;void&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;drv_hm3000_init&lt;/span&gt;(&lt;span style=&#34;color:#66d9ef&#34;&gt;void&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;{&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;nrf_gpio_cfg_output(HM3000_PIN_PWR);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    nrf_gpio_cfg_input(HM3000_PIN_DATA, NRF_GPIO_PIN_NOPULL);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;nrf_gpio_pin_write(HM3000_PIN_PWR, &lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description>
    </item>
    <item>
      <title>C语言简易均值滤波器</title>
      <link>https://xcdd.pages.dev/blog/2020/2020-04-16/</link>
      <pubDate>Thu, 16 Apr 2020 16:03:00 +0000</pubDate>
      <guid>https://xcdd.pages.dev/blog/2020/2020-04-16/</guid>
      <description>&lt;p&gt;均值滤波器就是取多个连续的数据，进行算术平均运算，得出输出数据；&lt;/p&gt;&#xA;&lt;p&gt;为了简化运算，本文演示代码使用2的整数次幂进行算术平均运算，因为这种情况可以通过移位的方式来代替除法。&lt;/p&gt;&#xA;&lt;p&gt;以下是滤波器定义的头文件：&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-cpp&#34; data-lang=&#34;cpp&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;#ifndef __FILTER_H&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;#define __FILTER_H&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;struct&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;filter&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;{&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt; buff[&lt;span style=&#34;color:#ae81ff&#34;&gt;32&lt;/span&gt;]; &lt;span style=&#34;color:#75715e&#34;&gt;//最大支持32级均值，可根据需要改为更大的值。&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt; order;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt; shift;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt; sum;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt; index;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;};&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;typedef&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;struct&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;filter&lt;/span&gt; filter_t;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;//初始化滤波器，order指定滤波常数，必须是2的N次方(1,2,4,8,16...)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;void&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;filter_init&lt;/span&gt;(filter_t &lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;flt, &lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt; order);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;//滤波函数，value输入待滤波的数据，返回滤波后的数据&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt;  &lt;span style=&#34;color:#a6e22e&#34;&gt;filter_input&lt;/span&gt;(filter_t &lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;flt, &lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt; value);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;//复位滤波器&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;void&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;filter_reset&lt;/span&gt;(filter_t &lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;flt);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;#endif&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;以下是源文件：&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-cpp&#34; data-lang=&#34;cpp&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;/*&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;* 均值滤波器&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;* 蒋晓岗&amp;lt;kerndev@foxmail.com&amp;gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;*/&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;#include&lt;/span&gt; &lt;span style=&#34;color:#75715e&#34;&gt;&amp;lt;string.h&amp;gt;&lt;/span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;#include&lt;/span&gt; &lt;span style=&#34;color:#75715e&#34;&gt;&amp;#34;filter.h&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;//均值滤波器&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;filter_input&lt;/span&gt;(filter_t &lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;flt, &lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt; value)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;{&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    flt&lt;span style=&#34;color:#f92672&#34;&gt;-&amp;gt;&lt;/span&gt;sum &lt;span style=&#34;color:#f92672&#34;&gt;+=&lt;/span&gt; value;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    flt&lt;span style=&#34;color:#f92672&#34;&gt;-&amp;gt;&lt;/span&gt;sum &lt;span style=&#34;color:#f92672&#34;&gt;-=&lt;/span&gt; flt&lt;span style=&#34;color:#f92672&#34;&gt;-&amp;gt;&lt;/span&gt;buff[flt&lt;span style=&#34;color:#f92672&#34;&gt;-&amp;gt;&lt;/span&gt;index];&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    flt&lt;span style=&#34;color:#f92672&#34;&gt;-&amp;gt;&lt;/span&gt;buff[flt&lt;span style=&#34;color:#f92672&#34;&gt;-&amp;gt;&lt;/span&gt;index] &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; value;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    flt&lt;span style=&#34;color:#f92672&#34;&gt;-&amp;gt;&lt;/span&gt;index &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; (flt&lt;span style=&#34;color:#f92672&#34;&gt;-&amp;gt;&lt;/span&gt;index &lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;) &lt;span style=&#34;color:#f92672&#34;&gt;&amp;amp;&lt;/span&gt; (flt&lt;span style=&#34;color:#f92672&#34;&gt;-&amp;gt;&lt;/span&gt;order &lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt; (flt&lt;span style=&#34;color:#f92672&#34;&gt;-&amp;gt;&lt;/span&gt;sum &lt;span style=&#34;color:#f92672&#34;&gt;&amp;gt;&amp;gt;&lt;/span&gt; flt&lt;span style=&#34;color:#f92672&#34;&gt;-&amp;gt;&lt;/span&gt;shift);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;//均值滤波器&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;void&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;filter_init&lt;/span&gt;(filter_t &lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;flt, &lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt; order)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;{&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    flt&lt;span style=&#34;color:#f92672&#34;&gt;-&amp;gt;&lt;/span&gt;index &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    flt&lt;span style=&#34;color:#f92672&#34;&gt;-&amp;gt;&lt;/span&gt;sum   &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    flt&lt;span style=&#34;color:#f92672&#34;&gt;-&amp;gt;&lt;/span&gt;order &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; order;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    flt&lt;span style=&#34;color:#f92672&#34;&gt;-&amp;gt;&lt;/span&gt;shift &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;while&lt;/span&gt;(order &lt;span style=&#34;color:#f92672&#34;&gt;&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        flt&lt;span style=&#34;color:#f92672&#34;&gt;-&amp;gt;&lt;/span&gt;shift&lt;span style=&#34;color:#f92672&#34;&gt;++&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        order &lt;span style=&#34;color:#f92672&#34;&gt;&amp;gt;&amp;gt;=&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;//复位&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;void&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;filter_reset&lt;/span&gt;(filter_t &lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;flt)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;{&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    flt&lt;span style=&#34;color:#f92672&#34;&gt;-&amp;gt;&lt;/span&gt;index &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    flt&lt;span style=&#34;color:#f92672&#34;&gt;-&amp;gt;&lt;/span&gt;sum   &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    memset(flt&lt;span style=&#34;color:#f92672&#34;&gt;-&amp;gt;&lt;/span&gt;buff, &lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;, &lt;span style=&#34;color:#66d9ef&#34;&gt;sizeof&lt;/span&gt;(flt&lt;span style=&#34;color:#f92672&#34;&gt;-&amp;gt;&lt;/span&gt;buff));&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description>
    </item>
    <item>
      <title>使用nw.js制作桌面版draw.io</title>
      <link>https://xcdd.pages.dev/blog/2020/2020-03-30-1616/</link>
      <pubDate>Mon, 30 Mar 2020 16:16:19 +0000</pubDate>
      <guid>https://xcdd.pages.dev/blog/2020/2020-03-30-1616/</guid>
      <description>&lt;p&gt;draw.io是一个开源的在线流程图制作软件，源码地址： &lt;a href=&#34;https://github.com/jgraph/drawio&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;https://github.com/jgraph/drawio&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;这个软件的特殊之处在于，它完全使用web技术开发，可以很方便地搭建在线编辑软件。&lt;/p&gt;&#xA;&lt;p&gt;对于Windows个人用户而言，还是使用桌面程序比较好一些。&lt;/p&gt;&#xA;&lt;p&gt;官方也提供桌面版本程序: &lt;a href=&#34;https://github.com/jgraph/drawio-desktop&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;https://github.com/jgraph/drawio-desktop&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;官方桌面程序是使用electron打包而成的，并且目前只提供64位版本，对于使用32位系统的我来说是个硬伤。&lt;/p&gt;&#xA;&lt;p&gt;因此只有考虑使用它的源码自己构建Windows桌面程序了。&lt;/p&gt;&#xA;&lt;hr&gt;&#xA;&lt;p&gt;鉴于之前研究过阿里钉钉PC端客户端，是使用nw.js制作的，于是研究能不能用nw.js来启动draw.io？&lt;/p&gt;&#xA;&lt;p&gt;1.首先下载官方源码，得到drawio-master.zip。&lt;/p&gt;&#xA;&lt;p&gt;2.解压后找到drawio-master\src\main\webapp目录，复制到nw.js的根目录。&lt;/p&gt;&#xA;&lt;p&gt;3.修改package.json&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;{&#xD;&#xA;&#x9;&amp;#34;name&amp;#34;: &amp;#34;draw.io&amp;#34;,&#xD;&#xA;&#x9;&amp;#34;main&amp;#34;: &amp;#34;app://./webapp/index.html&amp;#34;,&#xD;&#xA;&#x9;&amp;#34;window&amp;#34;:&#xD;&#xA;&#x9;{&#xD;&#xA;&#x9;&#x9;&amp;#34;icon&amp;#34;: &amp;#34;webapp/images/logo.png&amp;#34;,&#xD;&#xA;&#x9;&#x9;&amp;#34;title&amp;#34;:&amp;#34;draw.io&amp;#34;,&#xD;&#xA;&#x9;&#x9;&amp;#34;resizable&amp;#34;:true,&#xD;&#xA;&#x9;&#x9;&amp;#34;toolbar&amp;#34;:false,&#xD;&#xA;&#x9;&#x9;&amp;#34;frame&amp;#34;:true&#xD;&#xA;&#x9;}&#xD;&#xA;}&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;4.启动nw.exe&lt;/p&gt;&#xA;&lt;p&gt;哇哦，它真的运行成功了！&lt;/p&gt;&#xA;&lt;p&gt;&lt;img src=&#34;./140_1.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;&lt;img src=&#34;./140_2.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;体验还不错！nice！nw.js真是个好东西！&lt;/p&gt;&#xA;&lt;p&gt;嘿嘿，我的32位系统终于用上draw.io桌面版了！&lt;/p&gt;&#xA;&lt;hr&gt;&#xA;&lt;p&gt;备注下：我当前使用的nw.js版本是V0.12.3，没有package.json时启动是下面这个样子的。&lt;/p&gt;&#xA;&lt;p&gt;本来打算把我的nw.js也传上来的，发现CSDN上面已经有这个资源了，不能重复上传。&lt;/p&gt;&#xA;&lt;p&gt;&lt;img src=&#34;./140_3.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;</description>
    </item>
    <item>
      <title>Windows平台快速切换hosts文件的小工具</title>
      <link>https://xcdd.pages.dev/blog/2020/2020-03-30/</link>
      <pubDate>Mon, 30 Mar 2020 09:14:40 +0000</pubDate>
      <guid>https://xcdd.pages.dev/blog/2020/2020-03-30/</guid>
      <description>&lt;p&gt;上周孩子她妈跑过来说电脑上有个软件打不开了，让我给看看是怎么回事。&lt;/p&gt;&#xA;&lt;p&gt;做为一个程序员，外行人眼中修电脑什么的肯定都是必备技能啊！&lt;/p&gt;&#xA;&lt;p&gt;我走过去看了看，这个软件就是SwitchHosts!，具体问题当时没有保存截图，总之就是报错！&lt;/p&gt;&#xA;&lt;p&gt;最后解决的办法就是把C:\Users\Administrator.SwitchHosts这个文件夹删除就好了。&lt;/p&gt;&#xA;&lt;hr&gt;&#xA;&lt;p&gt;虽然问题已经解决，但是我分析了下这个软件，核心功能嘛就是切换预设的hosts文件嘛，功能并不复杂。&lt;/p&gt;&#xA;&lt;p&gt;但是它：&lt;/p&gt;&#xA;&lt;p&gt;1、高达100MB的程序体积（大概是为了跨平台，使用electron打包的程序）。&lt;/p&gt;&#xA;&lt;p&gt;2、默认配置文件保存在用户主目录（这不符合我对绿色软件的定义）。&lt;/p&gt;&#xA;&lt;p&gt;因此我突发奇想，决定使用Windows原生API重写一个真正的绿色程序，&lt;/p&gt;&#xA;&lt;p&gt;按照我理解的绿色程序应该具有以下特点：&lt;/p&gt;&#xA;&lt;p&gt;1、免安装，解压即用；&lt;/p&gt;&#xA;&lt;p&gt;2、不写注册表，程序数据和配置文件保存在程序目录下面；&lt;/p&gt;&#xA;&lt;p&gt;3、打包整个程序目录放到U盘，可以在任意电脑上打开，并得到相同的配置参数；&lt;/p&gt;&#xA;&lt;hr&gt;&#xA;&lt;p&gt;好的，说干就干。&lt;/p&gt;&#xA;&lt;p&gt;于是我打开VS2005，新建一个MFC工程，然后此处省略1万字&amp;hellip;&amp;hellip;&amp;hellip;&amp;hellip;&amp;hellip;&amp;hellip;&amp;hellip;&amp;hellip;&lt;/p&gt;&#xA;&lt;p&gt;终于一个界面丑陋，功能简单的hosts切换工具就产生了。&lt;/p&gt;&#xA;&lt;p&gt;&lt;img src=&#34;./139_1.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;界面布局参考了SwitchHosts!，左边是配置文件的列表，右边可以查看和编辑配置文件的内容。&lt;/p&gt;&#xA;&lt;p&gt;左侧的配置文件列表点鼠标右键可以进行添加、删除、改名操作。&lt;/p&gt;&#xA;&lt;p&gt;勾选对应的配置，可以同时勾选多个，则加载到系统hosts文件并执行清除DNS缓存的操作。&lt;/p&gt;&#xA;&lt;p&gt;清除DNS缓存使用的是命令：ipconfig /flushdns&lt;/p&gt;&#xA;&lt;p&gt;右侧的编辑框查看和修改配置文件，并实时保存配置文件的改动。&lt;/p&gt;&#xA;&lt;p&gt;实时保存这个功能，目前采用的是当EDIT控件丢失焦点时，如果文本内容有改变，则保存一次文件。&lt;/p&gt;&#xA;&lt;p&gt;第一次启动程序的时候会自动备份当前系统的hosts文件，命名为“默认配置”；&lt;/p&gt;&#xA;&lt;p&gt;所有配置文件均保存在程序主目录的etc目录下面，并以.hosts为后缀；&lt;/p&gt;&#xA;&lt;p&gt;编译出来的程序也才200多KB，比起SwitchHosts!小巧了不是一点半点。&lt;/p&gt;&#xA;&lt;p&gt;这个工具使用纯MFC开发，源码也非常的简单，感兴趣的朋友可以到我的码云查看源码。&lt;/p&gt;&#xA;&lt;p&gt;下载地址： &lt;a href=&#34;https://download.csdn.net/download/qq446252221/12282814&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;https://download.csdn.net/download/qq446252221/12282814&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;源码地址： &lt;a href=&#34;https://gitee.com/kerndev/HostsMan&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;https://gitee.com/kerndev/HostsMan&lt;/a&gt;&lt;/p&gt;&#xA;&lt;hr&gt;&#xA;&lt;p&gt;后记：&lt;/p&gt;&#xA;&lt;p&gt;发给孩子她妈试用，竟然打开是一坨英文+乱码！&lt;/p&gt;&#xA;&lt;p&gt;原来hosts文件被SwitchHosts!修改过后变成了UTF8编码的UNIX文档（换行符变成了\n而不是\r\n）。&lt;/p&gt;&#xA;&lt;p&gt;由于文本编辑使用的是EDIT控件，只能识别\r\n的换行符，&lt;/p&gt;&#xA;&lt;p&gt;于是又修改了一下代码，把加载的文件换行符强转为\r\n，才能正常换行。&lt;/p&gt;&#xA;&lt;p&gt;但是UTF8编码这个就有点麻烦了，暂时还不支持，只能用Notepad++先转为GBK编码吧。&lt;/p&gt;&#xA;&lt;hr&gt;&#xA;&lt;p&gt;补充：&lt;/p&gt;&#xA;&lt;p&gt;用python写了个脚本把SwitchHosts!的配置导入HostsMan&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-python&#34; data-lang=&#34;python&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;#!python&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;#从SwitchHosts!导入配置文件&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;#蒋晓岗&amp;lt;446252221@qq.com&amp;gt;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;import&lt;/span&gt; io&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;import&lt;/span&gt; os&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;import&lt;/span&gt; json&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;#创建子目录etc&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;def&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;safe_mkdir&lt;/span&gt;(name):&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&lt;span style=&#34;color:#66d9ef&#34;&gt;try&lt;/span&gt;:&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&#x9;os&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;mkdir(name)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&lt;span style=&#34;color:#66d9ef&#34;&gt;except&lt;/span&gt;:&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&#x9;&lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;None&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;#保存配置&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;def&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;save_hosts&lt;/span&gt;(dir, name, data):&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;print(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;正在导入:&amp;#34;&lt;/span&gt;, name)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;hosts &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; open(dir &lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;\\&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt; name &lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;.hosts&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;w&amp;#34;&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;hosts&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;write(data)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;hosts&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;close()&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;#入口&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;home &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; os&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;environ[&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;USERPROFILE&amp;#34;&lt;/span&gt;]&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;file_name &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; home &lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;\\&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;.SwitchHosts&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;\\&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;data.json&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;file_obj &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; open(file_name, &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;r&amp;#34;&lt;/span&gt;, encoding&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;utf8&amp;#34;&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;json_str &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; file_obj&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;read()&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;file_obj&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;close()&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;list_obj &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; json&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;loads(json_str)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;for&lt;/span&gt; data &lt;span style=&#34;color:#f92672&#34;&gt;in&lt;/span&gt; list_obj[&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;list&amp;#34;&lt;/span&gt;]:&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;title &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; data[&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;title&amp;#34;&lt;/span&gt;]&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;content &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; data[&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;content&amp;#34;&lt;/span&gt;]&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;safe_mkdir(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;etc&amp;#34;&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;save_hosts(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;etc&amp;#34;&lt;/span&gt;, title, content)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description>
    </item>
    <item>
      <title>Windows更新信任证书颁发机构列表</title>
      <link>https://xcdd.pages.dev/blog/2020/2020-03-28/</link>
      <pubDate>Sat, 28 Mar 2020 12:56:58 +0000</pubDate>
      <guid>https://xcdd.pages.dev/blog/2020/2020-03-28/</guid>
      <description>&lt;p&gt;Windows系统内置的信任根证书是需要随时更新的，&lt;/p&gt;&#xA;&lt;p&gt;任意打开一个HTTPS网站，如果发现其证书不是由受信任的根证书颁发机构提供的，那么有两种可能：&lt;/p&gt;&#xA;&lt;p&gt;一、本地储存的根证书太旧了，需要更新，这时就会触发系统自动请求证书；&lt;/p&gt;&#xA;&lt;p&gt;二、这个证书确实不是有效的，那么给出无效证书的警告；&lt;/p&gt;&#xA;&lt;p&gt;有时候安装某些带有数字证书的软件的时候，也会检查证书，如果自动更新没有成功，那么就会提示：&lt;/p&gt;&#xA;&lt;p&gt;无法建立到信任根颁发机构的证书链！&lt;/p&gt;&#xA;&lt;p&gt;这时就需要手动更新：&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;检查电脑网络是否通畅；&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;检查“任务计划程序库” &amp;gt; &amp;ldquo;Microsoft&amp;rdquo; &amp;gt; &amp;ldquo;Windows&amp;rdquo; &amp;gt; &amp;ldquo;CertificateServicesClient&amp;rdquo; 下面有没有3个项目。&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;p&gt;&lt;img src=&#34;./138_1.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;&#xA;&lt;ol start=&#34;3&#34;&gt;&#xA;&lt;li&gt;打开浏览器访问一些HTTPS的站点试试；&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;p&gt;4.重启电脑再次安装软件；&lt;/p&gt;&#xA;&lt;p&gt;5.实在不行就等等吧，有时候系统它过几天自己就好了。&lt;/p&gt;&#xA;&lt;p&gt;6.尝试安装补丁KB2813430(windows 7)&lt;/p&gt;</description>
    </item>
    <item>
      <title>嵌入式软件编程规范（C语言）</title>
      <link>https://xcdd.pages.dev/blog/2020/2020-03-09/</link>
      <pubDate>Mon, 09 Mar 2020 10:23:16 +0000</pubDate>
      <guid>https://xcdd.pages.dev/blog/2020/2020-03-09/</guid>
      <description>&lt;p&gt;〇、前言&lt;/p&gt;&#xA;&lt;p&gt;代码编程我认为也是一门艺术，优美的代码使人赏心悦目。然而编程规范并没有唯一的行业标准，就像windows和linux的代码各具风格。本文是作者本人在多年嵌入式软件开发中所总结出的一些经验，仅作读者参考。&lt;/p&gt;&#xA;&lt;p&gt;一、排版格式&lt;/p&gt;&#xA;&lt;p&gt;0.在同一个项目中的所有代码应保持一致的代码风格，引用第三方库文件源码的除外。&#xA;1.代码行首缩进使用TAB键，TAB宽度设置为4个字符。&#xA;2. 一条语句占一行，不要把多条语句写到一行。&#xA;3. 每行代码不要超过100个字符，含有字符串的语句可酌情延长（如打印日志）。&#xA;4. 这些关键字须独占一行：if、else、for、do、while、switch、case、default等。&#xA;5. 所有的if、else、for、do、while语句后面都要加上花括号{}。&#xA;6. 代码块的花括号{}应独占一行，并且保持代码块和花括号缩进对齐。&#xA;7. 相对独立的代码块之间应添加一个空行分隔开。&#xA;8. 在文件末尾添加一个空行。&#xA;9. 定义指针变量时星号的位置应远离类型，向右靠近变量。&#xA;10.函数的多个参数之间使用一个空格隔开，有利于阅读。&lt;/p&gt;&#xA;&lt;p&gt;二、注释&lt;/p&gt;&#xA;&lt;p&gt;0.注释的原则是以人为本，注释语言尽量使用简体中文，必须准确、简洁、易懂。&#xA;1.在源文件的头部添加注释，列出该模块的关键性功能说明、作者、创建日期等。&#xA;2.对接口函数进行详细注释，列出函数的功能、输入参数、返回值。&#xA;3.对内部函数进行简要注释，列出函数的功能和必要的参数说明。&#xA;4.对代码块和函数的注释应放在其上方相邻位置，单行代码和变量注释放在右方相邻位置。&#xA;5.禁止在一行代码或表达式的中间插入注释。&#xA;6.单行注释使用//，多行注释使用/**/。&lt;/p&gt;&#xA;&lt;p&gt;三、命名规则&lt;/p&gt;&#xA;&lt;p&gt;0.标识符的命名要简洁明了，能够通过名称直观地了解到该标识符所表达的含义。&#xA;1.通常用一个或多个英文单词来命名，原则上禁止使用中文拼音，多个单词之间用下划线连接。&#xA;2.遇到太长的英文单词可以采用缩写的形式，缩写可以去掉元音字母或者截取单词的前面几个字母，尽量采用大家都能理解的缩写单词。&#xA;3.对于理解有困难的缩写应该加以注释。&#xA;4.变量、函数、结构体、类型定义标识符使用小写字母。&#xA;6.宏、常量、枚举成员使用大写字母。&#xA;6. 循环变量等具有特殊含义的变量可以使用单个字符作为变量名字（形如i、j、k）。&#xA;7. 变量命名不要在变量名前面添加冗余类型前缀。&#xA;例如：unsigned int ui_size;&#xA;改为：unsigned int size;&#xA;8. 防止全局变量和静态变量与局部变量冲突，可添加特定前缀(g_、m_)表明作用域。&#xA;9. 使用typedef定义的类型标识符使用“_t”做为后缀。&#xA;10. 作用域为全局范围的函数、宏、枚举成员，应使用模块化的命名规则。即：以模块/对象名作为前缀。&lt;/p&gt;&#xA;&lt;p&gt;四、声明与定义&lt;/p&gt;&#xA;&lt;p&gt;0.尽量使用编程语言提供的标准数据类型，如char、int、float等。&#xA;1.不要自行定义固定字长的数据类型，因为标准库&amp;lt;stdint.h&amp;gt;已经提供了此类型(如uint8_t、int32_t等)。&#xA;2.谨慎使用条件编译功能，因为条件编译会降低代码可读性。&#xA;3.项目中广泛引用的数据类型或定义，应考虑把它们集中到一个头文件中，如&amp;lt;define.h&amp;gt;。&#xA;4.频繁使用的代码块应考虑定义成为函数。&#xA;5.避免随机乱序定义变量，将具有关联性的变量定义放到一起。&#xA;6.文件内部引用的全局变量和函数必须加上static声明。&#xA;7.被引用的枚举类型应使用typedef定义为自定义类型。&#xA;8.结构体的使用者如果不会访问其成员变量，则应使用typedef定义为自定义类型。&#xA;9.每个.c文件最多只能有一个与之对应的.h头文件声明其对外输出的接口函数。&#xA;10.明确头文件的使用者，不要在头文件中定义使用者不关心的数据定义或函数。&lt;/p&gt;&#xA;&lt;p&gt;五、 模块化编程&lt;/p&gt;&#xA;&lt;p&gt;0.模块化编程即是把整个项目代码分解为一个个功能独立的模块，良好的模块化设计可以极大地提高代码的维护性和复用性。&#xA;1.一个模块通常由一个或多个.c源文件和一个声明接口的.h头文件组成。&#xA;2.模块化设计的关键在于分解功能，一个模块只实现较为独立的单一功能。&#xA;3.根据模块所实现的功能大致分为应用层、功能层、驱动层，可以细分更多层次。&#xA;4.应用层属于最顶层，是整个项目业务需求最直观的体现，依赖于下层的模块。应用层的模块通常提供的接口函数很少，且都是初始化、启动、停止等操作。&#xA;5.功能层属于中间层，一般用于连接应用层和驱动层的桥梁，是实现业务需求的支柱。功能层的模块通常处理驱动层的数据传递给应用层，比如协议解析，数据处理等。&#xA;6.驱动层属于最低层，负责和底层硬件打交道，只处理硬件数据，不关心具体应用。因此驱动层的代码应该具有很强的可复用性，在不同的项目中应该可以直接重复使用。&#xA;7.函数调用层次需遵循上层模块调用同层或下层模块的接口，切勿在底层模块中直接调用上层模块的函数。&#xA;8.模块之间通信使用轮寻或回调函数的方式，降低各模块之间的耦合性。&lt;/p&gt;</description>
    </item>
    <item>
      <title>由DLL文件生成LIB文件</title>
      <link>https://xcdd.pages.dev/blog/2020/2020-02-28/</link>
      <pubDate>Fri, 28 Feb 2020 18:40:35 +0000</pubDate>
      <guid>https://xcdd.pages.dev/blog/2020/2020-02-28/</guid>
      <description>&lt;p&gt;网上广泛使用的方法，经过测试没有成功！&#xA;因为DLL导出名和编译链接时使用的名称不一样，导致编译通不过。一种是xxx@nn格式，还有一种是__imp_xxx@XYZ格式。&#xA;如果手动修改DEF文件里面的函数名为链接所需的名字，编译能通过，但运行时提示找不到XXX函数的入口点。&lt;/p&gt;&#xA;&lt;p&gt;经过一番百度，终于找到一位高人所写的文章和工具解决了我的问题！&#xA;文章地址： &lt;a href=&#34;https://bbs.csdn.net/topics/390707917&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;https://bbs.csdn.net/topics/390707917&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;生成DEF文件后，手工修改函数为以下格式：&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;LIBRARY demo.dll&#xD;&#xA;&#xD;&#xA;EXPORTS&#xD;&#xA;Initialize@12=Initialize&#xD;&#xA;CalcCRC@8=CalcCRC&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Initialize@12=Initialize前面的@12表示这个函数有3个参数，等号后面的Initialize是DLL导出函数的原始名字。&#xA;生成lib文件后，再用ImpLibEditor工具的Change To [Undecorate]功能修改函数名，最后另存为新的lib文件即可。&lt;/p&gt;&#xA;&lt;p&gt;&lt;img src=&#34;./136_1.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;相关工具已经上传到网盘。下载地址： &lt;a href=&#34;https://share.weiyun.com/5zM4Wfq&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;https://share.weiyun.com/5zM4Wfq&lt;/a&gt;&lt;/p&gt;</description>
    </item>
    <item>
      <title>I2C接口读取MPU9250磁力数值</title>
      <link>https://xcdd.pages.dev/blog/2020/2020-01-13/</link>
      <pubDate>Mon, 13 Jan 2020 16:27:25 +0000</pubDate>
      <guid>https://xcdd.pages.dev/blog/2020/2020-01-13/</guid>
      <description>&lt;p&gt;一开始拿到芯片手册云里雾里，根本没有找到关于磁力数据的寄存器，结果上网一查才知道，这芯片竟然是个胶水芯片。。。&lt;/p&gt;&#xA;&lt;p&gt;MPU9250内部是MPU6050和AK8963两个芯片合并在一起的，感觉傻傻的。&lt;/p&gt;&#xA;&lt;p&gt;内部的AK8963是负责三轴磁力传感器采样的芯片，它通过I2C总线与MPU9250连接在一起。&lt;/p&gt;&#xA;&lt;p&gt;&lt;img src=&#34;./135_1.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;如上图所示，MPU9250还集成了一个I2C主机控制器。默认情况下MPU9250用它的I2C主机控制器与AK8963通信，把磁力值读到出放到指定的寄存器中，这需要设置一堆寄存器，真是麻烦得一逼！！！&lt;/p&gt;&#xA;&lt;p&gt;幸好MPU9250还预留了I2C直通模式，这个模式相当于MPU9250和AK8963共同使用一条I2C总线，因为它们的通信地址不一样，&lt;/p&gt;&#xA;&lt;p&gt;MPU9250的地址：0xD0/0xD1&lt;/p&gt;&#xA;&lt;p&gt;AK8963的地址：0x18/0x19&lt;/p&gt;&#xA;&lt;p&gt;在写驱动程序的时候，可以把它们当作硬件上分离的两个芯片挂在同一条I2C总线上。&lt;/p&gt;&#xA;&lt;p&gt;直通模式需要设置MPU9250的第55号寄存器的Bit1写1即可开启。&lt;/p&gt;&#xA;&lt;hr&gt;&#xA;&lt;p&gt;有了直通模式我们就可以直接与AK8963通信了，AK8963的寄存器不多。&lt;/p&gt;&#xA;&lt;p&gt;下面讲讲几个关键寄存器操作：&lt;/p&gt;&#xA;&lt;p&gt;0x00:这个寄存器是芯片ID=0x48，能读出这个ID证明通信OK了。&lt;/p&gt;&#xA;&lt;p&gt;0x0A:设置工作模式，建议上电后先写入0x0F，读取出芯片校准系数；然后再写0x01，进行单次采样。&lt;/p&gt;&#xA;&lt;p&gt;0x02:状态寄存器，BIT0为1表示采样完成，可以读取采样数据了。网上有人说读不到数据，加上10毫秒延时就能读出数据，就是因为没有检查状态值。经过实验测试单次采样大概需要6-8毫秒。&lt;/p&gt;&#xA;&lt;p&gt;0x03-0x08:数据寄存器，三个轴，每个轴的数据都分为高8位和低8位，组成16位的有符号整数。&lt;/p&gt;&#xA;&lt;p&gt;0x10-0x12:校准寄存器，出厂设置的校准参数，当0x0A寄存器写入0x0F后才可以读出来。&lt;/p&gt;&#xA;&lt;p&gt;手册上写了数据校准参数的用法：&lt;/p&gt;&#xA;&lt;p&gt;&lt;img src=&#34;./135_2.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;Hadj是校准后的数据；&lt;/p&gt;&#xA;&lt;p&gt;H是读出来的原始采样数据；&lt;/p&gt;&#xA;&lt;p&gt;ASA是校准寄存器读出来的参数；&lt;/p&gt;&#xA;&lt;hr&gt;&#xA;&lt;p&gt;得到正确的三轴磁力数值后，就可以用来实现一个简单的电子指南针了。&lt;/p&gt;&#xA;&lt;p&gt;在水平面的方向＝180 + arctan(Y, X) * 180 / PI;&lt;/p&gt;&#xA;&lt;p&gt;由于环境干扰，还需要加入一个平面校准算法：将芯片在水平面原地转360度，记录三个轴的采样值的最大值和最小值，求得(最大值+最小值)除以2得到偏移值。将原始采样值减去偏移值之后，再送入上面的公式计算角度会更准确。&lt;/p&gt;</description>
    </item>
    <item>
      <title>EC20模块内置协议栈的开发笔记</title>
      <link>https://xcdd.pages.dev/blog/2019/2019-10-29/</link>
      <pubDate>Tue, 29 Oct 2019 16:25:09 +0000</pubDate>
      <guid>https://xcdd.pages.dev/blog/2019/2019-10-29/</guid>
      <description>&lt;p&gt;本文主要记录如何通过UART接口发送AT指令进行网络连接。&lt;/p&gt;&#xA;&lt;h2 id=&#34;前言&#34;&gt;前言&lt;/h2&gt;&#xA;&lt;p&gt;EC20是4G全网通模块。&#xA;从手册上看类似的模块应该还有EG9x和EM05&lt;/p&gt;&#xA;&lt;h2 id=&#34;硬件&#34;&gt;硬件&lt;/h2&gt;&#xA;&lt;p&gt;硬件上使用一路UART接口与模块通信，UART接口默认使用115200波特率。&#xA;模块上电就会启动，可以通过拉低RESET管脚对模块进行复位操作。&lt;/p&gt;&#xA;&lt;h2 id=&#34;软件&#34;&gt;软件&lt;/h2&gt;&#xA;&lt;p&gt;AT命令的格式：&#xA;发送方是以AT开头0x0D结尾的字符串，格式比较统一。&#xA;模块响应是以0x0D,0x0A结尾，但开头字符是没有统一的格式，有的指令响应是以+开头，有的又没有。&lt;/p&gt;&#xA;&lt;p&gt;AT指令软件初始化流程仅供参考：&lt;/p&gt;&#xA;&lt;p&gt;第1步：等待模块就绪&#xA;由于模块上电就会启动，启动时间大约10秒。&#xA;所以主机最好延时10秒再循环发送AT，等待模块响应OK，表示模块通信就绪了。&#xA;如果发送了多次都没有响应，则可以给模块来一个复位信号。&#xA;再重复上面的操作。&lt;/p&gt;&#xA;&lt;p&gt;第2步：基本参数设置&#xA;2.1 发送ATE0，关闭指令回显。&#xA;如果不关闭回显，主机发什么，模块就会原样回复，适合于在终端软件里人工发送命令，可以看到输入指令。&#xA;但是我们做产品是用程序去发指令，指令回显不利于写代码解析响应数据，所以关掉为好。&#xA;2.2 发送AT+CREG=0，取消注册状态主动上报&#xA;注册状态通过AT+CREG?查询就行了，可以不用主动上报。&#xA;2.3 发送AT+CMEE=2，设置错误反馈方式&#xA;设置为0所有的错误都会返回ERROR.&#xA;设置为2某些指令错误会返回+CME ERROR:给出详细的错误信息&#xA;2.4 发送AT+QCFG=&amp;ldquo;nwscanmode&amp;rdquo;,0设置模块搜网模式&#xA;通过这个指令可以锁定4G或2G网络。&#xA;具体的取值定义可以看手册：&lt;/p&gt;&#xA;&lt;p&gt;&lt;img src=&#34;./134_1.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;&lt;img src=&#34;./134_2.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;第3步：模块识别&#xA;主机发送ATI或者AT+GMM，可以得到模块型号。&#xA;发送ATI，还可以获取模块固件版本号信息。&lt;/p&gt;&#xA;&lt;p&gt;第4步：检测SIM卡&#xA;主机发送AT+CPIN?，可以得到SIM卡状态。&#xA;这条指令很好解析，响应是格式是+CPIN: &lt;code&gt;&#xA;检测到接收的内容是+CPIN开头，就可以确定这是指令应答，而不是模块主动上报的干扰数据。&#xA;当&lt;code&gt;为READY时表示SIM卡也就绪了，可以进行下一步操作了。&#xA;当&lt;code&gt;为其它状态时，看手册吧，反正是不正常的状态。&#xA;发送AT+CIMI可以得到IMSI信息，从号码的前5位可以判断这张卡是哪家运营商，&#xA;比如46000是中国移动，46001是中国联通。&lt;/p&gt;&#xA;&lt;p&gt;第5步：等待注册网络&#xA;主机发送AT+CREG?&#xA;模块响应+CREG:&lt;n&gt;,&lt;stat&gt;&#xA;当stat的值为1或者5时，表示注册成功。&#xA;可以发送AT+COPS?查询当前注册的是哪家运营商&#xA;可以发送AT+CSQ查询信号强度1-31，31表示信号最强&lt;/p&gt;&#xA;&lt;p&gt;第6步：激活GPRS数据连接&#xA;主机发送AT+QICSGP=1,1,&lt;apn&gt;,&lt;user&gt;,&lt;pass&gt;设置APN接入点。&#xA;模块响应：OK&#xA;主机发送AT+QIACT=1激活GPRS数据连接。&#xA;模块响应：OK&lt;/p&gt;&#xA;&lt;p&gt;第7步：其它信息&#xA;发送AT+QIACT?查询当前IP地址。&#xA;发送AT+QNWINFO查询当前网络参数。&lt;/p&gt;&#xA;&lt;p&gt;至此模块的网络初始化完成了。&#xA;可以进行网络通信了。&lt;/p&gt;&#xA;&lt;p&gt;第8步：连接远程服务器&#xA;发送AT+QIOPEN=1,&lt;id&gt;,&amp;ldquo;TCP&amp;rdquo;,&lt;host&gt;,&lt;port&gt;,0,1&#xA;&lt;id&gt;是通道号码，模块支持1-4通道，可以理解为socket句柄。&#xA;&lt;host&gt;可以是域名也可以是IP地址。&#xA;&lt;port&gt;是服务器端口。&#xA;最后的参数1表示使用Direct Push Mode。此模式模块会将接收数据主动上报过来。&#xA;模块响应：OK&#xA;模块响应：+QIOPEN: &lt;id&gt;,&lt;sta&gt;&#xA;响应的&lt;sta&gt;是连接状态，0表示连接成功，非0表示连接失败，手册有详细错误代码。&#xA;这里要注意：&#xA;模块是先返回应答OK，然后再返回连接状态。&#xA;如果网络不好模块会很过长时间才返回连接状态。&#xA;在模块返回连接状态之前，主机可以发送AT+QICLOSE=&lt;id&gt;提前结束连接，&#xA;此时模块会先返回OK，再返回+QIOPEN: &lt;id&gt;,567&lt;/p&gt;</description>
    </item>
    <item>
      <title>BM817模块内置协议栈的开发笔记</title>
      <link>https://xcdd.pages.dev/blog/2019/2019-10-28/</link>
      <pubDate>Mon, 28 Oct 2019 16:54:17 +0000</pubDate>
      <guid>https://xcdd.pages.dev/blog/2019/2019-10-28/</guid>
      <description>&lt;p&gt;BM817和U8300C是非常相似的4G全网通模块；&lt;/p&gt;&#xA;&lt;p&gt;AT指令初始化流程也几乎相同，可以参照U8300C的使用方法。&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;重点说一下不同之处：&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;1.设置模块搜网模式指令是：AT+BMMODODR=11&#xA;此处的值定义见手册：&#xA;&lt;img src=&#34;./133_1.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;2.此模块注册到电信HDR网络时使用的指令集会不同。&#xA;通过模块上报的^MODE: 2状态来决定通用指令集，&#xA;当状态值为2，4，8时模块使用3GPP2指令模式。&#xA;此模式：&#xA;AT+QCPIN?代替AT+CPIN?&#xA;AT+QCIMI代替AT+CIMI&#xA;AT+CCSQ代替AT+CSQ&lt;/p&gt;&#xA;&lt;p&gt;3.连接服务器指令AT+MIPOPEN多一个连接超时的参数。&#xA;AT+MIPOPEN=&lt;id&gt;,0,&lt;host&gt;,&lt;port&gt;,0,&lt;timeout&gt;&#xA;&lt;timeout&gt;是连接超时时间，单位是秒。&lt;/p&gt;</description>
    </item>
    <item>
      <title>U8300W模块内置协议栈的开发笔记</title>
      <link>https://xcdd.pages.dev/blog/2019/2019-10-24/</link>
      <pubDate>Thu, 24 Oct 2019 09:28:13 +0000</pubDate>
      <guid>https://xcdd.pages.dev/blog/2019/2019-10-24/</guid>
      <description>&lt;p&gt;本文主要记录如何通过UART接口发送AT指令进行GPRS网络连接。&lt;/p&gt;&#xA;&lt;h2 id=&#34;前言&#34;&gt;前言&lt;/h2&gt;&#xA;&lt;p&gt;U8300W是LTE制式的4G网络模块，支持移动和联通4G网络。&#xA;类似的模块的还有U8300C、U7500、C5300。&#xA;U8300C是支持电信4G的全网通模块。&#xA;U7500是只支持联通3G模块。&#xA;C5300是只支持电信3G模块。&lt;/p&gt;&#xA;&lt;p&gt;这几个模块的开发方式是一样的，支持的AT命令也都差不多。&lt;/p&gt;&#xA;&lt;h2 id=&#34;硬件&#34;&gt;硬件&lt;/h2&gt;&#xA;&lt;p&gt;硬件上使用一路UART接口与模块通信，UART接口默认使用115200波特率。&#xA;模块上电就会启动，可以通过拉低RESET管脚对模块进行复位操作。&lt;/p&gt;&#xA;&lt;h2 id=&#34;软件&#34;&gt;软件&lt;/h2&gt;&#xA;&lt;p&gt;AT命令的格式：&#xA;发送方是以AT开头0x0D结尾的字符串，格式比较统一。&#xA;模块响应是以0x0D,0x0A结尾，但开头字符是没有统一的格式，有的指令响应是以+开头，有的又没有。&lt;/p&gt;&#xA;&lt;p&gt;AT指令软件初始化流程仅供参考：&lt;/p&gt;&#xA;&lt;p&gt;第1步：等待模块就绪&#xA;由于模块上电就会启动，但启动时模块的UART接口会打印模块的启动日志，大约持续30秒。&#xA;所以主机最好延时30秒再循环发送AT，等待模块响应OK，表示模块通信就绪了。&#xA;如果发送了多次都没有响应，则可以给模块来一个复位信号。&#xA;再重复上面的操作。&lt;/p&gt;&#xA;&lt;p&gt;第2步：基本参数设置&#xA;2.1 发送ATE0，关闭指令回显。&#xA;如果不关闭回显，主机发什么，模块就会原样回复，适合于在终端软件里人工发送命令，可以看到输入指令。&#xA;但是我们做产品是用程序去发指令，指令回显不利于写代码解析响应数据，所以关掉为好。&#xA;2.2 发送AT+CREG=0，取消注册状态主动上报&#xA;注册状态通过AT+CREG?查询就行了，可以不用主动上报。&#xA;2.3 发送AT+CMEE=2，设置错误反馈方式&#xA;设置为0所有的错误都会返回ERROR.&#xA;设置为2某些指令错误会返回+CME ERROR:给出详细的错误信息&#xA;2.4 发送AT+MODODR=2，设置模块搜网模式&#xA;U8300可以通过这个指令设置锁定4G或2G网络。&lt;/p&gt;&#xA;&lt;p&gt;第3步：模块识别&#xA;主机发送AT+GMM，可以得到模块型号。&#xA;但是这条指令的响应内容就是模块型号字符串，没有固定的头和尾，解析比较困难，&#xA;如果发这条指令之后，模块突然主动上报一些其它内容，不要把干扰数据当成模块型号了！&#xA;发送ATI也可以得到模块型号，还可以获取模块固件版本号信息。&lt;/p&gt;&#xA;&lt;p&gt;第4步：检测SIM卡&#xA;主机发送AT+CPIN?，可以得到SIM卡状态。&#xA;这条指令很好解析，响应是格式是+CPIN: &lt;code&gt;&#xA;检测到接收的内容是+CPIN开头，就可以确定这是指令应答，而不是模块主动上报的干扰数据。&#xA;当&lt;code&gt;为READY时表示SIM卡也就绪了，可以进行下一步操作了。&#xA;当&lt;code&gt;为其它状态时，看手册吧，反正是不正常的状态。&#xA;发送AT+CIMI可以得到IMSI信息，从号码的前5位可以判断这张卡是哪家运营商，&#xA;比如46000是中国移动，46001是中国联通。&lt;/p&gt;&#xA;&lt;p&gt;第5步：等待注册网络&#xA;主机发送AT+CREG?&#xA;模块响应+CREG:&lt;n&gt;,&lt;stat&gt;&#xA;当stat的值为1或者5时，表示注册成功。&#xA;可以发送AT+COPS?查询当前注册的是哪家运营商&#xA;可以发送AT+CSQ查询信号强度1-31，31表示信号最强&lt;/p&gt;&#xA;&lt;p&gt;第6步：激活GPRS数据连接&#xA;主机发送AT+MIPPROFILE=1,&lt;apn&gt;,&lt;user&gt;,&lt;pass&gt;设置APN接入点。&#xA;模块响应：OK&#xA;主机发送AT+MIPCALL=1激活GPRS数据连接。&#xA;模块响应：+MIPCALL:&lt;IP&gt;&#xA;模块响应：OK&lt;/p&gt;&#xA;&lt;p&gt;第7步：数据连接相关的参数设置&#xA;发送AT+MIPHEX=1，设置数据格式&#xA;内嵌TCP/IP协议栈发送数据时采用16进制字符串的格式，而不使用原始二进制数据。&lt;/p&gt;&#xA;&lt;p&gt;至此模块的网络初始化完成了。&#xA;可以进行网络通信了。&lt;/p&gt;&#xA;&lt;p&gt;第8步：连接远程服务器&#xA;发送AT+MIPOPEN=&lt;id&gt;,0,&lt;host&gt;,&lt;port&gt;,0&#xA;&lt;id&gt;是通道号码，模块支持1-4通道，可以理解为socket句柄。&#xA;&lt;host&gt;可以是域名也可以是IP地址。&#xA;&lt;port&gt;是服务器端口。&#xA;模块响应：+MIPOPEN:&lt;id&gt;,&lt;sta&gt;&#xA;模块响应：OK&#xA;响应的&lt;sta&gt;是连接状态，1表示连接成功，0表示连接失败。&lt;/p&gt;</description>
    </item>
    <item>
      <title>SIM800模块内置协议栈的开发笔记</title>
      <link>https://xcdd.pages.dev/blog/2019/2019-10-17/</link>
      <pubDate>Thu, 17 Oct 2019 12:52:04 +0000</pubDate>
      <guid>https://xcdd.pages.dev/blog/2019/2019-10-17/</guid>
      <description>&lt;p&gt;本文主要记录如何通过UART接口发送AT指令进行GPRS网络连接。&lt;/p&gt;&#xA;&lt;h4 id=&#34;前言&#34;&gt;前言&lt;/h4&gt;&#xA;&lt;p&gt;SIM800是GSM制式的2G网络模块，支持移动和联通2G网络。&#xA;类似的模块的还有SIM900和SIM2000，&#xA;SIM2000是CDMA制式的模块，仅支持电信2G网络。&#xA;这三个模块的开发方式是一样的，支持的AT命令也都差不多。&#xA;但是2019年了，2G模块基本也属于淘汰级别的产品了。&lt;/p&gt;&#xA;&lt;h2 id=&#34;硬件&#34;&gt;硬件&lt;/h2&gt;&#xA;&lt;p&gt;硬件上使用一路UART接口与模块通信，UART接口默认使用115200波特率。&#xA;这个模块比较奇葩！&#xA;还需要一个GPIO控制模块的电源开关PWRKEY。&#xA;开机需要将模块的PWRKEY引脚拉低1.2秒才能开机。&#xA;开机后再给个1.2秒的低脉冲，模块还会关机。&lt;/p&gt;&#xA;&lt;h4 id=&#34;软件&#34;&gt;软件&lt;/h4&gt;&#xA;&lt;p&gt;AT命令的格式：&#xA;发送方是以AT开头0x0D结尾的字符串，格式比较统一。&#xA;模块响应是以0x0D,0x0A结尾，但开头字符是没有统一的格式，有的指令响应是以+开头，有的又没有。&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;软件开发的难点：&lt;/strong&gt;&#xA;由于模块会主动上报一些数据，比如来电会上报RING。&#xA;并不是主机发一条AT命令，模块才会响应一条数据。&#xA;如果在主机发送一条命令的时候，模块突然主动上报了一些信息，&#xA;更让人头疼的是响应的数据还没有统一的格式，&#xA;这就给软件解析响应数据带来了麻烦，难以判断接收到的数据是什么东西？&#xA;&lt;strong&gt;解决办法&lt;/strong&gt; 只能先判断接收到的数据是不是主动上报的内容，如果不是再根据上一次发送的指令类型来解析响应数据。&#xA;但我目前还不能确定模块主动上报的内容和命令响应的内容有没有重叠的，如果有重叠的，那就GG了。&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;AT指令软件初始化流程，仅供参考：&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;第1步：等待模块就绪&#xA;由于这个模块奇葩的上电流程，软件没办法确认模块现在是不是上电了？&#xA;所以这一步主机先循环发送AT，等待模块响应OK，表示模块通信就绪了。&#xA;如果发送了多次都没有响应，则给模块来一个上电流程：PWRKEY低脉冲1.2秒。&#xA;再重复上面的操作。&lt;/p&gt;&#xA;&lt;p&gt;第2步：基本参数设置&#xA;2.1 发送ATE0，关闭指令回显。&#xA;如果不关闭回显，主机发什么，模块就会原样回复，适合于在终端软件里人工发送命令，可以看到输入指令。&#xA;但是我们做产品是用程序去发指令，指令回显不利于写代码解析响应数据，所以关掉为好。&#xA;2.2 发送AT+CREG=0，取消注册状态主动上报&#xA;注册状态通过AT+CREG?查询就行了，可以不用主动上报。&#xA;2.3 发送AT+CMEE=2，设置错误反馈方式&#xA;设置为0所有的错误都会返回ERROR.&#xA;设置为2某些指令错误会返回+CME ERROR:给出详细的错误信息&lt;/p&gt;&#xA;&lt;p&gt;第3步：模块识别&#xA;主机发送AT+GMM，可以得到模块型号。&#xA;但是这条指令的响应内容就是模块型号字符串，没有固定的头和尾，解析比较困难，&#xA;如果发这条指令之后，模块突然主动上报一些其它内容，不要把干扰数据当成模块型号了！&lt;/p&gt;&#xA;&lt;p&gt;第4步：检测SIM卡&#xA;主机发送AT+CPIN?，可以得到SIM卡状态。&#xA;这条指令很好解析，响应是格式是+CPIN: &lt;code&gt;&#xA;检测到接收的内容是+CPIN开头，就可以确定这是指令应答，而不是模块主动上报的干扰数据。&#xA;当&lt;code&gt;为READY时表示SIM卡也就绪了，可以进行下一步操作了。&#xA;当&lt;code&gt;为其它状态时，看手册吧，反正是不正常的状态。&#xA;可以发送AT+CIMI得到IMSI信息，从号码的前5位可以判断这张卡是哪家运营商，&#xA;比如46000是中国移动，46001是中国联通。&lt;/p&gt;&#xA;&lt;p&gt;第5步：等待注册网络&#xA;主机发送AT+CREG?&#xA;模块响应+CREG:&lt;n&gt;,&lt;stat&gt;&#xA;当stat的值为1或者5时，表示注册成功。&#xA;可以发送AT+COPS?查询当前注册的是哪家运营商&#xA;可以发送AT+CSQ查询信号强度1-31，31表示信号最强&lt;/p&gt;&#xA;&lt;p&gt;第6步：激活GPRS数据连接&#xA;主机发送AT+CSTT=&lt;apn&gt;,&lt;user&gt;,&lt;pass&gt;设置APN接入点。&#xA;模块响应OK&#xA;主机发送AT+CIICR，激活GPRS数据连接。&#xA;模块响应OK&#xA;主机发送AT+CIFSR，查询模块的IP地址。&#xA;模块响应IP地址，注意这又是一个没有前缀的响应，就是纯IP字符串。&lt;/p&gt;</description>
    </item>
    <item>
      <title>Keil MDK-ARM历史版本下载地址</title>
      <link>https://xcdd.pages.dev/blog/2019/2019-09-18/</link>
      <pubDate>Wed, 18 Sep 2019 13:38:58 +0000</pubDate>
      <guid>https://xcdd.pages.dev/blog/2019/2019-09-18/</guid>
      <description>&lt;p&gt;官方提供历史版本下载: &lt;a href=&#34;http://www.keil.com/update/rvmdk.asp&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;http://www.keil.com/update/rvmdk.asp&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;目前可以看到从2.50a到5.28a的所有版本.&lt;/p&gt;&#xA;&lt;p&gt;查看更新日志: &lt;a href=&#34;http://www.keil.com/update/whatsnew.asp?p=MDK&amp;amp;v=5.12&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;http://www.keil.com/update/whatsnew.asp?p=MDK&amp;amp;v=5.28a&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;把最后的5.28a换为其它版本号即可查看其它版本的更新日志.&lt;/p&gt;&#xA;&lt;p&gt;&lt;img src=&#34;./130_1.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;</description>
    </item>
    <item>
      <title>快速查询Windows内核结构体定义</title>
      <link>https://xcdd.pages.dev/blog/2019/2019-09-16/</link>
      <pubDate>Mon, 16 Sep 2019 14:26:50 +0000</pubDate>
      <guid>https://xcdd.pages.dev/blog/2019/2019-09-16/</guid>
      <description>&lt;p&gt;搜索资料时找到一个网站&lt;/p&gt;&#xA;&lt;p&gt;可以比较方便地查询Windows内核结构体的定义.&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;http://www.nirsoft.net/kernel_struct/vista/index.html&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;http://www.nirsoft.net/kernel_struct/vista/index.html&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;里面包含了很多公开和非公开的结构体的定义.&lt;/p&gt;&#xA;&lt;p&gt;查询也很方便.&lt;/p&gt;&#xA;&lt;p&gt;收藏一下.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Foxmail发送邮件乱码的临时解决办法</title>
      <link>https://xcdd.pages.dev/blog/2019/2019-09-12/</link>
      <pubDate>Thu, 12 Sep 2019 10:52:27 +0000</pubDate>
      <guid>https://xcdd.pages.dev/blog/2019/2019-09-12/</guid>
      <description>&lt;p&gt;目前使用的版本是Foxmail 7.0.1.92, 因为这是最后一个使用经典界面的版本.&lt;/p&gt;&#xA;&lt;p&gt;&lt;img src=&#34;./128_1.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;一直用了差不多5年了没有遇到什么问题.&lt;/p&gt;&#xA;&lt;p&gt;直到昨天突然发现发出去的邮件正文是乱码,邮件标题正常,而且接收邮件是正常显示.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;经过一番研究,发现这个Foxmail的一个BUG,这个BUG在7.2.6版本以后才被修复.&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;临时解决办法:&lt;/p&gt;&#xA;&lt;p&gt;一. 重新设置系统语言.&lt;/p&gt;&#xA;&lt;p&gt;设置系统语言为英文,重启电脑,发送邮件正文正常了,但是标题又乱码.&lt;/p&gt;&#xA;&lt;p&gt;然后再改为中文.重启电脑,邮件正文还是乱码.标题正常&amp;hellip;&amp;hellip;.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;故障依旧,这个办法没有解决我的问题&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;二.手动选择邮件编码.&lt;/p&gt;&#xA;&lt;p&gt;在发送邮件的时候,在菜单&amp;quot;格式&amp;quot; -&amp;gt; &amp;ldquo;编码&amp;rdquo; 默认选择的是西欧.&lt;/p&gt;&#xA;&lt;p&gt;手动选择编码为GB2312或者UTF8发送邮件.每次发送的时候都要选择一次编码.&lt;/p&gt;&#xA;&lt;p&gt;&lt;img src=&#34;./128_2.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;三.使用发送纯文本邮件&lt;/p&gt;&#xA;&lt;p&gt;还有一种方案,就是发送邮件的时候,选择纯文本邮件,而不是HTML邮件,也不会出现乱码.&lt;/p&gt;&#xA;&lt;p&gt;&lt;img src=&#34;./128_3.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;</description>
    </item>
    <item>
      <title>基于阿里钉钉网页版制作绿色版客户端</title>
      <link>https://xcdd.pages.dev/blog/2019/2019-09-10-1628/</link>
      <pubDate>Tue, 10 Sep 2019 16:28:18 +0000</pubDate>
      <guid>https://xcdd.pages.dev/blog/2019/2019-09-10-1628/</guid>
      <description>&lt;p&gt;由于工作需要必须使用阿里钉钉这个聊天软件.&lt;/p&gt;&#xA;&lt;p&gt;但随着版本更新,疯狂添加新功能,体积越来越大,无法忍受.&lt;/p&gt;&#xA;&lt;p&gt;因此寻求体积小巧,绿色便携的PC客户端.&lt;/p&gt;&#xA;&lt;p&gt;在下载了无数个钉钉旧版本之后,可以发现一些钉钉软件的发展历程&amp;hellip;&amp;hellip;&lt;/p&gt;&#xA;&lt;p&gt;最初钉钉把主要功能都在网页版上面实现.&lt;/p&gt;&#xA;&lt;p&gt;早期的客户端都是基于网页版制作的.客户端使用nw.js把网页封装成为客户端.&lt;/p&gt;&#xA;&lt;p&gt;后来V2.X版本核心还是nw.js但是把网页版变成了离线版(把网页版的js和css保存在本地).&lt;/p&gt;&#xA;&lt;p&gt;后来V3.X版本开始,开发了一套rvwindow实现了本地化的GUI窗口,但核心逻辑还是js和css.&lt;/p&gt;&#xA;&lt;p&gt;再到V4.X又重新开发了一套新的GUI,重构了整个程序框架,已经看不到网页版的影子了.&lt;/p&gt;&#xA;&lt;p&gt;由于目前钉钉网页版还能正常使用.虽然可以用chrome直接打开,但是经常要浏览网页,一不小心就把它关闭了.&lt;/p&gt;&#xA;&lt;p&gt;所以利用早期版本的node-webkit来包装一个网页客户端.&lt;/p&gt;&#xA;&lt;p&gt;nw.js也就是node-webkit,它的核心是一个浏览器.可以通过package.json进行一行配置.&lt;/p&gt;&#xA;&lt;p&gt;package.json里面有自定义user-agent,定义了nw版本,WEB端用来识别这是客户端还是浏览器.&lt;/p&gt;&#xA;&lt;p&gt;因此可以提取出nw.js的核心文件,删除无用的文件.&lt;/p&gt;&#xA;&lt;p&gt;再修改package.json&lt;/p&gt;&#xA;&lt;p&gt;把user-agent修改为标准浏览器.&lt;/p&gt;&#xA;&lt;p&gt;把启动页面修改到钉钉网页版.&lt;/p&gt;&#xA;&lt;p&gt;再添加一行参数&amp;ndash;user-data-dir=Data把浏览器缓存数据设置到本地路径.&lt;/p&gt;&#xA;&lt;p&gt;这样启动DingTalk.exe就可以看到钉钉登陆界面了!.&lt;/p&gt;&#xA;&lt;p&gt;只要网页版还能正常使用,这个&amp;quot;假&amp;quot;客户端就能继续使用.&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;{&#xD;&#xA;  &amp;#34;name&amp;#34;: &amp;#34;DingTalk&amp;#34;,&#xD;&#xA;  &amp;#34;version&amp;#34;: &amp;#34;4.0.0&amp;#34;,&#xD;&#xA;  &amp;#34;main&amp;#34;: &amp;#34;https://im.dingtalk.com&amp;#34;,&#xD;&#xA;  &amp;#34;chromium-args&amp;#34;:&amp;#34;--disable-gpu --disable-directwrite-for-ui --user-data-dir=Data&amp;#34;,&#xD;&#xA;  &amp;#34;user-agent&amp;#34;: &amp;#34;Mozilla/5.0 (%osinfo) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/%webkit_ver Safari/537.36&amp;#34;,&#xD;&#xA;  &amp;#34;window&amp;#34;: {&#xD;&#xA;&#x9;&amp;#34;icon&amp;#34;: &amp;#34;logo.ico&amp;#34;,&#xD;&#xA;&#x9;&amp;#34;frame&amp;#34; :true,&#xD;&#xA;    &amp;#34;min_width&amp;#34;: 1000,&#xD;&#xA;    &amp;#34;min_height&amp;#34;: 600,&#xD;&#xA;    &amp;#34;width&amp;#34;: 1000,&#xD;&#xA;    &amp;#34;height&amp;#34;: 600,&#xD;&#xA;    &amp;#34;resizable&amp;#34;: false,&#xD;&#xA;&#x9;&amp;#34;toolbar&amp;#34;:true,&#xD;&#xA;    &amp;#34;transparent&amp;#34; : false&#xD;&#xA;  },&#xD;&#xA;  &amp;#34;webkit&amp;#34;: {&#xD;&#xA;    &amp;#34;plugin&amp;#34;: false,&#xD;&#xA;    &amp;#34;page-cache&amp;#34; : false&#xD;&#xA;  },&#xD;&#xA;  &amp;#34;dependencies&amp;#34;:{&#xD;&#xA;  }&#xD;&#xA;}&#xA;&lt;/code&gt;&lt;/pre&gt;</description>
    </item>
    <item>
      <title>Portable.NET一个绿色版.NET运行环境,支持.NET4.0版本</title>
      <link>https://xcdd.pages.dev/blog/2019/2019-09-10/</link>
      <pubDate>Tue, 10 Sep 2019 09:30:07 +0000</pubDate>
      <guid>https://xcdd.pages.dev/blog/2019/2019-09-10/</guid>
      <description>&lt;p&gt;经过对飞信VMdotNET的研究,利用其核心文件进行二次开发.&lt;/p&gt;&#xA;&lt;p&gt;得到一个绿色版的.NET运行环境.&lt;/p&gt;&#xA;&lt;p&gt;并且添加了对.NET4.0版本的支持.&lt;/p&gt;&#xA;&lt;p&gt;经过测试,可以在WinXP运行12306分流抢票软件.&lt;/p&gt;&#xA;&lt;p&gt;下载地址:&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://gitee.com/kerndev/Portable.NET&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;https://gitee.com/kerndev/Portable.NET&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;由于体积限制,GIT仓库只包含少量DLL组件,运行更多EXE程序,需要完整的.NET组件.&lt;/p&gt;&#xA;&lt;p&gt;完整.NET组件:&lt;/p&gt;&#xA;&lt;p&gt;链接: &lt;a href=&#34;https://pan.baidu.com/s/1XfGTpKQ9xW8JhamzYgmxWQ&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;https://pan.baidu.com/s/1XfGTpKQ9xW8JhamzYgmxWQ&lt;/a&gt; 提取码: afpj&lt;/p&gt;</description>
    </item>
    <item>
      <title>让基于.NET的程序变成绿色版独立运行</title>
      <link>https://xcdd.pages.dev/blog/2019/2019-09-05/</link>
      <pubDate>Thu, 05 Sep 2019 13:13:52 +0000</pubDate>
      <guid>https://xcdd.pages.dev/blog/2019/2019-09-05/</guid>
      <description>&lt;p&gt;临近国庆了,要抢火车票了,但是发现&amp;quot;12306分流&amp;quot;抢票软件是基于.NET4.0开发的,要求安装.NET4.0.&#xA;Windows XP集成了.NET2.0版本&#xA;Windows 7集成了.NET3.5版本&#xA;Windows 8集成了.NET4.0版本&#xA;由于目前使用的是Windows 7,没有.NET4.0环境.当然安装是没问题的.&#xA;但是作为一个系统技术爱好者,总是想研究一下与众不同的方案??? 有没有可能免安装.NET4.0环境?&lt;/p&gt;&#xA;&lt;p&gt;百度找到一些陈旧的资料, 说明跟我有一样需求的人还是存在的.&lt;/p&gt;&#xA;&lt;p&gt;方案一:使用MONO&#xA;MONO是为了让.NET程序跨平台的产物,支持Windows系统&#xA;&lt;a href=&#34;https://www.mono-project.com/download/stable/&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;软件下载地址: https://www.mono-project.com/download/stable&lt;/a&gt;&#xA;经过一番研究,并没有成功运行我的程序.&#xA;估计是需要用它的SDK重新编译程序,才能跨平台运行吧.&lt;/p&gt;&#xA;&lt;p&gt;方案二:使用飞信.NET虚拟机&#xA;老版本的飞信软件,基于.NET开发,使用了定制版RemoteSoft DotNET Linker工具.&#xA;下载后发现它可以运行大部分.NET2.0版本的程序.&#xA;运行方法是FetionVM.exe your.exe&#xA;但是不能运行.NET4.0的程序.&#xA;由于它的核心方案是利用RemoteSoft DotNET Linker,所以我去找原版工具研究下.&lt;/p&gt;&#xA;&lt;p&gt;方案三:RemoteSoft DotNET Linker&#xA;目前早已经停止更新了,官网也下线了,网上能找到的最新版本是2.1.0.&#xA;这个工具包目的就是把你的.NET程序打包为绿色版,它会自动收集所需的文件,并生成一个文件夹.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;所以今天的重点就是研究RemoteSoft DotNET Linker能不能实现运行基于.NET4.0的程序.&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;文件夹结构如下图:&lt;/p&gt;&#xA;&lt;p&gt;&lt;img src=&#34;./125_1.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;经过研究,飞信里面的FetionVM.exe其实就是mini.exe.&#xA;飞信里面的rsdeploy.dll版本号是1.0.6&#xA;这里下载的rsdeploy.dll版本号是2.1.0,这个版本可能要新一些?&#xA;尝试打包一个小工具后,发现要打包的目标程序会被命名为mini.rsm文件.由mini.exe进行启动.&#xA;还会生成一个文件夹结构,与飞信非常类似.&lt;/p&gt;&#xA;&lt;p&gt;飞信的FetionVM.exe也是加载FetionVM.rsm,这个FetionVM.rsm就是一个空的.NET引导程序.&#xA;它会运行命令行参数指定的程序.经过实验验证这种方案兼容性要差一些.&#xA;兼容性最好的办法是直接把要运行的程序改为为mini.rsm,由mini.exe直接运行.成功率高很多.&lt;/p&gt;&#xA;&lt;p&gt;由于它们提供的.NET版本都是2.0.50727,为了研究它能不能支持.NET4.0的程序.&#xA;对工具包的文件结构进行了分析,经过分析这套工具的原理大概是类似于IO重定向,&#xA;运行.NET程序时需要访问的注册表和文件都重定向到本地目录.&#xA;mdeploy.registry这个文件就是重定向的虚拟注册表.&#xA;另外还有一个叫c的文件夹,里面装的是windows\assemly.这就是重定向的虚拟系统盘路径.&#xA;基于这个原理,我猜测理论上应该是可以支持任意版本的.NET程序的!&#xA;毕竟Windows系统的核心内容不就是注册表和文件组成的吗?&amp;hellip;&amp;hellip;&amp;hellip;&amp;hellip;&amp;hellip;&amp;hellip;&amp;hellip;&amp;hellip;&amp;hellip;&amp;hellip;&lt;/p&gt;&#xA;&lt;p&gt;为了证明这个猜测,我从装好.NET4.0的虚拟机里面提取出.NET4.0相关的所有文件,以及注册表.&#xA;把注册表中HKLM\SOFTWARE的内容导出到mdeploy.registry&#xA;把虚拟机C:\Windows\Microsoft.NET\Framework下面的v4.0.30319全部复制到本地文件夹.&#xA;把虚拟机C:\Windows\assemly下面的文件全部复制到本地文件夹.&#xA;把bypass.exe改名为mini.rsm运行mini.exe测试一下.&#xA;报错!&amp;hellip;&amp;hellip;.&#xA;报错!&amp;hellip;&amp;hellip;.&#xA;报错!&amp;hellip;&amp;hellip;.&lt;/p&gt;&#xA;&lt;p&gt;这个时候轮到procmon上场了,跟踪一下是缺少哪个文件?&#xA;唔,发现一个问题,它要加载c\windows\assembly\GAC_MSIL\System\4.0.0.0__b77a5c561934e089&#xA;而实际上在安装好.NET4的Windows7系统中并没有这个文件.&#xA;搜索了一下,发现微软真是奇葩,竟然把.NET4的GAC文件移到了C:\Windows\Microsoft.NET\assembly文件夹.&#xA;而C:\Windows\assembly下面只有.NET2.0的GAC文件!!!&#xA;把这些缺失的文件拷贝到本地目录,再次测试&amp;hellip;..&#xA;还是报错!&amp;hellip;&amp;hellip;.&#xA;还是报错!&amp;hellip;&amp;hellip;.&#xA;还是报错!&amp;hellip;&amp;hellip;.&lt;/p&gt;</description>
    </item>
    <item>
      <title>如何从MSU系统补丁里提取出所需要的文件?</title>
      <link>https://xcdd.pages.dev/blog/2019/2019-08-30/</link>
      <pubDate>Fri, 30 Aug 2019 17:59:57 +0000</pubDate>
      <guid>https://xcdd.pages.dev/blog/2019/2019-08-30/</guid>
      <description>&lt;p&gt;Windows补丁文件是*.msu格式, 这是一种压缩文件格式.&lt;/p&gt;&#xA;&lt;p&gt;正常情况下,只需要双击这个文件就可以安装补丁.&lt;/p&gt;&#xA;&lt;p&gt;但是我不想安装更新,只想从里面提取出某个dll文件 ,怎么办?&lt;/p&gt;&#xA;&lt;p&gt;首先用7-zip打开这个msu文件,可以正常打开,发现里面有如下文件结构:&lt;/p&gt;&#xA;&lt;p&gt;&lt;img src=&#34;./124_1.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;我们所需要的目标文件,就在那个.cab文件包里面.&lt;/p&gt;&#xA;&lt;p&gt;继续用7-zip打开这个.cab包,发现如下文件结构:&lt;/p&gt;&#xA;&lt;p&gt;&lt;img src=&#34;./124_2.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;看上去好像正常打开了.cab文件,但是却没有找到真正的目标文件.&lt;/p&gt;&#xA;&lt;p&gt;真正的目标文件应该是这个0,1这两个文件,但是它们无法再继续解压了.&lt;/p&gt;&#xA;&lt;p&gt;经过一番研究,没有办法继续了.&lt;/p&gt;&#xA;&lt;p&gt;只得寻求百度的帮助,找到了一个方法.&lt;/p&gt;&#xA;&lt;p&gt;用系统提供的命令行工具expand.exe可以正确地解压这个.cab文件.&lt;/p&gt;&#xA;&lt;p&gt;方法如下:&lt;/p&gt;&#xA;&lt;p&gt;expand -F:* windows6.1-kb3042553-x86.cab X:\PATH&lt;/p&gt;&#xA;&lt;p&gt;X:\PATH是我们要解压的目标路径,可以使用相对路径,但需要保证目录必须存在.&lt;/p&gt;&#xA;&lt;p&gt;解压后得到如下文件结构:&lt;/p&gt;&#xA;&lt;p&gt;&lt;img src=&#34;./124_3.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;这里面终于找到了我们需要的目标文件http.sys.&lt;/p&gt;&#xA;&lt;p&gt;大功造成!&lt;/p&gt;</description>
    </item>
    <item>
      <title>MFC默认的多国语言实现方法</title>
      <link>https://xcdd.pages.dev/blog/2019/2019-08-28/</link>
      <pubDate>Wed, 28 Aug 2019 15:40:22 +0000</pubDate>
      <guid>https://xcdd.pages.dev/blog/2019/2019-08-28/</guid>
      <description>&lt;p&gt;关于MFC多国语言的实现方法,网上给出的主流方案是:&lt;/p&gt;&#xA;&lt;p&gt;一. 自己实现&lt;/p&gt;&#xA;&lt;p&gt;从ini或者xml文件读取字符串,根据需要动态填充到控件或者菜单中.&lt;/p&gt;&#xA;&lt;p&gt;这种方法通用性好,甚至可以实现动态切换界面语言,但实现起来比较复杂,需要自己写很多代码.&lt;/p&gt;&#xA;&lt;p&gt;二.加载纯资源文件&lt;/p&gt;&#xA;&lt;p&gt;生成一个纯资源的DLL文件,每种语言一个DLL文件.&lt;/p&gt;&#xA;&lt;p&gt;在程序启动的时候,一般是XXX::InitInstance()函数中添加以下代码:&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;HINSTANCE hDll;&#xD;&#xA;hDll = ::LoadLibrary(L&amp;#34;xxx.dll&amp;#34;);&#xD;&#xA;AfxSetResourceHandle(hDll); &#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;加载不同的xxx.dll就会显示不同的语言.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;今天我在这里主要记录一下第三种方案:&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;这种方案和第二方案非常相似,也是生成纯资源DLL文件,每种语言一个DLL.&lt;/p&gt;&#xA;&lt;p&gt;但不同的是不需要我们手动加载资源,MFC其实会自动加载多语言DLL.&lt;/p&gt;&#xA;&lt;p&gt;这个技术叫做Satellite DLLs.MFC从7.0版本开始就已经支持这种技术.&lt;/p&gt;&#xA;&lt;p&gt;但此方法网上讨论者非常少,相关的介绍资料也很少.&lt;/p&gt;&#xA;&lt;p&gt;官方资料只找到这一篇: &lt;a href=&#34;https://docs.microsoft.com/en-us/cpp/build/localized-resources-in-mfc-applications-satellite-dlls?view=vs-2019&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;https://docs.microsoft.com/en-us/cpp/build/localized-resources-in-mfc-applications-satellite-dlls&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;这种方案运行原理是,MFC应用程序在运行时会自动加载合适的多语言资源文件 .&lt;/p&gt;&#xA;&lt;p&gt;比如我的应用程序文件名叫app.exe,那么在运行时会自动在当前目录下加载appxxx.dll.&lt;/p&gt;&#xA;&lt;p&gt;xxx表示不同的语言,这3个字母有哪些组合没有找到资料,但已知的组合有:&lt;/p&gt;&#xA;&lt;table&gt;&#xA;  &lt;thead&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;th style=&#34;text-align: center&#34;&gt;CHS&lt;/th&gt;&#xA;          &lt;th style=&#34;text-align: center&#34;&gt;简体中文&lt;/th&gt;&#xA;      &lt;/tr&gt;&#xA;  &lt;/thead&gt;&#xA;  &lt;tbody&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;CHT&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;繁体中文&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;DEU&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;德语&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;ENU&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;英语&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;ESN&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;西班牙语&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;FRA&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;法语&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;ITA&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;意大利语&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;JPN&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;日语&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;KOR&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;朝鲜语&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;RUS&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;俄语&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;LOC&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;默认语言&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;  &lt;/tbody&gt;&#xA;&lt;/table&gt;&#xA;&lt;p&gt;LOC是个特殊的组合,它表示默认语言,当以上指定语言文件都找不到时,最后会使用LOC.dll.&lt;/p&gt;&#xA;&lt;p&gt;如果连LOC.dll都没有呢,那就相当于没有多国语言了,使用应用程序自带的资源做为界面显示.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Windows系统自带端口转发功能</title>
      <link>https://xcdd.pages.dev/blog/2019/2019-08-27/</link>
      <pubDate>Tue, 27 Aug 2019 11:20:43 +0000</pubDate>
      <guid>https://xcdd.pages.dev/blog/2019/2019-08-27/</guid>
      <description>&lt;p&gt;一、使用如下命令把127.0.0.1:80转发到192.168.1.1:80：&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;netsh interface portproxy add v4tov4 listenaddress=127.0.0.1 listenport=80 connectaddress=192.168.1.1 connectport=80&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;二、使用如下命令取消端口转发：&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;netsh interface portproxy delete v4tov4 listenaddress=127.0.0.1 listenport=80&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;三、使用如下命令查看转发状态：&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;netsh interface portproxy show v4tov4&#xA;&lt;/code&gt;&lt;/pre&gt;</description>
    </item>
    <item>
      <title>Jlink烧写SPI Flash存储芯片(W25QXX)</title>
      <link>https://xcdd.pages.dev/blog/2019/2019-08-21/</link>
      <pubDate>Wed, 21 Aug 2019 10:46:00 +0000</pubDate>
      <guid>https://xcdd.pages.dev/blog/2019/2019-08-21/</guid>
      <description>&lt;p&gt;JLink支持SPI协议，可以使用JFlashSPI.exe来烧录SPI FLASH芯片。&lt;/p&gt;&#xA;&lt;p&gt;JLink的20PIN管脚定义如下：&lt;/p&gt;&#xA;&lt;p&gt;&lt;img src=&#34;./121_1.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;而SPI接口所使用的接口与JTAG是复用的。&lt;/p&gt;&#xA;&lt;table&gt;&#xA;  &lt;thead&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;th style=&#34;text-align: center&#34;&gt;管脚序号&lt;/th&gt;&#xA;          &lt;th style=&#34;text-align: center&#34;&gt;JTAG定义&lt;/th&gt;&#xA;          &lt;th style=&#34;text-align: center&#34;&gt;SPI定义&lt;/th&gt;&#xA;      &lt;/tr&gt;&#xA;  &lt;/thead&gt;&#xA;  &lt;tbody&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;5&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;TDI&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;MOSI&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;7&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;TMS&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;NSS&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;9&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;TCK&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;SCK&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;13&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;TDO&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;MISO&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;  &lt;/tbody&gt;&#xA;&lt;/table&gt;&#xA;&lt;p&gt;需要注意的是，除了SPI接口外，还要连接VCC和GND，否则也识别不到芯片的。&lt;/p&gt;&#xA;&lt;p&gt;硬件连接完成后，就可以打开JFlashSPI.exe测试烧录了。&lt;/p&gt;&#xA;&lt;p&gt;点击connect会得到以下错误提示：&lt;/p&gt;&#xA;&lt;p&gt;&lt;img src=&#34;./121_2.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;因为JLink无法自动检测这个SPI Flash芯片。&lt;/p&gt;&#xA;&lt;p&gt;但是从日志可以看到SPI Flash ID已经成功读出来了：0xC8 40 15&lt;/p&gt;&#xA;&lt;p&gt;所以需要进入设置，手动为FLASH设置读写参数。&lt;/p&gt;&#xA;&lt;p&gt;根据芯片编程手册，填写对应的参数，如下：&lt;/p&gt;&#xA;&lt;p&gt;&lt;img src=&#34;./121_3.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;这样设置后，就可以正常读写W25QXX系列的SPI FLASH芯片了。&lt;/p&gt;</description>
    </item>
    <item>
      <title>收集一些Windows系统非常严重的安全漏洞</title>
      <link>https://xcdd.pages.dev/blog/2019/2019-08-15/</link>
      <pubDate>Thu, 15 Aug 2019 10:52:01 +0000</pubDate>
      <guid>https://xcdd.pages.dev/blog/2019/2019-08-15/</guid>
      <description>&lt;p&gt;今年Windows爆出了太多远程漏洞，这些漏洞主要存在于SMB和RDP服务。&lt;/p&gt;&#xA;&lt;p&gt;感觉有必要收集一下这些严重漏洞。&lt;/p&gt;&#xA;&lt;p&gt;首先在微软官方提供的安全更新指南查询： &lt;a href=&#34;https://portal.msrc.microsoft.com/zh-cn/security-guidance&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;https://portal.msrc.microsoft.com/zh-cn/security-guidance&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;获取补丁编号后到这个链接下载更新补丁： &lt;a href=&#34;https://www.catalog.update.microsoft.com/search.aspx?q=kb&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;https://www.catalog.update.microsoft.com/search.aspx?q=kb编号&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;这里列出几个影响重大的漏洞：&lt;/p&gt;&#xA;&lt;table&gt;&#xA;  &lt;thead&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;th style=&#34;text-align: center&#34;&gt;漏洞编号&lt;/th&gt;&#xA;          &lt;th style=&#34;text-align: center&#34;&gt;备注&lt;/th&gt;&#xA;          &lt;th style=&#34;text-align: center&#34;&gt;补丁编号(Win7)&lt;/th&gt;&#xA;      &lt;/tr&gt;&#xA;  &lt;/thead&gt;&#xA;  &lt;tbody&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;CVE-2017-0143&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;SMB&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;KB4012212&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;CVE-2017-0144&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;SMB&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;KB4012212&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;CVE-2017-0145&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;SMB&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;KB4012212&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;CVE-2017-0146&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;SMB&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;KB4012212&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;CVE-2017-0147&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;SMB&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;KB4012212&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;CVE-2017-0148&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;SMB&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;KB4012212&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;CVE-2017-11780&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;SMB&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;KB4041678&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;CVE-2019-0708&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;RDP&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;KB4499175&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;CVE-2019-1181&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;RDP&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;KB4512486&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;CVE-2019-1182&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;RDP&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;KB4512486&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;  &lt;/tbody&gt;&#xA;&lt;/table&gt;</description>
    </item>
    <item>
      <title>制作Win7PE精简版的经验总结笔记二</title>
      <link>https://xcdd.pages.dev/blog/2019/2019-08-14-1523/</link>
      <pubDate>Wed, 14 Aug 2019 15:23:04 +0000</pubDate>
      <guid>https://xcdd.pages.dev/blog/2019/2019-08-14-1523/</guid>
      <description>&lt;p&gt;这篇文章是接上一篇，主要写关于注册表的内容。&lt;/p&gt;&#xA;&lt;p&gt;WinPE的注册表本质是几个文件，但这些文件不能直接编辑，需要用regedit或者Registry Workshop。&lt;/p&gt;&#xA;&lt;p&gt;它们存放在\Windows\System32\config目录。&lt;/p&gt;&#xA;&lt;p&gt;这个目录下面有这些子目录和文件：&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt; Journal/&#xD;&#xA; RegBack/ &#xD;&#xA; SystemProfile/&#xD;&#xA; TxR/&#xD;&#xA; BCD-Template&#xD;&#xA; COMPONENTS&#xD;&#xA; DEFAULT&#xD;&#xA; SAM&#xD;&#xA; SECURITY&#xD;&#xA; SOFTWARE&#xD;&#xA; SYSTEM&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;其中PE系统只使用以下文件，其余文件可删除。&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt; DEFAULT&#xD;&#xA; SAM&#xD;&#xA; SECURITY&#xD;&#xA; SOFTWARE&#xD;&#xA; SYSTEM&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;DEFAULT是用户默认设置的注册表项，开机后会加载到HKEY_USERS.DEFAULT&lt;/p&gt;&#xA;&lt;p&gt;SAM是空的，不用管它，保留就行了。&lt;/p&gt;&#xA;&lt;p&gt;SECURITY是空的，不用管它，保留就行了。&lt;/p&gt;&#xA;&lt;p&gt;SOFTWARE是计算机软件设置，开机后会加载到HKEY_LOCAL_MACHINE\SOFTWARE&lt;/p&gt;&#xA;&lt;p&gt;SYSTEM是计算机系统设置，开机后加载到HKEY_LOCAL_MACHINE\SYSTEM&lt;/p&gt;&#xA;&lt;p&gt;下面就分别总结各个注册表项&lt;/p&gt;&#xA;&lt;hr&gt;&#xA;&lt;p&gt;&lt;strong&gt;HKEY_LOCAL_MACHINE\SYSTEM&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;PE系统能不能正常启动，开机会不会蓝屏？最重要的就是这里的内容。&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Class&#xD;&#xA;描述了设备类型的GUID，每个GUID表示一种设备类型。&#xD;&#xA;在进入设备管理器手动安装设备驱动时，&#xD;&#xA;如果选择“从计算机的设备驱动程序列表中选择”就会看到当前系统支持的所有设备类型，&#xD;&#xA;这个列表的内容就来自这个注册表项。&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\ComputerName\ActiveComputerName&#xD;&#xA;ComputerName=&amp;#34;WinPE&amp;#34;&#xD;&#xA;这里可以设置计算机名称&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\CriticalDeviceDatabase&#xD;&#xA;这是一条很关键是注册表，里面记录了系统启动时需要安装驱动的关键设备列表。&#xD;&#xA;这个作用和WXPE的TXTSETUP.SIF差不多，每一项设备ID下面都记录了设备类型和驱动路径。&#xD;&#xA;比如：&#xD;&#xA;[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\CriticalDeviceDatabase\PCI#VEN_8086&amp;amp;DEV_2412&amp;amp;CC_0C0300]&#xD;&#xA;&amp;#34;ClassGUID&amp;#34;=&amp;#34;{36FC9E60-C465-11CF-8056-444553540000}&amp;#34;&#xD;&#xA;&amp;#34;Service&amp;#34;=&amp;#34;usbuhci&amp;#34;&#xD;&#xA;&amp;#34;DriverPackageId&amp;#34;=&amp;#34;usbport.inf_x86_neutral_f9abf85fd00186bd&amp;#34;&#xD;&#xA;ClassGUID就是上面所说的设备类型&#xD;&#xA;Service表示驱动程序服务名称，这个在HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\servicess&#xD;&#xA;DriverPackageId大概就是驱动路径，在\Windows\System32\driverstor下面有对应的文件。&#xD;&#xA;&#xD;&#xA;关键设备列表非常大，可以删除一些。&#xD;&#xA;我试过全部删除，PE系统启动速度会非常快！但是进系统后无法操作，因为没有加载鼠标键盘驱动。&#xD;&#xA;所以需要酌情删除。&#xD;&#xA;这里有一个比较好的优化方案，把可以使用兼容ID匹配的设备精简为一条内容。&#xD;&#xA;比如：&#xD;&#xA;HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\CriticalDeviceDatabase\PCI#CC_0C0300&#xD;&#xA;这表示PCI设备且设备类型为0C0300的设备，这个类型表示uhci(USB1.1)控制器，加载usbuhci驱动。&#xD;&#xA;它可以通配所有的uhci控制器设备，不管是intel的还是amd的芯片组。&#xD;&#xA;所以我们可以删除类似于&#xD;&#xA;[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\CriticalDeviceDatabase\PCI#VEN_8086&amp;amp;DEV_2412&amp;amp;CC_0C0300]&#xD;&#xA;这一类的VEN&amp;amp;DEV的精确匹配。&#xD;&#xA;因为可以用兼容ID通配所有的uhci控制器，就没有必要再为不同的厂商都写一堆设备了。&#xD;&#xA;类似的兼容ID还有很多，比如：&#xD;&#xA;IDE控制器：HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\CriticalDeviceDatabase\PCI#CC_0101&#xD;&#xA;AHCI控制器：HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\CriticalDeviceDatabase\PCI#CC_010601&#xD;&#xA;这样一来就可以删除大量重复的注册表内容。&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Keyboard Layouts&#xD;&#xA;这一条是键盘布局，也就是不同语言的输入法列表，一般PE系统只保留00000409(英文)就行了&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SafeBoot&#xD;&#xA;人如其名，它就是记录了安全模式启动，要开启哪些驱动和服务。&#xD;&#xA;我们PE系统都是正常启动，不会用F8进入安全模式，所以可以把它全部删除。&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\ScsiPort\SpecialTargetList&#xD;&#xA;特殊SCSI设备列表，看了一下，没见过这些设备，所以都删除了吧。&#xD;&#xA;虽然不知道它们为什么会出现在这里。&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Environment&#xD;&#xA;系统级的环境变量，没什么好删除的，但需要知道它在这里。&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;HKEY_LOCAL_MACHINE\WPE_SYSTEM\ControlSet001\Control\ProductOptions&#xD;&#xA;有没有觉得ProductPolicy的内容太长了，有几十KB。&#xD;&#xA;它记录了当前系统的策略，决定了系统是否包含某些功能，如win7基础版，专业版，旗舰版。&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;HKEY_LOCAL_MACHINE\WPE_SYSTEM\ControlSet001\services&#xD;&#xA;这一项很重要，记录了系统的驱动和服务。&#xD;&#xA;如果开机蓝屏，报某个.sys找不到，可以来这里删除对应的驱动，成功进入系统。&#xD;&#xA;或者开机蓝屏，报某个.sys出现异常，可以来这里删除对应的驱动，成功进入系统。&#xD;&#xA;服务就是计算机管理里面的那个服务。&#xD;&#xA;有很多是PE系统用不到的，比如.NETFramework,AudioEndpointBuilder,bthserv等等，实再太多了。&#xD;&#xA;删掉这些，服务管理列表看着就清爽了。就不会有那么多无法加载的服务项。&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;关于SYSTEM注册表的内容就总结到这些，还有更多的内容，也没精力去分析了。&lt;/p&gt;</description>
    </item>
    <item>
      <title>制作Win7PE精简版的经验总结笔记</title>
      <link>https://xcdd.pages.dev/blog/2019/2019-08-14-1259/</link>
      <pubDate>Wed, 14 Aug 2019 12:59:30 +0000</pubDate>
      <guid>https://xcdd.pages.dev/blog/2019/2019-08-14-1259/</guid>
      <description>&lt;p&gt;写这篇文章的主要目的是做笔记和总结一些经验。&lt;/p&gt;&#xA;&lt;p&gt;首先是WinPE的文件目录：&lt;/p&gt;&#xA;&lt;hr&gt;&#xA;&lt;p&gt;&lt;strong&gt;Program Files&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;这个目录是程序目录，里面的文件可以全部删除，只保留一个文件就行了：&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;/Program Files/Internet Explorer/ieproxy.dll&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;没有这个文件会导致总是在新窗口打开文件夹！&lt;/p&gt;&#xA;&lt;hr&gt;&#xA;&lt;p&gt;&lt;strong&gt;ProgramData&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;这个目录是程序数据目录，里面与PE有关的就是有几个默认的开始菜单项目。&lt;/p&gt;&#xA;&lt;p&gt;如果没有什么要求， 是可以全部删除的，我这里保留了一个文件：&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;ProgramData\Microsoft\Network\Connections\Pbk\rasphone.pbk&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;因为添加网络功能时，顺便把PPPOE宽带连接功能也保留了，需要用到这个文件。&lt;/p&gt;&#xA;&lt;hr&gt;&#xA;&lt;p&gt;&lt;strong&gt;Users&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;这个目录是用户配置目录，在PE系统只有一个Default用户。&lt;/p&gt;&#xA;&lt;p&gt;里面有一些桌面图标，开始菜单，发送到桌面快捷方式，用户图标等。&lt;/p&gt;&#xA;&lt;p&gt;我不需要这些，所以全部删除。&lt;/p&gt;&#xA;&lt;hr&gt;&#xA;&lt;p&gt;&lt;strong&gt;sources&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;这个目录是原版安装程序包含的资源，PE系统不需要，直接删除。&lt;/p&gt;&#xA;&lt;hr&gt;&#xA;&lt;p&gt;&lt;strong&gt;Windows&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;这个目录是核心系统目录了，子目录太多，不能全部介绍了。&lt;/p&gt;&#xA;&lt;p&gt;我保留了以下目录，这差不多是PE系统最精简的目录结构了：&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt; Branding&#xD;&#xA; Fonts&#xD;&#xA; Globalization&#xD;&#xA; inf&#xD;&#xA; resources&#xD;&#xA; system32&#xD;&#xA; winsxs&#xD;&#xA; zh-CN&#xD;&#xA; explorer.exe&#xD;&#xA; regedit.exe&#xD;&#xA; WindowsShell.Manifest&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;hr&gt;&#xA;&lt;p&gt;关于字体&lt;/p&gt;&#xA;&lt;p&gt;Fonts目录是字体目录，原版有好几百M的字库，PE里用不到那么多字体，只需要保留少量几个就行了：&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;marlett.ttf&#xD;&#xA;simsun.ttc&#xD;&#xA;tahoma.ttf&#xD;&#xA;vga936.fon&#xD;&#xA;vgafix.fon&#xD;&#xA;vgaoem.fon&#xD;&#xA;vgasys.fon&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;简体中文系统最主要的字体是宋体(simsun.ttc)。&lt;/p&gt;&#xA;&lt;p&gt;simsun.ttc原版有15MB，可以使用精简版，只需要2.5MB&lt;/p&gt;&#xA;&lt;hr&gt;&#xA;&lt;p&gt;关于主题&lt;/p&gt;&#xA;&lt;p&gt;resources目录包含主题文件，保留了经典主题文件classic.theme，否则界面风格有点怪异，&lt;/p&gt;&#xA;&lt;p&gt;还要保留themeui.dll才能正常使用经典主题，在这个问题上卡了很久时间。&lt;/p&gt;&#xA;&lt;p&gt;没有这个DLL鼠标指针会变成默认风格很模糊。&lt;/p&gt;&#xA;&lt;p&gt;我想要的是Windows经典主题，并关闭所有显示动画效果，还需要配合注册表修改才能实现。&lt;/p&gt;&#xA;&lt;hr&gt;&#xA;&lt;p&gt;关于winsxs：&lt;/p&gt;&#xA;&lt;p&gt;win7的winsxs非常大，它几乎保留了完整的系统文件，主要是用于系统更新，PE系统并不需要更新系统。&lt;/p&gt;&#xA;&lt;p&gt;里面99%的文件都可以删除，但以下文件是必须的：&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;winsxs/&#xD;&#xA;├─manifests&#xD;&#xA;│      x86_microsoft.windows.c..-controls.resources_6595b64144ccf1df_5.82.7600.16385_zh-cn_6189e316803d96d4.manifest&#xD;&#xA;│      x86_microsoft.windows.c..-controls.resources_6595b64144ccf1df_6.0.7600.16385_zh-cn_b7a33d2d3f47b7fb.manifest&#xD;&#xA;│      x86_microsoft.windows.common-controls_6595b64144ccf1df_5.82.7600.16385_none_ebf82fc36c758ad5.manifest&#xD;&#xA;│      x86_microsoft.windows.common-controls_6595b64144ccf1df_6.0.7600.16385_none_421189da2b7fabfc.manifest&#xD;&#xA;│      x86_microsoft.windows.gdiplus_6595b64144ccf1df_1.1.7600.16385_none_72fc7cbf861225ca.manifest&#xD;&#xA;│      x86_microsoft.windows.i..utomation.proxystub_6595b64144ccf1df_1.0.7600.16385_none_9d148a8db8d32238.manifest&#xD;&#xA;│      x86_microsoft.windows.isolationautomation_6595b64144ccf1df_1.0.0.0_none_35d357a66c38ade4.manifest&#xD;&#xA;│      x86_microsoft.windows.systemcompatible_6595b64144ccf1df_6.0.7600.16385_none_49adccbde8169a03.manifest&#xD;&#xA;├─x86_microsoft.windows.c..-controls.resources_6595b64144ccf1df_5.82.7600.16385_zh-cn_6189e316803d96d4&#xD;&#xA;├─x86_microsoft.windows.c..-controls.resources_6595b64144ccf1df_6.0.7600.16385_zh-cn_b7a33d2d3f47b7fb&#xD;&#xA;├─x86_microsoft.windows.common-controls_6595b64144ccf1df_5.82.7600.16385_none_ebf82fc36c758ad5&#xD;&#xA;├─x86_microsoft.windows.common-controls_6595b64144ccf1df_6.0.7600.16385_none_421189da2b7fabfc&#xD;&#xA;└─x86_microsoft.windows.gdiplus_6595b64144ccf1df_1.1.7600.16385_none_72fc7cbf861225ca&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;其中manifest下面的以下3个文件比较神秘，没有它们开机会蓝屏：&lt;/p&gt;</description>
    </item>
    <item>
      <title>打造适用于KVM云服务器的极简Win7PE（仅80MB）</title>
      <link>https://xcdd.pages.dev/blog/2019/2019-08-14/</link>
      <pubDate>Wed, 14 Aug 2019 11:26:53 +0000</pubDate>
      <guid>https://xcdd.pages.dev/blog/2019/2019-08-14/</guid>
      <description>&lt;p&gt;鉴于之前折腾WXPE的失败经验，在折腾Win7PE之前，先不考虑体积和功能，找一个通用的Win7PE做个实验。&lt;/p&gt;&#xA;&lt;p&gt;发现Win7PE比WXPE要稳定得多，没有鼠标丢失问题，安装驱动也很顺利！&lt;/p&gt;&#xA;&lt;p&gt;于是开始玩命折腾，先定一个小目标：&lt;/p&gt;&#xA;&lt;p&gt;一、Win7PE只需要BOOT.WIM文件就可以了，用系统自带的Bootmgr就可以引导；&lt;/p&gt;&#xA;&lt;p&gt;二、体积一定要小于100M，最好小于85M，才能塞进100M的隐藏分区；&lt;/p&gt;&#xA;&lt;p&gt;三、要求能正常安装virtio驱动；&lt;/p&gt;&#xA;&lt;p&gt;四、支持网络功能，可以运行FTP软件上传和下载文件；&lt;/p&gt;&#xA;&lt;p&gt;五、集成最基本的系统维护工具；&lt;/p&gt;&#xA;&lt;p&gt;最终选择Windows7 32位企业版为基础制作这个PE。&lt;/p&gt;&#xA;&lt;p&gt;第一.32位比64位体积更小巧，对内存要求也更小；&lt;/p&gt;&#xA;&lt;p&gt;第二.企业版比旗舰版的安装文件要更小；&lt;/p&gt;&#xA;&lt;p&gt;第三.不带SP1的版本比带SP1的体积更小，对于PE系统来说有没有SP1补丁并不影响使用；&lt;/p&gt;&#xA;&lt;p&gt;首先是解压ISO，提取BOOT.WIM和INSTALL.WIM，&lt;/p&gt;&#xA;&lt;p&gt;然后合并文件，导入注册表，修改注册表。。。&lt;/p&gt;&#xA;&lt;p&gt;这些基本操作就略过了。。。&lt;/p&gt;&#xA;&lt;p&gt;最重要的精简系统文件和添加网络功能。&lt;/p&gt;&#xA;&lt;p&gt;参考了这个文章： &lt;a href=&#34;http://blog.sina.com.cn/s/blog_18cbdaad80102y18t.html&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;http://blog.sina.com.cn/s/blog_18cbdaad80102y18t.html&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;非常感谢这位博主的分享，节省了不少时间进行初步的精简工作。&lt;/p&gt;&#xA;&lt;p&gt;在基本功能满足要求的情况下，进一步精简无用文件和注册表项。&lt;/p&gt;&#xA;&lt;p&gt;使用虚拟机反复测试，使最终WIM文件的体积在85M以内。&lt;/p&gt;&#xA;&lt;p&gt;整个过程费时又费脑&lt;/p&gt;&#xA;&lt;p&gt;此处省略1万字。。。。。。。。。。&lt;/p&gt;&#xA;&lt;p&gt;此处省略1万字。。。。。。。。。。&lt;/p&gt;&#xA;&lt;p&gt;最终获得了一个比较满意的极简PE。&lt;/p&gt;&#xA;&lt;p&gt;此PE不含维护工具只有80M，加上维护工具85M。&lt;/p&gt;&#xA;&lt;p&gt;为了优化体积，对注册表进行了大量精简，去掉了一些右键菜单。&lt;/p&gt;&#xA;&lt;p&gt;为了优化体积，删除了大量系统自带的但是不常用的驱动。&lt;/p&gt;&#xA;&lt;p&gt;保留了PPPOE和RNDIS驱动，可以做为本地电脑维护时上网使用。&lt;/p&gt;&#xA;&lt;p&gt;集成Virtio驱动使用PECMD来加载，保证注册表纯净无污染。&lt;/p&gt;&#xA;&lt;p&gt;内置工具都放在Program Files目录，保证Windows目录纯净无污染。&lt;/p&gt;&#xA;&lt;p&gt;内置工具集成了常用维护工具，FTP服务器，磁盘分区工具，这些都没有添加到桌面图标；&lt;/p&gt;&#xA;&lt;p&gt;注意事项：&lt;/p&gt;&#xA;&lt;p&gt;1.此PE保留了系统自带的磁盘碎片整理工具，如果无法启动？&lt;/p&gt;&#xA;&lt;p&gt;需要手动到“计算机管理-&amp;gt;服务”手动打开“Task Scheduler”服务。&lt;/p&gt;&#xA;&lt;p&gt;2.此PE保留了宽带连接(PPPOE)功能，如果提示启动失败？&lt;/p&gt;&#xA;&lt;p&gt;需要手动到“计算机管理-&amp;gt;服务”手动打开“Windows Event Log”服务。&lt;/p&gt;&#xA;&lt;p&gt;系统截图：&lt;/p&gt;&#xA;&lt;p&gt;&lt;img src=&#34;./117_1.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;在服务器和本地电脑上测试了一下，感觉很不错。&lt;/p&gt;&#xA;&lt;p&gt;送上链接分享给有需要的朋友：&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://download.csdn.net/download/qq446252221/11545155&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;https://download.csdn.net/download/qq446252221/11545155&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;仅含BOOT.WIM文件&lt;/p&gt;&#xA;&lt;p&gt;如果使用Bootmgr引导wim文件，还需要一个BOOT.SDI文件，可以从安装光盘提取出来。&lt;/p&gt;&#xA;&lt;p&gt;本地硬盘启动时，自己通过BootICE添加一个WIM启动项即可。&lt;/p&gt;&#xA;&lt;p&gt;U盘启动时，格式为FAT/FAT32，使用BootICE修改引导程序为Bootmgr，再添加一个WIM的启动项即可。&lt;/p&gt;</description>
    </item>
    <item>
      <title>在KVM虚拟化云主机上使用WXPE的研究</title>
      <link>https://xcdd.pages.dev/blog/2019/2019-08-08/</link>
      <pubDate>Thu, 08 Aug 2019 13:15:41 +0000</pubDate>
      <guid>https://xcdd.pages.dev/blog/2019/2019-08-08/</guid>
      <description>&lt;p&gt;云服务器系统运行Windows Server 2008 R2，有100M的隐藏启动分区。&lt;/p&gt;&#xA;&lt;p&gt;为了对服务器的重装系统等日常维护工作，需要运行一个PE系统，最好能装进这个100M的启动分区。&lt;/p&gt;&#xA;&lt;p&gt;要求体积要小巧，首先想到的就是WXPE了，WXPE虽然古老，但体积非常小巧，核心文件压缩后只有20M左右。&lt;/p&gt;&#xA;&lt;p&gt;于是在硬盘里找出我珍藏多年的WXPE.ISO。&lt;/p&gt;&#xA;&lt;p&gt;上传到服务器，将100M隐藏分区分配到A盘，并上传GRLDR，用GRLDR来引导WXPE。&lt;/p&gt;&#xA;&lt;p&gt;重启系统后，成功看到WXPE的界面，但是不能识别云硬盘，而且鼠标会失去反应，只能纯键盘操作。&lt;/p&gt;&#xA;&lt;p&gt;KVM虚拟机，需要安装virtio驱动，才能识别硬盘。&lt;/p&gt;&#xA;&lt;p&gt;所以到官网下载virtio-win驱动: &lt;a href=&#34;https://fedorapeople.org/groups/virt/virtio-win/direct-downloads/&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;https://fedorapeople.org/groups/virt/virtio-win/direct-downloads/&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;需要将viostor.sys驱动集成到WXPE中。&lt;/p&gt;&#xA;&lt;p&gt;下面就要简单分析一下WXPE.ISO的文件结构：&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;├── WINNT.XPE&#xD;&#xA;├── WXPE&#xD;&#xA;│   ├── NTDETECT.COM&#xD;&#xA;│   └── SETUPLDR.BIN&#xD;&#xA;└── WXPE.IS_&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;引导扇区会加载SETUPLDR.BIN，然后读取WINNT.XPE中的引导参数&lt;/p&gt;&#xA;&lt;p&gt;WINNT.XPE指定了要加载到内存的镜像文件，文件内容如下&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;[SetupData]&#xD;&#xA;BootDevice=&amp;#34;ramdisk(0)&amp;#34;&#xD;&#xA;BootPath=&amp;#34;\WXPE\SYSTEM32\&amp;#34;&#xD;&#xA;OsLoadOptions=&amp;#34;/minint /fastdetect /rdexportascd /rdpath=WXPE.IS_&amp;#34;&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;其中/rdpath参数指定了内存镜像的文件路径，就是根目录下的WXPE.IS_&lt;/p&gt;&#xA;&lt;p&gt;在WXPE中会经常看到*.IS_，&lt;em&gt;.DL_，&lt;/em&gt;.SY_，*.EX_这样的后缀名，其实是一个压缩文件.&lt;/p&gt;&#xA;&lt;p&gt;解压后会把后缀名还原为*.ISO,&lt;em&gt;.DLL,&lt;/em&gt;.SYS,*.EXE&lt;/p&gt;&#xA;&lt;p&gt;我们把WXPE.IS_解压得到WXPE.ISO，再把它解压得到WXPE的系统目录。&lt;/p&gt;&#xA;&lt;p&gt;在\WXPE目录下有一个TXTSETUP.SIF，这个文件是WXPE启动后非常重要的文件 。&lt;/p&gt;&#xA;&lt;p&gt;[SourceDisksFiles] 这个章节是可以删除的。&lt;/p&gt;&#xA;&lt;p&gt;[HardwareIdsDatabase] 这个章节描述了系统启动中要检测和安装的设备列表。&lt;/p&gt;&#xA;&lt;p&gt;比如GenDisk=&amp;ldquo;Disk&amp;rdquo;,{4D36E967-E325-11CE-BFC1-08002BE10318}&lt;/p&gt;&#xA;&lt;p&gt;表示设备ID为GenDisk的设备，驱动程序为&amp;quot;Disk&amp;quot;，设备类型为{4D36E967-E325-11CE-BFC1-08002BE10318}&lt;/p&gt;&#xA;&lt;p&gt;再往下能找到disk=disk.sys，表示Disk驱动对应的文件是disk.sys。&lt;/p&gt;&#xA;&lt;p&gt;这个设备列表很长，其中有80%的内容都是可以删除的，减少这些内容，可以明显加快系统启动速度。&lt;/p&gt;&#xA;&lt;p&gt;在设备列表里删除一些内容，就可以安全地删除对应的\WXPE\system32\drivers下面的sys文件。&lt;/p&gt;&#xA;&lt;p&gt;比如下面的这些设备，我用了10多年的电脑也从来没见过。&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;si3132r5=&amp;#34;Silicon Image 3132 SoftRaid 5 Controller&amp;#34;&#xD;&#xA;si3132=&amp;#34;Silicon Image 3132 SATALink Controller&amp;#34;&#xD;&#xA;si3124r5=&amp;#34;Silicon Image 3124 SoftRaid 5 Controller&amp;#34;&#xD;&#xA;si3124r=&amp;#34;Silicon Image 3124 SATARaid Controller&amp;#34;&#xD;&#xA;si3124=&amp;#34;Silicon Image 3124 SATALink Controller&amp;#34;&#xD;&#xA;si3114r5=&amp;#34;Silicon Image 3114 SoftRaid 5 Controller&amp;#34;&#xD;&#xA;si3114r=&amp;#34;Silicon Image 3114 SATARaid Controller&amp;#34;&#xD;&#xA;si3114=&amp;#34;Silicon Image 3114 SATALink Controller&amp;#34;&#xD;&#xA;si3112r=&amp;#34;Silicon Image 3112 SATARaid Controller&amp;#34;&#xD;&#xA;si3112=&amp;#34;Silicon Image 3112 SATALink Controller&amp;#34;&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;于是我决定干掉这些内容，可以加快系统启动速度，何乐不为？&lt;/p&gt;</description>
    </item>
    <item>
      <title>IIS7安装URLReWrite的妙用</title>
      <link>https://xcdd.pages.dev/blog/2019/2019-07-19/</link>
      <pubDate>Fri, 19 Jul 2019 18:05:50 +0000</pubDate>
      <guid>https://xcdd.pages.dev/blog/2019/2019-07-19/</guid>
      <description>&lt;p&gt;IIS7默认是没有URLRewrite这个模块的,需要自行下载安装。&lt;/p&gt;&#xA;&lt;p&gt;官方下载地址: &lt;a href=&#34;https://www.iis.net/downloads/microsoft/url-rewrite&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;https://www.iis.net/downloads/microsoft/url-rewrite&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;安装了这个模块后,就可以实现重写URL请求了。&lt;/p&gt;&#xA;&lt;p&gt;应用场景一：隐藏后缀名&lt;/p&gt;&#xA;&lt;p&gt;比如浏览器请求的是http://127.0.0.1/api/demo&lt;/p&gt;&#xA;&lt;p&gt;我们可以利用URLRewrite把请求地址在末尾自动添加上.php,这样就可以实现无后缀访问了。&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;配置方式：&#xD;&#xA;使用通配符匹配：api/*&#xD;&#xA;重写URL：api/{R:1}.php&#xD;&#xA;&#xD;&#xA;说明：&#xD;&#xA;对api/*的任意访问，都会自动添加.php后缀。&#xD;&#xA;{R:1}表示被*匹配到的内容&#xD;&#xA;如果通配表达式有两个*，可以用{R:2}引用第二个*&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;应用场景二：重定向&lt;/p&gt;&#xA;&lt;p&gt;比如浏览器请求的是http://127.0.0.1/download/file.zip&lt;/p&gt;&#xA;&lt;p&gt;我们把它重定向到http://127.0.0.1/api/download.php?path=/file.zip&lt;/p&gt;&#xA;&lt;p&gt;这样就可以控制文件下载的权限。&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;配置方式：&#xD;&#xA;使用通配符匹配：/download/*&#xD;&#xA;重写URL：/api/download.php?path={R:1}&#xD;&#xA;&#xD;&#xA;说明：&#xD;&#xA;对download/*的任意访问，都会重定向到/api/download.php&#xD;&#xA;并且加上查询参数?path=*&#xA;&lt;/code&gt;&lt;/pre&gt;</description>
    </item>
    <item>
      <title>nginx-rtmp-win32的权限管理(事件回调)</title>
      <link>https://xcdd.pages.dev/blog/2019/2019-07-12-1926/</link>
      <pubDate>Fri, 12 Jul 2019 19:26:23 +0000</pubDate>
      <guid>https://xcdd.pages.dev/blog/2019/2019-07-12-1926/</guid>
      <description>&lt;p&gt;上一次研究了如何搭建nginx-rtmp服务器，以及推流和观看直播。&lt;/p&gt;&#xA;&lt;p&gt;但是问题是只要知道直播地址，任何人都可以往rtmp://127.0.0.1/live推送视频流。&lt;/p&gt;&#xA;&lt;p&gt;如何管理权限以及实现多个房间(多个频道)直播？&lt;/p&gt;&#xA;&lt;p&gt;一、多个房间(多个频道)&lt;/p&gt;&#xA;&lt;p&gt;这个比较简单，一个RTMP服务器本来就支持多个直播流，只需要改变推流地址就可以。&lt;/p&gt;&#xA;&lt;p&gt;比如改为:rtmp://127.0.0.1/live/123456，那么就得到一条名为123456的直播流。&lt;/p&gt;&#xA;&lt;p&gt;这个123456就可以理解为房间号，或者频道号。&lt;/p&gt;&#xA;&lt;p&gt;当然在OSB里地址不是这样写的，应该这样写：&lt;/p&gt;&#xA;&lt;p&gt;&lt;img src=&#34;./114_1.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;二、权限管理&lt;/p&gt;&#xA;&lt;p&gt;nginx-rtmp提供了一个webapi回调接口，需要在配置文件添加以下配置：&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;publish_notify on;&#xD;&#xA;notify_method get;&#xD;&#xA;on_publish http://127.0.0.1/api/live/auth;&#xD;&#xA;on_publish_done http://127.0.0.1/api/live/auth;&#xD;&#xA;on_play http://127.0.0.1/api/live/auth;&#xD;&#xA;on_play_done http://127.0.0.1/api/live/auth;&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;当收到推流或者播放事件时，会自动调用这些API，并且传递一些必要的参数过去。&lt;/p&gt;&#xA;&lt;p&gt;如果API返回200表示认证成功，返回404表示认证失败。&lt;/p&gt;&#xA;&lt;p&gt;要实现权限管理，重点就是分析传递过来的这些参数。&lt;/p&gt;&#xA;&lt;p&gt;默认情况下是以POST方式传递参数，但是可以使用notify_method修改为GET方式。&lt;/p&gt;&#xA;&lt;p&gt;我觉得GET方式可能比POST方便一些。&lt;/p&gt;&#xA;&lt;p&gt;参数格式是：application/x-www-form-urlencoded&lt;/p&gt;&#xA;&lt;p&gt;参数长什么样？&lt;/p&gt;&#xA;&lt;p&gt;我这里测试的结果是这样的：&lt;/p&gt;&#xA;&lt;p&gt;开始推流时我收到这样的请求：&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;http://127.0.0.1/api/live/auth?&#xD;&#xA;&#xD;&#xA;app=live&amp;amp;flashver=FMLE/3.0%20(compatible%3B%20FMSc/1.0)&amp;amp;swfurl=rtmp://127.0.0.1/live&amp;amp;tcurl=rtmp://127.0.0.1/live&amp;amp;pageurl=&amp;amp;addr=127.0.0.1&amp;amp;clientid=7&amp;amp;call=publish&amp;amp;name=123456&amp;amp;type=live&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;当我关闭OBS时收到这样的请求：&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;http://127.0.0.1/api/live/auth?app=live&amp;amp;flashver=FMLE/3.0%20(compatible%3B%20FMSc/1.0)&amp;amp;swfurl=rtmp://127.0.0.1/live&amp;amp;tcurl=rtmp://127.0.0.1/live&amp;amp;pageurl=&amp;amp;addr=127.0.0.1&amp;amp;clientid=7&amp;amp;call=publish_done&amp;amp;name=123456&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;从这两个测试结果可以看出来，包含以下参数：&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;app=live&#xD;&#xA;flashver=FMLE/3.0%20(compatible%3B%20FMSc/1.0)&#xD;&#xA;swfurl=rtmp://148.70.143.48/live&#xD;&#xA;tcurl=rtmp://148.70.143.48/live&#xD;&#xA;pageurl=&#xD;&#xA;addr=113.87.163.76&#xD;&#xA;clientid=7&#xD;&#xA;call=publish&#xD;&#xA;name=123456&#xD;&#xA;type=live&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;两种情况只有call参数和name不一样，&lt;/p&gt;&#xA;&lt;p&gt;call参数表示事件类型：一个是publish，另一个是publish_done。&lt;/p&gt;&#xA;&lt;p&gt;name参数表示我们设定的房间号。&lt;/p&gt;&#xA;&lt;p&gt;其它参数我们可以不去关心。&lt;/p&gt;&#xA;&lt;p&gt;要实验身份认证，那么我们可以从这个name参数入手，在name里面添加一些认证信息。&lt;/p&gt;&#xA;&lt;p&gt;比如把房间号设定为123456?user=admin&amp;amp;pass=admin&lt;/p&gt;&#xA;&lt;p&gt;假设定义user=用户名，pass=密码，然后通过解析这些值，最终实现用户权限管理。&lt;/p&gt;&#xA;&lt;p&gt;最后：&lt;/p&gt;&#xA;&lt;p&gt;房间号如果不写？而用其它&amp;amp;#这些特殊符号，可能会被编码为%xx，还可能导致在本地生成临时文件夹失败。&lt;/p&gt;&#xA;&lt;p&gt;所以应该使用123456?aaa=bbb&amp;amp;ccc=ddd这样的写法。&lt;/p&gt;&#xA;&lt;p&gt;这样nginx会自动把aaa=bbb添加到查询字符串当中去。&lt;/p&gt;</description>
    </item>
    <item>
      <title>nginx-rtmp-win32搭建RTMP流服务器的一篇笔记</title>
      <link>https://xcdd.pages.dev/blog/2019/2019-07-12/</link>
      <pubDate>Fri, 12 Jul 2019 16:31:12 +0000</pubDate>
      <guid>https://xcdd.pages.dev/blog/2019/2019-07-12/</guid>
      <description>&lt;p&gt;RTMP是一种基于TCP协议的视频流传输协议，默认端口号是1935。&lt;/p&gt;&#xA;&lt;p&gt;RTMP服务器监听端口，接收来自推流客户端的视频数据，并转发给拉流客户端。&lt;/p&gt;&#xA;&lt;p&gt;支持一人推送，万人观看！像电视直播或者游戏直播都是采用该技术。&lt;/p&gt;&#xA;&lt;p&gt;nginx-rtmp-win32就是这样的一个RTMP服务器；&lt;/p&gt;&#xA;&lt;p&gt;nginx官方下载的windows版本是不带rtmp模块的，目前最新稳定版本是1.16；&lt;/p&gt;&#xA;&lt;p&gt;要添加rtmp模块需要自己用源码编译，不过好在有前人做好了win32的移植。&lt;/p&gt;&#xA;&lt;p&gt;nginx-rtmp-win32在这里下载： &lt;a href=&#34;https://github.com/illuspas/nginx-rtmp-win32&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;https://github.com/illuspas/nginx-rtmp-win32&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;虽然该项目已经停止更新了，但是对于个人搭建学习和测试用的RTMP服务器还是没有问题的。&lt;/p&gt;&#xA;&lt;p&gt;有了RTMP服务器，那么还需要客户端软件：&lt;/p&gt;&#xA;&lt;p&gt;推流可以使用OBS这类软件；&lt;/p&gt;&#xA;&lt;p&gt;拉流可以使用PotPlayer这类播放器。&lt;/p&gt;&#xA;&lt;p&gt;直播过程中视频数据流是从OBS传输到nginx再传输到播放器，只要网速够快，就可以获得超低延时的视频直播。&lt;/p&gt;&#xA;&lt;p&gt;如果想在网页上观看视频直播？&lt;/p&gt;&#xA;&lt;p&gt;由于浏览器不支持rtmp协议，所以需在网页上嵌入一个adobe flash player插件来接收并播放视频流。&lt;/p&gt;&#xA;&lt;p&gt;目前好像也有基于js的纯H5播放器可以实现，没有去深入研究。&lt;/p&gt;&#xA;&lt;p&gt;另外还有一种选择是苹果的HLS技术，HLS技术就是把视频流分成无数个TS视频片段。&lt;/p&gt;&#xA;&lt;p&gt;再通过HTTP协议传输这些视频片段，实现了浏览器观看视频直播。&lt;/p&gt;&#xA;&lt;p&gt;目前android和ios的浏览器都支持这种技术。&lt;/p&gt;&#xA;&lt;p&gt;HLS技术一般只应用于拉流，而推流还是使用RTMP协议。&lt;/p&gt;&#xA;&lt;p&gt;但由于服务器需要对接收的数据进行分片，直播延时比较大。&lt;/p&gt;&#xA;&lt;p&gt;nginx-rtmp-win32非常不错，也支持HLS技术。&lt;/p&gt;&#xA;&lt;p&gt;它可以把接收到的视频流保存为无数个TS文件，并自动生成m3u8列表，浏览器只要访问对应的m3u8就可以观看直播了。&lt;/p&gt;&#xA;&lt;p&gt;说了这么多理论上的东西，该来实践一下了。&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;本次实践的内容是使用OBS推流，然后使用HLS技术，在iPhone的浏览器里面观看直播。&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;首先是编辑nginx的配置文件，打开nginx/conf/nginx.conf&lt;/p&gt;&#xA;&lt;p&gt;参考下面的参数进行配置：&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;worker_processes 1;&#xD;&#xA;error_log logs/error.log debug;&#xD;&#xA; &#xD;&#xA;events&#xD;&#xA;{&#xD;&#xA;    worker_connections  100;&#xD;&#xA;}&#xD;&#xA; &#xD;&#xA;#设置RTMP服务器参数&#xD;&#xA;rtmp&#xD;&#xA;{&#xD;&#xA;    server&#xD;&#xA;    {&#xD;&#xA;        listen 1935;  #设置监听端口&#xD;&#xA;        application live    #设置访问路径(rtmp://127.0.0.1/live)&#xD;&#xA;        {&#xD;&#xA;            live on; #开启rtmp直播功能&#xD;&#xA;            deny play all;#禁止RTMP播放(默认推流地址就是播放地址)&#xD;&#xA;            hls on; #开启hls功能&#xD;&#xA;            hls_path temp/rtmp_temp; #设置hls视频文件存放路径&#xD;&#xA;            hls_fragment 5; #设置分片时长(秒)&#xD;&#xA;&#x9;&#x9;&#x9;hls_playlist_length 10; #设置播放列表时长(秒)&#xD;&#xA;            hls_continuous off; #不使用连续模式&#xD;&#xA;            hls_cleanup on; #自动清理视频文件(这个默认是打开的，可以不用设置)&#xD;&#xA;            hls_nested on; #嵌套模式(为每个直播流创建一个子文件夹)&#xD;&#xA;            hls_fragment_naming sequential; #ts命令规则为序号递加&#xD;&#xA;        }&#xD;&#xA;    }&#xD;&#xA;}&#xD;&#xA; &#xD;&#xA;#设置HTTP服务器参数&#xD;&#xA;http&#xD;&#xA;{&#xD;&#xA;    include       mime.types;&#xD;&#xA;    default_type  application/octet-stream;&#xD;&#xA;    &#xD;&#xA;    server_tokens off;&#xD;&#xA;    sendfile      on;&#xD;&#xA;    server&#xD;&#xA;    {&#xD;&#xA;        listen       80;&#xD;&#xA;        server_name  localhost;&#xD;&#xA; &#xD;&#xA;        #下面是默认的根目录&#xD;&#xA;        location /&#xD;&#xA;        {&#xD;&#xA;            root   html;&#xD;&#xA;            index  index.html index.htm;&#xD;&#xA;            autoindex on;&#xD;&#xA;            autoindex_exact_size off;&#xD;&#xA;            autoindex_localtime on;&#xD;&#xA;        }&#xD;&#xA;&#x9;&#x9;location /stat&#xD;&#xA;&#x9;&#x9;{&#xD;&#xA;            rtmp_stat all;&#xD;&#xA;            rtmp_stat_stylesheet stat.xsl;&#xD;&#xA;        }&#xD;&#xA;        location /stat.xsl&#xD;&#xA;&#x9;&#x9;{&#xD;&#xA;            root html;&#xD;&#xA;        }&#xD;&#xA;        #下面是直播观看地址&#xD;&#xA;        location /live&#xD;&#xA;        {&#xD;&#xA;            alias  temp/rtmp_temp;&#xD;&#xA;&#x9;&#x9;&#x9;index  index.m3u8;&#xD;&#xA;&#x9;&#x9;&#x9;autoindex on;&#xD;&#xA;            types&#xD;&#xA;&#x9;&#x9;&#x9;{  &#xD;&#xA;                application/vnd.apple.mpegurl m3u8;  &#xD;&#xA;                video/mp2t ts;  &#xD;&#xA;            }&#xD;&#xA;        }&#xD;&#xA;    }&#xD;&#xA;}&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;配置文件修改好了，就可以双击nginx.exe启动了。&lt;/p&gt;</description>
    </item>
    <item>
      <title>C语言调用python脚本</title>
      <link>https://xcdd.pages.dev/blog/2019/2019-06-29/</link>
      <pubDate>Sat, 29 Jun 2019 12:47:19 +0000</pubDate>
      <guid>https://xcdd.pages.dev/blog/2019/2019-06-29/</guid>
      <description>&lt;p&gt;python提供了C语言的API，可以使用C语言调用python脚本。&lt;/p&gt;&#xA;&lt;p&gt;参考链接： &lt;a href=&#34;https://docs.python.org/3/c-api/&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;https://docs.python.org/3/c-api/&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;API接口函数很多，一时半会儿也看不完，先快速实现在C语言程序内执行py脚本再说吧，做个笔记。&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;#define Py_LIMITED_API&#xD;&#xA;#include &amp;lt;stdio.h&amp;gt;&#xD;&#xA;#include &amp;lt;Windows.h&amp;gt;&#xD;&#xA;#include &amp;#34;python.h&amp;#34;&#xD;&#xA;&#xD;&#xA;int py_init(void)&#xD;&#xA;{&#xD;&#xA;    Py_SetPythonHome(L&amp;#34;C:\Python&amp;#34;);&#xD;&#xA;    return 0;&#xD;&#xA;}&#xD;&#xA;&#xD;&#xA;int py_exec(wchar_t *script)&#xD;&#xA;{&#xD;&#xA;    wchar_t *argv[2];&#xD;&#xA;    argv[0] = L&amp;#34;python&amp;#34;;&#xD;&#xA;    argv[1] = script;&#xD;&#xA;    return Py_Main(2, argv);&#xD;&#xA;}&#xD;&#xA;&#xD;&#xA;int main(void)&#xD;&#xA;{&#xD;&#xA;    int ret;&#xD;&#xA;    wchar_t *script = L&amp;#34;X:\Path\demo.py&amp;#34;;&#xD;&#xA;    ret = py_init();&#xD;&#xA;    ret = py_exec(script);&#xD;&#xA;    return ret;&#xD;&#xA;}&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;解释一下：&lt;/p&gt;&#xA;&lt;p&gt;#define Py_LIMITED_API 表示只使用python3.dll提供的API函数，兼容性较强，否则会调用python36.dll。&lt;/p&gt;&#xA;&lt;p&gt;Py_SetPythonHome(home) 设置python的根目录，否则会报错，找不到&lt;/p&gt;&#xA;&lt;p&gt;Py_Main(argc, argv) 调用python的主函数，没有参数的话会进入python命令行，给2个参数就可以执行指定脚本。&lt;/p&gt;</description>
    </item>
    <item>
      <title>User Profile Service服务未能登录</title>
      <link>https://xcdd.pages.dev/blog/2019/2019-06-27/</link>
      <pubDate>Thu, 27 Jun 2019 10:46:29 +0000</pubDate>
      <guid>https://xcdd.pages.dev/blog/2019/2019-06-27/</guid>
      <description>&lt;p&gt;在Windows Server 2008 R2上面创建一个标准用户来用运行一些低权限进程。&lt;/p&gt;&#xA;&lt;p&gt;发现这个标准用户无法正常登陆，提示User Profile Service服务未能登录。&lt;/p&gt;&#xA;&lt;p&gt;在管理员账号下使用Shift+鼠标右键，选择“以其它用户身份运行”也失败，提示“系统找不到指定的文件”&lt;/p&gt;&#xA;&lt;p&gt;在命令行下面输入：runas /user:xxx calc.exe也提示是相同的提示。&lt;/p&gt;&#xA;&lt;p&gt;但是发现可以用runas /noprofile /user:xxx calc.exe可以正常运行。&lt;/p&gt;&#xA;&lt;p&gt;/noprofile的作用是不加载用户配置文件，看来是这个标准用户的配置文件找不到了。&lt;/p&gt;&#xA;&lt;p&gt;上网搜了一圈，讲的都是各种修改注册表，并不能解决此问题。&lt;/p&gt;&#xA;&lt;p&gt;经过一番研究，终于找到了原因： &lt;strong&gt;因为我把系统的默认配置文件给删除了！&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;默认用户配置文件在这个目录：C:\Users\Default&lt;/p&gt;&#xA;&lt;p&gt;所以解决办法就是：&lt;/p&gt;&#xA;&lt;p&gt;新建文件件夹：C:\Users\Default&lt;/p&gt;&#xA;&lt;p&gt;从系统安装盘拷贝C:\Users\Default\NTUSER.DAT进去就可以了。&lt;/p&gt;</description>
    </item>
    <item>
      <title>解决FileZilla服务器端0.9.60版本无法启动的问题</title>
      <link>https://xcdd.pages.dev/blog/2019/2019-06-26/</link>
      <pubDate>Wed, 26 Jun 2019 14:42:20 +0000</pubDate>
      <guid>https://xcdd.pages.dev/blog/2019/2019-06-26/</guid>
      <description>&lt;p&gt;在Windows 7系统下无法运行官网下载的FileZilla Server，版本号是0.9.60&lt;/p&gt;&#xA;&lt;p&gt;双击FileZilla Server Interface.exe会报错：&lt;/p&gt;&#xA;&lt;p&gt;Could not load TLS libraries. Aborting start of administration interface.&lt;/p&gt;&#xA;&lt;p&gt;看到这个提示信息，很明确是加载SSL的动态库失败了，但是程序目录下面，明明有ssleay32.dll和libeay32.dll。&lt;/p&gt;&#xA;&lt;p&gt;为什么会加载失败呢？&lt;/p&gt;&#xA;&lt;p&gt;好在FileZilla是开源软件，下载软件包还自带源代码，所以去源代码找到了加载过程：&lt;/p&gt;&#xA;&lt;p&gt;首先搜索报错提示，定位到了FileZilla server.cpp第103行，其中相关源码如下：&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-cpp&#34; data-lang=&#34;cpp&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&lt;span style=&#34;color:#66d9ef&#34;&gt;auto&lt;/span&gt; sslLoader &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; std&lt;span style=&#34;color:#f92672&#34;&gt;::&lt;/span&gt;make_unique&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;&lt;/span&gt;CAsyncSslSocketLayer&lt;span style=&#34;color:#f92672&#34;&gt;&amp;gt;&lt;/span&gt;(&lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt; (sslLoader&lt;span style=&#34;color:#f92672&#34;&gt;-&amp;gt;&lt;/span&gt;InitSSL() &lt;span style=&#34;color:#f92672&#34;&gt;!=&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;) {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&#x9;AfxMessageBox(_T(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Could not load TLS libraries. Aborting start of administration interface.&amp;#34;&lt;/span&gt;), MB_ICONEXCLAMATION);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&#x9;&lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt; false;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;继续跟踪InitSSL函数，定位到AsyncSslSocketLayer.cpp第318行，关键代码如下：&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-cpp&#34; data-lang=&#34;cpp&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt; CAsyncSslSocketLayer&lt;span style=&#34;color:#f92672&#34;&gt;::&lt;/span&gt;InitSSL()&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;{&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt; (m_bSslInitialized)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&#x9;&lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;simple_lock &lt;span style=&#34;color:#a6e22e&#34;&gt;lock&lt;/span&gt;(m_mutex);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt; (&lt;span style=&#34;color:#f92672&#34;&gt;!&lt;/span&gt;m_nSslRefCount) {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&#x9;&lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt; (&lt;span style=&#34;color:#f92672&#34;&gt;!&lt;/span&gt;m_sslDll2.load(_T(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;libeay32.dll&amp;#34;&lt;/span&gt;))) {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&#x9;&#x9;&lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt; SSL_FAILURE_LOADDLLS;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&#x9;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&#x9;&lt;span style=&#34;color:#66d9ef&#34;&gt;bool&lt;/span&gt; bError &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; false;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&#x9;proc(m_sslDll2, BIO_ctrl_pending);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&#x9;proc(m_sslDll2, BIO_read);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&#x9;proc(m_sslDll2, BIO_ctrl);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&#x9;proc(m_sslDll2, BIO_write);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#75715e&#34;&gt;/*以下代码太多，不列出来了。*/&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;失败信息来自m_sslDll2.load函数，于是继续定位到dll.cpp第18行，代码如下：&lt;/p&gt;</description>
    </item>
    <item>
      <title>用C语言编写CGI程序获取浏览器UserAgent</title>
      <link>https://xcdd.pages.dev/blog/2019/2019-06-21/</link>
      <pubDate>Fri, 21 Jun 2019 10:13:40 +0000</pubDate>
      <guid>https://xcdd.pages.dev/blog/2019/2019-06-21/</guid>
      <description>&lt;p&gt;CGI是一种比较古老的动态WEB技术，现在几乎没有直接使用CGI程序的WEB服务器了，但是作为学习研究，还是可以的。&lt;/p&gt;&#xA;&lt;p&gt;CGI的原理是WEB服务器收到浏览器的请求时，执行对应的CGI程序，其本质是一个EXE文件。&lt;/p&gt;&#xA;&lt;p&gt;这个EXE文件可以通过环境变量获取浏览器的请求信息，然后把页面数据输出到标准输出流(stdout)；&lt;/p&gt;&#xA;&lt;p&gt;然后WEB服务器会把这些数据返回给浏览器。&lt;/p&gt;&#xA;&lt;p&gt;根据这些信息，我写了一个简单的CGI程序，把浏览器的UA信息返回给浏览器，并把访问记录保存在服务器。&lt;/p&gt;&#xA;&lt;p&gt;需要注意的是，在输出页面数据的时候，需要先给HTTP响应的头部数据，比如Content-Type: text/html，再接一个空行。&lt;/p&gt;&#xA;&lt;p&gt;这个空行是HTTP协议头部结束的标志，后面的数据作为HTTP响应的BODY数据。&lt;/p&gt;&#xA;&lt;p&gt;我们的HTML页面数据就作为HTTP协议的BODY。&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-cpp&#34; data-lang=&#34;cpp&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;/*&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;CGI环境变量&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;CONTENT_TYPE&#x9;这个环境变量的值指示所传递来的信息的MIME类型。目前，环境变量CONTENT_TYPE一般都是：application/x-www-form-urlencoded,他表示数据来自于HTML表单。&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;CONTENT_LENGTH&#x9;如果服务器与CGI程序信息的传递方式是POST，这个环境变量即使从标准输入STDIN中可以读到的有效数据的字节数。这个环境变量在读取所输入的数据时必须使用。&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;HTTP_COOKIE&#x9;客户机内的 COOKIE 内容。&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;HTTP_USER_AGENT&#x9;提供包含了版本数或其他专有数据的客户浏览器信息。&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;PATH_INFO&#x9;这个环境变量的值表示紧接在CGI程序名之后的其他路径信息。它常常作为CGI程序的参数出现。&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;QUERY_STRING&#x9;如果服务器与CGI程序信息的传递方式是GET，这个环境变量的值即使所传递的信息。这个信息经跟在CGI程序名的后面，两者中间用一个问号&amp;#39;?&amp;#39;分隔。&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;REMOTE_ADDR&#x9;这个环境变量的值是发送请求的客户机的IP地址，例如上面的192.168.1.67。这个值总是存在的。而且它是Web客户机需要提供给Web服务器的唯一标识，可以在CGI程序中用它来区分不同的Web客户机。&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;REMOTE_HOST&#x9;这个环境变量的值包含发送CGI请求的客户机的主机名。如果不支持你想查询，则无需定义此环境变量。&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;REQUEST_METHOD&#x9;提供脚本被调用的方法。对于使用 HTTP/1.0 协议的脚本，仅 GET 和 POST 有意义。&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;SCRIPT_FILENAME&#x9;CGI脚本的完整路径&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;SCRIPT_NAME&#x9;CGI脚本的的名称&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;SERVER_NAME&#x9;这是你的 WEB 服务器的主机名、别名或IP地址。&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;SERVER_SOFTWARE&#x9;这个环境变量的值包含了调用CGI程序的HTTP服务器的名称和版本号。例如，上面的值为Apache/2.2.14(Unix)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;*/&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;#include&lt;/span&gt; &lt;span style=&#34;color:#75715e&#34;&gt;&amp;lt;time.h&amp;gt;&lt;/span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;#include&lt;/span&gt; &lt;span style=&#34;color:#75715e&#34;&gt;&amp;lt;stdio.h&amp;gt;&lt;/span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;#include&lt;/span&gt; &lt;span style=&#34;color:#75715e&#34;&gt;&amp;lt;stdlib.h&amp;gt;&lt;/span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;#include&lt;/span&gt; &lt;span style=&#34;color:#75715e&#34;&gt;&amp;lt;string.h&amp;gt;&lt;/span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;static&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;char&lt;/span&gt; local_string[&lt;span style=&#34;color:#ae81ff&#34;&gt;1024&lt;/span&gt;];&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;const&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;char&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;get_env_str&lt;/span&gt;(&lt;span style=&#34;color:#66d9ef&#34;&gt;const&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;char&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;name)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;{&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;size_t sz;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;getenv_s(&lt;span style=&#34;color:#f92672&#34;&gt;&amp;amp;&lt;/span&gt;sz, local_string, &lt;span style=&#34;color:#ae81ff&#34;&gt;1024&lt;/span&gt;, name);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt; local_string;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;const&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;char&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;get_tim_str&lt;/span&gt;(&lt;span style=&#34;color:#66d9ef&#34;&gt;void&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;{&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&lt;span style=&#34;color:#66d9ef&#34;&gt;struct&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;tm&lt;/span&gt; tm;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;time_t t;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;t &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; time(NULL);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;localtime_s(&lt;span style=&#34;color:#f92672&#34;&gt;&amp;amp;&lt;/span&gt;tm, &lt;span style=&#34;color:#f92672&#34;&gt;&amp;amp;&lt;/span&gt;t);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;sprintf_s(local_string, &lt;span style=&#34;color:#ae81ff&#34;&gt;1024&lt;/span&gt;, &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;%04d-%02d-%02d %02d:%02d:%02d&amp;#34;&lt;/span&gt;, tm.tm_year &lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;1900&lt;/span&gt;, tm.tm_mon &lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;, tm.tm_mday, tm.tm_hour, tm.tm_min, tm.tm_sec);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt; local_string;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;void&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;main&lt;/span&gt;(&lt;span style=&#34;color:#66d9ef&#34;&gt;void&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;{&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;FILE &lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;fp;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;fopen_s(&lt;span style=&#34;color:#f92672&#34;&gt;&amp;amp;&lt;/span&gt;fp, &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;access.txt&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;a+&amp;#34;&lt;/span&gt;);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt;(fp &lt;span style=&#34;color:#f92672&#34;&gt;!=&lt;/span&gt; NULL)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;{&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&#x9;fprintf(fp, &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;[%s]&amp;#34;&lt;/span&gt;, get_tim_str());&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&#x9;fprintf(fp, &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;[%s]&amp;#34;&lt;/span&gt;, get_env_str(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;REMOTE_ADDR&amp;#34;&lt;/span&gt;));&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&#x9;fprintf(fp, &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;[%s]&amp;#34;&lt;/span&gt;, get_env_str(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;HTTP_USER_AGENT&amp;#34;&lt;/span&gt;));&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&#x9;fprintf(fp, &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;\n&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&lt;/span&gt;);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&#x9;fclose(fp);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;printf(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Content-Type: text/html&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;\n&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&lt;/span&gt;);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;printf(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;\n&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&lt;/span&gt;);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;printf(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&amp;lt;html&amp;gt;&amp;#34;&lt;/span&gt;);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;printf(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&amp;lt;head&amp;gt;&amp;lt;meta charset=&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;\&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;gbk&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;\&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;/&amp;gt;&amp;#34;&lt;/span&gt;);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;printf(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&amp;lt;title&amp;gt;浏览器检测&amp;lt;/title&amp;gt;&amp;#34;&lt;/span&gt;);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;printf(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&amp;lt;/head&amp;gt;&amp;#34;&lt;/span&gt;);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;printf(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&amp;lt;body&amp;gt;&amp;#34;&lt;/span&gt;);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;printf(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&amp;lt;table&amp;gt;&amp;#34;&lt;/span&gt;);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;printf(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&amp;lt;tr&amp;gt;&amp;lt;td align=&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;\&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;right&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;\&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;gt;浏览器UA:&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;%s&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&amp;#34;&lt;/span&gt;, get_env_str(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;HTTP_USER_AGENT&amp;#34;&lt;/span&gt;));&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;printf(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&amp;lt;tr&amp;gt;&amp;lt;td align=&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;\&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;right&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;\&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;gt;来访者IP:&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;%s&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&amp;#34;&lt;/span&gt;, get_env_str(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;REMOTE_ADDR&amp;#34;&lt;/span&gt;));&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;printf(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&amp;lt;tr&amp;gt;&amp;lt;td align=&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;\&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;right&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;\&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;gt;系统时间:&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;%s&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&amp;#34;&lt;/span&gt;, get_tim_str());&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;printf(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&amp;lt;/body&amp;gt;&amp;#34;&lt;/span&gt;);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;printf(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&amp;lt;/html&amp;gt;&amp;#34;&lt;/span&gt;);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;编译为index.exe，然后放到WEB服务器根目录，打开浏览器访问就可以看到数据了：&lt;/p&gt;</description>
    </item>
    <item>
      <title>自己制做绿色版VirtualBox</title>
      <link>https://xcdd.pages.dev/blog/2019/2019-06-10/</link>
      <pubDate>Mon, 10 Jun 2019 16:24:19 +0000</pubDate>
      <guid>https://xcdd.pages.dev/blog/2019/2019-06-10/</guid>
      <description>&lt;p&gt;Windows软件的安装过程一般都是双击setup.msi或者setup.exe来完成。&lt;/p&gt;&#xA;&lt;p&gt;在安装的过程中主要就是：解压或复制文件到安装目录，注册程序组件，添加注册表项，安装系统驱动等。&lt;/p&gt;&#xA;&lt;p&gt;理论上只有解压就能运行的程序，才叫绿色软件，需要写注册表，注册组件的都不算。&lt;/p&gt;&#xA;&lt;p&gt;今天以VirtualBox V4.2.36版本为研究目标。&lt;/p&gt;&#xA;&lt;p&gt;第一步还是正常安装程序，然后备份所有程序文件，再卸载程序。&lt;/p&gt;&#xA;&lt;p&gt;第二步把备用文件放到工作目录，进行研究，先双击virtualBox.exe会提示严重错误：提示创建COM对象失败。&lt;/p&gt;&#xA;&lt;p&gt;&lt;img src=&#34;./108_1.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;看到这个提示猜测是某些dll文件需要注册了，所以用regsvr32命令把所有的dll文件全部注册遍，&lt;/p&gt;&#xA;&lt;p&gt;最后发现只有VBoxC.dll可以注册，其它文件都失败。&lt;/p&gt;&#xA;&lt;p&gt;再运行主程序，还是一样的提示，看来还有遗漏的文件？可能是EXE文件，无法直接用regsvr32来注册。&lt;/p&gt;&#xA;&lt;p&gt;只好通过解包安装程序了，查看一下安装包的安装过程来了解如果手动注册。&lt;/p&gt;&#xA;&lt;p&gt;把VirtualBox.exe用7zip解开可以看到里面有3个文件，2个msi文件和1个cab文件。&lt;/p&gt;&#xA;&lt;p&gt;解包后：这两个msi一个是32位，另一个是64位系统的安装程序，cab文件在安装时需要重命名为common.cab。&lt;/p&gt;&#xA;&lt;p&gt;对于msi文件，可以用Orca来反编译，查找它的Registry表项的内容，就是我们绿化软件时需要用到的注册表。&lt;/p&gt;&#xA;&lt;p&gt;而这些注册表项，并不是全部都需要，一些文件关联的内容，我们并不需要。&lt;/p&gt;&#xA;&lt;p&gt;只提取最重要的部分，那就是CLSID下面的内容。&lt;/p&gt;&#xA;&lt;p&gt;&lt;img src=&#34;./108_2.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;如图所示，还好VirtualBox的注册表内容并不多，只有几十行。&lt;/p&gt;&#xA;&lt;p&gt;而我们需要的只有CLSID相关的内容，这里面主要描述了两个组件，一个是VBoxC.dll和VBoxSVC.exe&lt;/p&gt;&#xA;&lt;p&gt;VBoxC.dll的内容，其实通过regsvr32 Vboxc.dll就完成注册了，需要手动添加的就是VBoxSVC.exe而已。&lt;/p&gt;&#xA;&lt;p&gt;手动添加了{B1A7A4F2-47B9-4A1E-82B2-07CCD5323C3F}下面的内容后，再次运行主程序，发现已经可以打开了。&lt;/p&gt;&#xA;&lt;p&gt;启动虚拟机报错：&lt;/p&gt;&#xA;&lt;p&gt;NtCreateFile(\Device\VBoxDrvStub) failed: 0xc0000034 STATUS_OBJECT_NAME_NOT_FOUND (0 retries) (rc=-101)&lt;/p&gt;&#xA;&lt;p&gt;这个问题需要安装驱动来解决：VBoxDrv.sys，这个驱动的安装嘛，就使用DPInst.exe来完成就可以了。&lt;/p&gt;&#xA;&lt;p&gt;最后总结一下：&lt;/p&gt;&#xA;&lt;p&gt;VirtualBox并不是真正的绿色软件，只能通过手动添加注册表的方法，来实现类似绿色软件。&lt;/p&gt;&#xA;&lt;p&gt;绿化方法：&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;#一、注册VBoxC.dll&#xD;&#xA;regsvr32 VboxC.dll&#xD;&#xA;&#xD;&#xA;#二、注册VBoxSVC.exe&#xD;&#xA;#将下面的内容保存为.reg文件，导入注册表&#xD;&#xA;#需要修改X:\PATH\VBoxSVC.exe为真实路径&#xD;&#xA;Windows Registry Editor Version 5.00&#xD;&#xA;&#xD;&#xA;[HKEY_CLASSES_ROOT\CLSID\{B1A7A4F2-47B9-4A1E-82B2-07CCD5323C3F}&#xD;&#xA;@=&amp;#34;VirtualBox Class&amp;#34;&#xD;&#xA;&amp;#34;LocalServer32&amp;#34;=&amp;#34;X:\PATH\VBoxSVC.exe&amp;#34;&#xD;&#xA;&amp;#34;AppID&amp;#34;=&amp;#34;{819B4D85-9CEE-493C-B6FC-64FFE759B3C9}&amp;#34;&#xD;&#xA;&amp;#34;ProgID&amp;#34;=&amp;#34;VirtualBox.VirtualBox.1&amp;#34;&#xD;&#xA;&amp;#34;TypeLib&amp;#34;=&amp;#34;{46137EEC-703B-4FE5-AFD4-7C9BBBBA0259}&amp;#34;&#xD;&#xA;&amp;#34;VersionIndependentProgID&amp;#34;=&amp;#34;VirtualBox.VirtualBox&amp;#34;&#xD;&#xA;&#xD;&#xA;#三、安装驱动VBoxDrv.sys&#xD;&#xA;将DPInst.exe放到驱动目录运行一下，自动完成&#xA;&lt;/code&gt;&lt;/pre&gt;</description>
    </item>
    <item>
      <title>sed命令批量处理二进制文件</title>
      <link>https://xcdd.pages.dev/blog/2019/2019-06-06-1716/</link>
      <pubDate>Thu, 06 Jun 2019 17:16:02 +0000</pubDate>
      <guid>https://xcdd.pages.dev/blog/2019/2019-06-06-1716/</guid>
      <description>&lt;p&gt;sed 是个查找替换文本文件的工具，通常是以行为单位，关于它的用法网上有很多，但都是针对文本文件的。&lt;/p&gt;&#xA;&lt;p&gt;sed以文本模式替换可执行文件(如exe和dll)，会导致0x0D，0x0A（换行符）被意外破坏掉，程序文件被损坏。&lt;/p&gt;&#xA;&lt;p&gt;所以需要以二进制方式查找和替换数据，仔细研究了一下，终于有了结果，做个笔记。&lt;/p&gt;&#xA;&lt;p&gt;其实就是加上-b参数：&lt;/p&gt;&#xA;&lt;p&gt;一、从文件中删除指定数据&lt;/p&gt;&#xA;&lt;p&gt;sed -b -i  &amp;lsquo;/\x00\x11\x22\x33/d&amp;rsquo; demo.exe&lt;/p&gt;&#xA;&lt;p&gt;这个命令将demo.exe文件中的00,11,22,33序列全部删掉。&lt;/p&gt;&#xA;&lt;p&gt;二、替换文件中的数据&lt;/p&gt;&#xA;&lt;p&gt;sed -b -i &amp;rsquo;s/\x00\x11\x22\x33/\xAA\xBB\xCC\xDD/g&amp;rsquo; demo.exe&lt;/p&gt;&#xA;&lt;p&gt;这个命令将替换demo.exe文件中的00,11,22,33序列为AA,BB,CC,DD&lt;/p&gt;</description>
    </item>
    <item>
      <title>自己制做python3.6精简绿色版</title>
      <link>https://xcdd.pages.dev/blog/2019/2019-06-06-1536/</link>
      <pubDate>Thu, 06 Jun 2019 15:36:21 +0000</pubDate>
      <guid>https://xcdd.pages.dev/blog/2019/2019-06-06-1536/</guid>
      <description>&lt;p&gt;一、从官网下载完整的python3.6.8安装程序，并安装到任意目录。勾选安装pip就行，其它不用选。&lt;/p&gt;&#xA;&lt;p&gt;二、打开安装目录，把所有文件打包到python.zip备用。&lt;/p&gt;&#xA;&lt;p&gt;三、进入控制面板，卸载python3.6。&lt;/p&gt;&#xA;&lt;p&gt;四、解压python.zip到任意非中文目录，开始我们的工作。&lt;/p&gt;&#xA;&lt;p&gt;五、此时双击python.exe应该是可能正常运行的，如果没有特殊要求，其实这也算是一个绿色版python了。&lt;/p&gt;&#xA;&lt;p&gt;六、我们可以精简掉所有的__pycache__文件夹，这个文件夹可以提高一些脚本运行速度，没有也不影响功能。&lt;/p&gt;&#xA;&lt;p&gt;七、Scripts下面删除重复的文件：保留pip.exe，删除pip3.exe，删除pip3.6.exe，这三个其实是一模一样的文件。&lt;/p&gt;&#xA;&lt;p&gt;八、可以删除include文件夹、可以删除Libs文件夹（这两个是python的二次开发接口SDK，用不上可以删除）。&lt;/p&gt;&#xA;&lt;p&gt;好了，至此python精简也差不多了，基本也能写代码测试了，不过pip还不能用。原因见 &lt;a href=&#34;https://blog.csdn.net/qq446252221/article/details/91042163&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;上一篇文章&lt;/a&gt; 。&lt;/p&gt;&#xA;&lt;p&gt;九、修复Scripts下面的EXE程序，用WinHEX打开pip.exe，拉到最后，找到下图红框内容，替换为python.exe。&lt;/p&gt;&#xA;&lt;p&gt;注意去掉双引号，exe后面要加上0D,0A换行符，然后再加上注释符#(井号)。&lt;/p&gt;&#xA;&lt;p&gt;下图是替换前的：&lt;/p&gt;&#xA;&lt;p&gt;&lt;img src=&#34;./106_1.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;下图是替换后的：&lt;/p&gt;&#xA;&lt;p&gt;&lt;img src=&#34;./106_2.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;修改完成后，保存文件，如果还有easy_install.exe也要做相同的修改。&lt;/p&gt;&#xA;&lt;p&gt;这时再打开pip还是可能会报错，没关系，我们把python.exe的路径加入PATH环境变量就可以了。&lt;/p&gt;&#xA;&lt;p&gt;这里有两种方式：&lt;/p&gt;&#xA;&lt;p&gt;方式一：永久性的，直接进系统设置，修改环境变量，在PATH的最后加上python.exe的文件夹路径。&lt;/p&gt;&#xA;&lt;p&gt;优点是全局生效，打开任意cmd窗口都可以调用python；&lt;/p&gt;&#xA;&lt;p&gt;缺点是路径固定，如果把python移动到其它地方，则需要重新设置环境变量；&lt;/p&gt;&#xA;&lt;p&gt;方式二：临时性的，使用批处理命令临时设置，关闭后失效。&lt;/p&gt;&#xA;&lt;p&gt;优点是可以任意移动python的路径；&lt;/p&gt;&#xA;&lt;p&gt;缺点是必须先打开批处理程序，利用cd命令切换到工作目录去；&lt;/p&gt;&#xA;&lt;p&gt;我这里打包好了一个绿色版python，大家可以下载使用：&lt;/p&gt;&#xA;&lt;p&gt;下载地址： &lt;a href=&#34;https://download.csdn.net/download/qq446252221/11229178&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;https://download.csdn.net/download/qq446252221/11229178&lt;/a&gt;&lt;/p&gt;</description>
    </item>
    <item>
      <title>PIP出现Fatal error in launcher:</title>
      <link>https://xcdd.pages.dev/blog/2019/2019-06-06/</link>
      <pubDate>Thu, 06 Jun 2019 12:49:38 +0000</pubDate>
      <guid>https://xcdd.pages.dev/blog/2019/2019-06-06/</guid>
      <description>&lt;p&gt;在Windows命令行下面输入pip install xxx安装包时，出现Fatal error in launcher:&lt;/p&gt;&#xA;&lt;p&gt;看提示意思是pip.exe启动时找不到启动器。&lt;/p&gt;&#xA;&lt;p&gt;其实pip.exe就是一个打包的py脚本，运行时会自动调用python.exe来执行内部的py脚本。&lt;/p&gt;&#xA;&lt;p&gt;报这个错的意思呢，大概就是它找不到python.exe吧。&lt;/p&gt;&#xA;&lt;p&gt;所以我用WinHEX打开Scripts目录下面的pip.exe，一查究竟，在文件的末尾发现的关键信息：&lt;/p&gt;&#xA;&lt;p&gt;&lt;img src=&#34;./105_1.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;卧槽，这家伙竟然把python.exe的绝对路径写在了pip.exe文件里！&lt;/p&gt;&#xA;&lt;p&gt;python for windows真TM是个智障啊！&lt;/p&gt;&#xA;&lt;p&gt;这样的python完全不具备Portable特性！&lt;/p&gt;&#xA;&lt;p&gt;PS：我是为了避免重装系统时重复安装python，所以把安装好的python打包到了其它目录。&lt;/p&gt;&#xA;&lt;p&gt;把它作为一个绿色软件来执行。当然要把python目录和Scripts目录加入环境变量。&lt;/p&gt;&#xA;&lt;p&gt;然后我又检查了Scripts目录下面的所有文件，几乎所有的exe和py脚本都把python.exe的绝对路径写了上去！！！&lt;/p&gt;&#xA;&lt;p&gt;既然python.exe已经添加到了环境变量，完全没有必要使用绝对路径，所以我试着手动修改为相对路径。&lt;/p&gt;&#xA;&lt;p&gt;如下图所示：&lt;/p&gt;&#xA;&lt;p&gt;&lt;img src=&#34;./105_2.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;保存之后，再次运行pip.exe可以正常工作了。&lt;/p&gt;&#xA;&lt;p&gt;顺便把Scripts下面的所有文件都做了相同的修改，这样基本上还是具有Portable特性了。&lt;/p&gt;&#xA;&lt;p&gt;把python移动到任意文件夹，并添加到环境变量PATH中，都可以正常工作。&lt;/p&gt;&#xA;&lt;p&gt;还可以写个批处理命令，临时添加环境变量，做为python的命令行工具。&lt;/p&gt;&#xA;&lt;p&gt;把下面的内容另存为python_cmd.bat即可&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;@title Python&#xD;&#xA;@set PATH=%PATH%%~dp0%;&#xD;&#xA;@set PATH=%PATH%%~dp0%\Scripts;&#xD;&#xA;@cmd /k&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;后记：为了验证这个绝对路径，我又反复多次使用安装程序安装python，都是一样的。&lt;/p&gt;&#xA;&lt;p&gt;Scripts下面的文件是在安装的时候动态修改过的，看文件修改时间就能看出来。&lt;/p&gt;&#xA;&lt;p&gt;其它核心文件都是2018年修改，只有这几个文件是安装的日期。&lt;/p&gt;&#xA;&lt;p&gt;因为它们在安装的时候，就把python.exe的路径给写死进去了。&lt;/p&gt;&#xA;&lt;p&gt;这一波操作把我惊呆了！&lt;/p&gt;</description>
    </item>
    <item>
      <title>变色龙给驱动打补丁实现USB驱动无需USBInjectAll.kext</title>
      <link>https://xcdd.pages.dev/blog/2019/2019-06-04/</link>
      <pubDate>Tue, 04 Jun 2019 13:52:07 +0000</pubDate>
      <guid>https://xcdd.pages.dev/blog/2019/2019-06-04/</guid>
      <description>&lt;p&gt;变色龙最新版本Enoch_R2921已经有给KEXT打补丁的功能，与Clover类似，或者说是从Clover搬过来的功能。&lt;/p&gt;&#xA;&lt;p&gt;变色龙的配置文件存放在/Extra/目录，有以下几个文件：&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;kernel.plist   //内核补丁配置文件&#xD;&#xA;kexts.plist    //驱动补丁配置文件&#xD;&#xA;org.chameleon.boot.plist //启动参数配置文件&#xD;&#xA;smbios.plist   //SMBIOS机型配置文件&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;今天的主角是kexts.plist，利用它可以实现自动对驱动打二进制补丁和Info.plist补丁&lt;/p&gt;&#xA;&lt;p&gt;该文件主要有几个配置项：&lt;/p&gt;&#xA;&lt;p&gt;1.KextsPatches&lt;/p&gt;&#xA;&lt;p&gt;这个项目下面可以添加多个驱动程序的二进制补丁，比如可以对AppleRTC，AppleHDA打补丁。&lt;/p&gt;&#xA;&lt;p&gt;每个子项目要添加的参数有：&lt;/p&gt;&#xA;&lt;p&gt;&lt;key&gt;Comment&lt;/key&gt;注释内容，该内容会在启动的时候，打印到屏幕上；&lt;/p&gt;&#xA;&lt;p&gt;&lt;key&gt;MatchOS&lt;/key&gt;匹配的系统版本，如10.11.X，其中X表示任意数字，只有系统版本匹配才会执行补丁的内容；&lt;/p&gt;&#xA;&lt;p&gt;&lt;key&gt;Find&lt;/key&gt;要查找的数据，这是以Base64编码的16进制内容（建议用 &lt;a href=&#34;https://download.csdn.net/download/qq446252221/11225008&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;plistEditor(点击下载)&lt;/a&gt; 查看和修改数据）；&lt;/p&gt;&#xA;&lt;p&gt;&lt;key&gt;Replace&lt;/key&gt;替换的数据内容，当查找到上面的数据时，将其替换为以下内容，注意数据长度要保持一致；&lt;/p&gt;&#xA;&lt;p&gt;2.ForceToLoad&lt;/p&gt;&#xA;&lt;p&gt;这个项目下面可以添加要强制加载的驱动程序。&lt;/p&gt;&#xA;&lt;p&gt;目前还不知道什么情况下会用到这个。&lt;/p&gt;&#xA;&lt;p&gt;3.PersonalitiesInjector&lt;/p&gt;&#xA;&lt;p&gt;这个项目下面可以添加驱动注入的配置，其效果相当于直接修改某个驱动的Info.plist&lt;/p&gt;&#xA;&lt;p&gt;应该只对目标驱动程序的&lt;IOKitPersonalities&gt;配置有效。&lt;/p&gt;&#xA;&lt;p&gt;使用方法是把目标驱动程序的Info.plist里面的&lt;IOKitPersonalities&gt;复制下来，粘贴到这里面。&lt;/p&gt;&#xA;&lt;p&gt;然后修改对应的参数，比如IONameMatch，PCIMatch等等。&lt;/p&gt;&#xA;&lt;ol start=&#34;4&#34;&gt;&#xA;&lt;li&gt;最后来贴上我的配置文件以作参考：&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;&amp;lt;?xml version=&amp;#34;1.0&amp;#34; encoding=&amp;#34;UTF-8&amp;#34;?&amp;gt;&#xD;&#xA;&amp;lt;plist version=&amp;#34;1.0&amp;#34;&amp;gt;&#xD;&#xA;  &amp;lt;dict&amp;gt;&#xD;&#xA;    &amp;lt;key&amp;gt;KextsPatches&amp;lt;/key&amp;gt;&#xD;&#xA;    &amp;lt;dict&amp;gt;&#xD;&#xA;      &amp;lt;key&amp;gt;AppleRTC&amp;lt;/key&amp;gt;&#xD;&#xA;      &amp;lt;array&amp;gt;&#xD;&#xA;        &amp;lt;dict&amp;gt;&#xD;&#xA;          &amp;lt;key&amp;gt;Comment&amp;lt;/key&amp;gt;&#xD;&#xA;          &amp;lt;string&amp;gt;Patch AppleRTC&amp;lt;/string&amp;gt;&#xD;&#xA;          &amp;lt;key&amp;gt;MatchOS&amp;lt;/key&amp;gt;&#xD;&#xA;          &amp;lt;string&amp;gt;10.11.x&amp;lt;/string&amp;gt;&#xD;&#xA;          &amp;lt;key&amp;gt;Find&amp;lt;/key&amp;gt;&#xD;&#xA;          &amp;lt;data&amp;gt;QYnXQYn2&amp;lt;/data&amp;gt;&#xD;&#xA;          &amp;lt;key&amp;gt;Replace&amp;lt;/key&amp;gt;&#xD;&#xA;          &amp;lt;data&amp;gt;6Z8AAACQ&amp;lt;/data&amp;gt;&#xD;&#xA;        &amp;lt;/dict&amp;gt;&#xD;&#xA;      &amp;lt;/array&amp;gt;&#xD;&#xA;    &amp;lt;/dict&amp;gt;&#xD;&#xA;    &amp;lt;key&amp;gt;ForceToLoad&amp;lt;/key&amp;gt;&#xD;&#xA;    &amp;lt;array&amp;gt;&#xD;&#xA;      &amp;lt;string&amp;gt;AppleHDA&amp;lt;/string&amp;gt;&#xD;&#xA;    &amp;lt;/array&amp;gt;&#xD;&#xA;    &amp;lt;key&amp;gt;PersonalitiesInjector&amp;lt;/key&amp;gt;&#xD;&#xA;    &amp;lt;dict&amp;gt;&#xD;&#xA;      &amp;lt;key&amp;gt;USBInjector&amp;lt;/key&amp;gt;&#xD;&#xA;      &amp;lt;dict&amp;gt;&#xD;&#xA;        &amp;lt;key&amp;gt;MatchOS&amp;lt;/key&amp;gt;&#xD;&#xA;        &amp;lt;string&amp;gt;10.11.x&amp;lt;/string&amp;gt;&#xD;&#xA;        &amp;lt;key&amp;gt;Comment&amp;lt;/key&amp;gt;&#xD;&#xA;        &amp;lt;string&amp;gt;USB EHCI Injector&amp;lt;/string&amp;gt;&#xD;&#xA;        &amp;lt;key&amp;gt;OSBundleRequired&amp;lt;/key&amp;gt;&#xD;&#xA;        &amp;lt;string&amp;gt;Root&amp;lt;/string&amp;gt;&#xD;&#xA;        &amp;lt;key&amp;gt;IOKitPersonalities&amp;lt;/key&amp;gt;&#xD;&#xA;        &amp;lt;dict&amp;gt;&#xD;&#xA;          &amp;lt;key&amp;gt;MacBookPro7,1-EHC1&amp;lt;/key&amp;gt;&#xD;&#xA;          &amp;lt;dict&amp;gt;&#xD;&#xA;            &amp;lt;key&amp;gt;CFBundleIdentifier&amp;lt;/key&amp;gt;&#xD;&#xA;            &amp;lt;string&amp;gt;com.apple.driver.AppleUSBMergeNub&amp;lt;/string&amp;gt;&#xD;&#xA;            &amp;lt;key&amp;gt;IOClass&amp;lt;/key&amp;gt;&#xD;&#xA;            &amp;lt;string&amp;gt;AppleUSBMergeNub&amp;lt;/string&amp;gt;&#xD;&#xA;            &amp;lt;key&amp;gt;IONameMatch&amp;lt;/key&amp;gt;&#xD;&#xA;            &amp;lt;string&amp;gt;EHC1&amp;lt;/string&amp;gt;&#xD;&#xA;            &amp;lt;key&amp;gt;IOProviderClass&amp;lt;/key&amp;gt;&#xD;&#xA;            &amp;lt;string&amp;gt;AppleUSBEHCIPCI&amp;lt;/string&amp;gt;&#xD;&#xA;            &amp;lt;key&amp;gt;IOProviderMergeProperties&amp;lt;/key&amp;gt;&#xD;&#xA;            &amp;lt;dict&amp;gt;&#xD;&#xA;              &amp;lt;key&amp;gt;kUSBMuxEnabled&amp;lt;/key&amp;gt;&#xD;&#xA;              &amp;lt;true/&amp;gt;&#xD;&#xA;            &amp;lt;/dict&amp;gt;&#xD;&#xA;            &amp;lt;key&amp;gt;model&amp;lt;/key&amp;gt;&#xD;&#xA;            &amp;lt;string&amp;gt;MacBookPro7,1&amp;lt;/string&amp;gt;&#xD;&#xA;          &amp;lt;/dict&amp;gt;&#xD;&#xA;          &amp;lt;key&amp;gt;MacBookPro7,1-EHC2&amp;lt;/key&amp;gt;&#xD;&#xA;          &amp;lt;dict&amp;gt;&#xD;&#xA;            &amp;lt;key&amp;gt;CFBundleIdentifier&amp;lt;/key&amp;gt;&#xD;&#xA;            &amp;lt;string&amp;gt;com.apple.driver.AppleUSBMergeNub&amp;lt;/string&amp;gt;&#xD;&#xA;            &amp;lt;key&amp;gt;IOClass&amp;lt;/key&amp;gt;&#xD;&#xA;            &amp;lt;string&amp;gt;AppleUSBMergeNub&amp;lt;/string&amp;gt;&#xD;&#xA;            &amp;lt;key&amp;gt;IONameMatch&amp;lt;/key&amp;gt;&#xD;&#xA;            &amp;lt;string&amp;gt;EHC2&amp;lt;/string&amp;gt;&#xD;&#xA;            &amp;lt;key&amp;gt;IOProviderClass&amp;lt;/key&amp;gt;&#xD;&#xA;            &amp;lt;string&amp;gt;AppleUSBEHCIPCI&amp;lt;/string&amp;gt;&#xD;&#xA;            &amp;lt;key&amp;gt;IOProviderMergeProperties&amp;lt;/key&amp;gt;&#xD;&#xA;            &amp;lt;dict&amp;gt;&#xD;&#xA;              &amp;lt;key&amp;gt;kUSBMuxEnabled&amp;lt;/key&amp;gt;&#xD;&#xA;              &amp;lt;true/&amp;gt;&#xD;&#xA;            &amp;lt;/dict&amp;gt;&#xD;&#xA;            &amp;lt;key&amp;gt;model&amp;lt;/key&amp;gt;&#xD;&#xA;            &amp;lt;string&amp;gt;MacBookPro7,1&amp;lt;/string&amp;gt;&#xD;&#xA;          &amp;lt;/dict&amp;gt;&#xD;&#xA;        &amp;lt;/dict&amp;gt;&#xD;&#xA;      &amp;lt;/dict&amp;gt;&#xD;&#xA;    &amp;lt;/dict&amp;gt;&#xD;&#xA;  &amp;lt;/dict&amp;gt;&#xD;&#xA;&amp;lt;/plist&amp;gt;&#xA;&lt;/code&gt;&lt;/pre&gt;</description>
    </item>
    <item>
      <title>给AppleRTC打补丁防止重置BIOS</title>
      <link>https://xcdd.pages.dev/blog/2019/2019-06-03/</link>
      <pubDate>Mon, 03 Jun 2019 13:20:10 +0000</pubDate>
      <guid>https://xcdd.pages.dev/blog/2019/2019-06-03/</guid>
      <description>&lt;p&gt;安装完黑苹果会发现BIOS设置会被重置，这是因为AppleRTC导致的，解决这个办法有几种方案：&lt;/p&gt;&#xA;&lt;p&gt;方案一：直接在EE目录加上这个防重置驱动ElliottForceLegacyRTC.kext&lt;/p&gt;&#xA;&lt;p&gt;这种比较稳定可靠，目前在我的电脑上测试是没有问题的。&lt;/p&gt;&#xA;&lt;p&gt;方案二：在变色龙配置文件kext.plist里加上&lt;AppleRTCPatch&gt;&lt;/true&gt;&lt;/p&gt;&#xA;&lt;p&gt;这个方案在我的电脑上测试没有成功，可能与MacOS版本有关系。&lt;/p&gt;&#xA;&lt;p&gt;方案三：手动给AppleRTC打上二进制补丁，并替换原生的AppleRTC文件&lt;/p&gt;&#xA;&lt;p&gt;在网上找了几种补丁方案，用perl命令替换AppleRTC里面的二进制代码，结果都没有成功。&lt;/p&gt;&#xA;&lt;p&gt;为了研究这个AppleRTC的二进制补丁，我找来了变色龙最新版本（Enoch_2921）的源代码，&lt;/p&gt;&#xA;&lt;p&gt;在文件kernel_patcher_internal.c里发现了以下内容：&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;// ===================================&#xD;&#xA;// (Clover)&#xD;&#xA;// Patching AppleRTC to prevent CMOS reset&#xD;&#xA;unsigned int AppleRTC_Patch(void *data, UInt32 DriverSize, UInt32 StartLocation)&#xD;&#xA;{&#xD;&#xA;    unsigned int count = 0;&#xD;&#xA;    // as far as I know this works from Lion to Sierra&#xD;&#xA;    UInt8   LionSearch_X64[]   = { 0x75, 0x30, 0x44, 0x89, 0xf8 };&#xD;&#xA;    UInt8   LionReplace_X64[]  = { 0xeb, 0x30, 0x44, 0x89, 0xf8 };&#xD;&#xA;    &#xD;&#xA;    UInt8   LionSearch_i386[]  = { 0x75, 0x3d, 0x8b, 0x75, 0x08 };&#xD;&#xA;    UInt8   LionReplace_i386[] = { 0xeb, 0x3d, 0x8b, 0x75, 0x08 };&#xD;&#xA;    &#xD;&#xA;    UInt8   MLSearch[]         = { 0x75, 0x30, 0x89, 0xd8 };&#xD;&#xA;    UInt8   MLReplace[]        = { 0xeb, 0x30, 0x89, 0xd8 };&#xD;&#xA;    //SunKi&#xD;&#xA;    //752e0fb6 -&amp;gt; eb2e0fb6&#xD;&#xA;    UInt8   MavSearch[]        = { 0x75, 0x2e, 0x0f, 0xb6 };&#xD;&#xA;    UInt8   MavReplace[]       = { 0xeb, 0x2e, 0x0f, 0xb6};&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;从这部分代码能看出来，这个补丁是从Clover的代码里搬过来的，嗯有很多Clover用户也反馈RTC补丁没有作用。&lt;/p&gt;</description>
    </item>
    <item>
      <title>使用GRUB2制作多重系统引导程序</title>
      <link>https://xcdd.pages.dev/blog/2019/2019-05-29/</link>
      <pubDate>Wed, 29 May 2019 13:40:48 +0000</pubDate>
      <guid>https://xcdd.pages.dev/blog/2019/2019-05-29/</guid>
      <description>&lt;p&gt;装了黑苹果后，同一硬盘多个分区，有不同的系统，为了统一管理，需要找一个通用性强的引导程序。&lt;/p&gt;&#xA;&lt;p&gt;现在环境是这样的一块硬盘，MBR分区方式，4个主分区分别如下：&lt;/p&gt;&#xA;&lt;table&gt;&#xA;  &lt;thead&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;th style=&#34;text-align: center&#34;&gt;&lt;/th&gt;&#xA;          &lt;th style=&#34;text-align: center&#34;&gt;文件系统&lt;/th&gt;&#xA;          &lt;th style=&#34;text-align: center&#34;&gt;操作系统&lt;/th&gt;&#xA;          &lt;th style=&#34;text-align: center&#34;&gt;引导方式&lt;/th&gt;&#xA;      &lt;/tr&gt;&#xA;  &lt;/thead&gt;&#xA;  &lt;tbody&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;分区一(C:)&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;NTFS&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;Windows&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;Bootmgr&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;分区二(D:)&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;EXT4&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;Ubuntu&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;linux/initrd&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;分区三(E:)&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;HFS+&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;MacOSX&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;boot(变色龙)&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;分区四(F:)&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;FAT32&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;无&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;grldr&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;  &lt;/tbody&gt;&#xA;&lt;/table&gt;&#xA;&lt;p&gt;分区四是目前只有1GB，预留用来存放通用引导程序的分区，这个分区是活动分区。&lt;/p&gt;&#xA;&lt;p&gt;这样的分区方式，设计思想是各个分区负责引导各个分区的操作系统，互不干扰。&lt;/p&gt;&#xA;&lt;p&gt;如果把grldr放到C盘根目录下，由Bootmgr来加载grldr，这不符合我的设计美学。&lt;/p&gt;&#xA;&lt;p&gt;一开始我是这样思考的：&lt;/p&gt;&#xA;&lt;p&gt;MBR设置为NT6 MBR，活动分区设置为分区四，分区四的PBR设置为GRUB4DOS。&lt;/p&gt;&#xA;&lt;p&gt;也就是在分区四的根目录添加grldr文件和menu.lst文件，由它来引导这三个系统。&lt;/p&gt;&#xA;&lt;p&gt;但很快就发现GRUB4DOS不支持HFS文件系统，不能读取分区三下面的/boot文件。&lt;/p&gt;&#xA;&lt;p&gt;于是又想到了它的chainloader，用链式引导的方式，引导各个分区的PBR。&lt;/p&gt;&#xA;&lt;p&gt;但很快又发现HFS系统的PBR很难正确地设置，还是无法引导/boot文件。&lt;/p&gt;&#xA;&lt;p&gt;最终只能放弃GRUB4DOS。&lt;/p&gt;&#xA;&lt;p&gt;目前能支持HFS文件系统的还是只有Chameleon和GRUB2。&lt;/p&gt;&#xA;&lt;p&gt;优先考虑GRUB2这个引导程序。&lt;/p&gt;&#xA;&lt;p&gt;好吧，先去下载GRUB2的内核文件，自己制作一个GRLDR吧：&lt;/p&gt;&#xA;&lt;p&gt;下载地址： &lt;a href=&#34;http://alpha.gnu.org/gnu/grub/&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;http://alpha.gnu.org/gnu/grub/&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;然后使用下面的命令生成一个支持HFS的core.img文件：&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;grub-mkimage.exe -C none -o core.img -O i386-pc -d i386-pc -p / biosdisk memdisk disk part_apple part_gpt part_msdos iso9660 udf fat exfat ntfs ext2 hfs hfsplus ls lsapm  mmap loopback net chain ntldr linux linux16 multiboot boot reboot help&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;这个core.img可以用GRUB4DOS的kernel命令引导，但是无法被PBR引导。&lt;/p&gt;</description>
    </item>
    <item>
      <title>PCI设备驱动和相关知识</title>
      <link>https://xcdd.pages.dev/blog/2019/2019-05-27/</link>
      <pubDate>Mon, 27 May 2019 13:39:25 +0000</pubDate>
      <guid>https://xcdd.pages.dev/blog/2019/2019-05-27/</guid>
      <description>&lt;p&gt;在研究黑苹果驱动时，经常会看到修改Info.plist中的IOPCIMatch字段。需要研究一下相关内容。&lt;/p&gt;&#xA;&lt;p&gt;PCI是一种外设部件互连标准总线，和USB总线差不多，可以将不同类型的设备连接到同一条总线上。&lt;/p&gt;&#xA;&lt;p&gt;常见的PCI设备有显卡，网卡，声卡，IDE控制器，AHCI控制器，USB控制器等。&lt;/p&gt;&#xA;&lt;p&gt;符合PCI标准的设备，都必须有一个VID和DID，在Windows设备管理器中，可以很方便地查看设备的硬件ID。&lt;/p&gt;&#xA;&lt;p&gt;下图以网卡为例：&lt;/p&gt;&#xA;&lt;p&gt;&lt;img src=&#34;./101_1.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;设备ID以PCI开头，表示这是PCI设备，VEN_10EC&amp;amp;DEV_8168，表示设备的VID=0x10EC，DID＝0x8168。&lt;/p&gt;&#xA;&lt;p&gt;VID是标识厂商的唯一代码，不同厂商是不同的，由一个神秘组织维护这些VID。知道VID就知道厂商名称。&lt;/p&gt;&#xA;&lt;p&gt;比如0x10EC是RealTek，0x10DE是Nvidia，0x8086是Intel。&lt;/p&gt;&#xA;&lt;p&gt;DID是标识不同的设备代码，相同厂商有不同和设备，需要用DID来区分。&lt;/p&gt;&#xA;&lt;p&gt;比如这里的0x8168就是Realtek的以太网卡设备，Realtek还有声卡等其它设备，具有不同的DID。&lt;/p&gt;&#xA;&lt;p&gt;一般情况下用VID和DID就可以匹配设备驱动程序了。&lt;/p&gt;&#xA;&lt;p&gt;除此之外，还有Subsystem ID和Revision ID和Class Code。&lt;/p&gt;&#xA;&lt;p&gt;Subsystem ID是次要的设备识别码，作用与VID和DID相同，长度为4字节。&lt;/p&gt;&#xA;&lt;p&gt;Revision ID是版本号，长度为1字节。&lt;/p&gt;&#xA;&lt;p&gt;Class Code是设备类型代码，由神秘组织定义的设备类型代码，长度为3字节。&lt;/p&gt;&#xA;&lt;p&gt;关于设备类型代码，在这里有说明： &lt;a href=&#34;http://pci-ids.ucw.cz/read/PD&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;http://pci-ids.ucw.cz/read/PD&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝&lt;/p&gt;&#xA;&lt;p&gt;大概了解了PCI设备的知识后，再来看看Windows驱动程序，Windows驱动一般由一个sys文件和inf文件组成。&lt;/p&gt;&#xA;&lt;p&gt;inf描述了设备驱动程序的安装过程，以及对应的设备ID。&lt;/p&gt;&#xA;&lt;p&gt;我找来了刚才的网卡驱动，找到里面关于设备ID的字段如下（部分内容）：&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;;8168B&#xD;&#xA;%RTL8168.DeviceDesc%    = RTL8168.ndi,      PCI\VEN_10EC&amp;amp;DEV_8168&amp;amp;REV_01&#xD;&#xA;%RTL8168.DeviceDesc%    = RTL8168.ndi,      PCI\VEN_10EC&amp;amp;DEV_8168&amp;amp;SUBSYS_816810EC&amp;amp;REV_01&#xD;&#xA;;8112&#xD;&#xA;%RTL8112.DeviceDesc%    = RTL8168.ndi,      PCI\VEN_10EC&amp;amp;DEV_8168&amp;amp;SUBSYS_83851043&amp;amp;REV_01&#xD;&#xA;&#xD;&#xA;;8168D&#xD;&#xA;%RTL8168D.DeviceDesc%   = RTL8168D.ndi,     PCI\VEN_10EC&amp;amp;DEV_8168&amp;amp;REV_03&#xD;&#xA;%RTL8168D.DeviceDesc%   = RTL8168D.ndi,     PCI\VEN_10EC&amp;amp;DEV_8168&amp;amp;SUBSYS_816810EC&amp;amp;REV_03&#xD;&#xA;;8112L&#xD;&#xA;%RTL8112L.DeviceDesc%   = RTL8168D.ndi,     PCI\VEN_10EC&amp;amp;DEV_8168&amp;amp;SUBSYS_83A31043&amp;amp;REV_03&#xD;&#xA;&#xD;&#xA;;8168E&#xD;&#xA;%RTL8168E.DeviceDesc%   = RTL8168E.ndi,     PCI\VEN_10EC&amp;amp;DEV_8168&amp;amp;REV_06&#xD;&#xA;%RTL8168E.DeviceDesc%   = RTL8168E.ndi,     PCI\VEN_10EC&amp;amp;DEV_8168&amp;amp;SUBSYS_816810EC&amp;amp;REV_06&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;从这里可以看出来，当设备的VID和DID是相同的时候，还需要由SUBSYS和REV来区分不同的版本。&lt;/p&gt;&#xA;&lt;p&gt;Windows安装驱动程序的时候，会检测到我的网卡ID符合下面这条内容：&lt;/p&gt;&#xA;&lt;p&gt;%RTL8168E.DeviceDesc%   = RTL8168E.ndi,     PCI\VEN_10EC&amp;amp;DEV_8168&amp;amp;REV_06&lt;/p&gt;&#xA;&lt;p&gt;因此会为我的网卡安装这个驱动程序。&lt;/p&gt;</description>
    </item>
    <item>
      <title>黑苹果日记六（双系统引导）</title>
      <link>https://xcdd.pages.dev/blog/2019/2019-05-25/</link>
      <pubDate>Sat, 25 May 2019 14:13:51 +0000</pubDate>
      <guid>https://xcdd.pages.dev/blog/2019/2019-05-25/</guid>
      <description>&lt;p&gt;打算把MAC OS X和Win7装到同一块硬盘的不同分区，所以要研究一下变色龙的引导程序。&lt;/p&gt;&#xA;&lt;p&gt;目前变色龙原版最新只更新到V2.4_R2877版本,后面的版本是它的分支Enoch_V2.4_R2921。&lt;/p&gt;&#xA;&lt;p&gt;MBR引导时，一般是用grldr来装载wowpc.iso来进入变色龙程序。&lt;/p&gt;&#xA;&lt;p&gt;wowpc.iso是一个可引导的光盘镜像，而且是一个Hybrid/ISO混合模式的镜像，用UltroISO不能原样保存。&lt;/p&gt;&#xA;&lt;p&gt;打开wowpc.iso里面也没有几个文件，试着解压出来，用grldr直接引导里面的boot文件，似乎也可以。&lt;/p&gt;&#xA;&lt;p&gt;不过没有GUI界面了，变成了BIOS默认的文本显示方式。&lt;/p&gt;&#xA;&lt;p&gt;这个boot程序会自动扫描HFS格式的磁盘，然后列表显示出来让你选择要从哪个磁盘启动。&lt;/p&gt;&#xA;&lt;p&gt;如果没猜错的话，那应该可以用GRUB4DOS来做双系统引导了。&lt;/p&gt;&#xA;&lt;p&gt;附上GRUB4DOS的引导命令：&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;#引导Windows&#xD;&#xA;chainloader /Bootmgr&#xD;&#xA;boot&#xD;&#xA;&#xD;&#xA;#引导变色龙的wowpc.iso&#xD;&#xA;map /wowpc.iso (hd32)&#xD;&#xA;map --hook&#xD;&#xA;chainloader (hd32)&#xD;&#xA;boot&#xD;&#xA;&#xD;&#xA;#引导变色龙的boot&#xD;&#xA;#注意这个boot文件与windows系统的boot目录重名了，最好改为其它文件名。&#xD;&#xA;kernel /boot&#xD;&#xA;boot&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;另外，在黑白界面的变色龙程序里找到了内置的帮助文档，发现它的配置参数还是不少。&lt;/p&gt;&#xA;&lt;p&gt;管它用得上用不上，先复制出来做个记录保存一下：&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;The boot: prompt waits for you to type advanced startup options.&#xD;&#xA;If you don&amp;#39;t type anything, the computer continues starting up normally. It&#xD;&#xA;uses the kernel and configuration files on the startup device, which it also&#xD;&#xA;uses as the root device.&#xD;&#xA;&#xD;&#xA;Advanced startup options use the following syntax:&#xD;&#xA;&#xD;&#xA;    [device]&amp;lt;kernel&amp;gt; [arguments]&#xD;&#xA;&#xD;&#xA;Example arguments include&#xD;&#xA;&#xD;&#xA; device: rd=&amp;lt;BSD device name&amp;gt;       (e.g. rd=disk0s2)&#xD;&#xA;         rd=*&amp;lt;IODeviceTree path&amp;gt;    (e.g. rd=*/PCI0@0/CHN0@0/@0:1)&#xD;&#xA;&#xD;&#xA; kernel: kernel name                (e.g. &amp;#34;mach_kernel&amp;#34; - must be in &amp;#34;/&amp;#34; )&#xD;&#xA;&#xD;&#xA; flags: -v (verbose),                -s (single user mode),&#xD;&#xA;        -x (safe mode),              -f (ignore caches),&#xD;&#xA;        -F (ignore &amp;#34;Kernel Flags&amp;#34; specified in boot configuration file)&#xD;&#xA;&#xD;&#xA; &amp;#34;Graphics Mode&amp;#34;=&amp;#34;WIDTHxHEIGHTxDEPTH&amp;#34; (e.g. &amp;#34;1024x768x32&amp;#34;)&#xD;&#xA;&#xD;&#xA; kernel flags                       (e.g. debug=0x144)&#xD;&#xA; io=0xffffffff                      (defined in IOKit/IOKitDebug.h)&#xD;&#xA;&#xD;&#xA;Example: mach_kernel rd=disk0s1 -v &amp;#34;Graphics Mode&amp;#34;=&amp;#34;1920x1200x32&amp;#34;&#xD;&#xA;&#xD;&#xA;If the computer won&amp;#39;t start up properly, you may be able to start it up using&#xD;&#xA;safe mode.  Type -x to start up in safe mode, which ignores all cached&#xD;&#xA;driver files.&#xD;&#xA;&#xD;&#xA;Special booter hotkeys:&#xD;&#xA;-----------------------&#xD;&#xA;  F5            Rescans optical drive.&#xD;&#xA;  F10           Scans and displays all BIOS accessible drives.&#xD;&#xA;&#xD;&#xA;Special booter commands:&#xD;&#xA;------------------------&#xD;&#xA;  ?memory       Displays information about the computer&amp;#39;s memory.&#xD;&#xA;  ?video        Displays VESA video modes supported by the computer&amp;#39;s BIOS.&#xD;&#xA;  ?norescan     Leaves optical drive rescan mode.&#xD;&#xA;&#xD;&#xA;Additional useful command-line options:&#xD;&#xA;---------------------------------------&#xD;&#xA;  config=&amp;lt;file&amp;gt;             Use an alternate Boot.plist file.&#xD;&#xA;&#xD;&#xA;Options useful in the org.chameleon.Boot.plist file:&#xD;&#xA;----------------------------------------------------&#xD;&#xA;  Wait=Yes|No               Prompt for a key press before starting the kernel.&#xD;&#xA;  &amp;#34;Quiet Boot&amp;#34;=Yes|No       Use quiet boot mode (no messages or prompt).&#xD;&#xA;  Timeout=8                 Number of seconds to pause at the boot: prompt.&#xD;&#xA;  &amp;#34;Instant Menu&amp;#34;=Yes        Force displaying the partition selection menu.&#xD;&#xA;&#xD;&#xA;  &amp;#34;Default Partition&amp;#34;     Sets the default boot partition,&#xD;&#xA;    =hd(x,y)|UUID|&amp;#34;Label&amp;#34;    Specified as a disk/partition pair, an UUID, or a&#xD;&#xA;                             label enclosed in quotes.&#xD;&#xA;&#xD;&#xA;  &amp;#34;Hide Partition&amp;#34;        Remove unwanted partition(s) from the boot menu.&#xD;&#xA;    =partition               Specified, possibly multiple times, as hd(x,y), an&#xD;&#xA;     [;partition2 ...]       UUID or label enclosed in quotes.&#xD;&#xA;&#xD;&#xA;  &amp;#34;Rename Partition&amp;#34;      Rename partition(s) for the boot menu.&#xD;&#xA;    =partition &amp;lt;alias&amp;gt;       Where partition is hd(x,y), UUID or label enclosed&#xD;&#xA;     [;partition2 &amp;lt;alias2&amp;gt;   in quotes. The alias can optionally be quoted too.&#xD;&#xA;     ...]&#xD;&#xA;&#xD;&#xA;  GUI=No                  Disable the GUI (enabled by default).&#xD;&#xA;  &amp;#34;Boot Banner&amp;#34;=Yes|No    Show boot banner in GUI mode (disabled by default).&#xD;&#xA;  ShowInfo=No             Disables display of partition and resolution details.&#xD;&#xA;                            &amp;#34;Boot Banner&amp;#34;=No will also disable this info.&#xD;&#xA;  &amp;#34;Legacy Logo&amp;#34;=Yes|No    Use the legacy grey apple logo (enabled by default).&#xD;&#xA;&#xD;&#xA;  RebootOnPanic=Yes|No    (disabled by default).&#xD;&#xA;&#xD;&#xA;  EnableHiDPI=Yes|No      Enable High resolution display (disabled by default).&#xD;&#xA;&#xD;&#xA;  BlackMode=Yes|No        The new BlackMode loads the white Apple logo,&#xD;&#xA;                             instead of the gray Apple logo, on a black background (disabled by default).&#xD;&#xA;&#xD;&#xA;  CsrActiveConfig=&amp;lt;value&amp;gt; Set CsrActiveConfig for OS 10.11.x, range 0..255 (default 0x67)&#xD;&#xA;&#xD;&#xA;  PciRoot=&amp;lt;value&amp;gt;         Use an alternate value for PciRoot (default value 0).&#xD;&#xA;&#xD;&#xA;  UseKernelCache=Yes|No   Yes will load pre-linked kernel and will ignore /E/E&#xD;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&#x9;    and /S/L/E/Extensions.mkext.&#xD;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&#x9;&#x9;Default is No but Yes if you use Lion on a Raid partition.&#xD;&#xA;&#xD;&#xA;  KeyLayout=keymap        Use to change the keyboard mapping of the bootloader&#xD;&#xA;                            (e.g. KeyLayout=mac-fr)&#xD;&#xA;&#xD;&#xA;  HDAEnabler=Yes|No         Automatic device-properties generation for audio controllers.&#xD;&#xA;    HDEFLayoutID=&amp;lt;value&amp;gt;    Inject alternate value of layout-id for HDEF (HEX).&#xD;&#xA;    HDAULayoutID=&amp;lt;value&amp;gt;    Inject alternate value of layout-id for HDAU (HEX).&#xD;&#xA;&#xD;&#xA;  GraphicsEnabler=Yes|No    Automatic device-properties generation for graphics cards.&#xD;&#xA;    SkipIntelGfx=Yes|No     Skip the Automatic device-properties generation for Intel cards.&#xD;&#xA;    SkipNvidiaGfx=Yes|No    Skip the Automatic device-properties generation for Nvidia cards.&#xD;&#xA;    SkipAtiGfx=Yes|No       Skip the Automatic device-properties generation for Ati cards.&#xD;&#xA;&#xD;&#xA;    NvidiaGeneric=Yes|No    Use the classic Nvidia name for the SystemProfiler (disabled by default).&#xD;&#xA;    NvidiaSingle=Yes|No     If you have two cards Nvidia and wants to inject only&#xD;&#xA;                              first one then you can set this parameter (enbaled by default).&#xD;&#xA;    NvidiaNoEFI=Yes|No      Inject NVDA,noEFI value as true&#xD;&#xA;&#xD;&#xA;    AtiConfig=&amp;lt;cardcfg&amp;gt;   Use a different card config, e.g. AtiConfig=Megalodon.&#xD;&#xA;    AtiPorts=&amp;lt;value&amp;gt;      Specify the number of ports, e.g. AtiPorts=2.&#xD;&#xA;    UseAtiROM=Yes|No      Use an alternate Ati ROM image&#xD;&#xA;                            (default path: /Extra/&amp;lt;vendorid&amp;gt;_&amp;lt;devid&amp;gt;_&amp;lt;subsysid&amp;gt;.rom)&#xD;&#xA;    UseNvidiaROM=Yes|No   Use an alternate Nvidia ROM image&#xD;&#xA;                            (default path:  /Extra/&amp;lt;vendorid&amp;gt;_&amp;lt;devid&amp;gt;.rom)&#xD;&#xA;    VBIOS=Yes|No            Inject VBIOS to device-properties.&#xD;&#xA;    display_0=&amp;lt;value&amp;gt;       Inject alternate value of display-cfg into NVDA,Display-A@0 (HEX).&#xD;&#xA;    display_1=&amp;lt;value&amp;gt;       Inject alternate value of display-cfg into NVDA,Display-B@1 (HEX).&#xD;&#xA;    IntelCapriFB=&amp;lt;value&amp;gt;    For Intel Ivy Bridge, range 0-11.&#xD;&#xA;    IntelAzulFB=&amp;lt;value&amp;gt;     For Intel Haswell, range 0-16.&#xD;&#xA;    IntelBdwFB=&amp;lt;value&amp;gt;      For Intel Broadwell, range 0-19.&#xD;&#xA;    IntelSklFB=&amp;lt;value&amp;gt;      For Intel Skylake, range 0-12.&#xD;&#xA;    InjectIntel-ig=&amp;lt;value&amp;gt;  Inject alternate value into AAPL,ig-platform-id (HEX).&#xD;&#xA;&#xD;&#xA;    EnableBacklight=Yes&#x9;  Enable Back light option for NVIDIA and ATI&#xD;&#xA;    EnableDualLink=Yes&#x9;  Enable DualLink option for NVIDIA and ATI&#xD;&#xA;    EnableHDMIAudio=Yes&#x9;  Inject HDMI audio for NVIDIA and ATI.&#xD;&#xA;&#xD;&#xA;  EthernetBuiltIn=Yes|No  Automatic &amp;#34;built-in&amp;#34;=YES device-properties generation&#xD;&#xA;                          for ethernet interfaces.&#xD;&#xA;  ForceHPET=Yes|No        Force HPET on (disabled by default).&#xD;&#xA;&#xD;&#xA;  USBBusFix=Yes             Enable the XHCI, EHCI and UHCI fixes (disabled by default).&#xD;&#xA;  EHCIacquire=Yes           Enable the EHCI fix (disabled by default).&#xD;&#xA;  UHCIreset=Yes             Enable the UHCI fix (disabled by default).&#xD;&#xA;  USBLegacyOff=Yes          Force USB Legacy off for XHCI and EHCI (disabled by default).&#xD;&#xA;  XHCILegacyOff=Yes         Force USB Legacy off for XHCI (disabled by default).&#xD;&#xA;&#xD;&#xA;  Wake=No                   Disable wake up after hibernation (enbaled by default).&#xD;&#xA;  ForceWake=Yes             Force using the sleepimage (disabled by default).&#xD;&#xA;  WakeImage=&amp;lt;file&amp;gt;          Use an alternate sleepimage file &#xD;&#xA;                              (default path is /private/var/vm/sleepimage).&#xD;&#xA;&#xD;&#xA;  DropSSDT=Yes              Skip the SSDT tables while relocating the ACPI tables.&#xD;&#xA;  Drop&amp;lt;file&amp;gt;=Yes            Skip:[HPET, SLIC, SBST, ECDT, ASF! or DMAR]&#xD;&#xA;&#xD;&#xA;  DSDT=&amp;lt;file&amp;gt;               Use an alternate DSDT.aml file &#xD;&#xA;                              (default path: /DSDT.aml&#xD;&#xA;                               /Extra/DSDT.aml bt(0,0)/Extra/DSDT.aml).&#xD;&#xA;  HPET=&amp;lt;file&amp;gt;               Use an alternate HPET.aml file &#xD;&#xA;                              (default path: /HPET.aml&#xD;&#xA;                               /Extra/HPET.aml bt(0,0)/Extra/HPET.aml).&#xD;&#xA;  SBST=&amp;lt;file&amp;gt;               Use an alternate SBST.aml file &#xD;&#xA;                              (default path: /SBST.aml&#xD;&#xA;                               /Extra/SBST.aml bt(0,0)/Extra/SBST.aml).&#xD;&#xA;  ECDT=&amp;lt;file&amp;gt;               Use an alternate ECDT.aml file &#xD;&#xA;                              (default path: /ECDT.aml&#xD;&#xA;                               /Extra/ECDT.aml bt(0,0)/Extra/ECDT.aml).&#xD;&#xA;  ASFT=&amp;lt;file&amp;gt;               Use an alternate ASFT.aml file &#xD;&#xA;                              (default path: /ASFT.aml&#xD;&#xA;                               /Extra/ASFT.aml bt(0,0)/Extra/ASFT.aml).&#xD;&#xA;  DMAR=&amp;lt;file&amp;gt;               Use an alternate DMAR.aml file &#xD;&#xA;                              (default path: /DMAR.aml&#xD;&#xA;                               /Extra/DMAR.aml bt(0,0)/Extra/DMAR.aml).&#xD;&#xA;  APIC=&amp;lt;file&amp;gt;               Use an alternate APIC.aml file &#xD;&#xA;                              (default path: /APIC.aml&#xD;&#xA;                               /Extra/APIC.aml bt(0,0)/Extra/APIC.aml).&#xD;&#xA;  MCFG=&amp;lt;file&amp;gt;               Use an alternate MCFG.aml file &#xD;&#xA;                              (default path: /MCFG.aml&#xD;&#xA;                               /Extra/MCFG.aml bt(0,0)/Extra/MCFG.aml).&#xD;&#xA;  FADT=&amp;lt;file&amp;gt;               Use an alternate FADT.aml file &#xD;&#xA;                              (default path: /FADT.aml&#xD;&#xA;                               /Extra/FADT.aml bt(0,0)/Extra/FADT.aml).&#xD;&#xA;&#xD;&#xA;  GenerateCStates=Yes     Enable auto generation of processor idle sleep states&#xD;&#xA;                            (C-States).&#xD;&#xA;  GeneratePStates=Yes     Enable auto generation of processor power performance&#xD;&#xA;                            states (P-States).&#xD;&#xA;  CSTUsingSystemIO=Yes    New C-State _CST generation method using SystemIO&#xD;&#xA;                            registers instead of FixedHW.&#xD;&#xA;&#xD;&#xA;  EnableC2State=Yes       Enable specific Processor power state, C2.&#xD;&#xA;  EnableC3State=Yes       Enable specific Processor power state, C3.&#xD;&#xA;  EnableC4State=Yes       Enable specific Processor power state, C4.&#xD;&#xA;  EnableC6State=Yes       Enable specific Processor power state, C6.&#xD;&#xA;  EnableC7State=Yes       Enable specific Processor power state, C7.&#xD;&#xA;&#xD;&#xA;  PrivateData=No          Show masked data (serial number) in bdmesg log (enbaled by default).&#xD;&#xA;&#xD;&#xA;  ForceFullMemInfo=Yes    Force SMBIOS Table 17 to be 27 bytes long (disabled by default).&#xD;&#xA;&#xD;&#xA;  SMBIOS=&amp;lt;file&amp;gt;             Use an alternate SMBIOS.plist file&#xD;&#xA;                              (default path: /smbios.plist /Extra/smbios.plist&#xD;&#xA;                               bt(0,0)/Extra/smbios.plist).&#xD;&#xA;&#xD;&#xA;  SMBIOSdefaults=No         Don&amp;#39;t use the Default values for SMBIOS overriding&#xD;&#xA;                              if smbios.plist doesn&amp;#39;t exist, factory&#xD;&#xA;                              values are kept.&#xD;&#xA;&#xD;&#xA;&#xD;&#xA;  KERNELPlist=&amp;lt;file&amp;gt;        Use an alternate kernel.plist file&#xD;&#xA;                              (default path: /Extra/Kernel.plist&#xD;&#xA;                               bt(0,0)/Extra/kernel.plist).&#xD;&#xA;&#xD;&#xA;  KEXTPlist=&amp;lt;file&amp;gt;          Use an alternate kext.plist file&#xD;&#xA;                              (default path: /Extra/Kext.plist&#xD;&#xA;                               bt(0,0)/Extra/kext.plist).&#xD;&#xA;&#xD;&#xA;  &amp;#34;Scan Single Drive&amp;#34;       Scan the drive only where the booter got loaded from.&#xD;&#xA;    =Yes|No                 Fix rescan issues when using a DVD reader in AHCI mode. &#xD;&#xA;  Rescan=Yes                Enable CD-ROM rescan mode.&#xD;&#xA;  &amp;#34;Rescan Prompt&amp;#34;=Yes       Prompts for enable CD-ROM rescan mode.&#xD;&#xA;  SystemId=&amp;lt;UUID&amp;gt;         Set the system id manually to UUID.&#xD;&#xA;                              Deprecated - Now SMsystemuuid in smbios.plist&#xD;&#xA;                          SMUUID in smbios config (reserved field) isn&amp;#39;t used then.&#xD;&#xA;  SystemType=&amp;lt;n&amp;gt;          Set the system type to n, where n is between 0..6&#xD;&#xA;                          (default=1 Desktop)&#xD;&#xA;  md0=&amp;lt;file&amp;gt;              Load raw img file into memory for use as XNU&amp;#39;s md0&#xD;&#xA;                          ramdisk. /Extra/Postboot.img is used otherwise.&#xD;&#xA; &#xA;&lt;/code&gt;&lt;/pre&gt;</description>
    </item>
    <item>
      <title>黑苹果日记五（USB）</title>
      <link>https://xcdd.pages.dev/blog/2019/2019-05-23-1659/</link>
      <pubDate>Thu, 23 May 2019 16:59:48 +0000</pubDate>
      <guid>https://xcdd.pages.dev/blog/2019/2019-05-23-1659/</guid>
      <description>&lt;p&gt;设定为SMBios中的机型后，该研究一下USB接口的问题了。&lt;/p&gt;&#xA;&lt;p&gt;之前加了USBInjectAll.kext还是有作用的，可以驱动所有USB口。&lt;/p&gt;&#xA;&lt;p&gt;原生的USB驱动文件在以下目录：/S/L/E/IOUSBHostFamily.kext/Contents/PlugIns/AppleUSBEHCIPCI.kext&lt;/p&gt;&#xA;&lt;p&gt;打开下面的Contents/Info.plist，可以找到一堆与机型相关的配置。&lt;/p&gt;&#xA;&lt;p&gt;结合之前部分USB接口能用的现象，反复观察后，认为与下面的内容有关：&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;&amp;lt;key&amp;gt;MacBookPro7,1-EHC1&amp;lt;/key&amp;gt;&#xD;&#xA;&#x9;&#x9;&amp;lt;dict&amp;gt;&#xD;&#xA;&#x9;&#x9;&#x9;&amp;lt;key&amp;gt;CFBundleIdentifier&amp;lt;/key&amp;gt;&#xD;&#xA;&#x9;&#x9;&#x9;&amp;lt;string&amp;gt;com.apple.driver.AppleUSBMergeNub&amp;lt;/string&amp;gt;&#xD;&#xA;&#x9;&#x9;&#x9;&amp;lt;key&amp;gt;IOClass&amp;lt;/key&amp;gt;&#xD;&#xA;&#x9;&#x9;&#x9;&amp;lt;string&amp;gt;AppleUSBMergeNub&amp;lt;/string&amp;gt;&#xD;&#xA;&#x9;&#x9;&#x9;&amp;lt;key&amp;gt;IONameMatch&amp;lt;/key&amp;gt;&#xD;&#xA;&#x9;&#x9;&#x9;&amp;lt;string&amp;gt;EHC1&amp;lt;/string&amp;gt;&#xD;&#xA;&#x9;&#x9;&#x9;&amp;lt;key&amp;gt;IOProviderClass&amp;lt;/key&amp;gt;&#xD;&#xA;&#x9;&#x9;&#x9;&amp;lt;string&amp;gt;AppleUSBEHCIPCI&amp;lt;/string&amp;gt;&#xD;&#xA;&#x9;&#x9;&#x9;&amp;lt;key&amp;gt;IOProviderMergeProperties&amp;lt;/key&amp;gt;&#xD;&#xA;&#x9;&#x9;&#x9;&amp;lt;dict&amp;gt;&#xD;&#xA;&#x9;&#x9;&#x9;&#x9;&amp;lt;key&amp;gt;port-count&amp;lt;/key&amp;gt;&#xD;&#xA;&#x9;&#x9;&#x9;&#x9;&amp;lt;data&amp;gt;&#xD;&#xA;&#x9;&#x9;&#x9;&#x9;BgAAAA==&#xD;&#xA;&#x9;&#x9;&#x9;&#x9;&amp;lt;/data&amp;gt;&#xD;&#xA;&#x9;&#x9;&#x9;&#x9;&amp;lt;key&amp;gt;ports&amp;lt;/key&amp;gt;&#xD;&#xA;&#x9;&#x9;&#x9;&#x9;&amp;lt;dict&amp;gt;&#xD;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&amp;lt;key&amp;gt;PRT1&amp;lt;/key&amp;gt;&#xD;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&amp;lt;dict&amp;gt;&#xD;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&#x9;&amp;lt;key&amp;gt;UsbConnector&amp;lt;/key&amp;gt;&#xD;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&#x9;&amp;lt;integer&amp;gt;0&amp;lt;/integer&amp;gt;&#xD;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&#x9;&amp;lt;key&amp;gt;port&amp;lt;/key&amp;gt;&#xD;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&#x9;&amp;lt;data&amp;gt;&#xD;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&#x9;AQAAAA==&#xD;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&#x9;&amp;lt;/data&amp;gt;&#xD;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&amp;lt;/dict&amp;gt;&#xD;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&amp;lt;key&amp;gt;PRT6&amp;lt;/key&amp;gt;&#xD;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&amp;lt;dict&amp;gt;&#xD;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&#x9;&amp;lt;key&amp;gt;UsbConnector&amp;lt;/key&amp;gt;&#xD;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&#x9;&amp;lt;integer&amp;gt;255&amp;lt;/integer&amp;gt;&#xD;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&#x9;&amp;lt;key&amp;gt;port&amp;lt;/key&amp;gt;&#xD;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&#x9;&amp;lt;data&amp;gt;&#xD;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&#x9;BgAAAA==&#xD;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&#x9;&amp;lt;/data&amp;gt;&#xD;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&amp;lt;/dict&amp;gt;&#xD;&#xA;&#x9;&#x9;&#x9;&#x9;&amp;lt;/dict&amp;gt;&#xD;&#xA;&#x9;&#x9;&#x9;&amp;lt;/dict&amp;gt;&#xD;&#xA;&#x9;&#x9;&#x9;&amp;lt;key&amp;gt;model&amp;lt;/key&amp;gt;&#xD;&#xA;&#x9;&#x9;&#x9;&amp;lt;string&amp;gt;MacBookPro7,1&amp;lt;/string&amp;gt;&#xD;&#xA;&#x9;&#x9;&amp;lt;/dict&amp;gt;&#xD;&#xA;&#x9;&#x9;&amp;lt;key&amp;gt;MacBookPro7,1-EHC2&amp;lt;/key&amp;gt;&#xD;&#xA;&#x9;&#x9;&amp;lt;dict&amp;gt;&#xD;&#xA;&#x9;&#x9;&#x9;&amp;lt;key&amp;gt;CFBundleIdentifier&amp;lt;/key&amp;gt;&#xD;&#xA;&#x9;&#x9;&#x9;&amp;lt;string&amp;gt;com.apple.driver.AppleUSBMergeNub&amp;lt;/string&amp;gt;&#xD;&#xA;&#x9;&#x9;&#x9;&amp;lt;key&amp;gt;IOClass&amp;lt;/key&amp;gt;&#xD;&#xA;&#x9;&#x9;&#x9;&amp;lt;string&amp;gt;AppleUSBMergeNub&amp;lt;/string&amp;gt;&#xD;&#xA;&#x9;&#x9;&#x9;&amp;lt;key&amp;gt;IONameMatch&amp;lt;/key&amp;gt;&#xD;&#xA;&#x9;&#x9;&#x9;&amp;lt;string&amp;gt;EHC2&amp;lt;/string&amp;gt;&#xD;&#xA;&#x9;&#x9;&#x9;&amp;lt;key&amp;gt;IOProviderClass&amp;lt;/key&amp;gt;&#xD;&#xA;&#x9;&#x9;&#x9;&amp;lt;string&amp;gt;AppleUSBEHCIPCI&amp;lt;/string&amp;gt;&#xD;&#xA;&#x9;&#x9;&#x9;&amp;lt;key&amp;gt;IOProviderMergeProperties&amp;lt;/key&amp;gt;&#xD;&#xA;&#x9;&#x9;&#x9;&amp;lt;dict&amp;gt;&#xD;&#xA;&#x9;&#x9;&#x9;&#x9;&amp;lt;key&amp;gt;port-count&amp;lt;/key&amp;gt;&#xD;&#xA;&#x9;&#x9;&#x9;&#x9;&amp;lt;data&amp;gt;&#xD;&#xA;&#x9;&#x9;&#x9;&#x9;BgAAAA==&#xD;&#xA;&#x9;&#x9;&#x9;&#x9;&amp;lt;/data&amp;gt;&#xD;&#xA;&#x9;&#x9;&#x9;&#x9;&amp;lt;key&amp;gt;ports&amp;lt;/key&amp;gt;&#xD;&#xA;&#x9;&#x9;&#x9;&#x9;&amp;lt;dict&amp;gt;&#xD;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&amp;lt;key&amp;gt;PRT1&amp;lt;/key&amp;gt;&#xD;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&amp;lt;dict&amp;gt;&#xD;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&#x9;&amp;lt;key&amp;gt;UsbConnector&amp;lt;/key&amp;gt;&#xD;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&#x9;&amp;lt;integer&amp;gt;255&amp;lt;/integer&amp;gt;&#xD;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&#x9;&amp;lt;key&amp;gt;port&amp;lt;/key&amp;gt;&#xD;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&#x9;&amp;lt;data&amp;gt;&#xD;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&#x9;AQAAAA==&#xD;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&#x9;&amp;lt;/data&amp;gt;&#xD;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&amp;lt;/dict&amp;gt;&#xD;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&amp;lt;key&amp;gt;PRT3&amp;lt;/key&amp;gt;&#xD;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&amp;lt;dict&amp;gt;&#xD;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&#x9;&amp;lt;key&amp;gt;UsbConnector&amp;lt;/key&amp;gt;&#xD;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&#x9;&amp;lt;integer&amp;gt;255&amp;lt;/integer&amp;gt;&#xD;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&#x9;&amp;lt;key&amp;gt;port&amp;lt;/key&amp;gt;&#xD;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&#x9;&amp;lt;data&amp;gt;&#xD;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&#x9;AwAAAA==&#xD;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&#x9;&amp;lt;/data&amp;gt;&#xD;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&amp;lt;/dict&amp;gt;&#xD;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&amp;lt;key&amp;gt;PRT4&amp;lt;/key&amp;gt;&#xD;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&amp;lt;dict&amp;gt;&#xD;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&#x9;&amp;lt;key&amp;gt;UsbConnector&amp;lt;/key&amp;gt;&#xD;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&#x9;&amp;lt;integer&amp;gt;0&amp;lt;/integer&amp;gt;&#xD;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&#x9;&amp;lt;key&amp;gt;port&amp;lt;/key&amp;gt;&#xD;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&#x9;&amp;lt;data&amp;gt;&#xD;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&#x9;BAAAAA==&#xD;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&#x9;&amp;lt;/data&amp;gt;&#xD;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&amp;lt;/dict&amp;gt;&#xD;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&amp;lt;key&amp;gt;PRT5&amp;lt;/key&amp;gt;&#xD;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&amp;lt;dict&amp;gt;&#xD;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&#x9;&amp;lt;key&amp;gt;UsbConnector&amp;lt;/key&amp;gt;&#xD;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&#x9;&amp;lt;integer&amp;gt;255&amp;lt;/integer&amp;gt;&#xD;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&#x9;&amp;lt;key&amp;gt;port&amp;lt;/key&amp;gt;&#xD;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&#x9;&amp;lt;data&amp;gt;&#xD;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&#x9;BQAAAA==&#xD;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&#x9;&amp;lt;/data&amp;gt;&#xD;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&amp;lt;/dict&amp;gt;&#xD;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&amp;lt;key&amp;gt;PRT6&amp;lt;/key&amp;gt;&#xD;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&amp;lt;dict&amp;gt;&#xD;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&#x9;&amp;lt;key&amp;gt;UsbConnector&amp;lt;/key&amp;gt;&#xD;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&#x9;&amp;lt;integer&amp;gt;255&amp;lt;/integer&amp;gt;&#xD;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&#x9;&amp;lt;key&amp;gt;port&amp;lt;/key&amp;gt;&#xD;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&#x9;&amp;lt;data&amp;gt;&#xD;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&#x9;BgAAAA==&#xD;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&#x9;&amp;lt;/data&amp;gt;&#xD;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&amp;lt;/dict&amp;gt;&#xD;&#xA;&#x9;&#x9;&#x9;&#x9;&amp;lt;/dict&amp;gt;&#xD;&#xA;&#x9;&#x9;&#x9;&amp;lt;/dict&amp;gt;&#xD;&#xA;&#x9;&#x9;&#x9;&amp;lt;key&amp;gt;model&amp;lt;/key&amp;gt;&#xD;&#xA;&#x9;&#x9;&#x9;&amp;lt;string&amp;gt;MacBookPro7,1&amp;lt;/string&amp;gt;&#xD;&#xA;&#x9;&#x9;&amp;lt;/dict&amp;gt;&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;其中EHC1和EHC2即是本机的USB控制器名称，在Windows系统下用USBTree工具查看USB设备信息如下：&lt;/p&gt;</description>
    </item>
    <item>
      <title>黑苹果日记四（SMBIOS）</title>
      <link>https://xcdd.pages.dev/blog/2019/2019-05-23-1316/</link>
      <pubDate>Thu, 23 May 2019 13:16:50 +0000</pubDate>
      <guid>https://xcdd.pages.dev/blog/2019/2019-05-23-1316/</guid>
      <description>&lt;p&gt;已知SMBios.plist的设置对于USB驱动有一定帮助，除此之外，这些信息还会展示在关于信息里面。&lt;/p&gt;&#xA;&lt;p&gt;所以有必要了解一下苹果的产品线及其代码。&lt;/p&gt;&#xA;&lt;p&gt;目前苹果电脑产品线包括：iMac、iMacPro、MacPro、MacMini、Macbook、Macbook Air、MacbookPro&lt;/p&gt;&#xA;&lt;p&gt;iMac和iMacPro都是桌面电脑，主机显示器一体机。带Pro表示功能更多，性能更强大。&lt;/p&gt;&#xA;&lt;p&gt;MacMini和MacPro是桌面电脑的主机，不含显示器。带Pro表示功能更多，性能更强大。&lt;/p&gt;&#xA;&lt;p&gt;Macbook 是轻便超薄型笔记本，老款从2006年到2011年就断货了，直到2015年又出了新的Macbook，有点不明白。&lt;/p&gt;&#xA;&lt;p&gt;Macbook Air也是轻便超薄型，使用Intel低主频CPU和集成显卡，和2015年以后的Macbook定位好像是一样的？&lt;/p&gt;&#xA;&lt;p&gt;Macbook Pro则是高性能笔记本了，带Pro表示功能更多，性能更强大。配置高主频CPU和独立显卡。&lt;/p&gt;&#xA;&lt;p&gt;对于不同的机型，苹果提供了相关机型识别，可以查看机型标识符和基本配置信息：&lt;/p&gt;&#xA;&lt;p&gt;iMac： &lt;a href=&#34;https://support.apple.com/zh-cn/HT201634&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;https://support.apple.com/zh-cn/HT201634&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;Mac Pro： &lt;a href=&#34;https://support.apple.com/zh-cn/HT202888&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;https://support.apple.com/zh-cn/HT202888&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;Mac Mini： &lt;a href=&#34;https://support.apple.com/zh-cn/HT201894&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;https://support.apple.com/zh-cn/HT201894&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;Macbook： &lt;a href=&#34;https://support.apple.com/zh-cn/HT201608&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;https://support.apple.com/zh-cn/HT201608&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;Macbook Air： &lt;a href=&#34;https://support.apple.com/zh-cn/HT201862&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;https://support.apple.com/zh-cn/HT201862&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;Macbook Pro： &lt;a href=&#34;https://support.apple.com/zh-cn/HT201300&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;https://support.apple.com/zh-cn/HT201300&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;简单阅览过后发现，一些2010年左右的老机型，最新兼容操作系统写着10.11.6，再新一点的电脑也只兼容10.13.6。&lt;/p&gt;&#xA;&lt;p&gt;看来我的老笔记本估计也只能装10.11.6版本了，2010年的本子差不多都是这个配置。&lt;/p&gt;&#xA;&lt;p&gt;最后觉得Macbook (13寸，2010年中)，部件号：MC516xx/A，标识符为：Macbook7,1&lt;/p&gt;&#xA;&lt;p&gt;还有Macbook Pro (13 英寸, 2010 年中)，部件号：MC374CH/A，标识符为：MacbookPro7,1&lt;/p&gt;&#xA;&lt;p&gt;这两个型号与我的笔记本配置比较相近，连分辨率都是相同的1280*800呢，显卡也是同时代的NV3xxM系列。&lt;/p&gt;&#xA;&lt;p&gt;SMBIOS参考配置如下：&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;&amp;lt;?xml version=&amp;#34;1.0&amp;#34; encoding=&amp;#34;UTF-8&amp;#34;?&amp;gt;&#xD;&#xA;&amp;lt;!DOCTYPE plist PUBLIC &amp;#34;-//Apple//DTD PLIST 1.0//EN&amp;#34; &amp;#34;http://www.apple.com/DTDs/PropertyList-1.0.dtd&amp;#34;&amp;gt;&#xD;&#xA;&amp;lt;plist version=&amp;#34;1.0&amp;#34;&amp;gt;&#xD;&#xA;&amp;lt;dict&amp;gt;&#xD;&#xA;&#x9;&amp;lt;key&amp;gt;SMbiosdate&amp;lt;/key&amp;gt;&#xD;&#xA;&#x9;&amp;lt;string&amp;gt;03/25/10&amp;lt;/string&amp;gt;&#xD;&#xA;&#x9;&amp;lt;key&amp;gt;SMbiosvendor&amp;lt;/key&amp;gt;&#xD;&#xA;&#x9;&amp;lt;string&amp;gt;Apple Inc.&amp;lt;/string&amp;gt;&#xD;&#xA;&#x9;&amp;lt;key&amp;gt;SMbiosversion&amp;lt;/key&amp;gt;&#xD;&#xA;&#x9;&amp;lt;string&amp;gt;MBP71.88Z.0039.B05.1003251322&amp;lt;/string&amp;gt;&#xD;&#xA;&#x9;&amp;lt;key&amp;gt;SMboardproduct&amp;lt;/key&amp;gt;&#xD;&#xA;&#x9;&amp;lt;string&amp;gt;Mac-F222BEC8&amp;lt;/string&amp;gt;&#xD;&#xA;&#x9;&amp;lt;key&amp;gt;SMfamily&amp;lt;/key&amp;gt;&#xD;&#xA;&#x9;&amp;lt;string&amp;gt;MacBook&amp;lt;/string&amp;gt;&#xD;&#xA;&#x9;&amp;lt;key&amp;gt;SMmanufacter&amp;lt;/key&amp;gt;&#xD;&#xA;&#x9;&amp;lt;string&amp;gt;Apple Inc.&amp;lt;/string&amp;gt;&#xD;&#xA;&#x9;&amp;lt;key&amp;gt;SMmanufacturer&amp;lt;/key&amp;gt;&#xD;&#xA;&#x9;&amp;lt;string&amp;gt;Apple Inc.&amp;lt;/string&amp;gt;&#xD;&#xA;&#x9;&amp;lt;key&amp;gt;SMproductname&amp;lt;/key&amp;gt;&#xD;&#xA;&#x9;&amp;lt;string&amp;gt;MacBookPro7,1&amp;lt;/string&amp;gt;&#xD;&#xA;&#x9;&amp;lt;key&amp;gt;SMserial&amp;lt;/key&amp;gt;&#xD;&#xA;&#x9;&amp;lt;string&amp;gt;W80140U3ATM&amp;lt;/string&amp;gt;&#xD;&#xA;&#x9;&amp;lt;key&amp;gt;SMsystemversion&amp;lt;/key&amp;gt;&#xD;&#xA;&#x9;&amp;lt;string&amp;gt;1.0&amp;lt;/string&amp;gt;&#xD;&#xA;&amp;lt;/dict&amp;gt;&#xD;&#xA;&amp;lt;/plist&amp;gt;&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;最后附上网上找到的相关SMBios信息：&lt;/p&gt;</description>
    </item>
    <item>
      <title>nRF52832&#43;FreeRTOS发现一处罕见的死机(HardFalut)问题</title>
      <link>https://xcdd.pages.dev/blog/2019/2019-05-23/</link>
      <pubDate>Thu, 23 May 2019 11:45:24 +0000</pubDate>
      <guid>https://xcdd.pages.dev/blog/2019/2019-05-23/</guid>
      <description>&lt;p&gt;&lt;strong&gt;前言&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;开发nRF52832程序，由于之前的代码是基于裸机程序开发的，使用app_timer和app_sched来调度任务。&lt;/p&gt;&#xA;&lt;p&gt;但由于项目中有一个功能对任务实时性有需求，所以移植了freeRTOS，用一个单独的高优先级线程处理这个高实时性要求的任务。&lt;/p&gt;&#xA;&lt;p&gt;为了提高代码复用性，尽量不改动现有的基于app_timer机制的代码。&lt;/p&gt;&#xA;&lt;p&gt;所以在freeRTOS环境下，要实现app_timer和app_sched的功能，nodic的SDK中已经有了app_timer_freertos.c。&lt;/p&gt;&#xA;&lt;p&gt;但app_sched模块还没有，所以需要自行实现这个模块，可以创建一个低优先级线程和一个队列来实现此功能。&lt;/p&gt;&#xA;&lt;p&gt;官方提供的app_time_freertos并没有使用app_timer_appsh，这样一来app_timer和app_sched处于不同的工作线程，&lt;/p&gt;&#xA;&lt;p&gt;app_timer的回调函数和app_sched的回调函数存在竞争风险，因此需要修改app_time_freertos，使其调用app_timer_appsh模块。&lt;/p&gt;&#xA;&lt;p&gt;由app_timer_appsh模块把定时器事件放入app_sched来调用。&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;正文&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;好了，大功告成，原先的代码基本不用修改，就能在freeRTOS下面运行了。&lt;/p&gt;&#xA;&lt;p&gt;然而，程序刚运行就出现了HardFault，只好打开DEBUG寻找原因。&lt;/p&gt;&#xA;&lt;p&gt;发现代码最后死在了app_timer_appsh.c里面，这里面代码很少，先帖上来。&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;#include &amp;#34;app_timer_appsh.h&amp;#34;&#xD;&#xA;#include &amp;#34;app_scheduler.h&amp;#34;&#xD;&#xA;&#xD;&#xA;static void app_timer_evt_get(void * p_event_data, uint16_t event_size)&#xD;&#xA;{&#xD;&#xA;    app_timer_event_t * p_timer_event = (app_timer_event_t *)p_event_data;&#xD;&#xA;&#xD;&#xA;    APP_ERROR_CHECK_BOOL(event_size == sizeof(app_timer_event_t));&#xD;&#xA;    p_timer_event-&amp;gt;timeout_handler(p_timer_event-&amp;gt;p_context);&#xD;&#xA;}&#xD;&#xA;&#xD;&#xA;uint32_t app_timer_evt_schedule(app_timer_timeout_handler_t timeout_handler,&#xD;&#xA;                                void *                      p_context)&#xD;&#xA;{&#xD;&#xA;    app_timer_event_t timer_event;&#xD;&#xA;&#xD;&#xA;    timer_event.timeout_handler = timeout_handler;&#xD;&#xA;    timer_event.p_context       = p_context;&#xD;&#xA;&#xD;&#xA;    return app_sched_event_put(&amp;amp;timer_event, sizeof(timer_event), app_timer_evt_get);&#xD;&#xA;}&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;问题就出在app_timer_evt_get这个函数，以为是指针错误？指针越界？长度错误？指针指向的内存数据不正确？&lt;/p&gt;&#xA;&lt;p&gt;NO！ NO！NO！  都不是！！！&lt;/p&gt;&#xA;&lt;p&gt;这里的参数p_event_data和下面app_timer_evt_schedule保存进去的内容是完全一致的，没有任何问题。&lt;/p&gt;&#xA;&lt;p&gt;通过查看反汇编代码，单步跟踪运行，发现最后程序在执行LDRD指令的时候，直接就挂了。如下图：&lt;/p&gt;&#xA;&lt;p&gt;&lt;img src=&#34;./097_1.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;反复测试，都是死在LDRD这条指令上面。&lt;/p&gt;&#xA;&lt;p&gt;而LDRD指令是干什么的呢？&lt;/p&gt;&#xA;&lt;p&gt;它是一条加载64位数据的指令。&lt;/p&gt;&#xA;&lt;p&gt;如图中所示：LDRD r1,r0,[r6,#0]。&lt;/p&gt;&#xA;&lt;p&gt;表示从R6+0这个地址加载一个64位的整数，并把低32位放入R1，高32位放入R0。&lt;/p&gt;&#xA;&lt;p&gt;R6是p_timer_event，是个结构体指针，这个结构体刚好是8字节（64位），&lt;/p&gt;&#xA;&lt;p&gt;低32位就是函数指针p_timer_event-&amp;gt;timeout_handler。&lt;/p&gt;</description>
    </item>
    <item>
      <title>黑苹果日记三（驱动）</title>
      <link>https://xcdd.pages.dev/blog/2019/2019-05-22/</link>
      <pubDate>Wed, 22 May 2019 16:55:13 +0000</pubDate>
      <guid>https://xcdd.pages.dev/blog/2019/2019-05-22/</guid>
      <description>&lt;p&gt;继上次解决了USB和有线网卡的问题后，又继续找资料尝试解决显卡，声卡，无线网卡的问题。&lt;/p&gt;&#xA;&lt;p&gt;一、由于无线网卡是BCM43XX，且设备ID为PCI：14E4：4727&lt;/p&gt;&#xA;&lt;p&gt;据说目前全球无解，所以只好放弃了。&lt;/p&gt;&#xA;&lt;p&gt;二、声卡也是IDT 92HD81B1C5系列，设备ID为 PCI：111D：76D5&lt;/p&gt;&#xA;&lt;p&gt;好像也很难搞，最后用万能声卡驱动VoodooHDA了，声音很小，耳机声音正常，但是无法正常调节音量。&lt;/p&gt;&#xA;&lt;p&gt;直接把VoodooHDA.kext放到EE目录没有驱动成功。&lt;/p&gt;&#xA;&lt;p&gt;后来找到VoodooHDA的MAC版的安装程序，自动安装完成的，还附带了几个PCI工具和HWmonitor。&lt;/p&gt;&#xA;&lt;p&gt;三、显卡是NVS3100M，设备ID为PCI：10DE：0A6C&lt;/p&gt;&#xA;&lt;p&gt;这个显卡好像可以免驱？但是我这边确又驱动不正常。&lt;/p&gt;&#xA;&lt;p&gt;在变色友配置里开启GraphicsEnabler=Yes，进入系统可以看到正确地识别出了显卡型号，但是还是没有驱动上。&lt;/p&gt;&#xA;&lt;p&gt;在EE目录添加NVEnabler64.kext，没有任何作用。&lt;/p&gt;&#xA;&lt;p&gt;回头想想好像NV的显卡驱动不是被我删除了么？&lt;/p&gt;&#xA;&lt;p&gt;SLE目录下面没有NV开头的文件，所以找回这些文件放回SLE重启，还是一样。&lt;/p&gt;&#xA;&lt;p&gt;折腾了很久，没有成功。最后打算重新安装一次系统。&lt;/p&gt;&#xA;&lt;p&gt;这次在安装的时候不删除NV的驱动，开启变色龙的GraphicsEnabler=Yes，哈哈可以正常进入安装界面，显卡自动驱动上了。&lt;/p&gt;&#xA;&lt;p&gt;哈哈哈，这真是太好了，进入系统后不会滚屏了，屏保也能正常使用了。感觉驱动是正常了。666！&lt;/p&gt;</description>
    </item>
    <item>
      <title>黑苹果日记二（驱动）</title>
      <link>https://xcdd.pages.dev/blog/2019/2019-05-21/</link>
      <pubDate>Tue, 21 May 2019 17:48:14 +0000</pubDate>
      <guid>https://xcdd.pages.dev/blog/2019/2019-05-21/</guid>
      <description>&lt;p&gt;继上一次安装黑苹果(10.11懒人版)成功进入桌面后，除了笔记本内置的键盘和触摸板以外，其它任何驱动都没有成功。&lt;/p&gt;&#xA;&lt;p&gt;没有声音，没有网络，没有USB，没有显卡！&lt;/p&gt;&#xA;&lt;p&gt;更严重的是每次重启，发现电脑的BIOS设置被重置了， 这个感觉很严重。&lt;/p&gt;&#xA;&lt;p&gt;上网爬各种帖子，寻找解决方案。&lt;/p&gt;&#xA;&lt;p&gt;终于解决了一些问题：&lt;/p&gt;&#xA;&lt;p&gt;一，重置BIOS的问题&lt;/p&gt;&#xA;&lt;p&gt;上网找ElliottForceLegacyRTC.kext放到EE目录，由变色龙注入到系统。解决BIOS重置的问题。&lt;/p&gt;&#xA;&lt;p&gt;二、板载intel有线网卡驱动&lt;/p&gt;&#xA;&lt;p&gt;上网找到IntelMausiEthernet.kext放到EE目录，重启电脑发现有线网卡可以用了！&lt;/p&gt;&#xA;&lt;p&gt;三，USB驱动&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;上网找了USBInjectAll.kext，放到EE目录，没有作用。&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;p&gt;2.修改变色龙配置，USBBusFix=Yes，没有作用。&lt;/p&gt;&#xA;&lt;p&gt;3.听说要修改DSDT，于是又找了DSDT的软件，找到电脑的USB接口信息，命名为EHC1和EHC1，好像没有问题？&lt;/p&gt;&#xA;&lt;p&gt;4.继续找帖子，说USB2.0驱动，可以修改以下驱动文件的信息：&lt;/p&gt;&#xA;&lt;p&gt;/System/Library/Extensions/IOUSBHostFamily.kext/Contents/PlugIns/AppleUSBEHCIPCI.kext/Contents/Info.plist&lt;/p&gt;&#xA;&lt;p&gt;研究了一下这个文件，找到了一些关于USB接口的描述，好像与机型有关，&lt;/p&gt;&#xA;&lt;p&gt;这个机型设置来源于变色龙的配置文件smbios.plist，默认机型是iMac14,1，而这个机型对应的USB接口描述好像是空的。&lt;/p&gt;&#xA;&lt;p&gt;于是修改机型为Macpro5,1，重启系统，发现USB鼠标竟然可以动了，真是惊喜！&lt;/p&gt;&#xA;&lt;p&gt;测试了一下笔记本的所有USB接口设备都能用，就连USB蓝牙，USB读卡器也都驱动了，真是太好了！！！&lt;/p&gt;&#xA;&lt;p&gt;5.USBInjectAll.kext到底有没有作用呢，删除这个文件，再重启电脑，发现只有一部分USB口可以用。&lt;/p&gt;&#xA;&lt;p&gt;6.把变色龙配置USBBusFix改为No看看，和第5点一样，说明这个修改这个配置项对我的笔记本是无效的。&lt;/p&gt;&#xA;&lt;p&gt;四、声卡，显卡，无线网卡还有没成功，待续。。。&lt;/p&gt;</description>
    </item>
    <item>
      <title>黑苹果日记（安装）</title>
      <link>https://xcdd.pages.dev/blog/2019/2019-05-20/</link>
      <pubDate>Mon, 20 May 2019 16:03:59 +0000</pubDate>
      <guid>https://xcdd.pages.dev/blog/2019/2019-05-20/</guid>
      <description>&lt;p&gt;2010年的闲置老笔记本，用来试试能不能装个黑苹果，在此记录一下安装笔记。&lt;/p&gt;&#xA;&lt;p&gt;CPU: intel i3-380m&lt;/p&gt;&#xA;&lt;p&gt;主板：HM55&lt;/p&gt;&#xA;&lt;p&gt;RAM:4GB DDR3&lt;/p&gt;&#xA;&lt;p&gt;GPU: Nvidia NVS3100M&lt;/p&gt;&#xA;&lt;p&gt;LCD:1280*800&lt;/p&gt;&#xA;&lt;p&gt;从零开始：&lt;/p&gt;&#xA;&lt;p&gt;最开始听说MAC OS只能用EFI和GPT，后来知道MBR也可以，要用懒人版CDR镜像。&lt;/p&gt;&#xA;&lt;p&gt;尽量用懒人版镜像吧，安装会简单得多！&lt;/p&gt;&#xA;&lt;p&gt;引导方式有两种，一种是变色龙（Chameleon）,另一种是四叶草(Clover)。&lt;/p&gt;&#xA;&lt;p&gt;MBR引导建议用变色龙单，UEFI引导建议用四叶草。&lt;/p&gt;&#xA;&lt;p&gt;四叶草配置复杂，变色龙配置简单。&lt;/p&gt;&#xA;&lt;p&gt;CDR镜像可以用7zip打开，可以看到里面有一个Extra目录，下面有org.chameleon.Boot.plist和Extensions目录&lt;/p&gt;&#xA;&lt;p&gt;Extensions目录下面存放了FakeSMC.kext等一些外置驱动，这是黑苹果必须的文件。&lt;/p&gt;&#xA;&lt;p&gt;/Extra/Extensions目录被大家简称为EE目录，这是引导器注入到系统的驱动。&lt;/p&gt;&#xA;&lt;p&gt;/System/Library/Extensions目录被简称为SLE目录，这是苹果官方的驱动。&lt;/p&gt;&#xA;&lt;p&gt;变色龙引导：&lt;/p&gt;&#xA;&lt;p&gt;变色龙的引导程序就是wowpc.iso，需要使用grub4dos来启动，如何引导grldr就不说了，&lt;/p&gt;&#xA;&lt;p&gt;说一下变色龙的启动命令，一般添加到menu.lst中&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;map /wowpc.iso (hd32)&#xD;&#xA;map --hook&#xD;&#xA;chainloader (hd32)&#xD;&#xA;boot&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;变色龙启动后，它会搜索系统硬盘，找出可以引导的磁盘，包括Windows,Linux,MAC OS X系统。&lt;/p&gt;&#xA;&lt;p&gt;制作黑苹果安装盘：&lt;/p&gt;&#xA;&lt;p&gt;MAC OS使用的文件系统是HFS+，并不能在Windows中直接访问，但可以用一些工具来实现。&lt;/p&gt;&#xA;&lt;p&gt;HFS+ for windows: 这个工具可以使Windows识别到HFS文件系统的磁盘，很有用，安装过程中需要用它来删除/增加文件。&lt;/p&gt;&#xA;&lt;p&gt;TransMac.exe: 这个工具是用来制作U盘安装盘的，它可以把dmg和cdr镜像写入U盘，从U盘中安装黑苹果。&lt;/p&gt;&#xA;&lt;p&gt;安装过程中可能出现Still waiting for root device!， 因为没有USB驱动的情况下，识别不到这个U盘。&lt;/p&gt;&#xA;&lt;p&gt;ddmac.exe:这个工具是用来制作硬盘安装盘的，它可以把dmg和cdr镜像写入硬盘的某个分区，不破坏硬盘的原有分区。&lt;/p&gt;&#xA;&lt;p&gt;需要注意写完镜像后，检查分区标识是否成功修改为AF，没有的话要自己手动修改一下。&lt;/p&gt;&#xA;&lt;p&gt;推荐使用硬盘安装！&lt;/p&gt;&#xA;&lt;p&gt;安装系统前准备工作：&lt;/p&gt;&#xA;&lt;p&gt;制作好硬盘镜像后，要用HFS+工具读取该磁盘的文件内容：&lt;/p&gt;&#xA;&lt;p&gt;一定要检查EE目录是否有以下文件：&lt;/p&gt;&#xA;&lt;p&gt;FakeSMC.kext 黑苹果核心文件。&lt;/p&gt;&#xA;&lt;p&gt;VoodooPS2Controller.kext 笔记本内置键盘和触摸板的驱动，否则进入安装界面也操作不了。&lt;/p&gt;&#xA;&lt;p&gt;USBInjectAll.kext 据说可以驱动大部分电脑的USB端口。&lt;/p&gt;&#xA;&lt;p&gt;一定要检查SLE目录要删除以下文件：&lt;/p&gt;&#xA;&lt;p&gt;AMD开头&lt;/p&gt;&#xA;&lt;p&gt;NV开头&lt;/p&gt;&#xA;&lt;p&gt;AppleThunderbolt*&lt;/p&gt;&#xA;&lt;p&gt;AppleIntelCPUPower*&lt;/p&gt;&#xA;&lt;p&gt;AppleIntelGraphics*&lt;/p&gt;&#xA;&lt;p&gt;开始安装：&lt;/p&gt;&#xA;&lt;p&gt;重启电脑，进入变色龙，选择最后面的那个苹果标志的磁盘，因为第一个是假的，启动不了的。&lt;/p&gt;</description>
    </item>
    <item>
      <title>JLinkARM.dll部分导出函数定义</title>
      <link>https://xcdd.pages.dev/blog/2019/2019-05-06/</link>
      <pubDate>Mon, 06 May 2019 11:41:17 +0000</pubDate>
      <guid>https://xcdd.pages.dev/blog/2019/2019-05-06/</guid>
      <description>&lt;p&gt;JLink未对个人开放软件开发接口(SDK)，无法进行二次开发，但通过研究发现，大部分接口都在JLinkARM.dll中实现。&lt;/p&gt;&#xA;&lt;p&gt;JLinkARM是JLink调试器对ARM系列CPU的JTAG/SWD访问接口。&lt;/p&gt;&#xA;&lt;p&gt;有了JLinkARM.dll的函数接口，我们就可以利用它进行2次开发，实现一些特定的功能，比如自定义烧录工具等。&lt;/p&gt;&#xA;&lt;p&gt;以下是导出函数的原型（部分）：&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-cpp&#34; data-lang=&#34;cpp&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;//JLINK TIF&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;#define JLINK_TIF_JTAG          0&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;#define JLINK_TIF_SWD           1&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;//RESET TYPE&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;#define JLINK_RESET_TYPE_NORMAL 0&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;#define JLINK_RESET_TYPE_CORE   1&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;#define JLINK_RESET_TYPE_PIN    2&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;//REGISTER INDEX&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;/* &#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;  0 - 15     R0 - R15(SP=R13, PC=R15)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt; 16          XPSR&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt; 17          MSP&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt; 18          PSP&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt; 19          RAZ&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt; 20          CFBP&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt; 21          APSR&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt; 22          EPSR&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt; 23          IPSR&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt; 24          PRIMASK&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt; 25          BASEPRI&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt; 26          FAULTMASK&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt; 27          CONTROL &#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt; 28          BASEPRI_MAX&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt; 29          IAPSR&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt; 30          EAPSR&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt; 31          IEPSR&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt; */&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;void&lt;/span&gt;  (WINAPI &lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;JLINK_SetLogFile)(&lt;span style=&#34;color:#66d9ef&#34;&gt;char&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;file);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;DWORD (WINAPI &lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;JLINK_GetDLLVersion)(&lt;span style=&#34;color:#66d9ef&#34;&gt;void&lt;/span&gt;);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;DWORD (WINAPI &lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;JLINK_GetHardwareVersion)(&lt;span style=&#34;color:#66d9ef&#34;&gt;void&lt;/span&gt;);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;DWORD (WINAPI &lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;JLINK_GetFirmwareString)(&lt;span style=&#34;color:#66d9ef&#34;&gt;char&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;buff, &lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt; count);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;DWORD (WINAPI &lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;JLINK_GetSN)(&lt;span style=&#34;color:#66d9ef&#34;&gt;void&lt;/span&gt;);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;BOOL  (WINAPI &lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;JLINK_ExecCommand)(&lt;span style=&#34;color:#66d9ef&#34;&gt;char&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt; cmd, &lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt; a, &lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt; b);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;DWORD (WINAPI &lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;JLINK_TIF_Select)(&lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt; type);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;void&lt;/span&gt;  (WINAPI &lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;JLINK_SetSpeed)(&lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt; speed);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;DWORD (WINAPI &lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;JLINK_GetSpeed)(&lt;span style=&#34;color:#66d9ef&#34;&gt;void&lt;/span&gt;);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;DWORD (WINAPI &lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;JLINK_GetId)(&lt;span style=&#34;color:#66d9ef&#34;&gt;void&lt;/span&gt;);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;DWORD (WINAPI &lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;JLINK_GetDeviceFamily)(&lt;span style=&#34;color:#66d9ef&#34;&gt;void&lt;/span&gt;);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;BOOL  (WINAPI &lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;JLINK_Open)(&lt;span style=&#34;color:#66d9ef&#34;&gt;void&lt;/span&gt;);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;void&lt;/span&gt;  (WINAPI &lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;JLINK_Close)(&lt;span style=&#34;color:#66d9ef&#34;&gt;void&lt;/span&gt;);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;BOOL  (WINAPI &lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;JLINK_IsOpen)(&lt;span style=&#34;color:#66d9ef&#34;&gt;void&lt;/span&gt;);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;BOOL  (WINAPI &lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;JLINK_Connect)(&lt;span style=&#34;color:#66d9ef&#34;&gt;void&lt;/span&gt;);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;BOOL  (WINAPI &lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;JLINK_IsConnected)(&lt;span style=&#34;color:#66d9ef&#34;&gt;void&lt;/span&gt;);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt;   (WINAPI &lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;JLINK_Halt)(&lt;span style=&#34;color:#66d9ef&#34;&gt;void&lt;/span&gt;);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;BOOL  (WINAPI &lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;JLINK_IsHalted)(&lt;span style=&#34;color:#66d9ef&#34;&gt;void&lt;/span&gt;);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;void&lt;/span&gt;  (WINAPI &lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;JLINK_SetResetType)(&lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt; type);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;void&lt;/span&gt;  (WINAPI &lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;JLINK_Reset)(&lt;span style=&#34;color:#66d9ef&#34;&gt;void&lt;/span&gt;);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;void&lt;/span&gt;  (WINAPI &lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;JLINK_Go)(&lt;span style=&#34;color:#66d9ef&#34;&gt;void&lt;/span&gt;);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;void&lt;/span&gt;  (WINAPI &lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;JLINK_GoIntDis)(&lt;span style=&#34;color:#66d9ef&#34;&gt;void&lt;/span&gt;);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;DWORD (WINAPI &lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;JLINK_ReadReg)(&lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt; index);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt;   (WINAPI &lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;JLINK_WriteReg)(&lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt; index, DWORD data);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt;   (WINAPI &lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;JLINK_ReadMem)(DWORD addr, &lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt; len, &lt;span style=&#34;color:#66d9ef&#34;&gt;void&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;buf);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt;   (WINAPI &lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;JLINK_WriteMem)(DWORD addr, &lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt; len, &lt;span style=&#34;color:#66d9ef&#34;&gt;void&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;buf);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt;   (WINAPI &lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;JLINK_WriteU8)(DWORD addr, BYTE data);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt;   (WINAPI &lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;JLINK_WriteU16)(DWORD addr, WORD data);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt;   (WINAPI &lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;JLINK_WriteU32)(DWORD addr, DWORD data);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt;   (WINAPI &lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;JLINK_EraseChip)(&lt;span style=&#34;color:#66d9ef&#34;&gt;void&lt;/span&gt;);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt;   (WINAPI &lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;JLINK_DownloadFile)(LPCSTR file, DWORD addr);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;void&lt;/span&gt;  (WINAPI &lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;JLINK_BeginDownload)(&lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt; index);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;void&lt;/span&gt;  (WINAPI &lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;JLINK_EndDownload)(&lt;span style=&#34;color:#66d9ef&#34;&gt;void&lt;/span&gt;);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;之所以定义成函数指针，是为了使用Windows API函数GetProcAddress来获取该函数的地址。&lt;/p&gt;</description>
    </item>
    <item>
      <title>不安装iTunes实现USB数据线与电脑传文件</title>
      <link>https://xcdd.pages.dev/blog/2019/2019-04-30/</link>
      <pubDate>Tue, 30 Apr 2019 17:22:57 +0000</pubDate>
      <guid>https://xcdd.pages.dev/blog/2019/2019-04-30/</guid>
      <description>&lt;p&gt;苹果手机需要安装iTunes才能与其设备进行USB通信，诸如查看设备信息，管理联系人，管理照片，管理应用程序等众多功能。&lt;/p&gt;&#xA;&lt;p&gt;但iTunes软件在Windows上使用体验极度不好，况且大部分情况下，安装iTunes只是为了用USB向手机传文件。&lt;/p&gt;&#xA;&lt;p&gt;说到USB传文件，还必须要手机内的APP开放了文件共享权限，才能通过iTunes访问应用程序内的文件数据。&lt;/p&gt;&#xA;&lt;p&gt;其传输速度在USB 2.0的电脑上，可以达到20－25MB/s，用来传下载好的电影还算不错。&lt;/p&gt;&#xA;&lt;p&gt;另外，其实只是传文件的话，国产软件iTools、爱思助手等软件使用其来更加方便，但是它们依然需要调用iTunes提供的接口，&lt;/p&gt;&#xA;&lt;p&gt;因此必须要在电脑上安装iTunes相关的组件，才能实现USB通信。&lt;/p&gt;&#xA;&lt;p&gt;但是安装iTunes会在系统里创建无数个开机自启服务，安装包体积也是足够臃肿，实在有点不舒服。&lt;/p&gt;&#xA;&lt;p&gt;解开iTunes的安装包，还会发现它内部其实要安装以下四个程序组件，分别是：&lt;/p&gt;&#xA;&lt;p&gt;1.AppleApplicationSupport.msi（41MB） 苹果软件支持组件，为苹果其它软件提供运行环境。&lt;/p&gt;&#xA;&lt;p&gt;2.AppleMobileDeviceSupport.msi（10MB） 苹果设备支持组件，包含USB驱动和一堆设备通信相关工具。&lt;/p&gt;&#xA;&lt;p&gt;3.Bonjour.msi（2MB）苹果为基于组播域名服务(multicast DNS)的开放性零设置网络。&lt;/p&gt;&#xA;&lt;p&gt;4.iTunes.msi（73MB）iTunes应用程序。&lt;/p&gt;&#xA;&lt;p&gt;实际上只需要安装1和2就可以实现用iTools和爱思助手来管理苹果手机了。&lt;/p&gt;&#xA;&lt;p&gt;即使只安装1和2，还是会增加好几个开机服务，你可以在任务管理器进程列表里看到它们的身影。&lt;/p&gt;&#xA;&lt;p&gt;对于强迫症患者来说，还是有点不可接受，难道就没有比这更简洁的办法了吗？&lt;/p&gt;&#xA;&lt;p&gt;答案是有的！&lt;/p&gt;&#xA;&lt;p&gt;主要实现方法还是要靠手机里的文件管理类APP，比如Documents、MFiles等支持HTTP,FTP方式传文件的软件。&lt;/p&gt;&#xA;&lt;p&gt;这类手机APP还可以对文件进行重命名，压缩，解压等操作，然后再通过APP内分享文件的方式，导入到其它APP里！&lt;/p&gt;&#xA;&lt;p&gt;并且HTTP和FTP方式都不需要在电脑上安装任何软件就可以实现双向通信，可以说是非常简洁了，简直就是强迫症的福音！&lt;/p&gt;&#xA;&lt;p&gt;使用方法也很简单，只要手机和电脑连接同一个WIFI就能通信，如果此地没有WIFI可用，那么还可以使用手机开个热点，或者电脑开热点的方法制造WIFI，最后打开手机上的APP，在电脑上用浏览器输入对应的IP地址和端口就可以了！&lt;/p&gt;&#xA;&lt;p&gt;然而，这个方法的弊端还是很明显:&lt;/p&gt;&#xA;&lt;p&gt;第一、如果电脑没有无线网卡，连接不了WIFI，那就不行了。&lt;/p&gt;&#xA;&lt;p&gt;第二、使用WIFI的通信速度远不如USB传输，在2.4G WIFI环境下大概只有1－2MB/s的速度，传大文件效率很低。&lt;/p&gt;&#xA;&lt;p&gt;那么有没有用USB又不安装iTunes的方法呢？&lt;/p&gt;&#xA;&lt;p&gt;答案是有的！&lt;/p&gt;&#xA;&lt;p&gt;那是因为苹果手机开热点，不仅可以开WIFI热点，还可以开一个USB热点！&lt;/p&gt;&#xA;&lt;p&gt;当你用USB连接电脑的时候打开手机热点，你有没有发现电脑上会出现一个Apple Mobile Device Ethernet的网卡呢？&lt;/p&gt;&#xA;&lt;p&gt;如果你的电脑没有联网，可以用这种方式，实现手机流量共享到电脑上网，这个时候电脑和手机之间建立了一个内部局域网，这个时候你打开手机上的MFiles，网页传文件可以发现，和连接WIFI一样的效果，但是这次是建立在USB之上的网络连接。&lt;/p&gt;&#xA;&lt;p&gt;再试一下文件传输，速度可以达到12MB/s，虽然比起原生的20MB/s还有点差距，但是比WIFI速度快了近10倍，传一些电视剧也够用了。&lt;/p&gt;&#xA;&lt;p&gt;但是电脑上要识别到Apple Mobile Device Ethernet这个网卡，还是要靠iTunes提供的USB驱动才行。&lt;/p&gt;&#xA;&lt;p&gt;所以我尝试把iTunes的USB驱动给提取出来，我就是不想安装完整的iTunes，最后发现原来仅仅8个文件就足够了！&lt;/p&gt;&#xA;&lt;p&gt;完全不需要安装完整的iTunes，不给系统增加任何负担，不会在任务管理器看到任何多余的进程。&lt;/p&gt;&#xA;&lt;p&gt;nice!!!&lt;/p&gt;&#xA;&lt;p&gt;＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝&lt;/p&gt;&#xA;&lt;p&gt;提取USB驱动的方法：&lt;/p&gt;&#xA;&lt;p&gt;1.解开iTunes安装包得到4个msi文件&lt;/p&gt;&#xA;&lt;p&gt;2.解开AppleMobileDeviceSupport.msi&lt;/p&gt;&#xA;&lt;p&gt;3.找到以下8个文件：usbaapl.inf，usbaapl.sys，usbaapl.inf.cat，usbaaplrc.dll，netaapl.inf，netaapl.sys，netaapl.cat，WdfCoInstaller01009.dll&lt;/p&gt;&#xA;&lt;p&gt;4.插入苹果USB数据线，打开电脑的设备管理器，在便携设备下面找到Apple设备，右键更新驱动程序，路径选择usbaapl.inf所在的目录即可。&lt;/p&gt;&#xA;&lt;p&gt;最后提供我提取的USB驱动32位系统适用：&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://download.csdn.net/download/qq446252221/11153774&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;https://download.csdn.net/download/qq446252221/11153774&lt;/a&gt;&lt;/p&gt;</description>
    </item>
    <item>
      <title>C语言实现的简易FTP客户端</title>
      <link>https://xcdd.pages.dev/blog/2019/2019-04-19/</link>
      <pubDate>Fri, 19 Apr 2019 10:03:10 +0000</pubDate>
      <guid>https://xcdd.pages.dev/blog/2019/2019-04-19/</guid>
      <description>&lt;p&gt;为了从FTP服务器下载文件，需要要实现一个简单的FTP客户端。&lt;/p&gt;&#xA;&lt;p&gt;FTP（文件传输协议） 是 TCP/IP 协议组中的应用层协议。&lt;/p&gt;&#xA;&lt;p&gt;FTP协议使用字符串格式命令字，每条命令都是一行字符串，以“\r\n”结尾。&lt;/p&gt;&#xA;&lt;p&gt;客户端发送格式是：命令+空格+参数+&amp;quot;\r\n&amp;quot;的格式&lt;/p&gt;&#xA;&lt;p&gt;服务器返回格式是以：状态码+空格+提示字符串+&amp;quot;\r\n&amp;quot;的格式，代码只要解析状态码就可以了。&lt;/p&gt;&#xA;&lt;p&gt;读写文件需要登陆服务器，特殊用户名：anonymous，表示匿名。注意大小写敏感。&lt;/p&gt;&#xA;&lt;p&gt;从FTP服务器下载文件的基本流程如下：&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;建立TCP连接，该协议默认使用21端口，当然可以指定其它端口，取决于服务器的配置。&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;连接成功之后，服务器会发送一行欢迎文字，例如：220 welcome.&#xA;其中左边的数字220表示就绪状态，220后面有一个空格，空格后面是提示文字。&#xA;在解析命令应答的时候，只需要获取前面的数字即可。&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;收到欢迎信息后，就要开始登陆了，先用USER命令发送用户名，服务器返回331状态。&#xA;然后再用PASS命令发送登陆密码，服务器返回530表示密码错误，返回230表示密码正确。&#xA;发送：USER anonymous&#xA;接收：331 Anonymous login ok, send your complete email address as your password&#xA;发送：PASS anonymous&#xA;接收：230 Anonymous access granted, restrictions apply&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;登陆成功之后，再发送一条TYPE I命令，进入二进制模式，这样获取文件数据的时候，就会以二进制字节流发送。&#xA;避免以ASCII码格式发送文件数据。&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;获取文件长度&#xA;发送：SIZE /path/filename&#xA;失败：550 /path/filename: No such file or directory&#xA;成功：213 [filesize]&#xA;返回[filesize]是十进制数字，表示该文件在大小，字节为单位&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;下载文件&#xA;下载文件前，先发送PASV命令，进入被动模式，这样FTP服务器就会开放一个新的端口，用于接收文件数据。&#xA;客户端成功连接到这个数据端口后，再发送RETR命令请求下载文件，这时文件数据就会从新的端口发送过来，文件传输完毕，服务器自动关闭数据端口。&#xA;发送：PASV&#xA;接收：227 Entering Passive Mode (145,24,145,107,207,235).&#xA;后面括号内的5个数字，分别表示IP地址和端口号，端口号分为高8位和低8位，高8位在前&#xA;这里的例子表示IP地址为145.24.145.107，端口号为53227(计算公式：207 * 256 + 235)。&lt;/p&gt;</description>
    </item>
    <item>
      <title>Windows 7精简版(2019.04.10)</title>
      <link>https://xcdd.pages.dev/blog/2019/2019-04-10/</link>
      <pubDate>Wed, 10 Apr 2019 14:15:48 +0000</pubDate>
      <guid>https://xcdd.pages.dev/blog/2019/2019-04-10/</guid>
      <description>&lt;p&gt;前一次制作的精简版Windows7运行了2个月，基本功能正常，可以稳定使用，并没有发现会影响使用的错误。&lt;/p&gt;&#xA;&lt;p&gt;只有两个小问题，在此重新发布一个安装文件。&lt;/p&gt;&#xA;&lt;p&gt;1.添加了verdana字体；Visual Assist的安装程序使用了此字体。&lt;/p&gt;&#xA;&lt;p&gt;2.添加snmp组件；缺少此组件无法运行arp命令。&lt;/p&gt;&#xA;&lt;p&gt;3.删除\Windows\System32\zh-cn\Licenses文件夹，节省7MB空间。&lt;/p&gt;&#xA;&lt;p&gt;4.替换\Program Files\Windows Mail\msoe.dll为Vista版本，可以正常使用Win7自带的邮件系统。&lt;/p&gt;&#xA;&lt;p&gt;下载地址： &lt;a href=&#34;https://pan.baidu.com/s/1fqAgg5ClT6riEhjPmGpjAQ&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;https://pan.baidu.com/s/1fqAgg5ClT6riEhjPmGpjAQ&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;提取码：8k6y&lt;/p&gt;&#xA;&lt;p&gt;安装方法：&lt;/p&gt;&#xA;&lt;p&gt;安装镜像使用Wim压缩方式打包，安装的时候，把C盘格式化，然后用GImageX解开此文件到C盘，重启电脑即可。&lt;/p&gt;</description>
    </item>
    <item>
      <title>[初学python]表格文件读写操作</title>
      <link>https://xcdd.pages.dev/blog/2019/2019-04-09-1732/</link>
      <pubDate>Tue, 09 Apr 2019 17:32:57 +0000</pubDate>
      <guid>https://xcdd.pages.dev/blog/2019/2019-04-09-1732/</guid>
      <description>&lt;p&gt;原生python并没有自带excel操作的类库，需要安装第三方类库xlrd和xlwt&lt;/p&gt;&#xA;&lt;p&gt;安装方法：&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;pip install xlrd&#xD;&#xA;pip install xlwt&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;一个Excel文件叫作一个Workbook，一个Workbook包含若干个工作表(sheet)，&lt;/p&gt;&#xA;&lt;p&gt;一个工作表包含若干行和列，对其中的单元格(cell)可以进行读写操作。&lt;/p&gt;&#xA;&lt;p&gt;以下是测试程序：&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-python&#34; data-lang=&#34;python&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;#测试读写excel文件&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;#需要安装xlrd和xlwt&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;import&lt;/span&gt; xlrd&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;import&lt;/span&gt; xlwt&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;def&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;excel_read&lt;/span&gt;():&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    w &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; xlrd&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;open_workbook(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;demo.xls&amp;#34;&lt;/span&gt;)  &lt;span style=&#34;color:#75715e&#34;&gt;#打开文件&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    sheet &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; w&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;sheet_by_index(&lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;)  &lt;span style=&#34;color:#75715e&#34;&gt;#获取第1个工作表&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    print(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;这是第1行，第A列的内容：&amp;#34;&lt;/span&gt;, sheet&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;cell_value(&lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;, &lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;))&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    print(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;这是第1行，第B列的内容：&amp;#34;&lt;/span&gt;, sheet&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;cell_value(&lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;, &lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;))&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    print(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;这是第2行，第A列的内容：&amp;#34;&lt;/span&gt;, sheet&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;cell_value(&lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;, &lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;))&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    print(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;这是第2行，第B列的内容：&amp;#34;&lt;/span&gt;, sheet&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;cell_value(&lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;, &lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;))&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;pass&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;def&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;excel_write&lt;/span&gt;():&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    f &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; xlwt&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;Workbook() &lt;span style=&#34;color:#75715e&#34;&gt;#创建工作簿 &lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    sheet &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; f&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;add_sheet(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;sheet1&amp;#34;&lt;/span&gt;) &lt;span style=&#34;color:#75715e&#34;&gt;#创建sheet&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    sheet&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;write(&lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;, &lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;, &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;第1行，第A列&amp;#34;&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    sheet&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;write(&lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;, &lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;, &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;第1行，第B列&amp;#34;&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    sheet&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;write(&lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;, &lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;, &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;第2行，第A列&amp;#34;&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    sheet&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;write(&lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;, &lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;, &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;第2行，第B列&amp;#34;&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    f&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;save(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;demo.xls&amp;#34;&lt;/span&gt;)  &lt;span style=&#34;color:#75715e&#34;&gt;#保存到文件&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;pass&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;#程序入口&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;print(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;演示表格文件的读写...&amp;#34;&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;excel_write()&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;excel_read()&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;print(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;操作完毕.&amp;#34;&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description>
    </item>
    <item>
      <title>[初学python]文本文件读写操作</title>
      <link>https://xcdd.pages.dev/blog/2019/2019-04-09/</link>
      <pubDate>Tue, 09 Apr 2019 17:23:13 +0000</pubDate>
      <guid>https://xcdd.pages.dev/blog/2019/2019-04-09/</guid>
      <description>&lt;p&gt;利用python脚本实现这样一个功能：&lt;/p&gt;&#xA;&lt;p&gt;现有a.txt和b.txt两个纯文本文件，需要把a.txt和b.txt中相同的内容提取出来，保存为c.txt&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-python&#34; data-lang=&#34;python&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;#从A.TXT和B.TXT读取文本,提取相同的行存为C.TXT.&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;import&lt;/span&gt; io&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;import&lt;/span&gt; os&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;#判断是否包含这行&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;def&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;is_line_in_lines&lt;/span&gt;(line, lines):&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    line &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; line&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;rstrip(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;\r\n&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;for&lt;/span&gt; temp &lt;span style=&#34;color:#f92672&#34;&gt;in&lt;/span&gt; lines:&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        temp &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; temp&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;rstrip(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;\r\n&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt; temp &lt;span style=&#34;color:#f92672&#34;&gt;==&lt;/span&gt; line:&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;True&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;False&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;#程序入口&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;f_a &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; open(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;a.txt&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;r&amp;#34;&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;f_b &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; open(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;b.txt&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;r&amp;#34;&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;f_c &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; open(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;c.txt&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;w&amp;#34;&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;print(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;正在处理...&amp;#34;&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;lines1 &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; f_a&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;readlines()&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;lines2 &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; f_b&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;readlines()&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;for&lt;/span&gt; line &lt;span style=&#34;color:#f92672&#34;&gt;in&lt;/span&gt; lines1:&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt; is_line_in_lines(line, lines2):&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            f_c&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;write(line)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;f_a&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;close()&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;f_b&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;close()&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;f_c&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;close()&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;print(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;处理完成!&amp;#34;&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description>
    </item>
    <item>
      <title>[初学python]利用Win32API实现鼠标自动点击</title>
      <link>https://xcdd.pages.dev/blog/2019/2019-03-29/</link>
      <pubDate>Fri, 29 Mar 2019 18:08:31 +0000</pubDate>
      <guid>https://xcdd.pages.dev/blog/2019/2019-03-29/</guid>
      <description>&lt;p&gt;python在Windows系统下可以调用win32 api来实现一些系统级的功能，比如控制鼠标和键盘来实现游戏辅助。&lt;/p&gt;&#xA;&lt;p&gt;但是python并没有自带这些库文件，需要自己动手安装pywin32这个库，安装方法：pip install pywin32&lt;/p&gt;&#xA;&lt;p&gt;今天就以Flash小游戏彩色砖块为实验对象，用python写一个自动点击的“游戏外挂”。&lt;/p&gt;&#xA;&lt;p&gt;彩色砖块这个小游戏在 &lt;strong&gt;很多年前&lt;/strong&gt; 出现在QQ空间3366小游戏。&lt;/p&gt;&#xA;&lt;p&gt;一共200个方块，在规定时间内，点击空白区域，消除相同颜色的方块越多得分越高，满分200分。&lt;/p&gt;&#xA;&lt;p&gt;那时候为了和QQ好友比赛，比分数高，就用C++写了一个辅助小程序，完成了200分。&lt;/p&gt;&#xA;&lt;p&gt;今天为了学习python，再次找到它，把Flash文件下载到本地电脑，用独立的Flash播放器打开这个block.swf文件。&lt;/p&gt;&#xA;&lt;p&gt;swf文件可以在我的网盘下载： &lt;a href=&#34;http://446252221.ys168.com/&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;http://446252221.ys168.com/&lt;/a&gt; (文件路径：FLASH/block.swf)&lt;/p&gt;&#xA;&lt;p&gt;&lt;img src=&#34;./087_1.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;代码思路和用C语言一样：&lt;/p&gt;&#xA;&lt;p&gt;1.利用GetPixel函数，获取所有方块的颜色，保存到列表，&lt;/p&gt;&#xA;&lt;p&gt;2.然后遍历所有的空白点，判断这个空白点的上下左右4个方向有没有相同颜色的方块，&lt;/p&gt;&#xA;&lt;p&gt;3.如果有则调用SetCursorPos和mouse_event模拟鼠标点击，&lt;/p&gt;&#xA;&lt;p&gt;4.重复第2，3步，直到所有空白区域都判断完毕。&lt;/p&gt;&#xA;&lt;p&gt;注意事项：&lt;/p&gt;&#xA;&lt;p&gt;需要事先分析方块的颜色值，游戏区域的坐标，以及方块的大小。&lt;/p&gt;&#xA;&lt;p&gt;下面开始写代码：&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-python&#34; data-lang=&#34;python&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;#FLASH小游戏彩色砖块辅助工具&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;#以下参数需要调整&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;#窗口大小: 668 * 526&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;#游戏区大小: 660 * 499&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;#第一次点击开始:(330, 425)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;#第二次点击开始:(320, 280)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;#左上角第一个方块相对坐标: (60, 100)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;#格子大小: 25 * 25&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;#格子数量: 23 * 15&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;#空白格子颜色: 0xF7F7F7 和 0xEDEDED&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;#实体格子颜色: &lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;#0x0066cc&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;#0x00cc00&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;#0x6666ff&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;#0xbbbbbb&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;#0xcccc66&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;#0x66cccc&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;#0xcc66cc&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;#0xff6600&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;#0xff88ff&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;#0x0099ff&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;import&lt;/span&gt; time&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;import&lt;/span&gt; win32gui&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;import&lt;/span&gt; win32ui&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;import&lt;/span&gt; win32api&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;import&lt;/span&gt; win32con&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;#查找游戏窗口，返回窗口起始坐标&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;def&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;find_flash_window&lt;/span&gt;():&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    hwnd &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; win32gui&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;FindWindow(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;ShockwaveFlash&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Adobe Flash Player 28&amp;#34;&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt;(hwnd):&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        rect &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; win32gui&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;GetWindowRect(hwnd)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt; rect[&lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;],rect[&lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;]&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;None&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;#模拟鼠标点击&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;def&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;mouse_click&lt;/span&gt;(x, y):&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    win32api&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;SetCursorPos([x, y])&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    win32api&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;mouse_event(win32con&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;MOUSEEVENTF_LEFTDOWN, &lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;, &lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;, &lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;, &lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    win32api&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;mouse_event(win32con&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;MOUSEEVENTF_LEFTUP, &lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;, &lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;, &lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;, &lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;#点击格子&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;def&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;click_block&lt;/span&gt;(xbase, ybase, x, y):&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    x &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; xbase &lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt; x &lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;25&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;60&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    y &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; ybase &lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt; y &lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;25&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;100&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    mouse_click(x, y)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;#颜色转换为方块类型&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;def&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;convert_color_to_type&lt;/span&gt;(color):&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt;(color &lt;span style=&#34;color:#f92672&#34;&gt;==&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;0x0066cc&lt;/span&gt;):&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;0x01&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt;(color &lt;span style=&#34;color:#f92672&#34;&gt;==&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;0x00cc00&lt;/span&gt;):&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;0x02&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt;(color &lt;span style=&#34;color:#f92672&#34;&gt;==&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;0x6666ff&lt;/span&gt;):&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;0x03&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt;(color &lt;span style=&#34;color:#f92672&#34;&gt;==&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;0xbbbbbb&lt;/span&gt;):&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;0x04&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt;(color &lt;span style=&#34;color:#f92672&#34;&gt;==&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;0xcccc66&lt;/span&gt;):&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;0x05&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt;(color &lt;span style=&#34;color:#f92672&#34;&gt;==&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;0x66cccc&lt;/span&gt;):&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;0x06&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt;(color &lt;span style=&#34;color:#f92672&#34;&gt;==&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;0xcc66cc&lt;/span&gt;):&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;0x07&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt;(color &lt;span style=&#34;color:#f92672&#34;&gt;==&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;0xff6600&lt;/span&gt;):&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;0x08&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt;(color &lt;span style=&#34;color:#f92672&#34;&gt;==&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;0xff88ff&lt;/span&gt;):&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;0x09&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt;(color &lt;span style=&#34;color:#f92672&#34;&gt;==&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;0x0099ff&lt;/span&gt;):&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;0x0A&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt;(color &lt;span style=&#34;color:#f92672&#34;&gt;==&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;0xededed&lt;/span&gt;):&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;0x00&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt;(color &lt;span style=&#34;color:#f92672&#34;&gt;==&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;0xf7f7f7&lt;/span&gt;):&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;0x00&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;0xFF&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;#获取方块类型&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;def&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;load_one_block&lt;/span&gt;(hdc, xbase, ybase, x, y):&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    x &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; x &lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;25&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt; xbase &lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;60&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    y &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; y &lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;25&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt; ybase &lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;100&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    color &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; win32gui&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;GetPixel(hdc, x, y)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt; convert_color_to_type(color)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;#获取所有方块 &lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;def&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;load_all_block&lt;/span&gt;(map, xbase, ybase):&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    hdc &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; win32gui&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;GetWindowDC(&lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    map&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;clear()&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;for&lt;/span&gt; y &lt;span style=&#34;color:#f92672&#34;&gt;in&lt;/span&gt; range(&lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;, &lt;span style=&#34;color:#ae81ff&#34;&gt;14&lt;/span&gt;):&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        list &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; []&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#66d9ef&#34;&gt;for&lt;/span&gt; x &lt;span style=&#34;color:#f92672&#34;&gt;in&lt;/span&gt; range(&lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;, &lt;span style=&#34;color:#ae81ff&#34;&gt;22&lt;/span&gt;):&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            type &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; load_one_block(hdc, xbase, ybase, x, y)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            list&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;append(type)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        map&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;append(list)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    win32gui&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;ReleaseDC(hdc, &lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;#返回指定格子左边的方块&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;def&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;find_left_block&lt;/span&gt;(map, x, y):&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;for&lt;/span&gt; i &lt;span style=&#34;color:#f92672&#34;&gt;in&lt;/span&gt; range(&lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;, x):&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt;(map[y][x &lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt; i] &lt;span style=&#34;color:#f92672&#34;&gt;!=&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;0x00&lt;/span&gt;):&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt; map[y][x &lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt; i]&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;0xFF&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;#返回指定格子右边的方块&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;def&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;find_right_block&lt;/span&gt;(map, x, y):&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;for&lt;/span&gt; i &lt;span style=&#34;color:#f92672&#34;&gt;in&lt;/span&gt; range(x, &lt;span style=&#34;color:#ae81ff&#34;&gt;22&lt;/span&gt;):&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt;(map[y][i] &lt;span style=&#34;color:#f92672&#34;&gt;!=&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;0x00&lt;/span&gt;):&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt; map[y][i]&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;0xFF&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;#返回指定格子上边的方块&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;def&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;find_top_block&lt;/span&gt;(map, x, y):&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;for&lt;/span&gt; i &lt;span style=&#34;color:#f92672&#34;&gt;in&lt;/span&gt; range(&lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;, y):&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt;(map[y &lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt; i][x] &lt;span style=&#34;color:#f92672&#34;&gt;!=&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;0x00&lt;/span&gt;):&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt; map[y &lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt; i][x]&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;0xFF&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;#返回指定格子下边的方块&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;def&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;find_bottom_block&lt;/span&gt;(map, x, y):&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;for&lt;/span&gt; i &lt;span style=&#34;color:#f92672&#34;&gt;in&lt;/span&gt; range(y, &lt;span style=&#34;color:#ae81ff&#34;&gt;14&lt;/span&gt;):&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt;(map[i][x] &lt;span style=&#34;color:#f92672&#34;&gt;!=&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;0x00&lt;/span&gt;):&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt; map[i][x]&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;0xFF&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;#判断这个格子是否可以点击&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;def&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;is_block_clickable&lt;/span&gt;(map, x, y):&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt;(map[y][x] &lt;span style=&#34;color:#f92672&#34;&gt;!=&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;) &lt;span style=&#34;color:#f92672&#34;&gt;or&lt;/span&gt; (map[y][x] &lt;span style=&#34;color:#f92672&#34;&gt;!=&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;):&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;False&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    left &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; find_left_block(map, x, y)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    right &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; find_right_block(map, x, y)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    top &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; find_top_block(map, x, y)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    bottom &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; find_bottom_block(map, x, y)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt;(top &lt;span style=&#34;color:#f92672&#34;&gt;==&lt;/span&gt; bottom) &lt;span style=&#34;color:#f92672&#34;&gt;and&lt;/span&gt; (top &lt;span style=&#34;color:#f92672&#34;&gt;!=&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;0xFF&lt;/span&gt;):&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        print(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;t = b:&amp;#34;&lt;/span&gt;, top, bottom)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;True&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt;(top &lt;span style=&#34;color:#f92672&#34;&gt;==&lt;/span&gt; left) &lt;span style=&#34;color:#f92672&#34;&gt;and&lt;/span&gt; (top &lt;span style=&#34;color:#f92672&#34;&gt;!=&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;0xFF&lt;/span&gt;):&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        print(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;t = l:&amp;#34;&lt;/span&gt;, top, left)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;True&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt;(top &lt;span style=&#34;color:#f92672&#34;&gt;==&lt;/span&gt; right) &lt;span style=&#34;color:#f92672&#34;&gt;and&lt;/span&gt; (top &lt;span style=&#34;color:#f92672&#34;&gt;!=&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;0xFF&lt;/span&gt;):&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        print(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;t = r:&amp;#34;&lt;/span&gt;, top, right)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;True&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt;(left &lt;span style=&#34;color:#f92672&#34;&gt;==&lt;/span&gt; right) &lt;span style=&#34;color:#f92672&#34;&gt;and&lt;/span&gt; (left &lt;span style=&#34;color:#f92672&#34;&gt;!=&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;0xFF&lt;/span&gt;):&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        print(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;l = r:&amp;#34;&lt;/span&gt;, left, right)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;True&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt;(left &lt;span style=&#34;color:#f92672&#34;&gt;==&lt;/span&gt; bottom) &lt;span style=&#34;color:#f92672&#34;&gt;and&lt;/span&gt; (left &lt;span style=&#34;color:#f92672&#34;&gt;!=&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;0xFF&lt;/span&gt;):&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        print(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;l = b:&amp;#34;&lt;/span&gt;, left, bottom)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;True&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt;(right &lt;span style=&#34;color:#f92672&#34;&gt;==&lt;/span&gt; bottom) &lt;span style=&#34;color:#f92672&#34;&gt;and&lt;/span&gt; (right &lt;span style=&#34;color:#f92672&#34;&gt;!=&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;0xFF&lt;/span&gt;):&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        print(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;r = b:&amp;#34;&lt;/span&gt;, right, bottom)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;True&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;False&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;#查找可以点击的格子&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;def&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;find_click_block&lt;/span&gt;(map):&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;for&lt;/span&gt; x &lt;span style=&#34;color:#f92672&#34;&gt;in&lt;/span&gt; range(&lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;, &lt;span style=&#34;color:#ae81ff&#34;&gt;22&lt;/span&gt;):&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#66d9ef&#34;&gt;for&lt;/span&gt; y &lt;span style=&#34;color:#f92672&#34;&gt;in&lt;/span&gt; range(&lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;, &lt;span style=&#34;color:#ae81ff&#34;&gt;14&lt;/span&gt;):&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt;(is_block_clickable(map, x, y)):&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                &lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt; x,y&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;None&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;def&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;dump_all_block&lt;/span&gt;(map):&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;for&lt;/span&gt; y &lt;span style=&#34;color:#f92672&#34;&gt;in&lt;/span&gt; range(&lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;, &lt;span style=&#34;color:#ae81ff&#34;&gt;14&lt;/span&gt;):&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#66d9ef&#34;&gt;for&lt;/span&gt; x &lt;span style=&#34;color:#f92672&#34;&gt;in&lt;/span&gt; range(&lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;, &lt;span style=&#34;color:#ae81ff&#34;&gt;22&lt;/span&gt;):&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            print(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;%02X&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt; &amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;%&lt;/span&gt; (map[y][x]), end&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        print()&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;#程序入口&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;map &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; []&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;xbase &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;ybase &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;print(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;正在查找游戏窗口...&amp;#34;&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;pos &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; find_flash_window()&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt;(pos &lt;span style=&#34;color:#f92672&#34;&gt;==&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;None&lt;/span&gt;):&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    print(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;查找游戏窗口失败!&amp;#34;&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    exit()&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;print(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;查找游戏窗口成功.&amp;#34;&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;xbase &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; pos[&lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;]&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;ybase &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; pos[&lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;]&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;while&lt;/span&gt;(&lt;span style=&#34;color:#66d9ef&#34;&gt;True&lt;/span&gt;):&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    load_all_block(map, xbase, ybase)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    dump_all_block(map)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    print(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;正在查找可以点击的格子&amp;#34;&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    pos &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; find_click_block(map)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt;(pos &lt;span style=&#34;color:#f92672&#34;&gt;==&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;None&lt;/span&gt;):&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        print(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;游戏结束!&amp;#34;&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        exit()&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    print(pos)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    click_block(xbase, ybase, pos[&lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;], pos[&lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;])&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    time&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;sleep(&lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description>
    </item>
    <item>
      <title>[初学python]苹果何时开放IOS降级通道啊？</title>
      <link>https://xcdd.pages.dev/blog/2019/2019-03-26/</link>
      <pubDate>Tue, 26 Mar 2019 17:07:31 +0000</pubDate>
      <guid>https://xcdd.pages.dev/blog/2019/2019-03-26/</guid>
      <description>&lt;p&gt;手机升级从iOS10升级到iOS12后，有点不适应，想降级到iOS10就没门了，太可恶了。&lt;/p&gt;&#xA;&lt;p&gt;想着苹果曾经意外地开放过旧系统的验证通道，于是幻想会不会再次出现？&lt;/p&gt;&#xA;&lt;p&gt;于是经常打开http://ipsw.me查询当前签名的系统版本，唉，频繁手动操作有点费时，&lt;/p&gt;&#xA;&lt;p&gt;不如用python写个自动化脚本来实现吧，检测到IOS10的时候就给我发个邮件吧。&lt;/p&gt;&#xA;&lt;p&gt;于是研究了一下ipsw.me，该网站提供查询接口了，并以json的格式返回数据。&lt;/p&gt;&#xA;&lt;p&gt;于是就有了下面的代码：&lt;/p&gt;&#xA;&lt;p&gt;定时访问ipsw.me提供的接口，检测到IOS10系统有效就发送邮件给我。&lt;/p&gt;&#xA;&lt;p&gt;发送邮件使用了网易提供的邮件接口。&lt;/p&gt;&#xA;&lt;p&gt;间隔10分钟查询一次，就让它在电脑的后台24小时运行吧，万一哪天真的它就给我发邮件了呢。嘿嘿。。。&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-python&#34; data-lang=&#34;python&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;#发现IOS10可以降级时通过邮件通知我&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;#QQ:446252221&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;#2018.05.10&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;import&lt;/span&gt; io&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;import&lt;/span&gt; time&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;import&lt;/span&gt; json&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;import&lt;/span&gt; urllib.request&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;import&lt;/span&gt; smtplib&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;import&lt;/span&gt; email.mime.text&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;import&lt;/span&gt; email.mime.multipart &#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;#获取当前时间&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;def&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;local_time_str&lt;/span&gt;():&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    str &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; time&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;strftime(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;%Y-%m-&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;%d&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;%X&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&lt;/span&gt;, time&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;localtime(time&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;time()&lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;28800&lt;/span&gt;))&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt; str&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;#通过网易的SMTP服务器发送邮件&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;def&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;send_mail&lt;/span&gt;(title, content):&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    mail_host &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;smtp.163.com&amp;#34;&lt;/span&gt;           &lt;span style=&#34;color:#75715e&#34;&gt;#设置服务器&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    mail_port &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;25&lt;/span&gt;                       &lt;span style=&#34;color:#75715e&#34;&gt;#SMTP端口号&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    mail_user &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;############@163.com&amp;#34;&lt;/span&gt;   &lt;span style=&#34;color:#75715e&#34;&gt;#用户名&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    mail_pass &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;########&amp;#34;&lt;/span&gt;               &lt;span style=&#34;color:#75715e&#34;&gt;#口令(授权码)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    mail_recv &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; [&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;446252221@qq.com&amp;#34;&lt;/span&gt;]     &lt;span style=&#34;color:#75715e&#34;&gt;#收件人&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    mail_subject &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; title                 &lt;span style=&#34;color:#75715e&#34;&gt;#邮件主题&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    mail_content &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; content               &lt;span style=&#34;color:#75715e&#34;&gt;#邮件正文&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    msg &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; email&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;mime&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;multipart&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;MIMEMultipart()  &#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    msg[&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;From&amp;#34;&lt;/span&gt;] &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; mail_user&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    msg[&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;To&amp;#34;&lt;/span&gt;] &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; mail_recv[&lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;]&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    msg[&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Subject&amp;#34;&lt;/span&gt;] &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; mail_subject&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    msg&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;attach(email&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;mime&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;text&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;MIMEText(mail_content))&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;try&lt;/span&gt;:&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        print(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;正在发送邮件...&amp;#34;&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        smtp_obj &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; smtplib&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;SMTP()&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        smtp_obj&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;connect(mail_host, mail_port)    &#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        smtp_obj&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;login(mail_user, mail_pass)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        smtp_obj&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;sendmail(mail_user, mail_recv, msg&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;as_string())&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;except&lt;/span&gt;:&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        print(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;邮件发送失败!&amp;#34;&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;False&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;else&lt;/span&gt;:&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        print(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;邮件发送成功.&amp;#34;&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;True&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;#调用ipsw接口,查询可升级的IOS版本&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;def&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;call_ipsw&lt;/span&gt;(iphone):&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;try&lt;/span&gt;:&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        print(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;正在获取数据...&amp;#34;&lt;/span&gt;);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        request_url &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;https://api.ipsw.me/v4/device/&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt; iphone&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        session &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; urllib&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;request&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;urlopen(request_url)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;except&lt;/span&gt;:&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        print(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;获取数据失败!&amp;#34;&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;None&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;else&lt;/span&gt;:&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        print(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;获取数据成功.&amp;#34;&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        respon_body &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; session&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;read()&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        json_obj &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; json&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;loads(respon_body&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;decode(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;utf-8&amp;#34;&lt;/span&gt;))&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        ios_all_list &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; json_obj[&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;firmwares&amp;#34;&lt;/span&gt;]&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        ios_signed_list &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; []&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#66d9ef&#34;&gt;for&lt;/span&gt; item &lt;span style=&#34;color:#f92672&#34;&gt;in&lt;/span&gt; ios_all_list:&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt; item[&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;signed&amp;#34;&lt;/span&gt;]:&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                ios_signed_list&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;append(item[&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;version&amp;#34;&lt;/span&gt;])&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt; ios_signed_list&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;#程序入口&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;while&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;True&lt;/span&gt;:&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    print(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;当前系统时间：&amp;#34;&lt;/span&gt;, local_time_str())&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    ios_list &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; call_ipsw(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;iPhone8,4&amp;#34;&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;for&lt;/span&gt; ios &lt;span style=&#34;color:#f92672&#34;&gt;in&lt;/span&gt; ios_list:&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        print(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;当前IOS版本：&amp;#34;&lt;/span&gt;, ios)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt; ios&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;startswith(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;10.&amp;#34;&lt;/span&gt;):&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            send_mail(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;苹果开放IOS10降级通道啦！&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;当前可降级版本为：&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt;ios)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#75715e&#34;&gt;#延时10分钟&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    time&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;sleep(&lt;span style=&#34;color:#ae81ff&#34;&gt;600&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description>
    </item>
    <item>
      <title>[初学Python]利用某网站的功能写一个磁力链转种子工具</title>
      <link>https://xcdd.pages.dev/blog/2019/2019-03-25/</link>
      <pubDate>Mon, 25 Mar 2019 18:00:03 +0000</pubDate>
      <guid>https://xcdd.pages.dev/blog/2019/2019-03-25/</guid>
      <description>&lt;p&gt;孔子曰：学而时习之~&lt;/p&gt;&#xA;&lt;p&gt;初学python，一边看语法，一边看参考例程，写了一个小程序，做个存档，否则很容易忘记。&lt;/p&gt;&#xA;&lt;p&gt;这次的目标是利用某种子下载网站，编写一个磁力链下载种子文件的工具。&lt;/p&gt;&#xA;&lt;p&gt;常见的种子文件磁力链接的格式是这样的： &lt;em&gt;magnet&lt;/em&gt; :?xt=urn:btih:XXX&lt;/p&gt;&#xA;&lt;p&gt;其中的XXX就是种子文件的哈希值，而这个网站可以输入哈希值，下载对应的种子文件，&lt;/p&gt;&#xA;&lt;p&gt;但是该网站广告内容太多了，用浏览器打开不太方便呀~，具体是哪个网站我就不说了，哈哈~~~，自己看代码吧。&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-python&#34; data-lang=&#34;python&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# 磁力链接转种子文件&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# QQ:446252221 &amp;lt;446252221@qq.com&amp;gt;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;import&lt;/span&gt; io&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;import&lt;/span&gt; os&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;import&lt;/span&gt; time&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;import&lt;/span&gt; urllib.request&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;import&lt;/span&gt; urllib.parse&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;import&lt;/span&gt; html.parser&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;USER_AGENT &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.106 Safari/537.36&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;#HTML解析&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;class&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;html_dumper&lt;/span&gt;(html&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;parser&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;HTMLParser):&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;def&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;__init__&lt;/span&gt;(self):&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        html&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;parser&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;HTMLParser&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;__init__&lt;/span&gt;(self)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        self&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;key &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;def&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;handle_starttag&lt;/span&gt;(self, tag, attrs):&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt; tag &lt;span style=&#34;color:#f92672&#34;&gt;==&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;input&amp;#34;&lt;/span&gt;:&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt; attrs[&lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;][&lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;] &lt;span style=&#34;color:#f92672&#34;&gt;==&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;key&amp;#34;&lt;/span&gt;:&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                self&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;key &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; attrs[&lt;span style=&#34;color:#ae81ff&#34;&gt;2&lt;/span&gt;][&lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;]&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;None&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;def&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;handle_data&lt;/span&gt;(self, data):&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;None&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;def&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;handle_comment&lt;/span&gt;(self, data):&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;None&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;def&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;get_key&lt;/span&gt;(self):&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt; self&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;key&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;#第1步获取key&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;def&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;step1_get_key&lt;/span&gt;(hash):&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    req_url &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;http://www.storetorrents.com/hash/&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt; hash&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    req &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; urllib&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;request&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;Request(url&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;req_url, method&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;GET&amp;#34;&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    req&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;add_header(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;User-Agent&amp;#34;&lt;/span&gt;, USER_AGENT)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;try&lt;/span&gt;:&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        respon &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; urllib&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;request&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;urlopen(req)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#75715e&#34;&gt;#print(&amp;#34;第1步:&amp;#34;, respon.status)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        respon_cook &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; respon&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;getheader(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Set-Cookie&amp;#34;&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        respon_body &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; respon&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;read()&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        dumper &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; html_dumper()&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        dumper&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;feed(respon_body&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;decode(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;utf-8&amp;#34;&lt;/span&gt;))&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#75715e&#34;&gt;#print(&amp;#34;key:&amp;#34;, dumper.get_key())&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt; dumper&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;get_key()&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;except&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;BaseException&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;as&lt;/span&gt; e:&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        print(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;urlopen error:&amp;#34;&lt;/span&gt;, e)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;None&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;#第2步获取captcha&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;def&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;step2_get_captcha&lt;/span&gt;():&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    req_url &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;https://storetorrents.xyz/captcha&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    req &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; urllib&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;request&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;Request(url&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;req_url, method&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;GET&amp;#34;&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    req&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;add_header(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;User-Agent&amp;#34;&lt;/span&gt;, USER_AGENT)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#75715e&#34;&gt;#req.add_header(&amp;#34;Cookie&amp;#34;, &amp;#34;__cfduid=dac7712102a83c5d8e2d3fb4ec6f407031553505032; PHPSESSID=25d2d5kd6erdqbo1fv4o4e8vs2&amp;#34;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;try&lt;/span&gt;:&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        respon &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; urllib&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;request&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;urlopen(req)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#75715e&#34;&gt;#print(&amp;#34;第2步:&amp;#34;, respon.status)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        respon_body &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; respon&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;read()&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        respon_cook &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; respon&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;getheader(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Set-Cookie&amp;#34;&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        file_name &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;captcha.jpg&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        file_obj &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; open(file_name, &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;wb&amp;#34;&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        file_obj&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;write(respon_body)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        file_obj&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;close()&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        os&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;system(file_name)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#75715e&#34;&gt;#print(&amp;#34;cookie:&amp;#34;, respon_cook)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        cookie_list &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; respon_cook&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;split(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;;&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        cookie &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; cookie_list[&lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;] &lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;;&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt; cookie_list[&lt;span style=&#34;color:#ae81ff&#34;&gt;5&lt;/span&gt;]&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;split(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;,&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;)[&lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;]&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#75715e&#34;&gt;#print(&amp;#34;cookie:&amp;#34;, cookie)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt; cookie&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;except&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;BaseException&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;as&lt;/span&gt; e:&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        print(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;urlopen error:&amp;#34;&lt;/span&gt;, e)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;None&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;#第3步下载文件&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;def&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;step3_download&lt;/span&gt;(key, hash, captcha, cookie):&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    req_url &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;https://storetorrents.xyz/download&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    req_values &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; {}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    req_values[&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;key&amp;#34;&lt;/span&gt;] &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; key&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    req_values[&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;infohash&amp;#34;&lt;/span&gt;] &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; hash&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    req_values[&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;captcha&amp;#34;&lt;/span&gt;] &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; captcha&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    req_body &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; urllib&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;parse&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;urlencode(req_values)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#75715e&#34;&gt;#print(&amp;#34;key encode:&amp;#34;, req_body)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    req &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; urllib&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;request&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;Request(url&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;req_url, method&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;POST&amp;#34;&lt;/span&gt;, data&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;bytes(req_body, encoding&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;utf8&amp;#34;&lt;/span&gt;))&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    req&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;add_header(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;User-Agent&amp;#34;&lt;/span&gt;, USER_AGENT)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    req&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;add_header(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Cookie&amp;#34;&lt;/span&gt;, cookie)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;try&lt;/span&gt;:&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        respon &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; urllib&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;request&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;urlopen(req)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#75715e&#34;&gt;#print(&amp;#34;第3步:&amp;#34;, respon.status)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        type &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; respon&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;getheader(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Content-Type&amp;#34;&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#75715e&#34;&gt;#print(&amp;#34;Type:&amp;#34;, type)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt; type&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;startswith(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;text/html&amp;#34;&lt;/span&gt;):&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            print(respon&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;read()&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;decode(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;utf-8&amp;#34;&lt;/span&gt;))&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;None&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        respon_body &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; respon&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;read()&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        file_name &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; hash &lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;.torrent&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        file_obj &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; open(file_name, &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;wb&amp;#34;&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        file_obj&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;write(respon_body)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        file_obj&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;close()&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        print(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;下载完成!&amp;#34;&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;except&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;BaseException&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;as&lt;/span&gt; e:&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        print(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;urlopen error:&amp;#34;&lt;/span&gt;, e)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;None&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;#入口&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;os&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;system(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;title 磁力转换工具&amp;#34;&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;os&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;system(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;echo off&amp;#34;&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;while&lt;/span&gt;(&lt;span style=&#34;color:#66d9ef&#34;&gt;True&lt;/span&gt;):&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    hash &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; input(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;magnet:?xt=urn:btih:&amp;#34;&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    key &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; step1_get_key(hash)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt; key &lt;span style=&#34;color:#f92672&#34;&gt;==&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;None&lt;/span&gt;:&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        print(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;未找到该资源!&amp;#34;&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        os&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;system(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;pause&amp;#34;&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#66d9ef&#34;&gt;continue&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    cookie &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; step2_get_captcha()&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt; cookie &lt;span style=&#34;color:#f92672&#34;&gt;==&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;None&lt;/span&gt;:&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        print(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;获取验证码失败!&amp;#34;&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        os&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;system(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;pause&amp;#34;&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#66d9ef&#34;&gt;continue&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    code &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; input(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;请输入验证码:&amp;#34;&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    step3_download(key, hash, code, cookie)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    os&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;system(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;pause&amp;#34;&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;简单解释一下代码内容：&lt;/p&gt;</description>
    </item>
    <item>
      <title>UC1617点阵屏幕驱动</title>
      <link>https://xcdd.pages.dev/blog/2019/2019-03-21/</link>
      <pubDate>Thu, 21 Mar 2019 17:12:16 +0000</pubDate>
      <guid>https://xcdd.pages.dev/blog/2019/2019-03-21/</guid>
      <description>&lt;p&gt;UC1617是一个单色点阵液晶屏驱动芯片，最大支持128*128分辨率。&lt;/p&gt;&#xA;&lt;p&gt;芯片手册： &lt;a href=&#34;https://download.csdn.net/download/qq446252221/11045952&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;https://download.csdn.net/download/qq446252221/11045952&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;首先要注意的是：这个驱动芯片与其它单色液晶驱动芯片有点不一样，因为它是支持4位灰度显示的！&lt;/p&gt;&#xA;&lt;p&gt;所以它的一个像素点是2个比特，而不是普通单色屏幕那样一个像素1个比特。&lt;/p&gt;&#xA;&lt;p&gt;1个字节8比特，对应屏幕上的4个像素点。&lt;/p&gt;&#xA;&lt;p&gt;这个芯片支持IIC，SPI，8080通信接口，通信时序就不详细说了，看看手册就行了。&lt;/p&gt;&#xA;&lt;p&gt;对于SPI接口：SCK上升沿时LCD采样数据，SCK下降沿LCD输出数据。&lt;/p&gt;&#xA;&lt;p&gt;重点关注的是初始化命令，对寄存器的配置。&lt;/p&gt;&#xA;&lt;p&gt;从手册得知，其命令编码规则是不定长编码，一个字节前面M个比特表示特定命令，剩于N比特表示数据。&lt;/p&gt;&#xA;&lt;p&gt;M和N的长度每个命令基本都不一样。如下图所示：&lt;/p&gt;&#xA;&lt;p&gt;&lt;img src=&#34;./084_1.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;验证硬件通信是否成功，应该先测试Get Status这个指令，连续读出3个字节，末尾两个字节可以判断通信是否正常。&lt;/p&gt;&#xA;&lt;p&gt;正常情况应该是0x1E,0x00,0x74，其中第1个字节与配置有关，后面2个字节是固定值。&lt;/p&gt;&#xA;&lt;p&gt;需要注意的时，SPI接口有特殊的命令来获取状态：&lt;/p&gt;&#xA;&lt;p&gt;&lt;img src=&#34;./084_2.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;先要用SPI发送0xFE这个指令，再连续读3个字节，才是状态。&lt;/p&gt;&#xA;&lt;p&gt;发送0xFE前CS0拉低，CD拉低表示指令，发送完0xFE后，把CD拉高表示数据，连续读3个字节，最后CS0拉高，通信结束。&lt;/p&gt;&#xA;&lt;p&gt;伪代码如下：&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-cpp&#34; data-lang=&#34;cpp&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;void&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;lcd_get_status&lt;/span&gt;(&lt;span style=&#34;color:#66d9ef&#34;&gt;uint8_t&lt;/span&gt; state[&lt;span style=&#34;color:#ae81ff&#34;&gt;3&lt;/span&gt;])&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;{&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    lcd_send_cmd(&lt;span style=&#34;color:#ae81ff&#34;&gt;0xfe&lt;/span&gt;);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    state[&lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;] &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; lcd_recv_data();&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    state[&lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;] &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; lcd_recv_data();&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    state[&lt;span style=&#34;color:#ae81ff&#34;&gt;2&lt;/span&gt;] &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; lcd_recv_data();&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;手册上没有提到的SPI指令是读显存数据，与SPI读状态类似，读显存的命令字是0xFF。&lt;/p&gt;&#xA;&lt;p&gt;以下是初始化命令伪代码：&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-cpp&#34; data-lang=&#34;cpp&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;void&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;lcd_chip_setup&lt;/span&gt;(&lt;span style=&#34;color:#66d9ef&#34;&gt;void&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;{&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    lcd_send_cmd(&lt;span style=&#34;color:#ae81ff&#34;&gt;0xeb&lt;/span&gt;); &lt;span style=&#34;color:#75715e&#34;&gt;//bias set 1/11&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;    lcd_send_cmd(&lt;span style=&#34;color:#ae81ff&#34;&gt;0x24&lt;/span&gt;); &lt;span style=&#34;color:#75715e&#34;&gt;//set tem compensation -0.15%&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;    lcd_send_cmd(&lt;span style=&#34;color:#ae81ff&#34;&gt;0x2a&lt;/span&gt;); &lt;span style=&#34;color:#75715e&#34;&gt;//set panel loading &amp;gt;40nF&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;    lcd_send_cmd(&lt;span style=&#34;color:#ae81ff&#34;&gt;0x2F&lt;/span&gt;); &lt;span style=&#34;color:#75715e&#34;&gt;//set pump PC[2];internal VLCD&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;    lcd_send_cmd(&lt;span style=&#34;color:#ae81ff&#34;&gt;0x81&lt;/span&gt;); &lt;span style=&#34;color:#75715e&#34;&gt;//set Vop PM[7:0]&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;    lcd_send_cmd(&lt;span style=&#34;color:#ae81ff&#34;&gt;0x34&lt;/span&gt;); &lt;span style=&#34;color:#75715e&#34;&gt;//PM[7:0]=0x34&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;    lcd_send_cmd(&lt;span style=&#34;color:#ae81ff&#34;&gt;0x84&lt;/span&gt;); &lt;span style=&#34;color:#75715e&#34;&gt;//set partial display&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;    lcd_send_cmd(&lt;span style=&#34;color:#ae81ff&#34;&gt;0x8b&lt;/span&gt;); &lt;span style=&#34;color:#75715e&#34;&gt;//set RAM address control AC[2:0]&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;    lcd_send_cmd(&lt;span style=&#34;color:#ae81ff&#34;&gt;0xc0&lt;/span&gt;); &lt;span style=&#34;color:#75715e&#34;&gt;//set LCD mapping control My Mx LC0,C2&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;    lcd_send_cmd(&lt;span style=&#34;color:#ae81ff&#34;&gt;0xa3&lt;/span&gt;); &lt;span style=&#34;color:#75715e&#34;&gt;//SET line rate  LC[4:3]&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;    lcd_send_cmd(&lt;span style=&#34;color:#ae81ff&#34;&gt;0xad&lt;/span&gt;); &lt;span style=&#34;color:#75715e&#34;&gt;//SET B/W MODE  AND DISPLAy ON  DC[ 3:2 ]&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;    &#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#75715e&#34;&gt;//设置显示区域，默认值是就0 - 127,可以不用设置&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;    lcd_send_cmd(&lt;span style=&#34;color:#ae81ff&#34;&gt;0xf4&lt;/span&gt;); &lt;span style=&#34;color:#75715e&#34;&gt;//SET start x&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;    lcd_send_cmd(&lt;span style=&#34;color:#ae81ff&#34;&gt;0x00&lt;/span&gt;); &#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    lcd_send_cmd(&lt;span style=&#34;color:#ae81ff&#34;&gt;0xf5&lt;/span&gt;); &lt;span style=&#34;color:#75715e&#34;&gt;//SET start y&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;    lcd_send_cmd(&lt;span style=&#34;color:#ae81ff&#34;&gt;0x00&lt;/span&gt;); &#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    lcd_send_cmd(&lt;span style=&#34;color:#ae81ff&#34;&gt;0xf6&lt;/span&gt;); &lt;span style=&#34;color:#75715e&#34;&gt;//SET end x&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;    lcd_send_cmd(&lt;span style=&#34;color:#ae81ff&#34;&gt;0x1f&lt;/span&gt;);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    lcd_send_cmd(&lt;span style=&#34;color:#ae81ff&#34;&gt;0xf7&lt;/span&gt;); &lt;span style=&#34;color:#75715e&#34;&gt;//SET end y&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;    lcd_send_cmd(&lt;span style=&#34;color:#ae81ff&#34;&gt;0x7f&lt;/span&gt;);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;写显存数据:&lt;/p&gt;</description>
    </item>
    <item>
      <title>Windows 7精简版(2019)</title>
      <link>https://xcdd.pages.dev/blog/2019/2019-02-16/</link>
      <pubDate>Sat, 16 Feb 2019 13:54:56 +0000</pubDate>
      <guid>https://xcdd.pages.dev/blog/2019/2019-02-16/</guid>
      <description>&lt;p&gt;此前的精简版使用NTLite免费版制作，受功能限制，有一些组件无法移除；&lt;/p&gt;&#xA;&lt;p&gt;此次找到了NTLite企业版，没有功能限制，重制了一个精简版。&lt;/p&gt;&#xA;&lt;p&gt;保留IE8，但可以安装IE9，IE10，IE11.&lt;/p&gt;&#xA;&lt;p&gt;为了支持升级IE浏览器，以下组件不能删除，否则安装会失败：&lt;/p&gt;&#xA;&lt;p&gt;1.Windows 帮助内容&#xA;2.多国语言支持：保留简体中文和英语&#xA;3.疑难解答&lt;/p&gt;&#xA;&lt;p&gt;2019.04.10: 已有更新版本，此版本暂停分享。&lt;/p&gt;&#xA;&lt;p&gt;&lt;del&gt;下载链接： &lt;a href=&#34;https://pan.baidu.com/s/1W8tO7vXuCgC_NuTahB2dDA&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;https://pan.baidu.com/s/1W8tO7vXuCgC_NuTahB2dDA&lt;/a&gt;&lt;/del&gt;&lt;/p&gt;&#xA;&lt;p&gt;精简了以下组件：&lt;/p&gt;&#xA;&lt;p&gt;由于内容过长，无法提交，因此打包上传到百度网盘&lt;/p&gt;&#xA;&lt;p&gt;使用NTLite精简后，还可以手动删除一些文件：&lt;/p&gt;&#xA;&lt;p&gt;由于内容过长，无法提交，因此打包上传到百度网盘&lt;/p&gt;&#xA;&lt;p&gt;链接: &lt;a href=&#34;https://pan.baidu.com/s/1Yb_IN0hkQOVa5PXQI4j8FQ&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;https://pan.baidu.com/s/1Yb_IN0hkQOVa5PXQI4j8FQ&lt;/a&gt; 提取码: 99vs&lt;/p&gt;</description>
    </item>
    <item>
      <title>nrf52832使用freeRTOS低功耗模式的笔记</title>
      <link>https://xcdd.pages.dev/blog/2019/2019-02-14/</link>
      <pubDate>Thu, 14 Feb 2019 10:59:43 +0000</pubDate>
      <guid>https://xcdd.pages.dev/blog/2019/2019-02-14/</guid>
      <description>&lt;p&gt;一般而言，RTOS的运转需要一个滴答定时器周期性地产生中断来为系统提供时钟，通常是1毫秒或者10毫秒。&lt;/p&gt;&#xA;&lt;p&gt;对于低功耗应用场景，定时器会频繁地产生中断，使得MCU频繁被唤醒，导致功耗升高，无法满足项目需求。&lt;/p&gt;&#xA;&lt;p&gt;freeRTOS中引入了TICKLESS模式来实现低功耗应用。&lt;/p&gt;&#xA;&lt;p&gt;TICKLESS模式的原理是动态地改变系统时钟的中断频率，当没有任务运行时，保持MCU处于睡眠模式，减少不必要的时钟中断。&lt;/p&gt;&#xA;&lt;p&gt;nordic nrf52832的SDK中提供了freeRTOS的低功耗应用实例，阅读源码后做一些笔记：&lt;/p&gt;&#xA;&lt;p&gt;在freeRTOS中全局变量[xNextTaskUnblockTime]记录着下一个任务唤醒的时间，[xTickCount]记录着当前系统时间，&lt;/p&gt;&#xA;&lt;p&gt;当系统处于空闲任务时，使用[xNextTaskUnblockTime - xTickCount]计算出MCU可以睡眠的时长，&lt;/p&gt;&#xA;&lt;p&gt;将计算结果传给portSUPPRESS_TICKS_AND_SLEEP函数，这个函数在port_cmsis_systick.c中实现，&lt;/p&gt;&#xA;&lt;p&gt;该函数修改RTC的中断模式，然后使用WFE的方式让MCU进入睡眠模式，当MCU被事件唤醒之后，恢复RTC中断为之前的状态。&lt;/p&gt;&#xA;&lt;p&gt;备注：WFE方式的唤醒方式可以是SEV指令，也可以是任意中断事件，使用中断唤醒需要提前设置SEVONPEND位。&lt;/p&gt;&#xA;&lt;p&gt;SDK的代码中在port_cmsis.c使用了SCB-&amp;gt;SCR |= SCB_SCR_SEVONPEND_Msk;&lt;/p&gt;</description>
    </item>
    <item>
      <title>VS2005精简版(二)</title>
      <link>https://xcdd.pages.dev/blog/2019/2019-01-15/</link>
      <pubDate>Tue, 15 Jan 2019 15:43:12 +0000</pubDate>
      <guid>https://xcdd.pages.dev/blog/2019/2019-01-15/</guid>
      <description>&lt;p&gt;上个版本精简版VS2005发现一个小问题，双击*.sln文件不能打开文件。&lt;/p&gt;&#xA;&lt;p&gt;于是又研究了一番注册表，*.sln的文件关联比较特殊，它可以识别文件内容，显示不同的图标。&lt;/p&gt;&#xA;&lt;p&gt;重新注册VSFileHandler.dll没有解决，但是发现注册的时候，它会自动生成很多注册表内容，&lt;/p&gt;&#xA;&lt;p&gt;于是发现大量的注册表项都是由这些COM组件生成的，&lt;/p&gt;&#xA;&lt;p&gt;这些COM组件相关的注册表主键主要在HKCR/CLSID、HKCR\TypeLib、HKCR\Interface、HKCR\Record。&lt;/p&gt;&#xA;&lt;p&gt;这几项注册表的内容占了大半，这部分内容既然是注册DLL的时候生成的，那么可以在安装脚本中删除，&lt;/p&gt;&#xA;&lt;p&gt;然后重新注册DLL，直接把安装脚本从3W多行，骤降至8000行。&lt;/p&gt;&#xA;&lt;p&gt;顺便将这些DLL的路径从C：\Program Files\Common Files\Microsoft Shared移动到VS2005的安装目录，&lt;/p&gt;&#xA;&lt;p&gt;减少安装过程的文件复制操作，但是.NET相关的文件还是要复制到系统目录的C:\Windows\assembly。&lt;/p&gt;&#xA;&lt;p&gt;最后发现*.sln文件关联需要手动添加注册表，使用VSLauncher.exe启动。&lt;/p&gt;&#xA;&lt;p&gt;顺便把setup文件夹下面的文件调整了一下，默认不安装vc80.debug，因为WinXP和Win7的winsxs结构有点不一样。&lt;/p&gt;&#xA;&lt;p&gt;WIN7系统可以手动安装vc80.debug，只要运行setup/install_vc80_debug.bat即可。&lt;/p&gt;&#xA;&lt;p&gt;重新打包inno setup，在XP和Win7系统下做测试，安装后使用正常。&lt;/p&gt;&#xA;&lt;p&gt;最后用xz压缩为压缩包只有65MB。&lt;/p&gt;&#xA;&lt;p&gt;上传度盘分享给有缘人： &lt;a href=&#34;https://pan.baidu.com/s/1FmtekIEVHYy-OtEgU3-IPg&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;https://pan.baidu.com/s/1FmtekIEVHYy-OtEgU3-IPg&lt;/a&gt;&lt;/p&gt;</description>
    </item>
    <item>
      <title>VS2005精简版</title>
      <link>https://xcdd.pages.dev/blog/2019/2019-01-11/</link>
      <pubDate>Fri, 11 Jan 2019 16:18:50 +0000</pubDate>
      <guid>https://xcdd.pages.dev/blog/2019/2019-01-11/</guid>
      <description>&lt;p&gt;从毕业到现在,一直都在使用Visual Studio 2005来开发C/C++小程序,每次重装系统就要重装VS2005，&lt;/p&gt;&#xA;&lt;p&gt;这家伙安装起来太慢了，如果要打SP1补丁那更费时间，所以有必要制作一个精简版！（都2019年了啊，早干嘛去了啊？？？）&lt;/p&gt;&#xA;&lt;p&gt;我只需要安装VC++的组件就行了，重装系统的时候就可以分分钟搞定VS2005。&lt;/p&gt;&#xA;&lt;p&gt;首先用虚拟机装了一个Win7 32位纯净系统,然后备份硬盘文件，然后在里面安装VS2005,对比两个硬盘镜像的差异，&lt;/p&gt;&#xA;&lt;p&gt;从而提取出VS2005所需的文件，不过不看不知道，一看吓一跳！这个家伙竟然向注册表写了接近10W行数据！！！&lt;/p&gt;&#xA;&lt;p&gt;握草！！！！！！！！&lt;/p&gt;&#xA;&lt;p&gt;不怕把注册表写坏了吗！！！&lt;/p&gt;&#xA;&lt;p&gt;除了注册表之外还有好几千个文件被写到了以下目录：&lt;/p&gt;&#xA;&lt;p&gt;C:\Program Files\Visual Studio 8\&lt;/p&gt;&#xA;&lt;p&gt;C:\Program Files\Common Files\&lt;/p&gt;&#xA;&lt;p&gt;C:\Windows\Assembly\&lt;/p&gt;&#xA;&lt;p&gt;C:\Windows\System32\&lt;/p&gt;&#xA;&lt;p&gt;C:\Windows\WinSXS\&lt;/p&gt;&#xA;&lt;p&gt;这样的目录结构，想要把Visual Studio做成绿色版是绝逼不可能的了，但是可以做成精简版，直接复制相关文件和注册表就可以完成安装，再怎么说也比DVD镜像里面的安装程序要快很多。&lt;/p&gt;&#xA;&lt;p&gt;话虽如此，但是如此之多的注册表项和文件，要精简起来十分费时！&lt;/p&gt;&#xA;&lt;p&gt;不过还好我不是世界上第一个制作VS2005精简版的人，网上能找到cntrup和skygz前辈制作的精简版。&lt;/p&gt;&#xA;&lt;p&gt;不过这两位的精简版还是不太满意，安装过程有一些小问题，精简程度也还不够。&lt;/p&gt;&#xA;&lt;p&gt;参考前辈的精简版成品和我提取的VS2005再进行整理，用inno setup打包成快速安装程序，&lt;/p&gt;&#xA;&lt;p&gt;这个安装程序其实写注册表和注册必要的dll文件，不用复制文件到C盘，所以安装速度很快。&lt;/p&gt;&#xA;&lt;p&gt;下面做点精简笔记，以纯净的WIN7 32位系统为基础：&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;将VS2005的程序目录放到D：\VS2005\，运行Common7\IDE\devenv.exe，提示应用程序配置不正确，程序无法运行？&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;p&gt;这是因为VS2005是基于VS2005开发的，需要安装VC++ 2005运行时库才可以。&lt;/p&gt;&#xA;&lt;ol start=&#34;2&#34;&gt;&#xA;&lt;li&gt;安装VC++2005后，再次运行devenv.exe，提示一个或多个组件没有找到？&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;p&gt;这是因为还没有写入注册表，所以VS2005完全不能运行，需要把刚才提取的注册表项导入。&lt;/p&gt;&#xA;&lt;ol start=&#34;3&#34;&gt;&#xA;&lt;li&gt;导入注册表项后，再次运行devenv.exe，提示文件加载失败，%commondir%\dte80.olb？&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;p&gt;这是因为VS2005依赖的一部分DLL竟然要放到C:\Program Files\Common Files\&lt;/p&gt;&#xA;&lt;ol start=&#34;4&#34;&gt;&#xA;&lt;li&gt;复制这些DLL到C:\Program Files\Common Files\之后，再运行devenv.exe，终于看到初始化界面了，但过了一会儿提示“无效的许可证数据”？&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;p&gt;这个问题有点奇怪，明明把完整的注册表项都导入了，为什么注册没有成功，这次找到了前辈的安装程序，发现发vsreg.exe，用这个小工具重新注册一下就可以了。&lt;/p&gt;&#xA;&lt;ol start=&#34;5&#34;&gt;&#xA;&lt;li&gt;重新注册VS2005之后，再运行devenv.exe，又提示一堆Package加载失败？&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;p&gt;嗯，很烦，VS2005的很多Package是基于.NET平台开发的，所以还要重复这些文件到C:\Windows\Assembly目录啊！&lt;/p&gt;&#xA;&lt;ol start=&#34;6&#34;&gt;&#xA;&lt;li&gt;复制.net组件后，再运行devenv.exe，终于成功了，但是编译helloworld无法运行，还是提示应用程序配置不正确？&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;p&gt;这个嘛，是因为DEBUG版本程序依赖DEBUG版的VC++运行时库，需要拷贝几个dll和manifest文件到C:\Windows\Winsxs，还要把这几个DLL注册到注册表项。&lt;/p&gt;&#xA;&lt;p&gt;7.处理好winsxs目录的文件，VS2005终于可以正常工作了。&lt;/p&gt;&#xA;&lt;p&gt;好了，剩下的事情就是精简了，所谓精简就是不停地删除那些我一辈子都用不到的组件，然后还要删除对应的注册表项，&lt;/p&gt;&#xA;&lt;p&gt;这就是个相当耗费精力的过程。。。&lt;/p&gt;&#xA;&lt;p&gt;。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。&lt;/p&gt;&#xA;&lt;p&gt;。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。&lt;/p&gt;&#xA;&lt;p&gt;。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。&lt;/p&gt;&#xA;&lt;p&gt;。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。&lt;/p&gt;&#xA;&lt;p&gt;不知道过了多久，删除了一堆又一堆DLL文件，删除了一行又一行的注册表项，而且要保证VS2005运行时不出错。&lt;/p&gt;&#xA;&lt;p&gt;最后的文件结构：&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;\Common7\*        IDE核心文件&#xD;&#xA;\Setup\*          安装时会引用的文件&#xD;&#xA;\VC\bin           VC++编译器，可以替换为VS2010或者其它版本，可以实现对C++11的支持。&#xD;&#xA;\VC\atlmfc        MFC库文件、头文件、源代码。可以替换为VS2010或者其它版本。&#xD;&#xA;\VC\crt           CRT的源代码，没有太多作用，可以删除。&#xD;&#xA;\VC\PlatformSDK   Windows的SDK头文件和库文件，VS2005提供的SDK是基于windows XP的，可以替换为其它版本&#xD;&#xA;\VC\*             VC++工程核心文件&#xD;&#xA;\setup.exe        快速安装程序&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;做好了成品放到百度网盘，分享给有缘人吧：&lt;/p&gt;</description>
    </item>
    <item>
      <title>winsxs探索之组件的本质:文件与注册表</title>
      <link>https://xcdd.pages.dev/blog/2019/2019-01-01/</link>
      <pubDate>Tue, 01 Jan 2019 11:15:10 +0000</pubDate>
      <guid>https://xcdd.pages.dev/blog/2019/2019-01-01/</guid>
      <description>&lt;p&gt;是谁在解析应用程序的manifest文件？它又是怎么去查找相关的组件的？&lt;/p&gt;&#xA;&lt;p&gt;我觉得要搞清楚这个问题，才能彻底解决winsxs带来的问题。&lt;/p&gt;&#xA;&lt;p&gt;仅仅依靠sxstrace给的那点提示是不够的，还需要了深入地了解发生在它背后的事情。&lt;/p&gt;&#xA;&lt;p&gt;在Windows系统组件的本质其实就是文件和注册表。&lt;/p&gt;&#xA;&lt;p&gt;所以通过监控应用程序启动过程中整个系统对注册表和文件系统的访问动作来寻找答案。&lt;/p&gt;&#xA;&lt;p&gt;很快便发现了一个叫做csrss.exe的进程，访问了winsxs相关的目录和注册表。&lt;/p&gt;&#xA;&lt;p&gt;并且这些访问与启动的应用程序manifest里描述的组件信息完全吻合。&lt;/p&gt;&#xA;&lt;p&gt;这里以Debug版的demo程序为例，&lt;/p&gt;&#xA;&lt;p&gt;csrss进程先后读取了以下内容：&lt;/p&gt;&#xA;&lt;p&gt;注册表：&lt;/p&gt;&#xA;&lt;p&gt;[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\SideBySide\Winners\x86_policy.9.0.microsoft.vc90.debugcrt_1fc8b3b9a1e18e3b_none_3f3c83b270d599c8]&lt;/p&gt;&#xA;&lt;p&gt;文件：&lt;/p&gt;&#xA;&lt;p&gt;C:\Windows\winsxs\manifests\x86_policy.9.0.microsoft.vc90.debugcrt_1fc8b3b9a1e18e3b_9.0.21022.8_none_3c8576a8f974f0b8.cat&lt;/p&gt;&#xA;&lt;p&gt;注册表：&lt;/p&gt;&#xA;&lt;p&gt;[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\SideBySide\Winners\x86_microsoft.vc90.debugcrt_1fc8b3b9a1e18e3b_none_eaaf859ba152a8ae]&lt;/p&gt;&#xA;&lt;p&gt;文件夾：&lt;/p&gt;&#xA;&lt;p&gt;C:\Windows\winsxs\x86_microsoft.vc90.debugcrt_1fc8b3b9a1e18e3b_9.0.21022.8_none_96748342450f6aa2\&lt;/p&gt;&#xA;&lt;p&gt;有了这个信息，再来解决&amp;quot;应用程序配置不正确程序无法启动”的问题就变得清晰明了了。&lt;/p&gt;&#xA;&lt;p&gt;当出现&amp;quot;应用程序配置不正确程序无法启动”的时候，我们只要监控csrss.exe进程访问了哪些注册表项和系统文件，&lt;/p&gt;&#xA;&lt;p&gt;就可以顺藤摸瓜找到winsxs组件的安装方法了。&lt;/p&gt;&#xA;&lt;p&gt;这样即使微软不提供Microsoft.VC++.Runtime的安装包程序，我们也可以手动找到这些dll文件，复制到winsxs对应的目录，然后写入正确的注册表项就完手动完成了。&lt;/p&gt;&#xA;&lt;p&gt;这里贴上一个VC90.debugcrt的在winsxs目录的树形结构以作参考：&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;winsxs&#xD;&#xA;├── manifests&#xD;&#xA;│   ├── x86_microsoft.vc90.debugcrt_1fc8b3b9a1e18e3b_9.0.21022.8_none_96748342450f6aa2.cat&#xD;&#xA;│   ├── x86_microsoft.vc90.debugcrt_1fc8b3b9a1e18e3b_9.0.21022.8_none_96748342450f6aa2.manifest&#xD;&#xA;│   ├── x86_microsoft.vc90.debugmfc_1fc8b3b9a1e18e3b_9.0.21022.8_none_9b54853441e399d5.cat&#xD;&#xA;│   ├── x86_microsoft.vc90.debugmfc_1fc8b3b9a1e18e3b_9.0.21022.8_none_9b54853441e399d5.manifest&#xD;&#xA;│   ├── x86_microsoft.vc90.debugopenmp_1fc8b3b9a1e18e3b_9.0.21022.8_none_469e7800ca24708e.cat&#xD;&#xA;│   ├── x86_microsoft.vc90.debugopenmp_1fc8b3b9a1e18e3b_9.0.21022.8_none_469e7800ca24708e.manifest&#xD;&#xA;│   ├── x86_policy.9.0.microsoft.vc90.debugcrt_1fc8b3b9a1e18e3b_9.0.21022.8_none_3c8576a8f974f0b8.cat&#xD;&#xA;│   ├── x86_policy.9.0.microsoft.vc90.debugcrt_1fc8b3b9a1e18e3b_9.0.21022.8_none_3c8576a8f974f0b8.manifest&#xD;&#xA;│   ├── x86_policy.9.0.microsoft.vc90.debugmfc_1fc8b3b9a1e18e3b_9.0.21022.8_none_37ea0b5cfc57dfad.cat&#xD;&#xA;│   ├── x86_policy.9.0.microsoft.vc90.debugmfc_1fc8b3b9a1e18e3b_9.0.21022.8_none_37ea0b5cfc57dfad.manifest&#xD;&#xA;│   ├── x86_policy.9.0.microsoft.vc90.debugopenmp_1fc8b3b9a1e18e3b_9.0.21022.8_none_8b162516588f5ada.cat&#xD;&#xA;│   └── x86_policy.9.0.microsoft.vc90.debugopenmp_1fc8b3b9a1e18e3b_9.0.21022.8_none_8b162516588f5ada.manifest&#xD;&#xA;├── x86_microsoft.vc90.debugcrt_1fc8b3b9a1e18e3b_9.0.21022.8_none_96748342450f6aa2&#xD;&#xA;│   ├── msvcm90d.dll&#xD;&#xA;│   ├── msvcp90d.dll&#xD;&#xA;│   └── msvcr90d.dll&#xD;&#xA;├── x86_microsoft.vc90.debugmfc_1fc8b3b9a1e18e3b_9.0.21022.8_none_9b54853441e399d5&#xD;&#xA;│   ├── mfc90d.dll&#xD;&#xA;│   ├── mfc90ud.dll&#xD;&#xA;│   ├── mfcm90d.dll&#xD;&#xA;│   └── mfcm90ud.dll&#xD;&#xA;└── x86_microsoft.vc90.debugopenmp_1fc8b3b9a1e18e3b_9.0.21022.8_none_469e7800ca24708e&#xD;&#xA;    └── vcomp90d.dll&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;除了文件以外，还有几项必须的注册表：&lt;/p&gt;</description>
    </item>
    <item>
      <title>winsxs探索之sxstrace错误跟踪工具</title>
      <link>https://xcdd.pages.dev/blog/2018/2018-12-31-2124/</link>
      <pubDate>Mon, 31 Dec 2018 21:24:02 +0000</pubDate>
      <guid>https://xcdd.pages.dev/blog/2018/2018-12-31-2124/</guid>
      <description>&lt;p&gt;当程序弹出&amp;quot;应用程序配置不正确程序无法启动”的时候，都会提示你使用sxstrace工具来追踪信息。&lt;/p&gt;&#xA;&lt;p&gt;sxstrace工具的用法是这样的：&lt;/p&gt;&#xA;&lt;p&gt;第一步：输入并运行SxsTrace Trace -logfile:log.etl&lt;/p&gt;&#xA;&lt;p&gt;第二步：运行你的测试的程序hellp.exe&lt;/p&gt;&#xA;&lt;p&gt;第三步：在刚才的命令窗口按下回车，停止日志收集&lt;/p&gt;&#xA;&lt;p&gt;第四步：输入并运行SxsTrace Parse -logfile:log.etl -outfile:log.txt&lt;/p&gt;&#xA;&lt;p&gt;第五步：打开log.txt&lt;/p&gt;&#xA;&lt;p&gt;找开log.txt文件后，给到的信息并不多，只能看出是这个程序的哪个组件没有找到。&lt;/p&gt;</description>
    </item>
    <item>
      <title>winsxs探索之应用程序配置不正确程序无法启动</title>
      <link>https://xcdd.pages.dev/blog/2018/2018-12-31-2100/</link>
      <pubDate>Mon, 31 Dec 2018 21:00:11 +0000</pubDate>
      <guid>https://xcdd.pages.dev/blog/2018/2018-12-31-2100/</guid>
      <description>&lt;p&gt;“应用程序配置不正确程序无法启动”这是经常会遇到的错误提示。那么它到底意味着什么，如何解决这个问题？&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;这个错误提示意味着什么？&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;p&gt;意味着此程序运行所需的组件不存在。&lt;/p&gt;&#xA;&lt;p&gt;这个组件的描述在程序的manifest文件里。&lt;/p&gt;&#xA;&lt;p&gt;大多数manifest文件是以资源的形式内嵌在可执行文件里面的。&lt;/p&gt;&#xA;&lt;p&gt;这个文件长什么样？我随便找来了一个EXE文件来研究，导出它的资源文件:/.rsrc/1033/manifest/1&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;&amp;lt;assembly xmlns=&amp;#34;urn:schemas-microsoft-com:asm.v1&amp;#34; manifestVersion=&amp;#34;1.0&amp;#34;&amp;gt;&#xD;&#xA;    &amp;lt;dependency&amp;gt;&#xD;&#xA;        &amp;lt;dependentAssembly&amp;gt;&#xD;&#xA;            &amp;lt;assemblyIdentity type=&amp;#34;win32&amp;#34; name=&amp;#34;Microsoft.VC80.CRT&amp;#34; version=&amp;#34;8.0.50608.0&amp;#34; processorArchitecture=&amp;#34;x86&amp;#34; publicKeyToken=&amp;#34;1fc8b3b9a1e18e3b&amp;#34;&amp;gt;&#xD;&#xA;            &amp;lt;/assemblyIdentity&amp;gt;&#xD;&#xA;        &amp;lt;/dependentAssembly&amp;gt;&#xD;&#xA;    &amp;lt;/dependency&amp;gt;&#xD;&#xA;    &amp;lt;dependency&amp;gt;&#xD;&#xA;        &amp;lt;dependentAssembly&amp;gt;&#xD;&#xA;            &amp;lt;assemblyIdentity type=&amp;#34;win32&amp;#34; name=&amp;#34;Microsoft.Windows.Common-Controls&amp;#34; version=&amp;#34;6.0.0.0&amp;#34; processorArchitecture=&amp;#34;x86&amp;#34; publicKeyToken=&amp;#34;6595b64144ccf1df&amp;#34; language=&amp;#34;*&amp;#34;&amp;gt;&#xD;&#xA;            &amp;lt;/assemblyIdentity&amp;gt;&#xD;&#xA;        &amp;lt;/dependentAssembly&amp;gt;&#xD;&#xA;    &amp;lt;/dependency&amp;gt;&#xD;&#xA;&amp;lt;/assembly&amp;gt;&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;从这个文件内容可以看出，它的本质是一个类似XML的文本文件，dependency节点描述了此程序运行所需的组件信息，这个文件里面有两个dependency节点，分别描述了两个组件，一个是Microsoft.VC80.CRT，另一个是Microsoft.Windows.Common-Controls。&lt;/p&gt;&#xA;&lt;p&gt;Microsoft.VC80.CRT 就是VS2005编译器所带的VC++运行时库版本，说明此程序是用VS2005开发的。&lt;/p&gt;&#xA;&lt;p&gt;Microsoft.Windows.Common-Controls 就是Windows的通用控件库，这个一般是系统都有的组件，可能版本有所不同。&lt;/p&gt;&#xA;&lt;p&gt;这里我们以Microsoft.VC80.CRT为例，&lt;/p&gt;&#xA;&lt;p&gt;从文件内容可以看出，这个组件的其它信息：&lt;/p&gt;&#xA;&lt;p&gt;CPU架构是X86，&lt;/p&gt;&#xA;&lt;p&gt;系统类型是Win32，&lt;/p&gt;&#xA;&lt;p&gt;版本号是8.0.50608.0，&lt;/p&gt;&#xA;&lt;p&gt;公钥令牌是：1fc8b3b9a1e18e3b&lt;/p&gt;&#xA;&lt;ol start=&#34;2&#34;&gt;&#xA;&lt;li&gt;如何解决这个问题？&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;p&gt;如果这个程序运行时提示：应用程序配置不正确程序无法启动&lt;/p&gt;&#xA;&lt;p&gt;那么很可能是系统中没有Microsoft.VC80.CRT这个组件，或者组件版本不正确，只要安装正确的版本就能解决。&lt;/p&gt;</description>
    </item>
    <item>
      <title>为精简版VS2008添加DEBUG版运行时库到系统目录</title>
      <link>https://xcdd.pages.dev/blog/2018/2018-12-31/</link>
      <pubDate>Mon, 31 Dec 2018 20:29:05 +0000</pubDate>
      <guid>https://xcdd.pages.dev/blog/2018/2018-12-31/</guid>
      <description>&lt;p&gt;首先要感谢精简版VS2008的作者：风铃夜思雨（ &lt;a href=&#34;https://bbs.pediy.com/thread-66741.htm&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;https://bbs.pediy.com/thread-66741.htm&lt;/a&gt; ）&lt;/p&gt;&#xA;&lt;p&gt;很可惜这个资源在2018年的今天过于老旧，网上已经快要绝版了。&lt;/p&gt;&#xA;&lt;p&gt;原作者的V1.03版本VS2008SP1在网上已经找不到资源了，现在我能找到的只有原作者的V1.01版本。&lt;/p&gt;&#xA;&lt;p&gt;完整的VS2008实再太臃肿，安装过程也需要很多时间，而且还附带了一大堆C++开发跟本用不上的组件，&lt;/p&gt;&#xA;&lt;p&gt;诸如什么Web Designer，Document Explorer, SQL Server Express等等等。。。。。。&lt;/p&gt;&#xA;&lt;p&gt;精简版只包含C++开发所需的编译器，SDK库文件，和IDE组件，体积小，便于安装，启动速度也更快。&lt;/p&gt;&#xA;&lt;p&gt;但对于99.9%的人来说都不会使用这类精简版的工具，因为大多数人都害怕出现问题，又没有能力解决问题。&lt;/p&gt;&#xA;&lt;p&gt;对于搞技术的人就是要有能折腾的精神，遇到问题解决它便是！&lt;/p&gt;&#xA;&lt;p&gt;再次致敬作者！&lt;/p&gt;&#xA;&lt;p&gt;众所周知，Visual Studio编译的目标程序分DEBUG版和RELEASE版。&lt;/p&gt;&#xA;&lt;p&gt;如果使用动态链接发布程序，那么运行的时候需要安装对应版本的VC++运行时库（以下简称CRT）。&lt;/p&gt;&#xA;&lt;p&gt;Release版的CRT很容易在网上找到资源，但是DEBUG版的确没有任何资源，&lt;/p&gt;&#xA;&lt;p&gt;因为一般来说微软是不允许开发者发布DEBUG版的程序的，而DEBUG版CRT是伴随VS一起安装到本地系统的。&lt;/p&gt;&#xA;&lt;p&gt;正好这个精简版VS2008是没有把DEBUG版CRT安装到系统目录，在调试程序的时候会弹出程序无法运行的错误，&lt;/p&gt;&#xA;&lt;p&gt;别人的解决方法是把编译选项改为静态链接，或者把DEBUG版的msvcr80d.dll文件复制到程序目录。&lt;/p&gt;&#xA;&lt;p&gt;这些方法虽然可以临时解决问题，但是不够方便，最好的办法是把DEBUG版CRT安装到系统目录。&lt;/p&gt;&#xA;&lt;p&gt;在Windows系统上所谓的安装软件，无非就是两个过程：复制文件和写入注册表。&lt;/p&gt;&#xA;&lt;p&gt;如果监控VS2008在安装的过程中的所有复制文件操作和注册表操作，这会非常困难，因为VS2008在安装过程中复制的文件数目多到令人发指，工作量很大。&lt;/p&gt;&#xA;&lt;p&gt;所以我们倒着来寻找线索，利用程序运行时报错的信息来反向找到正确的DLL文件路径和相关的注册表项。&lt;/p&gt;&#xA;&lt;p&gt;中间的过程比较坎坷，不过让我对winsxs的了解更加熟悉了，关于winsxs的内容放到另一篇文章吧，&lt;/p&gt;&#xA;&lt;p&gt;这里就不多说了，直接放上我的研究结果吧。&lt;/p&gt;&#xA;&lt;p&gt;下载这个压缩包，复制文件和添加注册表项即可。&lt;/p&gt;&#xA;&lt;p&gt;x86_microsoft.vc90.debug下载地址：&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://download.csdn.net/download/qq446252221/10887422&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;https://download.csdn.net/download/qq446252221/10887422&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;x86_microsoft.vc80.debug下载地址：&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://download.csdn.net/download/qq446252221/10890793&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;https://download.csdn.net/download/qq446252221/10890793&lt;/a&gt;&lt;/p&gt;</description>
    </item>
    <item>
      <title>socket编程为什么不会弹出Windows防火墙安全警告？</title>
      <link>https://xcdd.pages.dev/blog/2018/2018-12-21/</link>
      <pubDate>Fri, 21 Dec 2018 15:43:33 +0000</pubDate>
      <guid>https://xcdd.pages.dev/blog/2018/2018-12-21/</guid>
      <description>&lt;p&gt;在启动了Windows防火墙的电脑上，第一次运行QQ，Chrome等网络程序的时候，会弹出一个安全警告，如图：&lt;/p&gt;&#xA;&lt;p&gt;&lt;img src=&#34;./075_1.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;但是为什么自己用socket编程接口，开发的网络小程序，不会弹出这个窗口来呢？&lt;/p&gt;&#xA;&lt;p&gt;经过一番研究，发现了原因：&lt;/p&gt;&#xA;&lt;p&gt;在socket编程的流程中，有一个bind函数，用于绑定本机IP地址和端口号。&lt;/p&gt;&#xA;&lt;p&gt;而这个bind函数就是防火墙弹窗的关键。&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;{&#x9;&#xD;&#xA;int ret;&#xD;&#xA;sockaddr_in addr;&#xD;&#xA;SOCKET s;&#xD;&#xA;memset(&amp;amp;addr, 0, sizeof(addr));&#xD;&#xA;addr.sin_family = AF_INET;&#xD;&#xA;addr.sin_port = 0;&#xD;&#xA;addr.sin_addr.S_un.S_addr = inet_addr(&amp;#34;0.0.0.0&amp;#34;);&#xD;&#xA;s = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);&#xD;&#xA;ret = bind(s, (struct sockaddr *)&amp;amp;addr, sizeof(addr));&#xD;&#xA;}&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;如上代码片段，调用bind函数，绑定本机IP地址和端口号。&lt;/p&gt;&#xA;&lt;p&gt;如果addr.sin_port = 0，表示由系统分配一个端口号，这种情况下，Windows防火墙不会提示。&lt;/p&gt;&#xA;&lt;p&gt;如果addr.sin_port = 非0值，表示程序指定一个端口号，这种情况下，Windows防火墙就是弹出提示。&lt;/p&gt;</description>
    </item>
    <item>
      <title>32位Windows 7开启PAE可以识别4GB以上内存</title>
      <link>https://xcdd.pages.dev/blog/2018/2018-10-21/</link>
      <pubDate>Sun, 21 Oct 2018 17:12:48 +0000</pubDate>
      <guid>https://xcdd.pages.dev/blog/2018/2018-10-21/</guid>
      <description>&lt;p&gt;众所周知32位Windows 7系统最大只能识别4GB内存，并且可用内存最多为3.25GB.&lt;/p&gt;&#xA;&lt;p&gt;但是32位的Windows Server 2003/2008却可以使用4GB以上内存，原因就在于这个系统可以利用x86的PAE特性。&lt;/p&gt;&#xA;&lt;p&gt;然而默认情况Windows 7却无法使用PAE特性，原因在于系统内核层屏蔽了此功能，&lt;/p&gt;&#xA;&lt;p&gt;网传的修改BCD参数，bcdedit /set pae forceenable 设置PAE模式为:ForceEnable，实测并没有作用。&lt;/p&gt;&#xA;&lt;p&gt;不过早就有大神开发32位系统内核的PAE补丁(PatchPae2.exe)！&lt;/p&gt;&#xA;&lt;p&gt;大概在2012年左右就发布了支持Windows7/8版本的PAE内核补丁，而我在6年后的今天才知道，相当的后知后觉！&lt;/p&gt;&#xA;&lt;p&gt;在我的这台破旧的4GB笔记本上面实测有用，写下记录过程，以便以后查阅：&lt;/p&gt;&#xA;&lt;p&gt;一、补丁下载地址： &lt;a href=&#34;https://pan.baidu.com/s/1BT3g_AMx9v2FakR0G6KizA&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;https://pan.baidu.com/s/1BT3g_AMx9v2FakR0G6KizA&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;二、补丁使用方法：&lt;/p&gt;&#xA;&lt;p&gt;1.将PatchPae2.exe复制到C:\Windows\System32\目录&#xA;2.以管理员身份运行cmd.exe&#xA;3.依次输入以下命令，将会在C:\Windows\System32\目录下生成两个系统文件.&#xA;PatchPae2 -type kernel -o ntkrnlpa_pae.exe ntkrnlpa.exe&#xA;PatchPae2 -type loader -o winload_pae.exe winload.exe&#xA;4.使用BOOTICE.exe工具编辑BCD文件，（因为使用bcdedit输入命令太麻烦了，所以用这个GUI工具）&#xA;为了避免启动失败，最好新建一个启动项，使用高级编辑模式，修改下图红框中的3个参数即可。 &lt;img src=&#34;./074_1.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;重新启动电脑，选项新建的PAE启动项测试，结果如下：&lt;/p&gt;&#xA;&lt;p&gt;任务管理器显示总的物理内存为4020MB&lt;/p&gt;&#xA;&lt;p&gt;&lt;img src=&#34;./074_2.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;系统属性显示安装内存4.00GB，以前的“可用2.99GB”的字样消失了。&lt;/p&gt;&#xA;&lt;p&gt;&lt;img src=&#34;./074_3.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;</description>
    </item>
    <item>
      <title>nRF51822关于GPIOTE模块的外部中断问题</title>
      <link>https://xcdd.pages.dev/blog/2018/2018-09-25/</link>
      <pubDate>Tue, 25 Sep 2018 14:12:55 +0000</pubDate>
      <guid>https://xcdd.pages.dev/blog/2018/2018-09-25/</guid>
      <description>&lt;p&gt;nRF51822的GPIO的外部中断单独做成了一个模块，叫做GPIOTE，除了产生外部中断事件外，还支持输出任务。&lt;/p&gt;&#xA;&lt;p&gt;这里重点关注一下外部中断的功能，GPIOTE有两种外部中断模式：&lt;/p&gt;&#xA;&lt;p&gt;一种是IN_EVENT&lt;/p&gt;&#xA;&lt;p&gt;这种模式可以独立配置4个通道，每个通道都有专门的中断标志位，可以任意指管脚和中断触发方式：上升/下降/翻转&lt;/p&gt;&#xA;&lt;p&gt;当检测到对应的电平跳变后，将产生中断，触发GPIOTE_IRQHandler函数，但是这种模式有一个严重的问题，那就是静态功耗有1.3mA，对于低功耗芯片来说，这个功能就相当的鸡勒了。&lt;/p&gt;&#xA;&lt;p&gt;另一种是PORT_EVENT&lt;/p&gt;&#xA;&lt;p&gt;这种模式所有GPIO外部中断共用一个中断标志，在GPIOTE模块中，没有多余的参数配置寄存器。&lt;/p&gt;&#xA;&lt;p&gt;要用它实现外部中断，需要在GPIO模块中配置对应的管脚打开SENSE功能，而GPIO的这个SENSE功能呢，&lt;/p&gt;&#xA;&lt;p&gt;它的功能是检测GPIO电平，如果满足PIN_CNF[17:16]设置的条件，则将DETECT信号拉高。&lt;/p&gt;&#xA;&lt;p&gt;这个DETECT信号是内部信号，每个PIN都有一条独立的DETECT信号，而所有的DETECT信号又由系统以[逻辑或]的方式合并为一条通用的DETECT信号，当这条通用的DETECT信号产生上升沿跳变的时候，就会产生一次PORT_EVENT中断。&lt;/p&gt;&#xA;&lt;p&gt;PORT_EVENT中断方式功耗极低，但是却存在多个GPIO冲突的情况，导至中断不能正确地触发。&lt;/p&gt;</description>
    </item>
    <item>
      <title>修复Keil5的菜单栏字体</title>
      <link>https://xcdd.pages.dev/blog/2018/2018-08-28/</link>
      <pubDate>Tue, 28 Aug 2018 15:21:59 +0000</pubDate>
      <guid>https://xcdd.pages.dev/blog/2018/2018-08-28/</guid>
      <description>&lt;p&gt;用Keil5已经相当长的时间了，一直觉得Keil5的菜单栏字体看着不顺眼，应该只有处女座才会注意到吧？&lt;/p&gt;&#xA;&lt;p&gt;特别是把Windows 7主题设置为经典主题之后,系统字体已经变为宋体，&lt;/p&gt;&#xA;&lt;p&gt;搞开发的电脑屏幕分辨率又不高，且DPI为96的硬件条件下，用宋体做系统字体比较清晰。&lt;/p&gt;&#xA;&lt;p&gt;因为宋体在字号为9-13这个范围时，使用的是点阵字体，所以效果非常锐利不会出现模糊。&lt;/p&gt;&#xA;&lt;p&gt;然而Keil的菜单栏字体却很模糊，整个菜单栏如下图的模糊效果：&lt;/p&gt;&#xA;&lt;p&gt;&lt;img src=&#34;./072_1.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;这个&amp;quot;Close&amp;quot;单词变形很严重，太难看了，由此可以推测它跟随了系统菜单的字形，但没有使用系统菜单的字号！&lt;/p&gt;&#xA;&lt;p&gt;于是今天对UV4.exe做了一番研究，发现它获取到系统菜单的字体之后，又对字体大小做了一堆操作！&lt;/p&gt;&#xA;&lt;p&gt;得出一个新的字体大小，并使用这个新的字体,创建了这个菜单栏！&lt;/p&gt;&#xA;&lt;p&gt;所以最后我修改UV4.exe还原了菜单栏的字体大小,这样就与系统菜单保持一致了，如下图：&lt;/p&gt;&#xA;&lt;p&gt;&lt;img src=&#34;./072_2.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;这个处女座纠结的问题总算被解决了^_^&lt;/p&gt;&#xA;&lt;p&gt;终于可以把注意力放到写代码上面，而不用纠结这个菜单栏了。&lt;/p&gt;&#xA;&lt;p&gt;哈哈哈哈&amp;hellip;&amp;hellip;&amp;hellip;..&lt;/p&gt;&#xA;&lt;p&gt;附上修改后的UV4.exe: &lt;a href=&#34;https://download.csdn.net/download/qq446252221/10631414&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;https://download.csdn.net/download/qq446252221/10631414&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;我所用的Keil版本号是V5.18&lt;/p&gt;</description>
    </item>
    <item>
      <title>Windows中的字体映射关系</title>
      <link>https://xcdd.pages.dev/blog/2018/2018-07-30/</link>
      <pubDate>Mon, 30 Jul 2018 10:27:48 +0000</pubDate>
      <guid>https://xcdd.pages.dev/blog/2018/2018-07-30/</guid>
      <description>&lt;p&gt;从软件开发的角度，研究如何自定义Windows的系统字体。&lt;/p&gt;&#xA;&lt;p&gt;在Windows程序开发中经常使用CreateFont创建指定的字体，其中一个参数&amp;quot;lpszFace&amp;quot;指定了字体名称。&lt;/p&gt;&#xA;&lt;p&gt;那么系统是如何加载这个字体的？&lt;/p&gt;&#xA;&lt;p&gt;首先会从注册表中查找:&lt;/p&gt;&#xA;&lt;p&gt;HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Fonts&lt;/p&gt;&#xA;&lt;p&gt;这里列出了系统中已经安装的字体信息，以及该字体对应的字体文件名(默认路径是C:\windows\fonts)。&lt;/p&gt;&#xA;&lt;p&gt;如果找到了，则加载对应的字体到内存，用作文字输出。&lt;/p&gt;&#xA;&lt;p&gt;如果没找到呢？&lt;/p&gt;&#xA;&lt;p&gt;系统还会寻找:&lt;/p&gt;&#xA;&lt;p&gt;HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\FontSubstitutes&lt;/p&gt;&#xA;&lt;p&gt;这里定义的是复用字体，如果系统中没有安装指定的字体，但是可以在这里添加一个表项，指向系统中已有的字体。&lt;/p&gt;&#xA;&lt;p&gt;如果还是没有找到呢？&lt;/p&gt;&#xA;&lt;p&gt;那么CreateFont函数可能会返回失败，文字输出可能会使用一个叫做“System, 16”的字体代替。&lt;/p&gt;&#xA;&lt;p&gt;在研究注册表的时候，还有一个表项：&lt;/p&gt;&#xA;&lt;p&gt;HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\FontLink\SystemLink&lt;/p&gt;&#xA;&lt;p&gt;这里定义的是字体链表，作用是当我加载的字体中没有要显示的文字的时候，就会从这里找到对应字体的备选字体文件。&lt;/p&gt;&#xA;&lt;p&gt;从备选字体中加载要显示的文字。&lt;/p&gt;&#xA;&lt;hr&gt;&#xA;&lt;p&gt;所以如果要安全地去掉“微软雅黑”字体的方法就是：&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;在HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Fonts中删除微软雅黑&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;在HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\FontSubstitutes中设置微软雅黑的别名&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;p&gt;3.重启电脑&lt;/p&gt;&#xA;&lt;p&gt;4.删除C:\Windows\Fonts\msyh.ttf&lt;/p&gt;</description>
    </item>
    <item>
      <title>关于mingw里面swprintf函数的问题</title>
      <link>https://xcdd.pages.dev/blog/2018/2018-07-28/</link>
      <pubDate>Sat, 28 Jul 2018 12:53:09 +0000</pubDate>
      <guid>https://xcdd.pages.dev/blog/2018/2018-07-28/</guid>
      <description>&lt;p&gt;mingw中的swprintf函数声明与iso c语言标准的有些差异，这个函数定义在wchar.h中。&lt;/p&gt;&#xA;&lt;p&gt;iso c99标准定义如下：&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-cpp&#34; data-lang=&#34;cpp&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;swprintf&lt;/span&gt; (&lt;span style=&#34;color:#66d9ef&#34;&gt;wchar_t&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt; ws, size_t len, &lt;span style=&#34;color:#66d9ef&#34;&gt;const&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;wchar_t&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt; format, ...);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;而在mingw当中是这样的：&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-cpp&#34; data-lang=&#34;cpp&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;swprintf&lt;/span&gt; (&lt;span style=&#34;color:#66d9ef&#34;&gt;wchar_t&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;, &lt;span style=&#34;color:#66d9ef&#34;&gt;const&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;wchar_t&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;, ...);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;少了一个size_t的参数，这是什么原因造成的呢？&lt;/p&gt;&#xA;&lt;p&gt;mingw当中定义的swprintf是由windows提供的msvcrt.dll实现的，&lt;/p&gt;&#xA;&lt;p&gt;而msvcrt.dll在windows 95中就存在了。&lt;/p&gt;&#xA;&lt;p&gt;1995年iso c99标准还没有问世，而iso c89标准又没有定义wchar.h。&lt;/p&gt;&#xA;&lt;p&gt;所以大概就是windows 95编写的时候，还没有swprintf函数，所以呢这是一个windows系统自定义的非标准函数。&lt;/p&gt;&#xA;&lt;p&gt;后来swprintf正式进入iso c99标准，但是函数声明却与windows内置的swprintf不一致！！！&lt;/p&gt;&#xA;&lt;p&gt;结果就是微软被iso坑了啊&amp;hellip;&amp;hellip;&amp;hellip;&amp;hellip;..&lt;/p&gt;&#xA;&lt;p&gt;但是此时微软已经发布了windows 95, windows 98&amp;hellip;&lt;/p&gt;&#xA;&lt;p&gt;那怎么办？要是直接把msvcrt.dll里面的swprintf改为iso标准的实现，那么以前基于旧版本开发的软件就没发运行了。&lt;/p&gt;&#xA;&lt;p&gt;所以msvcrt.dll是肯定不能改的，后果很严重，但是又不能不兼容iso c标准的定义。&lt;/p&gt;&#xA;&lt;p&gt;后来我查了vc++4.2和vc++6.0版本定义的swprintf都是和mingw一样的。&lt;/p&gt;&#xA;&lt;p&gt;从vs2005开始才发生了变化，通过宏定义_CRT_NON_CONFORMING_SWPRINTFS，区分新旧版本swprintf。&lt;/p&gt;&#xA;&lt;p&gt;如果定义了这个宏则使用旧版swprintf，没有定义则使用新版swprintf。&lt;/p&gt;&#xA;&lt;p&gt;而新版swprintf其实是一个内联函数，在swprintf.inl文件中如下：&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-cpp&#34; data-lang=&#34;cpp&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;static&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;__inline&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;swprintf&lt;/span&gt;(&lt;span style=&#34;color:#66d9ef&#34;&gt;wchar_t&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt; _String, size_t _Count, &lt;span style=&#34;color:#66d9ef&#34;&gt;const&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;wchar_t&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt; _Format, ...)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;{&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    va_list _Arglist;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt; _Ret;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    _crt_va_start(_Arglist, _Format);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    _Ret &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; _vswprintf_c_l(_String, _Count, _Format, NULL, _Arglist);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    _crt_va_end(_Arglist);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt; _Ret;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;看到这里，就恍然大悟了！！！&lt;/p&gt;&#xA;&lt;p&gt;微软的程序员果然还真是聪明啊！！！这样既保证了软件兼容性，又可以实现兼容iso c99。&lt;/p&gt;&#xA;&lt;p&gt;如果没猜错的话，目前所有版本的msvcrt.dll都是老版本的swprintf，所以才有今天mingw的头文件中swprintf的声明与iso c99不一致的问题。&lt;/p&gt;</description>
    </item>
    <item>
      <title>怎样才能去除可执行文件中的.eh_frame数据?</title>
      <link>https://xcdd.pages.dev/blog/2018/2018-07-08/</link>
      <pubDate>Sun, 08 Jul 2018 20:24:22 +0000</pubDate>
      <guid>https://xcdd.pages.dev/blog/2018/2018-07-08/</guid>
      <description>&lt;p&gt;用mingw gcc各个版本编译出来的exe文件，都比VS编译的大一点。&lt;/p&gt;&#xA;&lt;p&gt;分析文件发现是每个exe文件都包含一个叫作&amp;quot;.eh_frame&amp;quot;的节，然而却没有找到去除这个数据节的办法！！！&lt;/p&gt;&#xA;&lt;p&gt;测试方法：&lt;/p&gt;&#xA;&lt;p&gt;编译一个空的main.c文件，如下内容：&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-cpp&#34; data-lang=&#34;cpp&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;#include&lt;/span&gt; &lt;span style=&#34;color:#75715e&#34;&gt;&amp;lt;stdio.h&amp;gt;&lt;/span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;void&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;main&lt;/span&gt;(&lt;span style=&#34;color:#66d9ef&#34;&gt;void&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;{&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    printf(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;hello&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;\n&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&lt;/span&gt;);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;1.使用命令#gcc main.c 得到a.exe,这时包含调试信息，再用#strip a.exe去除调试信息。&lt;/p&gt;&#xA;&lt;p&gt;发现a.exe里面也有.eh_frame章节。&lt;/p&gt;&#xA;&lt;p&gt;2.使用命令#gcc -s main.c得到a.exe&lt;/p&gt;&#xA;&lt;p&gt;这时a.exe还有是.eh_fram章节，注意与上面的a.exe有区别。&lt;/p&gt;&#xA;&lt;p&gt;3.使用strip -R .eh_frame 强制去除这个数据节，结果程序不能正常运行了。&lt;/p&gt;&#xA;&lt;p&gt;网上找了半天资料，试过加上如下各种参数：&lt;/p&gt;&#xA;&lt;p&gt;-fno-exceptions&lt;/p&gt;&#xA;&lt;p&gt;-fno-unwind-tables&lt;/p&gt;&#xA;&lt;p&gt;-fno-asynchronous-unwind-tables&lt;/p&gt;&#xA;&lt;p&gt;依然没能解决问题。&lt;/p&gt;&#xA;&lt;hr&gt;&#xA;&lt;p&gt;24小时后&amp;hellip;&amp;hellip;&lt;/p&gt;&#xA;&lt;p&gt;终于找到原因了，换了另外一个版本的gcc，编译出来的a.exe竟然没有.eh_frame段，而且体积会小2KB.&lt;/p&gt;&#xA;&lt;p&gt;经过比较区别就是这个版本的gcc没有使用dwarf的异常模型！&lt;/p&gt;&#xA;&lt;p&gt;使用gcc -v查看GCC的版本，会提示这个GCC的configure，如果带有&amp;ndash;with-dwarf则说明是支持dwarf异常。&lt;/p&gt;&#xA;&lt;p&gt;还记得Mingw-W64下载GCC的时候会选择线程模型(win32/posix)和异常模型(sjlj/dwarf)吗？&lt;/p&gt;&#xA;&lt;p&gt;下载sjls异常的GCC编译出来的exe就没有.eh_frame！！！&lt;/p&gt;&#xA;&lt;p&gt;之所以有这两种区别都是C++的事，只是没想到会影响我这个纯C开发者。&lt;/p&gt;&#xA;&lt;p&gt;25小时后&amp;hellip;&amp;hellip;&amp;hellip;&amp;hellip;&lt;/p&gt;&#xA;&lt;p&gt;事情好像不是我想像中的那样，似乎与异常模型没有关系？？？&lt;/p&gt;&#xA;&lt;p&gt;因为我交换了两个版本GCC自带的win32 library之后，原本出现.eh_frame的GCC竟然没有出现！&lt;/p&gt;&#xA;&lt;p&gt;进一步研究，好像是CRT库搞的鬼。具体就是crt1.o和crt2.o这两个文件！&lt;/p&gt;&#xA;&lt;p&gt;使用ojbdump查看crt1.o，这是自带.eh_frame的那个版本：&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-plain&#34; data-lang=&#34;plain&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;$../bin/objdump.exe -h crt1.o&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;crt1.o:     file format pe-i386&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Sections:&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Idx Name          Size      VMA       LMA       File off  Algn&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  0 .text         00000500  00000000  00000000  00000294  2**4&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  1 .data         00000004  00000000  00000000  00000794  2**2&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                  CONTENTS, ALLOC, LOAD, DATA&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  2 .bss          0000001c  00000000  00000000  00000000  2**2&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                  ALLOC&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  3 .text.unlikely 00000000  00000000  00000000  00000000  2**2&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                  ALLOC, LOAD, READONLY, CODE&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  4 .CRT$XCAA     00000004  00000000  00000000  00000798  2**2&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                  CONTENTS, ALLOC, LOAD, RELOC, DATA&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  5 .CRT$XIAA     00000004  00000000  00000000  0000079c  2**2&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                  CONTENTS, ALLOC, LOAD, RELOC, DATA&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  6 .drectve      00000054  00000000  00000000  000007a0  2**2&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                  CONTENTS, ALLOC, LOAD, DATA&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  7 .debug_info   00002203  00000000  00000000  000007f4  2**0&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                  CONTENTS, RELOC, READONLY, DEBUGGING&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  8 .debug_abbrev 00000441  00000000  00000000  000029f7  2**0&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                  CONTENTS, READONLY, DEBUGGING&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  9 .debug_loc    000002e3  00000000  00000000  00002e38  2**0&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                  CONTENTS, RELOC, READONLY, DEBUGGING&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; 10 .debug_aranges 00000020  00000000  00000000  0000311b  2**0&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                  CONTENTS, RELOC, READONLY, DEBUGGING&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; 11 .debug_ranges 00000088  00000000  00000000  0000313b  2**0&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                  CONTENTS, READONLY, DEBUGGING&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; 12 .debug_line   0000031c  00000000  00000000  000031c3  2**0&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                  CONTENTS, RELOC, READONLY, DEBUGGING&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; 13 .debug_str    000002f0  00000000  00000000  000034df  2**0&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                  CONTENTS, READONLY, DEBUGGING&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; 14 .rdata$zzz    0000002c  00000000  00000000  000037cf  2**2&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                  CONTENTS, ALLOC, LOAD, READONLY, DATA&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; 15 .eh_frame     000000c8  00000000  00000000  000037fb  2**2&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, DATA&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;下面是不带.eh_frame的版本&lt;/p&gt;</description>
    </item>
    <item>
      <title>MSYS2使用笔记</title>
      <link>https://xcdd.pages.dev/blog/2018/2018-06-30/</link>
      <pubDate>Sat, 30 Jun 2018 15:12:28 +0000</pubDate>
      <guid>https://xcdd.pages.dev/blog/2018/2018-06-30/</guid>
      <description>&lt;p&gt;MSYS2是一个体验非常好的linux模拟环境，可以移植大多数linux上面的程序，起源于cygwin。&lt;/p&gt;&#xA;&lt;p&gt;虽然官方网站也提供了安装包，一键安装，但是整个软件包太大了，&lt;/p&gt;&#xA;&lt;p&gt;我不太喜欢大而全的东西，更喜欢小而精的玩意。&lt;/p&gt;&#xA;&lt;p&gt;这里有一个非常好的镜像网站，http://mirrors.ustc.edu.cn/msys2/&lt;/p&gt;&#xA;&lt;p&gt;可以下载MSYS2的所有组件，以及所有版本，简直太好了。&lt;/p&gt;&#xA;&lt;p&gt;下载runtime + coreutil + bash + mintty 就可以把框架运行起来了。&lt;/p&gt;&#xA;&lt;p&gt;默认情况下bash的backspace不正常，需要下载ncurses-6.0，只要解压/usr/share/terminfo/78/xterm就可以了。&lt;/p&gt;&#xA;&lt;p&gt;busybox也是个非常厉害的程序，只有500多KB，我打算用它提供的命令替换coreutil里面的东西，&lt;/p&gt;&#xA;&lt;p&gt;然而发现它不支持中文，放弃之&amp;hellip;&lt;/p&gt;&#xA;&lt;p&gt;不过发现一个好玩的东西，linux下面的busybox &amp;ndash;install 会以创建软链接的方式来调用不同的命令，&lt;/p&gt;&#xA;&lt;p&gt;而windows平台却没有这样的操作，默认情况下是复制了N个相同的文件，硬盘占用感人！&lt;/p&gt;&#xA;&lt;p&gt;虽然windows可以创建硬链接，但是给人的感觉还是不舒服，因为硬链接和普通文件太像了，根本看不出来，&lt;/p&gt;&#xA;&lt;p&gt;查看文件夹大小，依然是一个很大的数字，为了减少磁盘空间，研究windows下面类似软链接的方法。&lt;/p&gt;&#xA;&lt;p&gt;结果还真有：在windows命令行输入mklink ls busybox 就可以创建一个符号链接了。&lt;/p&gt;&#xA;&lt;p&gt;文件图标有一个箭头，文件大小为0，可以双击运行，马上切换到MSYS2下面运行一下，成功！YES！太好了！！！&lt;/p&gt;</description>
    </item>
    <item>
      <title>一阶IIR滤波器的C语言设计和优化</title>
      <link>https://xcdd.pages.dev/blog/2018/2018-04-17/</link>
      <pubDate>Tue, 17 Apr 2018 14:19:08 +0000</pubDate>
      <guid>https://xcdd.pages.dev/blog/2018/2018-04-17/</guid>
      <description>&lt;p&gt;对于N阶IIR的计算方程式为：&lt;/p&gt;&#xA;&lt;p&gt;&lt;img src=&#34;./067_1.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;其中N表示滤波器的级数，当N＝1的时候，其方程可以展开为如下所示：&lt;/p&gt;&#xA;&lt;p&gt;&lt;img src=&#34;./067_2.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;本文的研究对象就是这个一阶方程，其中y为输出数据，x为输入数据，a和b为滤波器的系数。&lt;/p&gt;&#xA;&lt;p&gt;x[n]为本次要滤波的输入数据，x[n-1]为上一次滤波前的输入数据，y[n-1]为上一次滤波器输出的数据。&lt;/p&gt;&#xA;&lt;p&gt;设计这个滤波器，主要就是设计其中的系数a和b。&lt;/p&gt;&#xA;&lt;p&gt;######################################&lt;/p&gt;&#xA;&lt;p&gt;几乎网上的所有资料都是叫你使用matlab中的fdtool来设计参数，其实如果只是计算滤波参数，&lt;/p&gt;&#xA;&lt;p&gt;完全不用安装matlab这个几百兆的大家伙，可以使用下面介绍的小工具完成任务：&lt;/p&gt;&#xA;&lt;p&gt;1.直接在线计算：http://www-users.cs.york.ac.uk/~fisher/mkfilter&lt;/p&gt;&#xA;&lt;p&gt;2.下载专用小软件ScopeIIR，官方网站：http://iowegian.com/scopeiir&lt;/p&gt;&#xA;&lt;p&gt;3.下载专用小软件FiWiz，官方网站：http://www1.icsi.berkeley.edu/~storn/fiwiz.html&lt;/p&gt;&#xA;&lt;p&gt;4.下载专用小软件Iowa Hill，官方网站：http://iowahills.com/8DownloadPage.html&lt;/p&gt;&#xA;&lt;p&gt;#####################################&lt;/p&gt;&#xA;&lt;p&gt;无论使用哪种方式计算参数，都要输入采样率，滤波器类型，滤波级数，截止频率等参数。&lt;/p&gt;&#xA;&lt;p&gt;最后都会得到A0,A1,A2,B0,B1,B2这样的滤波器系数，直接代入到公式中计算就可以了。&lt;/p&gt;&#xA;&lt;p&gt;默认情况下，公式中的数据用代码都是采用浮点数float或者double来计算，这样可以提高精度，&#xA;但是大量的浮点乘法计算量比较大，特别是对于主频不高的单片机而言就更为吃力；&#xA;所以我们希望可以使用定点整数以减少计算量，甚至希望用移位器和加法器来代替乘法。&lt;/p&gt;&#xA;&lt;p&gt;下面就举一个实例来研究如何减少计算量：&lt;/p&gt;&#xA;&lt;p&gt;我们要设计一个采样率为1000，截止频率为100，滤波器类型为Butterworth，阶数为1的IIR低通滤波器，&#xA;通过计算得到如下参数：&lt;/p&gt;&#xA;&lt;p&gt;B[0]=+1.000000&#xA;B[1]=+1.000000&#xA;A[1]=-0.509525&lt;/p&gt;&#xA;&lt;p&gt;(细心的人可能会发现高通滤波器和低通滤波器的区别只有B[1]这个参数，一个为+1.00，一个为-1.00)&lt;/p&gt;&#xA;&lt;p&gt;代入公式得到：y[n]=x[n]+x[n-1]+0.509525*y[n-1]&lt;/p&gt;&#xA;&lt;p&gt;我们优化的重点就是这个0.50952*y[n-1]，利用移位法来代替小数乘法，&#xA;原理就是把小数分解为1/M[0]+1/M[1]+&amp;hellip;的方式，其中M[n]必须为2的整数次幂，&#xA;分解的次数越多，分母越大，误差就越小，可以根据实际情况需要选择分解的精度。&lt;/p&gt;&#xA;&lt;p&gt;分解过程：&lt;/p&gt;&#xA;&lt;p&gt;0.509525 * 1024 = 521(注：需要更高精度，可以把1024改为2048，4096，8192&amp;hellip;&amp;hellip;.)&lt;/p&gt;&#xA;&lt;p&gt;=521/1024&lt;/p&gt;&#xA;&lt;p&gt;＝(512+8+1)/1024&lt;/p&gt;&#xA;&lt;p&gt;=512/1024+8/1024+1/1024&lt;/p&gt;&#xA;&lt;p&gt;=1/2+1/8+1/1024&lt;/p&gt;&#xA;&lt;p&gt;所以这个公式可以改写为：y[n]=x[n]+x[n-1]+y[n-1]/2+y[n-1]/8+y[n-1]/1024&lt;/p&gt;&#xA;&lt;p&gt;最后附上C语言代码：&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-cpp&#34; data-lang=&#34;cpp&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;/*************************************************************************************************&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;* 输入待滤波的数据，返回滤波后的数据&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;* 由于输入输出都是整型数据，为了防止数据溢出或数据太小，可以将输入数据先左/右移N位，最后返回时再右/左移N位&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;**************************************************************************************************/&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;iir_filter&lt;/span&gt;(&lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt; x1)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;{&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;static&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt; x0;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;static&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt; y0;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt; y1;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    y1 &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; x1 &lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt; x0 &lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt; (y0&lt;span style=&#34;color:#f92672&#34;&gt;&amp;gt;&amp;gt;&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;) &lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt; (y0&lt;span style=&#34;color:#f92672&#34;&gt;&amp;gt;&amp;gt;&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;3&lt;/span&gt;) &lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt; (y0&lt;span style=&#34;color:#f92672&#34;&gt;&amp;gt;&amp;gt;&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;10&lt;/span&gt;);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    x0 &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; x1;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    y0 &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; y1;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt; y1;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description>
    </item>
    <item>
      <title>VirtLCD:在Windows上调试各种嵌入式GUI的小工具</title>
      <link>https://xcdd.pages.dev/blog/2018/2018-03-21/</link>
      <pubDate>Wed, 21 Mar 2018 12:48:24 +0000</pubDate>
      <guid>https://xcdd.pages.dev/blog/2018/2018-03-21/</guid>
      <description>&lt;p&gt;&lt;strong&gt;前言&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;为了方便测试和移植嵌入式GUI，自己做的一个小工具，可以在windows上模拟出LCD，键盘和鼠标。&lt;/p&gt;&#xA;&lt;p&gt;虽然像emwin一样，大多数GUI都提供了自己的模拟工具，但是一般只能用于它本身，不方便移植其它GUI或者自己开发GUI，所以写了这个通用工具，理论上支持移植任何GUI，当然主要是测试目的。&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;简介&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;本工具提供了LCD帧缓存以及鼠标和键盘接口，可以定制屏幕宽度，高度和颜色位深，支持16位，24位，32位色。&lt;/p&gt;&#xA;&lt;p&gt;LCD窗口是在单独的进程中运行，在vs调试GUI的时候，可以单步调试，不会导致LCD窗口无法显示的问题。&lt;/p&gt;&#xA;&lt;p&gt;VirtLCD.exe作为LCD窗口的服务器，VirtLCD.dll作为LCD窗口的客户端，同一时间只能运行一个LCD服务器。&lt;/p&gt;&#xA;&lt;p&gt;LCD窗口服务器与客户端使用UDP传输按键和鼠标事件，而帧缓存使用内存映射技术，共享同一段内存。&lt;/p&gt;&#xA;&lt;p&gt;LCD服务器定时将共享内存的数据绘制到屏幕上，目前刷新率设定为50Hz。&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;如何获取&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;本工具已经开放源代码，可以在码云下载完整源码，也可以下载打包好的SDK。&lt;/p&gt;&#xA;&lt;p&gt;下载SDK压缩包： &lt;a href=&#34;https://download.csdn.net/download/qq446252221/10299754&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;https://download.csdn.net/download/qq446252221/10299754&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;下载源代码： &lt;a href=&#34;https://gitee.com/kerndev/VirtualLCD&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;https://gitee.com/kerndev/VirtualLCD&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;如何使用&lt;/strong&gt;&#xA;下面的代码作为演示.&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-cpp&#34; data-lang=&#34;cpp&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;/******************************************************************************&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;* LCD 驱动&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;******************************************************************************/&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;#include&lt;/span&gt; &lt;span style=&#34;color:#75715e&#34;&gt;&amp;#34;virtlcd.h&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;#pragma comment(lib, &amp;#34;virtlcd.lib&amp;#34;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;#define LCD_FILENAME    &amp;#34;virtlcd.exe&amp;#34;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;#define LCD_WIDTH       640&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;#define LCD_HEIGHT      480&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;#define LCD_BPP         32&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;//定义像素类型&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;typedef&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;unsigned&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;long&lt;/span&gt;   PIXEL;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;//帧缓存指针&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;static&lt;/span&gt; PIXEL &lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;m_pFrameBuffer;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;//计算在X,Y坐标的帧缓存指针&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;#define GET_OFFSET(x, y)        ( LCD_WIDTH * ( LCD_HEIGHT - (y) - 1) ) + (x) )&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;#define GET_FRAMEBUFFER(x, y)   ( m_pFrameBuffer + GET_OFFSET(x, y) )&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;//响应鼠标事件&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;static&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;void&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;on_mouse_input&lt;/span&gt;(&lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt; event, &lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt; x, &lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt; y)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;{&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;//响应键盘事件&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;static&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;void&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;on_keybd_input&lt;/span&gt;(&lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt; event, &lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt; key)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;{&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;//初始化LCD&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;LCD_Init&lt;/span&gt;(&lt;span style=&#34;color:#66d9ef&#34;&gt;void&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;{&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt; ret;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    ret &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; VirtLCD_Init(LCD_FILENAME, LCD_WIDTH, LCD_HEIGHT, LCD_BPP);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt;(&lt;span style=&#34;color:#f92672&#34;&gt;!&lt;/span&gt;ret)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    m_pFrameBuffer &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; VirtLCD_GetFrameBuffer();&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    VirtLCD_SetMouseProc(on_mouse_input);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    VirtLCD_SetKeybdProc(on_keybd_input);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;//画点&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;void&lt;/span&gt;  &lt;span style=&#34;color:#a6e22e&#34;&gt;LCD_DrawPoint&lt;/span&gt;(&lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt; x, &lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt; y, PIXEL color)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;{&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    PIXEL &lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;mem;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    mem &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; GET_FRAMEBUFFER(x, y);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;mem &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; color;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;//画水平直线&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;void&lt;/span&gt;  &lt;span style=&#34;color:#a6e22e&#34;&gt;LCD_DrawHLine&lt;/span&gt;(&lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt; x1, &lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt; y1, &lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt; x2, PIXEL color)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;{&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    PIXEL &lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;mem;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    mem &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; GET_FRAMEBUFFER(x1, y1);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;for&lt;/span&gt;(; x1 &lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;&lt;/span&gt; x2; x1&lt;span style=&#34;color:#f92672&#34;&gt;++&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;mem&lt;span style=&#34;color:#f92672&#34;&gt;++&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; color;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;//画垂直直线&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;void&lt;/span&gt;  &lt;span style=&#34;color:#a6e22e&#34;&gt;LCD_DrawVLine&lt;/span&gt;(&lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt; x1, &lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt; y1, &lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt; y2, PIXEL color)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;{&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    PIXEL &lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;mem;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    mem &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; GET_FRAMEBUFFER(x1, y1);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;for&lt;/span&gt;(; y1 &lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;&lt;/span&gt; y2; y1&lt;span style=&#34;color:#f92672&#34;&gt;++&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;mem &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; color;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        mem &lt;span style=&#34;color:#f92672&#34;&gt;-=&lt;/span&gt; LCD_WIDTH;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description>
    </item>
    <item>
      <title>谈谈智能穿戴设备最火主控芯片NRF51422/NRF51822的开发感受</title>
      <link>https://xcdd.pages.dev/blog/2018/2018-03-13/</link>
      <pubDate>Tue, 13 Mar 2018 17:28:08 +0000</pubDate>
      <guid>https://xcdd.pages.dev/blog/2018/2018-03-13/</guid>
      <description>&lt;p&gt;最近在接手一个nRF51822的项目，找到一篇文章，写得很有意思，总结非常通俗易懂，于是转过来了。&lt;/p&gt;&#xA;&lt;p&gt;文章出处：http://blog.sina.com.cn/s/blog_9fff1f140102w87s.html&lt;/p&gt;&#xA;&lt;p&gt;最近一年时间一直在做一个比较高端的运动设备的传感器——自行车功率计的开发，主控芯片自然选的是当前最火功能最强大的智能穿戴设备的SOC芯片NRF51422，跑蓝牙4.0和ANT+用于无线数据传输。经过这一年的折腾，基本算比较熟悉了，今天抽空总结总结对这款芯片的感受。&lt;/p&gt;&#xA;&lt;p&gt;来个实物图~~&#xA;[ &lt;img src=&#34;./065/065_1.jpeg&#34; alt=&#34;谈谈智能穿戴设备最火主控芯片NRF51422/NRF51822的开发感受&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;](&lt;a href=&#34;http://photo.blog.sina.com.cn/showpic.html#blogid=9fff1f140102w87s&amp;amp;url=http://album.sina.com.cn/pic/002VF2gAgy70VHVJKDR67&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;http://photo.blog.sina.com.cn/showpic.html#blogid=9fff1f140102w87s&amp;url=http://album.sina.com.cn/pic/002VF2gAgy70VHVJKDR67&lt;/a&gt;)&lt;/p&gt;&#xA;&lt;p&gt;首先先大体介绍下这款芯片情况：&#xA;&lt;strong&gt;内核&lt;/strong&gt; ：ARM Cortex M0&#xA;&lt;strong&gt;主频&lt;/strong&gt; ：16MHz&#xA;&lt;strong&gt;内存&lt;/strong&gt; ：16/32KB&#xA;&lt;strong&gt;闪存&lt;/strong&gt; ：128/256KB&#xA;&lt;strong&gt;外设&lt;/strong&gt; ：UART，IIC，ADC，TIMER，SPI，RADIO，RTC，GPIOTE，TEMP,RTC&#xA;&lt;strong&gt;封装&lt;/strong&gt; ：48PIN QFN，也有超小超小的CSP封装的&#xA;[ &lt;img src=&#34;./065/065_2.jpeg&#34; alt=&#34;谈谈智能穿戴设备最火主控芯片NRF51422/NRF51822的开发感受&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;](&lt;a href=&#34;http://photo.blog.sina.com.cn/showpic.html#blogid=9fff1f140102w87s&amp;amp;url=http://album.sina.com.cn/pic/002VF2gAgy70VLQ6b9qe4&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;http://photo.blog.sina.com.cn/showpic.html#blogid=9fff1f140102w87s&amp;url=http://album.sina.com.cn/pic/002VF2gAgy70VLQ6b9qe4&lt;/a&gt;)&lt;/p&gt;&#xA;&lt;p&gt;从硬件上来看，基本就是一款自带2.4GHz射频无线收发器的MCU罢了。而主要特殊之处还是在软件上面，厂商提供了一套完善的蓝牙，ANT协议的处理代码，而这部分预先编译好，和用户应用部分程序分别烧录在芯片不同位置，彼此之间通过软件中断进行通信。相比于TI的CC254X系列提供源码和用户代码一起编译而言，这种方式更简洁，不容易出错，基本上协议栈程序和用户应用程序，虽然运行在一个处理器上，但基本处于类似井水不犯河水这种情况，无论是学习还是开发调试都带来了非常巨大的便捷，也无怪于成为目前最火热的智能可穿戴设备的主控SOC。&lt;/p&gt;&#xA;&lt;p&gt;今天呢就主要讲讲硬件相关部分的感受~~~&lt;/p&gt;&#xA;&lt;p&gt;首先先上Summary：&#xA;1、DCDC真有用，不是搞笑的&#xA;2、功耗控制略菜，要么浅睡，要么休眠启动就复位洗脑了&#xA;3、外设和端口连接可以随意映射，麻麻再也不用担心我布局布线啦&#xA;4、时钟体系8051feel，少挂不少脑细胞&#xA;5、各种外设易用功能少，寄存器配置傻瓜型，研发狗之友&#xA;6、定时器略菜，实时时钟调试器管不住，调试时候会坑成狗&#xA;7、IIC静态功耗有1mA，1mA，1mA！！不用赶紧关&#xA;8、温度外设有点搞笑的&amp;hellip;&amp;hellip;.远看高端而已&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;供电：&lt;/strong&gt;&#xA;和一般ARM Cotex M系列MCU差不多，都是1.8V~3.3V酱紫。也就是对于CR2032这种最常用纽扣电池而言是可以直接供电的，如果使用1节干电池或者可充电锂电池，就需要外围稳压芯片来升降压了。芯片实际内核工作电压就是1.8V。&#xA;比较特殊的在于这款芯片自己具有DCDC，即开关式稳压器，仅需外接一个电感一个电容就可以了。这个可以大大提高电源效率，对于寸电寸金的可穿戴智能设备而言是非常友好的一个设计。不过捏，很多人可能都没注意，这个DCDC其实仅能给片内的模拟部分提供电能，并且仅在无线收发器工作时候才开启，数字部分仍然是LDO，即线性稳压器提供。不过一般来讲，这种可穿戴设备也不需要多大运算量，绝大部分时候CPU都是睡眠的，因此这个也没多大影响。根据我们实测结果，跑蓝牙3.3v供电时候，峰值电流不开DCDC大概13个mA，开了之后差不多就9mA了，效果还是很明显的。&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;布局布线相关：&lt;/strong&gt;&#xA;博主之前比较多时间都做STM32相关开发，那个引脚端口排布简直就跟随机分配一样。连接个啥LCD显示器，外扩内存闪存需要一排信号线过去时布局布线简直就是煎熬。NRF51422就非常友好，直接按顺序0-31排过去了。而且模拟信号相关的比如射频，晶振基本都在一侧，数字的在另一侧，布局布线相对都比较好处理，这个从图片里面也可以看出来。&#xA;然而最最最重要的，也是最最最特别的，就是外设和外端口的连接可以随意映射，而且是彻彻底底的随意映射（除ADC外），这个简直就是爽飞了啊，板子怎么安排走线都顺了，用了这个都有再也不想用其他MCU的感觉了哈哈哈哈。&lt;/p&gt;&#xA;&lt;p&gt;下面谈谈芯片内部的~~来一发内部框图先&#xA;[ &lt;img src=&#34;./065/065_3.jpeg&#34; alt=&#34;谈谈智能穿戴设备最火主控芯片NRF51422/NRF51822的开发感受&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;](&lt;a href=&#34;http://photo.blog.sina.com.cn/showpic.html#blogid=9fff1f140102w87s&amp;amp;url=http://album.sina.com.cn/pic/002VF2gAgy70VLN2USu72&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;http://photo.blog.sina.com.cn/showpic.html#blogid=9fff1f140102w87s&amp;url=http://album.sina.com.cn/pic/002VF2gAgy70VLN2USu72&lt;/a&gt;)&#xA;&lt;strong&gt;时钟&lt;/strong&gt; ：&#xA;这个MCU时钟体系很简单，8051风格，16MHz跑遍全芯片，基本就不用管啦。一般芯片配置个时钟都要烧不少脑细胞，真心是研发狗之友啊哈哈。&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;功耗控制（PWR）：&lt;/strong&gt;&#xA;就两种模式，System ON和System Off，前者都工作，后者都不工作，然后后者切换到前者之后系统等于复位了。这个略菜。一般MCU都是4，5种不同级别的低功耗模式，不少恢复了可以从休眠点继续跑。这个要达到这个效果只能保持在System ON模式，然后用CPU的WFI或者WFE让CPU停掉。Datasheet上面说可以到2.4uA，不过跑了协议栈之后咋都到不了了&amp;hellip;..如果放在systemoff还要能唤醒之后继续跑，那就只能软件保存各种外设，CPU寄存器内容状态，然后开内存数据保存，然后再进入Off模式，复位之后自己判断情况来恢复，超级蛋疼。还好我们设备要求也没那么高，就前者搞掂了~~~后者的话，估计又得挂不少脑细胞。&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;无线收发器（RADIO）：&lt;/strong&gt;&#xA;这个无线收发器还是非常易用的，基本可以看作是内嵌了一个NRF24L01。自带功放，外围接一个匹配网络之后直接接50欧姆阻抗的天线就完事了，基本不需要多少射频相关开发经验就可以达到不错的性能，只需要把走线的阻抗匹配好就可以。发射功率最大可以软件设置到+4dbm，基本上我们在楼道里面可以传个几十m都是妥妥的。&#xA;一般跑协议栈之后，这个外设就被MPU保护住不能访问了，也不需要管他。不跑协议栈时候，直接操作也是挺方便的，有一些简单数据传输，或者需要大吞吐量数据传输啥的，也可以自己直接操作。无线收发器内置了一个简易DMA用于数据传输，操作也很方便。&#xA;此外这个外设内部自带了一个信号强度检测的功能RSSI，拿来玩蓝牙定位啥的不错哦。&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;通用输入输出端口（GPIO，GPIOTE）：&lt;/strong&gt;&#xA;端口模式很全，上拉下拉，开漏，推挽，模拟。需要注意的就是如果有外设连接到选定端口，基本上GPIO模块就管不了它了，也不需要去配置，配置也没用。外设和端口连接除ADC外可以随便映射，前面说过了，这个很爽。然后这里可以设置用GPIO唤醒MCU，不过只能高低电平唤醒，不能边沿唤醒。&#xA;然后GPIOTE算是GPIO的扩展吧，有一些没有直连GPIO的外设可以通过PPI再通过这个模块控制GPIO，比如反转，置低拉高的。此外也可以让GPIO以此控制这些外设，比如GPIO高低电平或者上升下降边沿触发外设执行某些操作啥的。这些具体在PPI里面讲了。&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;啥外设内部互联啥啥的（PPI）：&lt;/strong&gt;&#xA;这个也算是这款芯片一个卖点吧，不过一般也就是一些功耗要控制非常非常非常非常低设备才有用的必要。这玩意大概是个啥情况捏，官方那破说明我也是看了老半天才看明白，其实炒鸡简单，且听我讲讲。&#xA;芯片内每个外设都有两种比较特殊的寄存器，里面只有一位可用。他们叫任务寄存器（Task）和事件寄存器（Event）。Task就像个按钮，给它写1就可以控制外设去开始一项任务，比如ADC转换一次，定时器捕获一次之类的。事件寄存器就像个灯泡，外设完成一项工作，比如ADC完成一次转换，GPIO捕获到一次下降沿，就点个灯。然后捏，PPI就是个通道，你可以随意配置源和端，就好比放了个人在这里看到亮灯就去按一下开关这种感觉，以此把外设工作串联起来。比如GPIO捕获到一个下降沿就开启一次模数转换，模数转换玩就触发一个GPIO反转啥啥的就自己去发挥啦。&#xA;这个还是很能玩的开的，有32个通道，而且各个通道开关本身都还是一个任务，可以组成很多很复杂操作。&#xA;这个好处呢，就是让CPU有更多时间睡眠，很多很简单的一系列连续工作就纯靠这个PPI内部机制来完成了，速度快，功耗低。此外很多外设内部还有很多short功能，和这个原理一样，只是将外设内部一些操作串联起来罢了。&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;模数转换器（ADC）：&lt;/strong&gt;&#xA;8，9，10位可配置，貌似是逐次逼近型，功能也比较少，8通道输入，就能开启一次转换，然后获取数据，最多再开个中断。不像某STM32那个ADC单次连续扫描错位连续这个触发那个触发啥啥乱七八糟看得眼花缭乱的，这个基本几行代码就跑起来了。准确度的话还是非常不错的，跟我们安捷伦六位半的表比对，误差基本最多+-1，也就是千分之一酱紫，所以我们产品上面也直接就用片内的模数转换器来进行转换了。射频都能做的厂商，模拟肯定不在话下了哈哈。&#xA;此外这个功耗也还好，貌似仅转换时候有功耗，不使用的时候也没有多少必要去关掉它电源，也可能内部自动关的。&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;定时器（TIMER）：&lt;/strong&gt;&#xA;这个也是MCU必备一个外设。不过51422这款的定时器功能也比较单一，简单来讲就捕获和比对俩功能，而且还要和GPIOTE结合在一起使用才能控制到外围管脚，要不然就自己在片内晃荡了。我用TIMER几乎就俩目的，一个产生个Tick中断用来定时触发啥啥的，这个一般就用ARM内核里面那个定时器就好，结果51422居然把这个阉掉了，也是无语。一个就是发生PWM拿来当DAC（数模转换）用。这个和GPIOTE结合起来也能实现硬件PWM，但问题很多，改PWM时候必须要重启定时器，比较坑。而还有个很奇葩的，居然这个定时器的计数寄存器是不能读取写入的，那好吧&amp;hellip;&amp;hellip;.反正后面好像都没怎么用过这个了。&lt;/p&gt;</description>
    </item>
    <item>
      <title>如何使用JLink:RTT打印调试日志</title>
      <link>https://xcdd.pages.dev/blog/2018/2018-03-02/</link>
      <pubDate>Fri, 02 Mar 2018 18:18:05 +0000</pubDate>
      <guid>https://xcdd.pages.dev/blog/2018/2018-03-02/</guid>
      <description>&lt;p&gt;JLink 自V4.92版本以后，添加了RTT功能，可以在没有串口的时候当作调试日志输出端口。&lt;/p&gt;&#xA;&lt;p&gt;一、准备工作&lt;/p&gt;&#xA;&lt;p&gt;只需要在你的项目中添加以下三个文件：&lt;/p&gt;&#xA;&lt;p&gt;SEGGER_RTT.c&lt;/p&gt;&#xA;&lt;p&gt;SEGGER_RTT.h&lt;/p&gt;&#xA;&lt;p&gt;SEGGER_RTT_Conf.h&lt;/p&gt;&#xA;&lt;p&gt;需要注意的是在SEGGER_RTT_Conf.h中定义&lt;/p&gt;&#xA;&lt;p&gt;#define SEGGER_RTT_IN_RAM (0)&lt;/p&gt;&#xA;&lt;p&gt;这样不占用额外内存，即可实现日志打印；&lt;/p&gt;&#xA;&lt;p&gt;在源码中调用SEGGER_RTT_Write(0, buff, len));&lt;/p&gt;&#xA;&lt;p&gt;或者SEGGER_RTT_WriteString(0,str);&lt;/p&gt;&#xA;&lt;p&gt;二、输出日志的查看方式&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;在Keil软件中使用JLink进入全速调试模式，然后打开JLinkRTTClient.exe就可以在控制台看到程序输出的内容；&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;直接使用JLinkRTTViewer.exe，可以在不进行全速调试模式的情况下查看输出的内容；&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;p&gt;三、补充说明&lt;/p&gt;&#xA;&lt;p&gt;1.如果Keil自带的Jlink驱动太旧，不支持RTT，则需要替换Keil自带的驱动文件:&lt;/p&gt;&#xA;&lt;p&gt;在Keil\ARM\Segger\目录下面的JLink.exe, JLinkARM.dll, JLinkRDI.dll&lt;/p&gt;&#xA;&lt;p&gt;2.实现RTT功能的关键在于JLinkARM.dll，在Keil进入调试模式时会加载JLinkARM.dll，而JLinkARM.dll会创建一个telnel服务器，监听端口是19021，所以可以用第三方telnel软件，如Secure-CRT软件来查看打印的日志更方便。&lt;/p&gt;</description>
    </item>
    <item>
      <title>STM32F429同时使用LTDC和外部SDRAM作堆栈导致HardFault死机</title>
      <link>https://xcdd.pages.dev/blog/2018/2018-03-01/</link>
      <pubDate>Thu, 01 Mar 2018 09:51:12 +0000</pubDate>
      <guid>https://xcdd.pages.dev/blog/2018/2018-03-01/</guid>
      <description>&lt;p&gt;最近在研究STM32F429的LTDC驱动LCD和emWin运行DEMO时候，发现程序总是异常死机，DEBUG发现是进入了HardFault！查看堆栈数据发现数据异常，难道是程序有BUG导致堆栈被破坏了吗？&lt;/p&gt;&#xA;&lt;p&gt;于是新建一个最小工程，使用最精简的代码，只创建一个GUI线程跑emWin的DEMO程序，发现还是会不定时死机！难道是GUI线程的堆栈设置太小了吗？&lt;/p&gt;&#xA;&lt;p&gt;于是加大GUI任务的堆栈，由8K增加到16K，故障依旧！！！不应该啊，难道是我的RTOS有问题吗？&lt;/p&gt;&#xA;&lt;p&gt;于是去掉RTOS，修改emWin的配置文件，改为裸机运行，跑了一段时间，竟然不死机了！WTF!!!&lt;/p&gt;&#xA;&lt;p&gt;于是又单独测试RTOS，去掉GUI任务反复测试，运行非常正常，各种测试代码都没有问题啊！！！&lt;/p&gt;&#xA;&lt;p&gt;到底是怎么回事呢，为什么GUI和RTOS同时使用就会死机呢？&lt;/p&gt;&#xA;&lt;p&gt;对比两份代码，区别就是使用RTOS的时候，把外部SDRAM用作了任务堆栈，而裸机程序使用的是内部RAM做堆栈。&lt;/p&gt;&#xA;&lt;p&gt;于是把RTOS的任务堆栈设置为内部RAM，结果程序运行正常了！ 真是奇怪，难道STM32F429的SDRAM不能作堆栈吗？&lt;/p&gt;&#xA;&lt;p&gt;不对，不对，不对，在移植GUI之前一直都是用外部SDRAM作任务堆栈，从来没有出现过这种死机的问题啊，难道是LTDC的问题吗？&lt;/p&gt;&#xA;&lt;p&gt;于是又恢复刚才的代码，继续使用外部SDRAM作堆栈，但是去掉LTDC的初始化代码，再次运行程序，屏幕虽然没有任何显示，但是从板子上的不断闪烁的LED来看，程序并没有死机，继续观察10多分钟，也没有死机.&lt;/p&gt;&#xA;&lt;p&gt;我的天！！！这是为何？？？&lt;/p&gt;&#xA;&lt;p&gt;在启用LTDC之后，使用外部SDRAM用作堆栈会导致程序异常死机，至今没有找到原因。&lt;/p&gt;</description>
    </item>
    <item>
      <title>使用iTunes下载旧版本的IPA文件</title>
      <link>https://xcdd.pages.dev/blog/2017/2017-11-16/</link>
      <pubDate>Thu, 16 Nov 2017 15:49:04 +0000</pubDate>
      <guid>https://xcdd.pages.dev/blog/2017/2017-11-16/</guid>
      <description>&lt;p&gt;本文的方法参考: &lt;a href=&#34;http://bbs.feng.com/read-htm-tid-10125110.html&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;http://bbs.feng.com/read-htm-tid-10125110.html&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;本文的内容为自己理解后做下的记录.&lt;/p&gt;&#xA;&lt;p&gt;方法说明:&lt;/p&gt;&#xA;&lt;p&gt;本文介绍了一种使用iTunes下载旧版本的IPA文件的方法,&lt;/p&gt;&#xA;&lt;p&gt;本方法的原理是通过Fidller抓包,拦截iTunes发起的HTTP请求, 并修改请求的内容,使得iTunes下载到的IPA文件为我们想要的旧版本.&lt;/p&gt;&#xA;&lt;p&gt;一. 准备工作&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;安装Fiddler 4.6.2 (注:目前对版本没有要求,任意版本都可以)&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;安装.net framework 4.0&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;安装iTunes V12.6.2.20(注:新版本不能下载APP了)&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;p&gt;二. 具体步骤&lt;/p&gt;&#xA;&lt;p&gt;1.打开Fiddler, 勾选HTTPS解密,需要信任一个证书.&lt;/p&gt;&#xA;&lt;p&gt;2.按下F12,停止抓包,然后最小化.&lt;/p&gt;&#xA;&lt;ol start=&#34;3&#34;&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;打开iTunes, 并用自己的apple id登陆iTunes.&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;打开iTunes的应用菜单, 进入App Store界面.&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;搜索目标APP程序,进入下载页面.&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;p&gt;6.回到Fiddler,按下F12,开始抓包.&lt;/p&gt;&#xA;&lt;p&gt;7.回到iTunes,开始下载该APP.&lt;/p&gt;&#xA;&lt;p&gt;8.回到Fiddler,寻找带有&amp;quot;/WebObjects/MZBuy.woa/wa/buyProduct&amp;quot;字样的会话,&lt;/p&gt;&#xA;&lt;p&gt;查看TextView,找到&lt;key&gt;appExtVrsId&lt;/key&gt;注意下面的一串数字,该数字就是请求的软件版本ID,&lt;/p&gt;&#xA;&lt;p&gt;然后Decode Response,并查看TextView,找到&lt;key&gt;softwareVersionExternalIdentifiers&lt;/key&gt;,&lt;/p&gt;&#xA;&lt;p&gt;下面有多行数字,表示这个APP的所有版本ID, 越往后版本越新,要下载旧版本就用旧版本的ID替换请求包体中的版本ID.&lt;/p&gt;&#xA;&lt;p&gt;9.回到iTunes,APP资料库,删除刚才下载的APP,重新回到下载界面.&lt;/p&gt;&#xA;&lt;p&gt;10.回到Fiddler,按下F11启动拦截功能.&lt;/p&gt;&#xA;&lt;p&gt;11.回到iTunes,点击下载按钮,重新下载刚才的APP.&lt;/p&gt;&#xA;&lt;p&gt;12.回到Fiddler,查看拦截列表,如果拦截到的不是&amp;quot;/WebObjects/MZBuy.woa/wa/buyProduct,则直接运行它,不拦截; 否则拦截下来,修改其中的版本ID,再继续运行.然后按下Shift+F11停止拦截功能.&lt;/p&gt;&#xA;&lt;p&gt;13.等待iTunes下载完成,在资料库中,可以查看刚才下载的APP的版本号.&lt;/p&gt;&#xA;&lt;p&gt;14.打开C:\Users\Administrator\Music\iTunes\iTunes Media\Mobile Applications就能找到下载好的ipa文件了.&lt;/p&gt;&#xA;&lt;p&gt;三. 后记&lt;/p&gt;&#xA;&lt;p&gt;在下载ipa的过程中,我发现iTunes下载有时候特别慢,所以用迅雷复制该ipa的下载链接,下载到了该ipa文件,速度非常快.&lt;/p&gt;&#xA;&lt;p&gt;但是用iTools安装到手机后,显示LOGO后就闪退了,而用iTunes下载的则没有这个问题,&lt;/p&gt;&#xA;&lt;p&gt;后来发现用迅雷下载的ipa文件与iTunes下载的ipa文件不一样,&lt;/p&gt;&#xA;&lt;p&gt;用zip打开该文件可以看出来,迅雷下载的缺少iTunesArtworkt和iTunesMetadata.plist这两个文件,&lt;/p&gt;&#xA;&lt;p&gt;其中后者实际上是一个xml文件,里面记录了下载这个ipa文件的appleid和版本信息.&lt;/p&gt;</description>
    </item>
    <item>
      <title>研究Win32 GUI中SetActiveWindow与SetFocus和窗口消息</title>
      <link>https://xcdd.pages.dev/blog/2017/2017-08-31/</link>
      <pubDate>Thu, 31 Aug 2017 15:46:16 +0000</pubDate>
      <guid>https://xcdd.pages.dev/blog/2017/2017-08-31/</guid>
      <description>&lt;p&gt;为了与Win32 GUI的函数功能兼容，得先知道Windows是怎么处理这些信息的，才能模仿。&lt;/p&gt;&#xA;&lt;p&gt;这次研究对象是SetActiveWindow与SetFocus和窗口消息WM_SETFOCUS，WM_ACTIVATE之间的关系&lt;/p&gt;&#xA;&lt;hr&gt;&#xA;&lt;p&gt;SetFocus&lt;/p&gt;&#xA;&lt;p&gt;功能：设置新的焦点窗口，只有焦点窗口才能获取键盘输入消息&lt;/p&gt;&#xA;&lt;p&gt;1.这个函数会检查输入的窗口，如果是最小化的窗口，或者禁用的窗口，则不会改变焦点.&lt;/p&gt;&#xA;&lt;p&gt;2.如果要设置的焦点窗口是子窗口，且其父窗口不是激活状态，还会调用SetActiveWindow将其父窗口激活.&lt;/p&gt;&#xA;&lt;p&gt;3.检查激活窗口是否成功，如果没有成功，则取消设置新焦点.&lt;/p&gt;&#xA;&lt;p&gt;4.向窗口发送WM_SETFOCUS消息，向前一个焦点窗口发送WM_KILLFOCUS消息&lt;/p&gt;&#xA;&lt;hr&gt;&#xA;&lt;p&gt;SetActiveWindow&lt;/p&gt;&#xA;&lt;p&gt;功能：设置激活窗口，只有激活窗口，才能拥有焦点窗口&lt;/p&gt;&#xA;&lt;p&gt;1.检查传入的窗口，如果是子窗口，则取消操作&lt;/p&gt;&#xA;&lt;p&gt;2.向当前激活窗口发送WM_NCACTIVE消息，如果当前激活窗口返回FALSE，则表示它不同意其它窗口被激活，所以取消操作.&lt;/p&gt;&#xA;&lt;p&gt;3.如果第2步没有问题，则向当前激活窗口发送WM_ACTIVE消息，告之被取消激活.&lt;/p&gt;&#xA;&lt;p&gt;4.将传入的窗口标记为激活窗口，并将窗口的Z序置顶,&lt;/p&gt;&#xA;&lt;p&gt;5.向新激活窗口发送WM_NCACTIVE和WM_ACTIVE消息，告之被成功激活.&lt;/p&gt;&#xA;&lt;hr&gt;&#xA;&lt;p&gt;WM_NCACTIVE&lt;/p&gt;&#xA;&lt;p&gt;这个消息通知窗口，非客户区被激活或取消激活.&lt;/p&gt;&#xA;&lt;p&gt;当WPARAM参数为FALSE时，表示窗口要被取消激活，此时如果返回FALSE，则会阻止被取消激活，返回TRUE则表示允许被激活。&lt;/p&gt;&#xA;&lt;p&gt;DefWindowProc 处理方式：做一些内部标记，如果lParam为－1的话，还要重绘标题栏和菜单栏！&lt;/p&gt;&#xA;&lt;p&gt;WM_SETFOCUS&lt;/p&gt;&#xA;&lt;p&gt;这个消息是通知窗口，即将获得或失去焦点；&lt;/p&gt;&#xA;&lt;p&gt;DefWindowProc好像并没有处理这个消息。&lt;/p&gt;&#xA;&lt;p&gt;WM_ACTIVATE&lt;/p&gt;&#xA;&lt;p&gt;这个消息是通知窗口，即将被激活或取消激活；&lt;/p&gt;&#xA;&lt;p&gt;DefWindowProc 处理方式是：如果这个窗口马上要被激活了，则将这个窗口设置为焦点窗口&lt;/p&gt;&#xA;&lt;hr&gt;&#xA;&lt;p&gt;这里很诡异的是，如果对一个未激活的主窗口调用SetFocus，它会激活这个窗口，&lt;/p&gt;&#xA;&lt;p&gt;而激活这个窗口会发送WM_ACTIVE消息，而默认处理WM_ACTIVE消息的方式又是对这个窗口调用SetFocus&amp;hellip;&lt;/p&gt;</description>
    </item>
    <item>
      <title>验证RA8875的硬件绘图与使用MCU软件绘图的速度差异</title>
      <link>https://xcdd.pages.dev/blog/2017/2017-08-30-2133/</link>
      <pubDate>Wed, 30 Aug 2017 21:33:21 +0000</pubDate>
      <guid>https://xcdd.pages.dev/blog/2017/2017-08-30-2133/</guid>
      <description>&lt;p&gt;RA8875是一块LCD驱动芯片，支持RGB接口的LCD液晶屏，提供8080时序的MCU接口；&#xA;RA8875内置了2D硬件加速功能，可以实现硬件绘制矩形，直线等功能；&lt;/p&gt;&#xA;&lt;p&gt;本次测试就是为了验证RA8875的硬件绘图与使用MCU软件绘图的速度差异。&lt;/p&gt;&#xA;&lt;p&gt;硬件环境：&lt;/p&gt;&#xA;&lt;p&gt;CPU：STM32F407VE@168MHz&lt;/p&gt;&#xA;&lt;p&gt;LCD：480x272x16bpp&lt;/p&gt;&#xA;&lt;p&gt;测试方法：&lt;/p&gt;&#xA;&lt;p&gt;计算1秒内填充整个屏幕的次数(FPS)&lt;/p&gt;&#xA;&lt;p&gt;测试结果：&lt;/p&gt;&#xA;&lt;table&gt;&#xA;  &lt;thead&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;th style=&#34;text-align: center&#34;&gt;填充方式&lt;/th&gt;&#xA;          &lt;th style=&#34;text-align: center&#34;&gt;帧率(FPS)&lt;/th&gt;&#xA;          &lt;th style=&#34;text-align: center&#34;&gt;速度(Pixel/s)&lt;/th&gt;&#xA;          &lt;th style=&#34;text-align: center&#34;&gt;备注&lt;/th&gt;&#xA;      &lt;/tr&gt;&#xA;  &lt;/thead&gt;&#xA;  &lt;tbody&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;软件逐点填充&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;6&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;783360&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;软件逐行填充&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;63&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;8225280&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;软件矩形填充&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;69&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;9008640&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;硬件逐行填充1&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;201&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;26242560&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;先绘图，等待空闲后退出函数&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;硬件逐行填充2&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;207&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;27025920&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;进入函数先等待空闲，再绘图&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;硬件矩形填充1&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;312&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;40734720&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;先绘图&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;硬件矩形填充2&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;315&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;41126400&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;先等待&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;emWin(5.30)&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;126&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;16441000&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;自带驱动，支持硬件加速&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;FastGUI&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;201&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;26242560&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;驱动为硬件逐行填充2&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;FlatGUI&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;324&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;42301440&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;  &lt;/tbody&gt;&#xA;&lt;/table&gt;&#xA;&lt;p&gt;说明：RA8875的硬件绘制功能，需要读取状态寄存器的BIT7，&lt;/p&gt;&#xA;&lt;p&gt;如果该位为1说明硬件绘制没有完成，不能进行其它绘制，否则屏幕会显示不正常。&lt;/p&gt;&#xA;&lt;p&gt;“先绘图”是指先发送硬件绘图指令，然后读取状态寄存器，等待BIT7清0后退出函数；&lt;/p&gt;&#xA;&lt;p&gt;“先等待”是指先读取状态寄存器，等待BIT7清0后，再发送绘图指令；&lt;/p&gt;&#xA;&lt;p&gt;测试结论：&lt;/p&gt;&#xA;&lt;p&gt;由此可见使用RA8875的硬件绘图有着非常明显的速度优势，比使用软件绘图快了3－4倍。&lt;/p&gt;&#xA;&lt;p&gt;附上RA8875的2D加速代码：&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-cpp&#34; data-lang=&#34;cpp&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;static&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;void&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;lcd_set_rect&lt;/span&gt;(&lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt; x1, &lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt; y1, &lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt; x2, &lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt; y2)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;{&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#75715e&#34;&gt;//窗口起始位置&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;    lcd_command(&lt;span style=&#34;color:#ae81ff&#34;&gt;0x30&lt;/span&gt;, x1);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    lcd_command(&lt;span style=&#34;color:#ae81ff&#34;&gt;0x31&lt;/span&gt;, (x1 &lt;span style=&#34;color:#f92672&#34;&gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;8&lt;/span&gt;) &lt;span style=&#34;color:#f92672&#34;&gt;&amp;amp;&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;0x3&lt;/span&gt;);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    lcd_command(&lt;span style=&#34;color:#ae81ff&#34;&gt;0x32&lt;/span&gt;, y1);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    lcd_command(&lt;span style=&#34;color:#ae81ff&#34;&gt;0x33&lt;/span&gt;, (y1 &lt;span style=&#34;color:#f92672&#34;&gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;8&lt;/span&gt;) &lt;span style=&#34;color:#f92672&#34;&gt;&amp;amp;&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;0x01&lt;/span&gt;);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#75715e&#34;&gt;//窗口结束位置&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;    lcd_command(&lt;span style=&#34;color:#ae81ff&#34;&gt;0x34&lt;/span&gt;, x2);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    lcd_command(&lt;span style=&#34;color:#ae81ff&#34;&gt;0x35&lt;/span&gt;, (x2 &lt;span style=&#34;color:#f92672&#34;&gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;8&lt;/span&gt;) &lt;span style=&#34;color:#f92672&#34;&gt;&amp;amp;&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;0x03&lt;/span&gt;);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    lcd_command(&lt;span style=&#34;color:#ae81ff&#34;&gt;0x36&lt;/span&gt;, y2);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    lcd_command(&lt;span style=&#34;color:#ae81ff&#34;&gt;0x37&lt;/span&gt;, (y2 &lt;span style=&#34;color:#f92672&#34;&gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;8&lt;/span&gt;) &lt;span style=&#34;color:#f92672&#34;&gt;&amp;amp;&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;0x01&lt;/span&gt;);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;static&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;void&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;lcd_wseek&lt;/span&gt;(&lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt; x, &lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt; y)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;{&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    lcd_command(&lt;span style=&#34;color:#ae81ff&#34;&gt;0x46&lt;/span&gt;, x);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    lcd_command(&lt;span style=&#34;color:#ae81ff&#34;&gt;0x47&lt;/span&gt;, x &lt;span style=&#34;color:#f92672&#34;&gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;8&lt;/span&gt;);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    lcd_command(&lt;span style=&#34;color:#ae81ff&#34;&gt;0x48&lt;/span&gt;, y);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    lcd_command(&lt;span style=&#34;color:#ae81ff&#34;&gt;0x49&lt;/span&gt;, y &lt;span style=&#34;color:#f92672&#34;&gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;8&lt;/span&gt;);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;static&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;void&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;lcd_rseek&lt;/span&gt;(&lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt; x, &lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt; y)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;{&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    lcd_command(&lt;span style=&#34;color:#ae81ff&#34;&gt;0x4A&lt;/span&gt;, x);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    lcd_command(&lt;span style=&#34;color:#ae81ff&#34;&gt;0x4B&lt;/span&gt;, x &lt;span style=&#34;color:#f92672&#34;&gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;8&lt;/span&gt;);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    lcd_command(&lt;span style=&#34;color:#ae81ff&#34;&gt;0x4C&lt;/span&gt;, y);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    lcd_command(&lt;span style=&#34;color:#ae81ff&#34;&gt;0x4D&lt;/span&gt;, y &lt;span style=&#34;color:#f92672&#34;&gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;8&lt;/span&gt;);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;void&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;lcd_set_pixel&lt;/span&gt;(&lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt; x, &lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt; y, &lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt; pixel)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;{&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    lcd_wait_ram();&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    lcd_wseek(x, y);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    lcd_command(&lt;span style=&#34;color:#ae81ff&#34;&gt;0x02&lt;/span&gt;, pixel);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;lcd_get_pixel&lt;/span&gt;(&lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt; x, &lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt; y)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;{&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt; data;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    lcd_rseek(x, y);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    LCD_CMD &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;0x02&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    data &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; LCD_DATA;  &lt;span style=&#34;color:#75715e&#34;&gt;//dummy read&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;    data &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; LCD_DATA;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt; data;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;//BTE&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;static&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;void&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;bte_set_rect&lt;/span&gt;(&lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt; x, &lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt; y, &lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt; w, &lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt; h)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;{&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    lcd_command(&lt;span style=&#34;color:#ae81ff&#34;&gt;0x58&lt;/span&gt;, x);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    lcd_command(&lt;span style=&#34;color:#ae81ff&#34;&gt;0x59&lt;/span&gt;, (x &lt;span style=&#34;color:#f92672&#34;&gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;8&lt;/span&gt;) &lt;span style=&#34;color:#f92672&#34;&gt;&amp;amp;&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;0x03&lt;/span&gt;);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    lcd_command(&lt;span style=&#34;color:#ae81ff&#34;&gt;0x5A&lt;/span&gt;, y);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    lcd_command(&lt;span style=&#34;color:#ae81ff&#34;&gt;0x5B&lt;/span&gt;, (y &lt;span style=&#34;color:#f92672&#34;&gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;8&lt;/span&gt;) &lt;span style=&#34;color:#f92672&#34;&gt;&amp;amp;&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;0x01&lt;/span&gt;);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    lcd_command(&lt;span style=&#34;color:#ae81ff&#34;&gt;0x5C&lt;/span&gt;, w);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    lcd_command(&lt;span style=&#34;color:#ae81ff&#34;&gt;0x5D&lt;/span&gt;, (w &lt;span style=&#34;color:#f92672&#34;&gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;8&lt;/span&gt;) &lt;span style=&#34;color:#f92672&#34;&gt;&amp;amp;&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;0x03&lt;/span&gt;);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    lcd_command(&lt;span style=&#34;color:#ae81ff&#34;&gt;0x5E&lt;/span&gt;, h);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    lcd_command(&lt;span style=&#34;color:#ae81ff&#34;&gt;0x5F&lt;/span&gt;, (h &lt;span style=&#34;color:#f92672&#34;&gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;8&lt;/span&gt;) &lt;span style=&#34;color:#f92672&#34;&gt;&amp;amp;&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;0x03&lt;/span&gt;);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;static&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;void&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;bte_set_bkcolor&lt;/span&gt;(&lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt; color)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;{&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    lcd_command(&lt;span style=&#34;color:#ae81ff&#34;&gt;0x60&lt;/span&gt;, (color &lt;span style=&#34;color:#f92672&#34;&gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;11&lt;/span&gt;) &lt;span style=&#34;color:#f92672&#34;&gt;&amp;amp;&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;0x1F&lt;/span&gt;);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    lcd_command(&lt;span style=&#34;color:#ae81ff&#34;&gt;0x61&lt;/span&gt;, (color &lt;span style=&#34;color:#f92672&#34;&gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;5&lt;/span&gt;) &lt;span style=&#34;color:#f92672&#34;&gt;&amp;amp;&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;0x3F&lt;/span&gt;);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    lcd_command(&lt;span style=&#34;color:#ae81ff&#34;&gt;0x62&lt;/span&gt;, color &lt;span style=&#34;color:#f92672&#34;&gt;&amp;amp;&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;0x1F&lt;/span&gt;);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;static&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;void&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;bte_set_fgcolor&lt;/span&gt;(&lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt; color)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;{&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    lcd_command(&lt;span style=&#34;color:#ae81ff&#34;&gt;0x63&lt;/span&gt;, (color &lt;span style=&#34;color:#f92672&#34;&gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;11&lt;/span&gt;) &lt;span style=&#34;color:#f92672&#34;&gt;&amp;amp;&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;0x1F&lt;/span&gt;);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    lcd_command(&lt;span style=&#34;color:#ae81ff&#34;&gt;0x64&lt;/span&gt;, (color &lt;span style=&#34;color:#f92672&#34;&gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;5&lt;/span&gt;) &lt;span style=&#34;color:#f92672&#34;&gt;&amp;amp;&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;0x3F&lt;/span&gt;);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    lcd_command(&lt;span style=&#34;color:#ae81ff&#34;&gt;0x65&lt;/span&gt;, color &lt;span style=&#34;color:#f92672&#34;&gt;&amp;amp;&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;0x1F&lt;/span&gt;);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;static&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;void&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;bte_set_colorkey&lt;/span&gt;(&lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt; color)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;{&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    lcd_command(&lt;span style=&#34;color:#ae81ff&#34;&gt;0x67&lt;/span&gt;, (color &lt;span style=&#34;color:#f92672&#34;&gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;11&lt;/span&gt;) &lt;span style=&#34;color:#f92672&#34;&gt;&amp;amp;&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;0x1F&lt;/span&gt;);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    lcd_command(&lt;span style=&#34;color:#ae81ff&#34;&gt;0x68&lt;/span&gt;, (color &lt;span style=&#34;color:#f92672&#34;&gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;5&lt;/span&gt;) &lt;span style=&#34;color:#f92672&#34;&gt;&amp;amp;&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;0x3F&lt;/span&gt;);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    lcd_command(&lt;span style=&#34;color:#ae81ff&#34;&gt;0x69&lt;/span&gt;, color &lt;span style=&#34;color:#f92672&#34;&gt;&amp;amp;&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;0x1F&lt;/span&gt;);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;static&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;void&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;bte_open&lt;/span&gt;(&lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt; mode)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;{&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    lcd_command(&lt;span style=&#34;color:#ae81ff&#34;&gt;0x51&lt;/span&gt;, lcd_rop_mask &lt;span style=&#34;color:#f92672&#34;&gt;|&lt;/span&gt; mode);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    lcd_command(&lt;span style=&#34;color:#ae81ff&#34;&gt;0x50&lt;/span&gt;, &lt;span style=&#34;color:#ae81ff&#34;&gt;0x80&lt;/span&gt;);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;static&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;void&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;g2d_set_rect&lt;/span&gt;(&lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt; x, &lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt; y, &lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt; x2, &lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt; y2)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;{&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    lcd_command(&lt;span style=&#34;color:#ae81ff&#34;&gt;0x91&lt;/span&gt;, x&lt;span style=&#34;color:#f92672&#34;&gt;&amp;amp;&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;0xFF&lt;/span&gt;);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    lcd_command(&lt;span style=&#34;color:#ae81ff&#34;&gt;0x92&lt;/span&gt;, (x&lt;span style=&#34;color:#f92672&#34;&gt;&amp;gt;&amp;gt;&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;8&lt;/span&gt;)&lt;span style=&#34;color:#f92672&#34;&gt;&amp;amp;&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;0xFF&lt;/span&gt;);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    lcd_command(&lt;span style=&#34;color:#ae81ff&#34;&gt;0x93&lt;/span&gt;, y&lt;span style=&#34;color:#f92672&#34;&gt;&amp;amp;&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;0xFF&lt;/span&gt;);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    lcd_command(&lt;span style=&#34;color:#ae81ff&#34;&gt;0x94&lt;/span&gt;, (y&lt;span style=&#34;color:#f92672&#34;&gt;&amp;gt;&amp;gt;&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;8&lt;/span&gt;)&lt;span style=&#34;color:#f92672&#34;&gt;&amp;amp;&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;0xFF&lt;/span&gt;);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    lcd_command(&lt;span style=&#34;color:#ae81ff&#34;&gt;0x95&lt;/span&gt;, x2&lt;span style=&#34;color:#f92672&#34;&gt;&amp;amp;&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;0xFF&lt;/span&gt;);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    lcd_command(&lt;span style=&#34;color:#ae81ff&#34;&gt;0x96&lt;/span&gt;, (x2&lt;span style=&#34;color:#f92672&#34;&gt;&amp;gt;&amp;gt;&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;8&lt;/span&gt;)&lt;span style=&#34;color:#f92672&#34;&gt;&amp;amp;&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;0xFF&lt;/span&gt;);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    lcd_command(&lt;span style=&#34;color:#ae81ff&#34;&gt;0x97&lt;/span&gt;, y2&lt;span style=&#34;color:#f92672&#34;&gt;&amp;amp;&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;0xFF&lt;/span&gt;);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    lcd_command(&lt;span style=&#34;color:#ae81ff&#34;&gt;0x98&lt;/span&gt;, (y2&lt;span style=&#34;color:#f92672&#34;&gt;&amp;gt;&amp;gt;&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;8&lt;/span&gt;)&lt;span style=&#34;color:#f92672&#34;&gt;&amp;amp;&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;0xFF&lt;/span&gt;);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;static&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;void&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;g2d_command&lt;/span&gt;(&lt;span style=&#34;color:#66d9ef&#34;&gt;uint8_t&lt;/span&gt; cmd)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;{&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    lcd_command(&lt;span style=&#34;color:#ae81ff&#34;&gt;0x90&lt;/span&gt;, cmd);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;void&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;lcd_set_rop&lt;/span&gt;(&lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt; mode)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;{&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    lcd_rop_mask &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; (mode &lt;span style=&#34;color:#f92672&#34;&gt;&amp;amp;&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;0x0F&lt;/span&gt;) &lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;4&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;void&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;bte_fill_rect&lt;/span&gt;(&lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt; x, &lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt; y, &lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt; w, &lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt; h, &lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt; color)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;{&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    lcd_wait_bte();&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    bte_set_rect(x, y, w, h);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    bte_set_fgcolor(color);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    bte_open(&lt;span style=&#34;color:#ae81ff&#34;&gt;0x0C&lt;/span&gt;);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;void&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;g2d_fill_rect&lt;/span&gt;(&lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt; x, &lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt; y, &lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt; x2, &lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt; y2, &lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt; color)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;{&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    lcd_wait_ram();&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    bte_set_fgcolor(color);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    g2d_set_rect(x, y, x2, y2);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    g2d_command(&lt;span style=&#34;color:#ae81ff&#34;&gt;0xB0&lt;/span&gt;);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description>
    </item>
    <item>
      <title>Windows系统使用WMIC的获取硬盘ID的问题</title>
      <link>https://xcdd.pages.dev/blog/2017/2017-08-30/</link>
      <pubDate>Wed, 30 Aug 2017 14:03:40 +0000</pubDate>
      <guid>https://xcdd.pages.dev/blog/2017/2017-08-30/</guid>
      <description>&lt;p&gt;为了查询硬件信息，可以使用wmic命令：&lt;/p&gt;&#xA;&lt;p&gt;查看CPU：wmic cpu get processorid&lt;/p&gt;&#xA;&lt;p&gt;查看主板：wmic baseboard get serialnumber&lt;/p&gt;&#xA;&lt;p&gt;查看硬盘：wmic diskdrive get serialnumber&lt;/p&gt;&#xA;&lt;p&gt;但这里有个小问题：&lt;/p&gt;&#xA;&lt;p&gt;对于XP系统查不到硬盘ID；&lt;/p&gt;&#xA;&lt;p&gt;对于win7系统硬盘ID是HEX格式的文本(40位)，如：202020202020325a4b415244544；&lt;/p&gt;&#xA;&lt;p&gt;对于win10系统硬盘ID是字符串格式，如：XYZ1234567890；&lt;/p&gt;&#xA;&lt;p&gt;对于win8.1系统和win10一样.&lt;/p&gt;&#xA;&lt;p&gt;对于win8和vista没有裸机测试,所以结果未知.&lt;/p&gt;&#xA;&lt;p&gt;对于有多块硬盘的系统，wmic列出的硬盘顺序可能是乱的, 目前不知道排序规则，可以肯定的是排在第1个的不一定就是当前系统盘；(猜测可能是BIOS中的启动顺序???)&lt;/p&gt;&#xA;&lt;p&gt;Windows的物理硬盘序号\.\PHYSICALDRIVE0-X是按照主板接口顺序(SATA0-X)排序的，PHYSICALDRIVE0不一定是当前启动系统的那块硬盘.&lt;/p&gt;&#xA;&lt;p&gt;那么如何得知当前系统所在的硬盘呢,并读取硬盘ID呢?&lt;/p&gt;&#xA;&lt;p&gt;目前看来,可以假定当前系统盘一定是C盘,所以通过读取C盘的磁盘信息,获取C盘所在磁盘的编号,这个编号就是\.\PHYSICALDRIVEx中的x;&lt;/p&gt;&#xA;&lt;p&gt;如果想查看该硬盘的信息，可以使用：wmic diskdrive where deviceid=&amp;rsquo;\\.\PHYSICALDRIVEx&#39;&lt;/p&gt;</description>
    </item>
    <item>
      <title>嵌入式操作系统内核KLite的API详解</title>
      <link>https://xcdd.pages.dev/blog/2017/2017-08-14/</link>
      <pubDate>Mon, 14 Aug 2017 14:18:23 +0000</pubDate>
      <guid>https://xcdd.pages.dev/blog/2017/2017-08-14/</guid>
      <description>&lt;p&gt;本文转载出处：http://git.oschina.net/kerndev/klite/wikis/API%E6%89%8B%E5%86%8C&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;#KLite API参考手册&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;##1.功能特性 KLite是一个为ARM Cortex-M微控制器设计的微内核,设计思想是&amp;quot;简洁易用&amp;quot;.&lt;/p&gt;&#xA;&lt;p&gt;-1- 支持动态内存管理;&lt;/p&gt;&#xA;&lt;p&gt;-2- 支持256级线程抢占优先级;&lt;/p&gt;&#xA;&lt;p&gt;-3- 支持线程同步:互斥锁,信号量,事件.&lt;/p&gt;&#xA;&lt;p&gt;-4- 规范的编码风格.&lt;/p&gt;&#xA;&lt;p&gt;##2.数据类型 KLite提供以下4种内核对象:&lt;/p&gt;&#xA;&lt;p&gt;kthread_t 线程标识符&lt;/p&gt;&#xA;&lt;p&gt;kmutex_t 互斥锁标识符&lt;/p&gt;&#xA;&lt;p&gt;kevent_t 事件标识符&lt;/p&gt;&#xA;&lt;p&gt;ksem_t 信号量标识符&lt;/p&gt;&#xA;&lt;p&gt;##3.API参考 ###3.1 内核相关&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;原型: &#xD;&#xA;&#x9;void kernel_init(uint32_t addr, uint32_t size)&#xD;&#xA;功能: &#xD;&#xA;&#x9;KLite内核初始化.&#xD;&#xA;参数: &#xD;&#xA;&#x9;addr    内核动态管理内存起始地址&#xD;&#xA;&#x9;size    内核动态管理内存大小  &#xD;&#xA;返回值: &#xD;&#xA;&#x9;无&#xD;&#xA;备注:在调用内核初始化时保证中断处于关闭状态,此函数只能执行一次,在初始化内核之前不能调用任何KLite相关的API.&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;原型: &#xD;&#xA;&#x9;void kernel_start(void)&#xD;&#xA;功能: &#xD;&#xA;&#x9;启动KLite内核,内部调用底层函数cpu_tick_init,以启动滴答定时器.&#xD;&#xA;参数: &#xD;&#xA;&#x9;无 &#xD;&#xA;返回值: &#xD;&#xA;&#x9;无&#xD;&#xA;备注:&#xD;&#xA;&#x9;在启动KLite之前调用至少需要创建一个用户线程.&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;原型:&#xD;&#xA;&#x9;uint32_t kernel_version(void)&#xD;&#xA;功能:&#xD;&#xA;&#x9;返回KLite内核的版本号&#xD;&#xA;参数:&#xD;&#xA;&#x9;无&#xD;&#xA;返回值:&#xD;&#xA;&#x9;版本号,BIT[31:24]主版本号,BIT[23:16]次版本号,BIT[15:0]修订号&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;原型:&#xD;&#xA;&#x9;uint32_t kernel_time(void)&#xD;&#xA;功能:&#xD;&#xA;&#x9;返回内核自启动以来的节拍数,单位毫秒&#xD;&#xA;参数:&#xD;&#xA;&#x9;无&#xD;&#xA;返回值:&#xD;&#xA;&#x9;节拍数&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;###3.2 内存管理&lt;/p&gt;</description>
    </item>
    <item>
      <title>在MSYS2&#43;MinGW环境下编译arm-none-eabi工具链</title>
      <link>https://xcdd.pages.dev/blog/2017/2017-08-08-1737/</link>
      <pubDate>Tue, 08 Aug 2017 17:37:55 +0000</pubDate>
      <guid>https://xcdd.pages.dev/blog/2017/2017-08-08-1737/</guid>
      <description>&lt;p&gt;&lt;strong&gt;前言&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;在Windows平台有MSYS2这个非常好用的linux模拟环境，支持大量的linux实用工具，如：busybox, grep, find, sed, awk, perl, gcc等等. 虽然MSYS2平台也提供了gcc编译器，但它的gcc工具链是i686-pc-msys，也就是说它编译出来的代码是基于MSYS的运行时环境， 而不是原生的Windows运行时(MSVCRT)，所以为了编译Windows平台运行的EXE程序，还是使用MINGW提供的GCC比较好。&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;目的&lt;/strong&gt;&#xA;MSYS和MINGW都提供了各自的gcc工具链，但是没有arm平台的交叉编译环境，所以自己尝试编译一个单纯的arm-none-eabi工具链。&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;正文&lt;/strong&gt;&#xA;在MSYS+MINGW环境下编译gcc和在linux系统编译过程大体相同，&#xA;编译顺序也是这样的：gmp -&amp;gt; mpfr -&amp;gt; mpc -&amp;gt;binutils -&amp;gt; gcc （-&amp;gt; glibc -&amp;gt; binutils -&amp;gt; gcc）。&#xA;注意：不要用太新的GCC版本编译太旧的GCC源码，我之前用GCC6.3编译4.8版本的源码失败了。&#xA;我现在测试使用的是GCC5.10， 编译的源码版本为4.8.5。&lt;/p&gt;&#xA;&lt;p&gt;1.编译gmp, mpfr, mpc&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;#../configure --disable-shared --host=i686-pc-mingw32 --build=i686-pc-mingw32 --prefix=/opt/mingw&#xD;&#xA;#make&#xD;&#xA;#make install&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;编译过程都比较顺利&#xA;host 指定运行这个库的环境是mingw32&#xA;build 指定编译这个源码的环境是mingw32&#xA;可能会出现找不到gmp.h的问题，那就添加一个参数：–with-gmp=/opt/mingw&#xA;这里不能用动态链接，所以要–disable-shared&lt;/p&gt;&#xA;&lt;p&gt;2.编译binutils&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;#../configure --disable-shared --disable-nls --disable-multilib --host=i686-pc-mingw32 --build=i686-pc-mingw32 --target=arm-none-eabi --prefix=/opt/arm&#xD;&#xA;# make&#xD;&#xA;# make install&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;这个编译过程也比较顺利，可能出现的问题问题同上。&lt;/p&gt;&#xA;&lt;p&gt;3.编译gcc：&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;#../configure --enable-targets=all --enable-languages=c --disable-shared --disable-checking --disable-threads --disable-multilib --disable-nls  --disable-decimal-float --disable-libgomp --disable-libmudflap --disable-libssp --disable-bootstrap --disable-libquadmath --disable-libatomic  --without-headers --with-newlib&#xD;&#xA;--host=i686-pc-mingw32 --build=i686-pc-mingw32 --target=arm-none-eabi&#xD;&#xA;#make -j2&#xD;&#xA;#make install&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;编译gcc非常慢，而且还出了几个问题，在此记录：&lt;/p&gt;</description>
    </item>
    <item>
      <title>在MSYS2&#43;MinGW环境下编译arm-none-eabi工具链</title>
      <link>https://xcdd.pages.dev/blog/2017/2017-08-08-1724/</link>
      <pubDate>Tue, 08 Aug 2017 17:24:55 +0000</pubDate>
      <guid>https://xcdd.pages.dev/blog/2017/2017-08-08-1724/</guid>
      <description>&lt;p&gt;&lt;strong&gt;前言&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;在Windows平台有MSYS2这个非常好用的linux模拟环境，支持大量的linux实用工具。&lt;/p&gt;&#xA;&lt;p&gt;如：busybox, grep, find, sed, awk, perl, gcc, make等等.&lt;/p&gt;&#xA;&lt;p&gt;虽然MSYS2平台也提供了gcc编译器，但它的gcc工具链是i686-pc-msys，&lt;/p&gt;&#xA;&lt;p&gt;也就是说它编译出来的可执行文件是基于MSYS2的运行时环境，需要msys.dll才能运行。&lt;/p&gt;&#xA;&lt;p&gt;而不是原生的Windows运行时(MSVCRT)，所以为了编译Windows平台运行的EXE程序，&lt;/p&gt;&#xA;&lt;p&gt;还是使用MINGW提供的GCC比较好。&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;目的&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;MSYS2和MINGW都提供了各自的gcc工具链，但是没有arm平台的交叉编译环境，&lt;/p&gt;&#xA;&lt;p&gt;所以自己尝试编译一个单纯的arm-none-eabi工具链。&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;正文&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;在MSYS2+MINGW环境下编译gcc和在linux系统编译过程大体相同，&lt;/p&gt;&#xA;&lt;p&gt;编译顺序也是这样的：gmp -&amp;gt; mpfr -&amp;gt; mpc -&amp;gt;binutils -&amp;gt; gcc （-&amp;gt; glibc/newlib/uclibc）。&lt;/p&gt;&#xA;&lt;p&gt;注意：&#xA;不要用太新的GCC版本编译太旧的GCC源码，我之前用GCC6.3编译4.8版本的源码失败了。&lt;/p&gt;&#xA;&lt;p&gt;我现在测试使用的是GCC5.10， 编译的源码版本为4.8.5。&lt;/p&gt;&#xA;&lt;p&gt;编译时，最好在源码目录下执行:&lt;/p&gt;&#xA;&lt;p&gt;#mkdir build&#xA;#cd build&#xA;#../configure&#xA;这样不会污染源码目录。&lt;/p&gt;&#xA;&lt;p&gt;1.编译gmp, mpfr, mpc&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-plain&#34; data-lang=&#34;plain&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;#../configure --host=i686-pc-mingw32 --build=i686-pc-mingw32 --prefix=/opt/mingw --disable-shared &#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;#make&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;#make install&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;或者 &#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;#make install-strip&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;编译过程都比较顺利，此过程需要MSYS2有m4、awk、grep命令。&lt;/p&gt;&#xA;&lt;p&gt;&amp;ndash;host 指定运行这个库的环境是mingw32&lt;/p&gt;&#xA;&lt;p&gt;&amp;ndash;build 指定编译这个源码的环境是mingw32&lt;/p&gt;&#xA;&lt;p&gt;可能会出现找不到gmp.h的问题，那就添加一个参数：&amp;ndash;with-gmp=/opt/mingw&lt;/p&gt;&#xA;&lt;p&gt;这里不能用动态链接，所以要&amp;ndash;disable-shared&lt;/p&gt;&#xA;&lt;p&gt;2.编译binutils&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-plain&#34; data-lang=&#34;plain&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;#../configure --host=i686-pc-mingw32 --build=i686-pc-mingw32 \&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;--target=arm-none-eabi --prefix=/opt/arm \&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;--disable-shared --disable-nls --disable-multilib &#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;#make CFLAGS=&amp;#34;xxx&amp;#34;(这里可以自定义编译选项)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;#make install&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;#make install-strip(推荐)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;这个编译过程也比较顺利，一般不会有什么问题。&lt;/p&gt;</description>
    </item>
    <item>
      <title>[MSYS]另类busybox调用/安装方法</title>
      <link>https://xcdd.pages.dev/blog/2017/2017-08-08/</link>
      <pubDate>Tue, 08 Aug 2017 13:05:56 +0000</pubDate>
      <guid>https://xcdd.pages.dev/blog/2017/2017-08-08/</guid>
      <description>&lt;p&gt;在Windows环境下的使用MSYS2，由于Windows上面不支持ln -s这样的软链接，&lt;/p&gt;&#xA;&lt;p&gt;默认情况下，如果使用busybox &amp;ndash;install 这样的话，busybox会把自己复制N遍，每个命令都是一个exe文件，且文件大小等于它自己。&lt;/p&gt;&#xA;&lt;p&gt;这样的话就浪费用了大量的磁盘空间，于是我研究了一下，找到一种可以节省空间的调用方法，如下：&lt;/p&gt;&#xA;&lt;p&gt;在/usr/bin目录下面，建立该命令的shell脚本，&lt;/p&gt;&#xA;&lt;p&gt;比如我需要busybox的cpio命令，则新建一个文件名为cpio的脚本。&lt;/p&gt;&#xA;&lt;p&gt;内容为：&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-cpp&#34; data-lang=&#34;cpp&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;#!/usr/bin/busybox&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;$0&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;$@&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;第一行指定了解释这个脚本的程序，由busybox来执行&lt;/p&gt;&#xA;&lt;p&gt;第二行 &amp;ldquo;$0&amp;rdquo; 代表文件名自己，&amp;quot;$@&amp;ldquo;代表调用参数。&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;可以把这个文件改名为任何busybox支持的命令。&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;是不是很方便了呢，哈哈哈？&lt;/p&gt;</description>
    </item>
    <item>
      <title>关于cygwin/msys/msys2/mingw/mingw64</title>
      <link>https://xcdd.pages.dev/blog/2017/2017-08-05/</link>
      <pubDate>Sat, 05 Aug 2017 16:12:15 +0000</pubDate>
      <guid>https://xcdd.pages.dev/blog/2017/2017-08-05/</guid>
      <description>&lt;p&gt;最近想在windows平台建立一个gcc开发环境，目前windows平台有多种gcc工具链可用：cygwin/msys/msys2/mingw/mingw64&#xA;这几天研究了一下这几个东西，把目前所了解的情况做个笔记,以防以后再花时间去研究.&lt;/p&gt;&#xA;&lt;p&gt;cygwin&lt;/p&gt;&#xA;&lt;p&gt;是最早出现的一套在windows平台模拟linux环境的软件，它几乎完整地模拟了linux的大部分API，&lt;/p&gt;&#xA;&lt;p&gt;核心文件是cygwin1.dll，然后再基于此核心移植了linux平台的其它GNU工具.&lt;/p&gt;&#xA;&lt;p&gt;工具比较全，体积较大，运行速度较慢，编译的程序依赖cygwin.dll.&lt;/p&gt;&#xA;&lt;p&gt;所以说它应该可以理解为一个linux模拟器.&lt;/p&gt;&#xA;&lt;p&gt;主页： &lt;a href=&#34;http://www.cygwin.com/&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;http://www.cygwin.com/&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;mingw&lt;/p&gt;&#xA;&lt;p&gt;则是专注于windows平台的gcc工具链，把gcc移植到windows平台，基于原生win32 api，而不依赖linux平台的api.&lt;/p&gt;&#xA;&lt;p&gt;它不提供linux环境下的其它管理工具，是个原生的windows编译环境.&lt;/p&gt;&#xA;&lt;p&gt;可以用它编译出原生的windows程序，而不像cygwin一样需要依赖cygwin.dll.&lt;/p&gt;&#xA;&lt;p&gt;它的gcc工具命名是 i686-pc-mingw32-gcc&lt;/p&gt;&#xA;&lt;p&gt;主页： &lt;a href=&#34;http://www.mingw.org/&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;http://www.mingw.org/&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;项目资源： &lt;a href=&#34;https://sourceforge.net/projects/mingw&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;https://sourceforge.net/projects/mingw&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;mingw-w64&lt;/p&gt;&#xA;&lt;p&gt;由于mingw只支持32位程序，所以又产生了mingw-w64，提供了可以在32位系统上编译出64位windows程序的gcc工具链？&lt;/p&gt;&#xA;&lt;p&gt;它的gcc工具命名是i686-w64-mingw32-gcc还有x86_64-w64-mingw32-gcc&lt;/p&gt;&#xA;&lt;p&gt;主页： &lt;a href=&#34;http://www.mingw-w64.org/&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;http://www.mingw-w64.org/&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;项目资源： &lt;a href=&#34;https://sourceforge.net/projects/mingw-w64&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;https://sourceforge.net/projects/mingw-w64&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;msys&lt;/p&gt;&#xA;&lt;p&gt;由mingw团队开发的，mingw和cygwin结合的产物，cygwin的精简版再加上mingw的编译器.&lt;/p&gt;&#xA;&lt;p&gt;主要是用来配合mingw进行命令行开发一套比较完整的开发环境.&lt;/p&gt;&#xA;&lt;p&gt;主页： &lt;a href=&#34;http://www.mingw.org/wiki/MSYS&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;http://www.mingw.org/wiki/MSYS&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;msys2&lt;/p&gt;&#xA;&lt;p&gt;是另一个开源组织在MSYS的基础上重新开发的.与MSYS最大的区别是移植了 &lt;a href=&#34;https://baike.baidu.com/item/Arch%20Linux&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;Arch Linux&lt;/a&gt; 的软件包管理系统 &lt;a href=&#34;https://baike.baidu.com/item/Pacman&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;Pacman&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;msys2也和cygwin差不多，是模拟linux平台的环境(posix api)，但它的速度比cygwin要快不少.&lt;/p&gt;&#xA;&lt;p&gt;目前提供了比较丰富的工具，包括git, python, perl, gcc等。&lt;/p&gt;&#xA;&lt;p&gt;用它的gcc编译出来的程序，需要msys2的运行环境，核心dll是msys-2.0.dll&lt;/p&gt;&#xA;&lt;p&gt;gcc工具命名是 i686-pc-msys-gcc&lt;/p&gt;&#xA;&lt;p&gt;主页是： &lt;a href=&#34;http://www.msys2.org/&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;http://www.msys2.org/&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;下载源： &lt;a href=&#34;https://sourceforge.net/projects/msys2/&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;https://sourceforge.net/projects/msys2/&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;写在最后：&lt;/p&gt;&#xA;&lt;p&gt;目前推荐使用的mingw-w64和msys2的组合.&lt;/p&gt;&#xA;&lt;p&gt;mingw的工具链适合编译纯windows api的程序，而sys2则可以比较方便地移植GNU的开源项目.&lt;/p&gt;&#xA;&lt;p&gt;目前git for windows从安装后的文件目录来看，也是基于msys2的，但它的git是由mingw32编译的.&lt;/p&gt;&#xA;&lt;p&gt;由于我又想要使用mingw,又想使用msys2，又想使用git，如果分开安装，不仅占用硬盘空间，而且很麻烦，&lt;/p&gt;&#xA;&lt;p&gt;所以我想在windows上使用MSYS2来统一开发环境，我安装了MSYS2，再安装了MSYS2提供的git，&lt;/p&gt;&#xA;&lt;p&gt;但发现这个版本的git在以http的方式clone远程仓库时输入用户名没有回显，很奇怪，很纠结.&lt;/p&gt;</description>
    </item>
    <item>
      <title>怀念WAP网站和让IE浏览器支持WAP网站</title>
      <link>https://xcdd.pages.dev/blog/2017/2017-05-02/</link>
      <pubDate>Tue, 02 May 2017 13:41:29 +0000</pubDate>
      <guid>https://xcdd.pages.dev/blog/2017/2017-05-02/</guid>
      <description>&lt;p&gt;&lt;strong&gt;前言&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;WAP网站目前已经快要消失了，对于WAP那真是满满的回忆啊，10年前那个让人激动的网站：wap.3g.qq.com，现在早已经无法访问了。&lt;/p&gt;&#xA;&lt;p&gt;WAP网站那时候还是主流的手机网站，因为页面内容少，节省流量，对手机性能要求也非常低。&lt;/p&gt;&#xA;&lt;p&gt;1.0版本的WAP主要使用wml语言做为网页开发语言，到了2.0版本则使用xhtml，新旧版本在那个时候体现在“普通版”和“彩版”的切换。&lt;/p&gt;&#xA;&lt;p&gt;普通版本则是完全基于WML语言，主要是文字和少量gif图片，排版也比较简单，基本都是左对齐；&lt;/p&gt;&#xA;&lt;p&gt;彩色版则是使用XHTML语言，文字有了颜色，按钮也有了背景框，文本也有居中显示了；&lt;/p&gt;&#xA;&lt;p&gt;现代版的手机网站基本都使用HTML5开发，网页内容就非常丰富了而且支持javascript，网页广告则堆一堆的出现，对手机性能要求的流量也比以前高了许多！&lt;/p&gt;&#xA;&lt;p&gt;所以现在用30MB手机流量上网？基本看不了几个网页就被广告和图片消耗完毕了，想想曾经一个月30MB流量可以玩一个月的岁月，真的是十分怀念的！！！&lt;/p&gt;&#xA;&lt;p&gt;下面是三种效果的百度首页，分别是：简版（WML）、彩色版（XHTML）、现代版（H5）！&lt;/p&gt;&#xA;&lt;hr&gt;&#xA;&lt;p&gt;&lt;img src=&#34;./053_1&#34; alt=&#34;&#34;&gt;&lt;/p&gt;&#xA;&lt;hr&gt;&#xA;&lt;p&gt;&lt;img src=&#34;./053_2&#34; alt=&#34;&#34;&gt;&lt;/p&gt;&#xA;&lt;hr&gt;&#xA;&lt;p&gt;&lt;img src=&#34;./053_3&#34; alt=&#34;&#34;&gt;&lt;/p&gt;&#xA;&lt;hr&gt;&#xA;&lt;p&gt;前两种百度首页，只需要不到10KB的流量，而H5版本的百度首页，则需要几百KB的流量！&lt;/p&gt;&#xA;&lt;p&gt;我个人最喜欢的是第2种页面，也就是所谓的彩版页面，既简洁又省流量。&lt;/p&gt;&#xA;&lt;p&gt;正文&lt;/p&gt;&#xA;&lt;p&gt;说了这么多废话，该上正文了，我最近发现不管是chrome还有IE浏览器，其实它们都可以解析并显示WML语言的页面。&lt;/p&gt;&#xA;&lt;p&gt;但是联网访问这些页面的时候，它并不能正确识别这种格式所以会导致不能正常显示，对于chrome浏览器，我没有找到办法让它重新认识这种格式。&lt;/p&gt;&#xA;&lt;p&gt;但IE浏览器可以，只要导入下面的注册表内容就可以实现了！&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-plain&#34; data-lang=&#34;plain&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Windows Registry Editor Version 5.00&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;[HKEY_CLASSES_ROOT\MIME\Database\Content Type\text/vnd.wap.wml]&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&amp;#34;Extension&amp;#34;=&amp;#34;.wml&amp;#34;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&amp;#34;Encoding&amp;#34;=hex:08,00,00,00&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&amp;#34;CLSID&amp;#34;=&amp;#34;{25336920-03F9-11cf-8FD0-00AA00686F13}&amp;#34;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;[HKEY_CLASSES_ROOT\.wml]&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;@=&amp;#34;htmlfile&amp;#34;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&amp;#34;Content Type&amp;#34;=&amp;#34;text/html&amp;#34;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&amp;#34;PerceivedType&amp;#34;=&amp;#34;text&amp;#34;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;[HKEY_CLASSES_ROOT\.wml\OpenWithProgids]&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&amp;#34;htmlfile&amp;#34;=&amp;#34;&amp;#34;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;[HKEY_CLASSES_ROOT\.wml\PersistentHandler]&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;@=&amp;#34;{eec97550-47a9-11cf-b952-00aa0051fe20}&amp;#34;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description>
    </item>
    <item>
      <title>BIOS引导流程与启动管理器</title>
      <link>https://xcdd.pages.dev/blog/2017/2017-03-28/</link>
      <pubDate>Tue, 28 Mar 2017 11:34:49 +0000</pubDate>
      <guid>https://xcdd.pages.dev/blog/2017/2017-03-28/</guid>
      <description>&lt;p&gt;现今BIOS存在传统的Legacy BIOS和UEFI两种；&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;Legacy BIOS&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;存在的历史比较长，使用广泛，最近几年正在被UEFI所替代，主要原因我认为是这种方式的BIOS对X64体系的支持不够友好；&#xA;再加上硬盘容量已经超过2TB，MBR分区表无法处理，需要用到GPT分区表.&lt;/p&gt;&#xA;&lt;p&gt;Legacy BIOS的一般启动流程是:&#xA;1.由BIOS选择启动设备，如HDD/CDROM等；&#xA;2.加载该设备的MBR（主引导记录），MBR中记录了下一步启动的方式，通常是搜索激活的主分区；&#xA;3.加载该分区的PBR（分区引导记录），PBR中记录了需要引导分区中的哪个启动管理器，如NTLDR/BOOTMGR/GRLDR等；&#xA;4.加载启动管理器，由启动管理器进一步加载OS内核；&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;UEFI&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;全称“统一的可扩展固件接口”(Unified Extensible Firmware Interface)， 是一种详细描述类型接口的标准。&#xA;这种接口用于操作系统自动从预启动的操作环境，加载到一种操作系统上。&#xA;大约2010年以后生厂的电脑大多数都开始使用UEFI了，只不过版本可能比较低，兼容性没有最近几年的好。&lt;/p&gt;&#xA;&lt;p&gt;UEFI的启动流程：&#xA;1.指定启动设备，如HDD/CDROM等；&#xA;2.搜索可识别的分区，通常是FAT32；&#xA;3.在该分区的/efi/boot/目录下寻找bootx64.efi或者bootia32.efi；&#xA;4.引导bootx64.efi文件，这个文件就是Legacy BIOS中的启动管理器，由启动管理器进一步加载OS内核；&lt;/p&gt;&#xA;&lt;p&gt;虽然UEFI在各个方便对比传统BIOS有不少优势，但目前看来使用起来还是有不少困难，比如说支持的引导程序比较少，不支持实模式的DOS系统等。&#xA;而且Legacy BIOS和UEFI的运行模式完全不一样，引导文件的格式也不一样，因此在Legacy BIOS和UEFI模式下的引导文件是不能通用的。&#xA;再加上MS在UEFI中强行加入Secure Boot这个流氓，啊？&lt;/p&gt;&#xA;&lt;hr&gt;&#xA;&lt;p&gt;启动管理器（也叫做引导程序，对应的文件叫做引导文件）&#xA;常见的启动管理器如下：&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;1.NTLDR&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;Windows XP时代的启动管理器，通过/boot.ini文件来管理启动菜单，可以引导grub等其它引导程序。&#xA;目前只有Legacy BIOS模式下的引导文件，不支持UEFI启动。&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;2.BOOTMGR&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;Windows Vista以后的系统使用和启动管理器，功能上比NTLDR强大一些，支持VHD，WIM文件的挂载。&#xA;Legacy BIOS模式下引导文件为/bootmgr，通过/boot/bcd文件来管理启动菜单；&#xA;UEFI模式下引导文件为/efi/boot/bootx64.efi，通过/efi/microsoft/boot/bcd文件来管理启动菜单。在UEFI环境下它不能引导其它的启动管理器如grub。&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;3.GRUB4DOS&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;多系统引导程序，GNU GRUB的一个分支，有一个强大的shell，可以通过命令行进行引导。&#xA;目前只有Legacy BIOS模式下的引导文件，不支持UEFI启动，一般情况下通过/menu.lst来管理启动菜单；&lt;/p&gt;&#xA;&lt;p&gt;常用命令:&#xA;chainloader 加载MBR&#xA;chainloader /bootmgr 可以导引bootmgr&#xA;chainloader /g2ldr.mbr 可以引导grub2;&#xA;chainloader +1 可以引导当前分区的PBR;&#xA;kernel 加载引导程序内核&#xA;kernel /g2ldr 可以引导GRUB2;&#xA;boot 引导刚才加载的程序;&#xA;map 映射iso等镜像文件;&lt;/p&gt;</description>
    </item>
    <item>
      <title>Makefile参考样例4：多个文件夹.c的编译</title>
      <link>https://xcdd.pages.dev/blog/2017/2017-03-24-1601/</link>
      <pubDate>Fri, 24 Mar 2017 16:01:58 +0000</pubDate>
      <guid>https://xcdd.pages.dev/blog/2017/2017-03-24-1601/</guid>
      <description>&lt;p&gt;对于上一篇的makefile的缺点，经过改良后行成了下面的makefile；&#xA;主要改动是把编译过程的中间文件(*.d, *.o)放到一个单独的文件夹，clean的时候删除该中间文件夹，不会污染源码文件夹。&lt;/p&gt;&#xA;&lt;p&gt;优点：代码简洁，容易解理，能自动检查头文件依赖关系，支持不同文件夹下面有相同的文件名的.c文件，中间文件单独存放；&#xA;缺点：暂无&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-plain&#34; data-lang=&#34;plain&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;#这是一个makefile的参考样例,用于编译多文件夹,多文件&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;#编译工具链&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;CC&#x9;= gcc&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;CXX&#x9;= g++&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;LD&#x9;= $(CC)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;AS&#x9;= nasm&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;#编译选项&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;ASFLAGS  = -m32&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;CFLAGS   = -m32 -Wall $(incdir)&#x9; &#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;CXXFLAGS = -m32 -Wall $(incdir)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;LDFLAGS&#x9; = -m32 -static&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;#定义输出文件名&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;target = main.exe&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;#定义根目录&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;objdir = obj&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;srcdir = src&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;#定义源码子目录&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;subdir = . \&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;         src \&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&#x9; dir1 \&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&#x9; dir2 \&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&#x9; dir2/sub1 \&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&#x9; dir2/sub2&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;#定义包含目录&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;incdir = $(foreach dir, $(subdir), -I$(srcdir)/$(dir))&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;#定义附加依赖库&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;inclib = -lpthread&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;#遍历所有dir,并搜索该dir下面的所有.c文件&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;allsrc = $(foreach dir, $(subdir), $(wildcard $(srcdir)/$(dir)/*.c))&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;#把所有的.c替换为.o&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;allobj = $(patsubst $(srcdir)/%.c, $(objdir)/%.o, $(allsrc))&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;#把所有的.c替换为.d&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;alldep = $(patsubst $(srcdir)/%.c, $(objdir)/%.d, $(allsrc))&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;#生成.d的规则&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;$(objdir)/%.d: $(srcdir)/%.c&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;@echo Generating $@...&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;@$(CC) -MM -MT &amp;#34;$(patsubst $(srcdir)/%.c, $(objdir)/%.o, $&amp;lt;) $@&amp;#34; $(CFLAGS) $&amp;lt; &amp;gt;$@&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;#生成.o的规则&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;$(objdir)/%.o: $(srcdir)/%.c&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;@echo Compiling $&amp;lt;...&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;@$(CC) $(CFLAGS) -c $&amp;lt; -o $@&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;#如果是第3次调用make,则包含所有.d文件&#x9;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;ifeq ($(MAKELEVEL), 2)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;include $(alldep)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;endif&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;#声明虚拟目标&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;.PHONY:&#x9;init clean&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;init: &#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;@mkdir -p $(dir $(allobj))&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;@$(MAKE) -s depend&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;depend: $(alldep)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;@$(MAKE) -s target&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;target: $(alldep) $(allobj)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;@echo Linking target...&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;@$(LD) $(LDFLAGS) -o $(target) $(allobj) $(inclib)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;@echo Link done!&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;clean:&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;@rm -rf $(target) $(objdir)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;@echo clean done.&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description>
    </item>
    <item>
      <title>Makefile参考样例3:多个文件夹.c的编译</title>
      <link>https://xcdd.pages.dev/blog/2017/2017-03-24/</link>
      <pubDate>Fri, 24 Mar 2017 10:37:45 +0000</pubDate>
      <guid>https://xcdd.pages.dev/blog/2017/2017-03-24/</guid>
      <description>&lt;p&gt;上一篇的Makefile写得太过复杂，且不支持同名.c文件，因此经过改良后，又来一发Makefile参考样例3；&lt;/p&gt;&#xA;&lt;p&gt;优点：代码简洁，容易解理，能自动检查头文件依赖关系，支持不同文件夹下面有相同的文件名的.c文件；&lt;/p&gt;&#xA;&lt;p&gt;缺点：所有编译的中间文件与源码在同一路径，会造成一些文件污染，好在make clean可以干净地清除这些中间文件；&lt;/p&gt;&#xA;&lt;p&gt;代码如下：&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-plain&#34; data-lang=&#34;plain&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;#这是一个makefile的样例,用于编译多文件夹,多文件的编译&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;#编译工具链&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;CC&#x9;= gcc&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;CXX&#x9;= g++&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;LD&#x9;= $(CC)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;AS&#x9;= nasm&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;#编译选项&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;ASFLAGS  = -m32&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;CFLAGS   = -m32 -Wall $(incdir)&#x9; &#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;CXXFLAGS = -m32 -Wall $(incdir)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;LDFLAGS&#x9; = -m32 -static&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;#定义输出文件名&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;target = main.exe&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;#定义源码目录&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;srcdir = src \&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;         src/dir1 \&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;         src/dir2 \&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;         src/dir2/sub1 \&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;         src/dir2/sub2&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;#定义包含目录&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;incdir = $(foreach dir,$(srcdir),-I$(dir))&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;#定义附加依赖库&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;inclib = -lpthread&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;#遍历所有dir,并搜索该dir下面的所有.c文件&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;allsrc = $(foreach dir,$(srcdir),$(wildcard $(dir)/*.c))&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;#把所有的.c替换为.o&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;allobj = $(allsrc:%.c=%.o)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;#把所有的.c替换为.d&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;alldep = $(allsrc:%.c=%.d)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;#生成.d的规则&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;%.d: %.c&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;@echo Generating $@...&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;@$(CC) -MM -MT &amp;#34;$(&amp;lt;D)/$(*F).o $@&amp;#34; $(CFLAGS) $&amp;lt; &amp;gt;$@&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;#生成.o的规则&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;%.o: %.c&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;@echo Compiling $&amp;lt;...&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;@$(CC) $(CFLAGS) -c $&amp;lt; -o $@&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;#如果不是第1次调用make,则包含所有.d文件&#x9;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;ifneq ($(MAKELEVEL), 0)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;include $(alldep)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;endif&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;#声明虚拟目标&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;.PHONY:&#x9;init clean&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;init: $(alldep)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;@$(MAKE) -s $(target)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;ifneq ($(MAKELEVEL), 0)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;$(target): $(alldep) $(allobj)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;@echo Linking target...&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;@$(LD) $(LDFLAGS) -o $@ $(allobj) $(inclib)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;@echo Link done!&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;endif&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;clean:&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;@rm -rf $(alldep) $(allobj) $(target)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;@echo clean done.&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description>
    </item>
    <item>
      <title>Makefile参考样例2:多个文件夹.c的编译</title>
      <link>https://xcdd.pages.dev/blog/2017/2017-03-23/</link>
      <pubDate>Thu, 23 Mar 2017 17:08:29 +0000</pubDate>
      <guid>https://xcdd.pages.dev/blog/2017/2017-03-23/</guid>
      <description>&lt;p&gt;优点：可以很好地解决.h头文件依赖问题，修改任意头文件，会自动重新编译对应的c文件；&lt;/p&gt;&#xA;&lt;p&gt;缺点：在不同的文件夹下面不能有同名的c文件!&lt;/p&gt;&#xA;&lt;p&gt;源码目录结构如下：&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-plain&#34; data-lang=&#34;plain&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;src&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;├─main.c&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;├─dir1&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;│　├─file11.c&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;│　├─file11.h&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;│　├─file12.c&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;│　└─file12.h&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;└─dir2&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    ├─sub1&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    │  ├─file211.c&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    │  ├─file211.h&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    │  ├─file212.c&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    │  └─file212.h&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    └─sub2&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        ├─file221.c&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        ├─file221.h&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        ├─file222.c&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        └─file222.h&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;这个Makefile理解起来有点麻烦，Make进行了递归调用,第1次生成depend文件，第2次进行编译和链接.代码如下：&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-plain&#34; data-lang=&#34;plain&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;#|这是一个makefile的范例,用于编译多文件夹,多文件的编译&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;#定义编译工具链&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;CC&#x9;= gcc&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;CXX&#x9;= g++&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;LD&#x9;= $(CC)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;AS&#x9;= nasm&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;#编译选项&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;ASFLAGS  = -m32&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;CFLAGS   = -m32 -Wall $(incdir)&#x9; &#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;CXXFLAGS = -m32 -Wall $(incdir)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;LDFLAGS&#x9; = -m32 -static&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;#定义输出文件名&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;target = main.exe&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;#定义输出根目录&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;objdir = obj/&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;#定义源码根目录&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;srcdir = src/&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;#定义所有的文件夹和需要编译的目标文件&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;alldir = . dir1 dir2 \&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;     dir2/sub1 dir2/sub2&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;#定义所有文件&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;allsrc = main.c\&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;         file11.c file12.c\&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;         file211.c file212.c\&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&#x9; file221.c file222.c&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;#定义头文件包含目录&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;incdir = $(foreach dir,$(alldir),-I$(srcdir)$(dir))&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;#定义连接依赖库&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;inclib = -lpthread&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;#配置搜索路径&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;vpath %.c&#x9;$(foreach dir,$(alldir),$(srcdir)$(dir)/ )&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;vpath %.h&#x9;$(foreach dir,$(alldir),$(srcdir)$(dir)/ )&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;vpath %.o &#x9;$(foreach dir,$(alldir),$(objdir)$(dir)/ )&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;vpath %.d &#x9;$(foreach dir,$(alldir),$(objdir)$(dir)/ )&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;#所有依赖关系&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;autdep = $(allsrc:.c=.d)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;autobj = $(allsrc:.c=.o)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;#所有目标&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;allobj = $(foreach file,$(allsrc), \&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&#x9; $(foreach dir,$(alldir),$(subst $(srcdir),$(objdir), \&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&#x9; $(firstword $(subst .c,.o,$(wildcard $(srcdir)$(dir)/$(file)))))))&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;alldep = $(foreach file,$(allsrc), \&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&#x9; $(foreach dir,$(alldir),$(subst $(srcdir),$(objdir), \&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&#x9; $(firstword $(subst .c,.d,$(wildcard $(srcdir)$(dir)/$(file)))))))&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;#声明虚拟目标&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;.PHONY:&#x9;all init clean&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;#定义虚拟目标&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;ifeq ($(MAKELEVEL), 0)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;all: init $(autdep)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;@echo $(MAKELEVEL) make done.&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;@$(MAKE) all&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;else&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;all: $(autobj) $(target)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;@echo $(MAKELEVEL) make done.&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;endif&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;init:&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;@mkdir -p $(foreach dir, $(alldir),$(objdir)$(dir))&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;clean:&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;@rm -rf $(objdir) $(target)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;@echo clean done.&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;#生成d文件&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;%.d: %.c&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;@echo $(MAKELEVEL) Generating depend file for $&amp;lt;...&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;@$(CC) -MM -MT &amp;#34;$(subst $(srcdir),$(objdir),$(&amp;lt;D))/$(*F).o $(subst $(srcdir),$(objdir),$(&amp;lt;D))/$(@F)&amp;#34; -x c++ $(CXXFLAGS) $&amp;lt; &amp;gt;$(subst $(srcdir),$(objdir),$(&amp;lt;D))/$(@F)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;ifeq ($(MAKELEVEL), 1)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;%.o:&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;@echo $(MAKELEVEL) Compiling $&amp;lt;...&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;@$(CC) $(CFLAGS) -c $&amp;lt; -o $(subst $(srcdir),$(objdir),$(&amp;lt;D))/$(@F)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;else&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;%.o: %.c&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;@echo $(MAKELEVEL) Compiling $&amp;lt;...&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;@$(CC) $(CXXFLAGS) -c $&amp;lt; -o $@&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;endif&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;ifeq ($(MAKELEVEL), 1)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;include&#x9;$(alldep)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;$(target): $(allobj)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;@echo Linking executable... $(target)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;@$(LD) $(LDFLAGS) -o $@ $^ $(inclib)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;endif&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description>
    </item>
    <item>
      <title>Altium Designer精简版</title>
      <link>https://xcdd.pages.dev/blog/2017/2017-02-16/</link>
      <pubDate>Thu, 16 Feb 2017 11:55:49 +0000</pubDate>
      <guid>https://xcdd.pages.dev/blog/2017/2017-02-16/</guid>
      <description>&lt;p&gt;AltiumDesigner是使用非常广泛的原理图/PCB设计工具，它还支持VHDL等其它EDA设计功能。&lt;/p&gt;&#xA;&lt;p&gt;虽然现在的工作不是画PCB，但偶尔也会DIY一下，自娱自乐。主要工具就是AD系列的多个版本。&lt;/p&gt;&#xA;&lt;p&gt;对于我而言，我只使用原理图和PCB设计，其它功能都用不上，而它的安装后体积竟然有3GB以上了，实在是太臃肿了！&lt;/p&gt;&#xA;&lt;p&gt;这个软件的功能大多数是以组件的形式放在system目录下，因此可以进行适当的精简，减少软件的体积。&lt;/p&gt;&#xA;&lt;p&gt;先放上我的精减版成品：&lt;/p&gt;&#xA;&lt;p&gt;1. Altium Designer 6.9(build 6.9.0.12759)&lt;/p&gt;&#xA;&lt;p&gt;压缩包25MB，解压后110MB，极度精简，只保留最基本的原理图和PCB设计，不含元件库，适合像我这样只做一些简单PCB的用户使用。&lt;/p&gt;&#xA;&lt;p&gt;百度网盘：http://pan.baidu.com/s/1hsFnGIo&lt;/p&gt;&#xA;&lt;p&gt;2.Altium Designer Summer 09(build9.3.1.19182)&lt;/p&gt;&#xA;&lt;p&gt;压缩包120MB左右，解压后390MB左右，保留比较完善的原理图和PCB设计功能，支持DWG的导入和导出，但不含任何元件库。&lt;/p&gt;&#xA;&lt;p&gt;百度网盘：http://pan.baidu.com/s/1skYXS1v&lt;/p&gt;&#xA;&lt;p&gt;3.Altium Designer Summer 09(build9.4.0.20159)（ &lt;strong&gt;推荐&lt;/strong&gt; ）&lt;/p&gt;&#xA;&lt;p&gt;压缩包67MB，解压后400MB，去除了仿真，VHDL，软件编程等功能，保留比较完善的原理图和PCB设计功能；&lt;/p&gt;&#xA;&lt;p&gt;支持导入其它文件格式和导出功能，不含元件库；&lt;/p&gt;&#xA;&lt;p&gt;精简了菜单，修改了几条显示不准确的中文菜单。&lt;/p&gt;&#xA;&lt;p&gt;百度网盘：http://pan.baidu.com/s/1kVNpker&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;版本说明&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;1. Protel 99SE&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;非常古老而经典的版本，在大学时期入门所使用的版本，运行非常流畅，基本功能都有，但总是经常崩溃，对中文支持非常不好。&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;2. DXP2004&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;后来发现了这个新版本，在XP系统下运行非常流畅，稳定，对中文支持也非常好，自带中文菜单。&lt;/p&gt;&#xA;&lt;p&gt;当时非常喜欢这个版本，使用了很长时间，后来装上win7之后就GG了；&lt;/p&gt;&#xA;&lt;p&gt;这个版本在win7以上系统问题很多，比如不能使用打印功能，必定崩溃&amp;hellip;&amp;hellip;&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;3. AltiumDesigner6&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;为了在win7上画PCB，又找到了升级版本，简称AD6，最新版本号是AD6.9，界面与DXP2004类似。&lt;/p&gt;&#xA;&lt;p&gt;在win7上运行，也很稳定，流畅。也是一个非常好用的经典版本！&lt;/p&gt;&#xA;&lt;ol start=&#34;4&#34;&gt;&#xA;&lt;li&gt;&lt;strong&gt;AltiumDesigner Summer 08（内部版本号是7.0&lt;/strong&gt; ）&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;p&gt;&lt;strong&gt;只&lt;/strong&gt; 试用了一天时间，功能上也没有什么明显感觉， &lt;strong&gt;据说&lt;/strong&gt; BUG很多，后来就没有研究了。&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;5.AltiumDesigner Winter 09（内部版本号是8.0）&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;这个版本，感觉比起AD6.9，明显卡顿了，启动也变慢了，用了一段时间后，感觉不够流畅，&lt;/p&gt;&#xA;&lt;p&gt;功能上好像没有太明显的差异，还是继续使用AD6.9吧.&lt;/p&gt;&#xA;&lt;p&gt;6.AltiumDesigner Summer 09 &lt;strong&gt;（内部版本号是9.0&lt;/strong&gt; ）&lt;/p&gt;&#xA;&lt;p&gt;身边的朋友，大多数都在用这个版本，所以我也仔细地与AD6做了下对比。&lt;/p&gt;&#xA;&lt;p&gt;和上一版本一样，卡顿，在低配机器上始终不如AD6流畅；&lt;/p&gt;&#xA;&lt;p&gt;在原理图界面，双击一个元件，弹出属性菜单，明显有延迟，而AD6则快速很多，安装的元件库比较多时，卡顿更明显；&lt;/p&gt;&#xA;&lt;p&gt;在库里面查找封装的时候，点击“Find”按钮，要卡很久很久才能弹出搜索窗口，但是搜索的速度比AD6要快不少，&lt;/p&gt;&#xA;&lt;p&gt;我认为是在搜索的时候，软件会读取所有的库文件，建立一些索引，用来加快搜索速度，但第1次打开搜索对话框的时候就要卡死很长时间；&lt;/p&gt;&#xA;&lt;p&gt;AD6在搜索的时候，没有索引，搜索速度要慢不少。&lt;/p&gt;&#xA;&lt;p&gt;优点：这个新版本的PCB布线更加智能了，自动布线速度更快了，多线走也可以自动识别终点，布线的推挤功能感觉很好用！&lt;/p&gt;&#xA;&lt;p&gt;7.AltiumDesigner 10&lt;/p&gt;&#xA;&lt;p&gt;这个版本对界面做了调整，好多对话框在我的1366*768的分辨率下，根本显示不全，因为对话框上面增加了一个cloud的云选项。。。&lt;/p&gt;&#xA;&lt;p&gt;DXP主菜单像Windows的开始菜单一样了，本人不太喜欢这种风格，界面越华丽，越占用资源，电脑越卡顿.&lt;/p&gt;&#xA;&lt;p&gt;8.最近几年AD的更新速度非常快，10以后的版本开始向.NET平台转移了，安装包越来越庞大，越来越不喜欢它了！目前保留AD6.9和AD9.4两个版本就够用了。&lt;/p&gt;</description>
    </item>
    <item>
      <title>STM32F429的LTDC和DMA2D</title>
      <link>https://xcdd.pages.dev/blog/2016/2016-12-29/</link>
      <pubDate>Thu, 29 Dec 2016 10:53:43 +0000</pubDate>
      <guid>https://xcdd.pages.dev/blog/2016/2016-12-29/</guid>
      <description>&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-cpp&#34; data-lang=&#34;cpp&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;在阅读了&lt;/span&gt;STM32F429的手册之后&lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;，对&lt;/span&gt;LTDC与DMA2D有了一点认识&lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;，赶紧写下来做为笔记保存下来。&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;STM32F429与之前的系列强大之处就在于增加了LTDC个功能，从手册上看STM32F429的LTDC可以用于驱动1024x768分辨率的LCD屏幕。&lt;/p&gt;&#xA;&lt;p&gt;LTDC其实就是TFT LCD控制器的意思，在arm9/arm11/cortex-A系列CPU当中，这个是必须有的外设，在小型单片机中，有这个功能的不多。&lt;/p&gt;&#xA;&lt;p&gt;LCD控制器的功能就是生成LCD像素时钟，将GRAM中的数据搬运到LCD屏幕上去显示。&lt;/p&gt;&#xA;&lt;p&gt;在一般的小型LCD模块一般都集成了一个LCD控制器，如常用的ili9320/ili9325等型号，这些LCD模块同时还集成了几百KB大小的RAM，用于显示；&lt;/p&gt;&#xA;&lt;p&gt;这种方案，不需要占用单片机的RAM就可以稳定地驱动LCD显示图像，一般地MCU先通过8080接口或SPI向控制器发送命令，配置LCD参数，&lt;/p&gt;&#xA;&lt;p&gt;然后向集成的RAM中写入数据就可以显示，是低成本项目的首选方案。&lt;/p&gt;&#xA;&lt;p&gt;而STM32F429自带的LTDC也是LCD控制器，与ili9320相比，支持的分辨率更高，功能更多，但是LTDC只负责产生LCD需要的时序，并没有集成RAM，&lt;/p&gt;&#xA;&lt;p&gt;如640x480x16bpp的屏幕，需要600KB的RAM，在单片机中600KB的内存，已经是天文数字了，所以需要外扩一片SDRAM来充当GRAM。&lt;/p&gt;&#xA;&lt;p&gt;那么在使用LTDC的时候，首先要配置LCD的时序，然后要设置GRAM的地址（这里GRAM的地址就是外扩的SDRAM的地址），最后开启LTDC，可以在LCD_CLK引脚测量到有稳定的频率输出，应该就差不多了；配置好LTDC之后，硬件会自动将GRAM中的内容搬运到LCD屏幕上，只要改变GRAM中的数据就可以改变显示内容。&lt;/p&gt;&#xA;&lt;p&gt;另外要说的是这个LTDC支持2个图层和1个背景图层，一般情况下用一个图层显示就可以了；这2个图层可以单独设置显示区域和GRAM地址，并且同时开启时，硬件自动将2个图层的显示内容进行混合，混合顺序是：图层2 -&amp;gt; 图层1 -&amp;gt; 背景色，图层2位于最顶层，至于怎么利用这两个图层实现特殊的功能，就仁者见仁，智者见智了。&lt;/p&gt;&#xA;&lt;p&gt;DMA2D则是一个生活在GRAM世界中的一个搬运工，往你指定的内存地址中制造一个矩形，或者把一个矩形数据从源RAM复制到目的RAM，并且完全由硬件实现。&lt;/p&gt;&#xA;&lt;p&gt;贴一个LTDC的初始化参考例程：&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-cpp&#34; data-lang=&#34;cpp&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;#include&lt;/span&gt; &lt;span style=&#34;color:#75715e&#34;&gt;&amp;#34;stm32f4xx.h&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;#include&lt;/span&gt; &lt;span style=&#34;color:#75715e&#34;&gt;&amp;#34;gpio.h&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;#include&lt;/span&gt; &lt;span style=&#34;color:#75715e&#34;&gt;&amp;#34;ltdc.h&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;#define HBP&#x9;&#x9;8&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;#define VBP&#x9;&#x9;4&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;#define HSW&#x9;&#x9;1&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;#define VSW&#x9;&#x9;1&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;#define HFP&#x9;&#x9;30&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;#define VFP&#x9;&#x9;1&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;#define WIDTH &#x9;240&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;#define HEIGHT&#x9;320&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;#define FRAMEBUFFER&#x9;0xD0000000&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;static&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;void&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;ltdc_gpio_init&lt;/span&gt;(&lt;span style=&#34;color:#66d9ef&#34;&gt;void&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;{&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;gpio_open(PA, &lt;span style=&#34;color:#ae81ff&#34;&gt;3&lt;/span&gt;, GPIO_MODE_AF, GPIO_AF_LTDC);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;gpio_open(PA, &lt;span style=&#34;color:#ae81ff&#34;&gt;4&lt;/span&gt;, GPIO_MODE_AF, GPIO_AF_LTDC);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;gpio_open(PA, &lt;span style=&#34;color:#ae81ff&#34;&gt;6&lt;/span&gt;, GPIO_MODE_AF, GPIO_AF_LTDC);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;gpio_open(PA,&lt;span style=&#34;color:#ae81ff&#34;&gt;11&lt;/span&gt;, GPIO_MODE_AF, GPIO_AF_LTDC);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;gpio_open(PA,&lt;span style=&#34;color:#ae81ff&#34;&gt;12&lt;/span&gt;, GPIO_MODE_AF, GPIO_AF_LTDC);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;gpio_open(PB, &lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;, GPIO_MODE_AF, GPIO_AF_LTDC);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;gpio_open(PB, &lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;, GPIO_MODE_AF, GPIO_AF_LTDC);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;gpio_open(PB, &lt;span style=&#34;color:#ae81ff&#34;&gt;8&lt;/span&gt;, GPIO_MODE_AF, GPIO_AF_LTDC);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;gpio_open(PB, &lt;span style=&#34;color:#ae81ff&#34;&gt;9&lt;/span&gt;, GPIO_MODE_AF, GPIO_AF_LTDC);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;gpio_open(PB,&lt;span style=&#34;color:#ae81ff&#34;&gt;10&lt;/span&gt;, GPIO_MODE_AF, GPIO_AF_LTDC);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;gpio_open(PB,&lt;span style=&#34;color:#ae81ff&#34;&gt;11&lt;/span&gt;, GPIO_MODE_AF, GPIO_AF_LTDC);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;gpio_open(PC, &lt;span style=&#34;color:#ae81ff&#34;&gt;6&lt;/span&gt;, GPIO_MODE_AF, GPIO_AF_LTDC);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;gpio_open(PC, &lt;span style=&#34;color:#ae81ff&#34;&gt;7&lt;/span&gt;, GPIO_MODE_AF, GPIO_AF_LTDC);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;gpio_open(PD, &lt;span style=&#34;color:#ae81ff&#34;&gt;3&lt;/span&gt;, GPIO_MODE_AF, GPIO_AF_LTDC);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;gpio_open(PD, &lt;span style=&#34;color:#ae81ff&#34;&gt;6&lt;/span&gt;, GPIO_MODE_AF, GPIO_AF_LTDC);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;gpio_open(PF,&lt;span style=&#34;color:#ae81ff&#34;&gt;10&lt;/span&gt;, GPIO_MODE_AF, GPIO_AF_LTDC);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;gpio_open(PG, &lt;span style=&#34;color:#ae81ff&#34;&gt;6&lt;/span&gt;, GPIO_MODE_AF, GPIO_AF_LTDC);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;gpio_open(PG, &lt;span style=&#34;color:#ae81ff&#34;&gt;7&lt;/span&gt;, GPIO_MODE_AF, GPIO_AF_LTDC);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;gpio_open(PG,&lt;span style=&#34;color:#ae81ff&#34;&gt;10&lt;/span&gt;, GPIO_MODE_AF, GPIO_AF_LTDC);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;gpio_open(PG,&lt;span style=&#34;color:#ae81ff&#34;&gt;11&lt;/span&gt;, GPIO_MODE_AF, GPIO_AF_LTDC);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;gpio_open(PG,&lt;span style=&#34;color:#ae81ff&#34;&gt;12&lt;/span&gt;, GPIO_MODE_AF, GPIO_AF_LTDC);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;static&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;void&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;ltdc_clock_init&lt;/span&gt;(&lt;span style=&#34;color:#66d9ef&#34;&gt;void&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;{&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    LTDC_InitTypeDef ltdc;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    ltdc.LTDC_HSPolarity &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; LTDC_HSPolarity_AL;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    ltdc.LTDC_VSPolarity &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; LTDC_VSPolarity_AL;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    ltdc.LTDC_DEPolarity &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; LTDC_DEPolarity_AL;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    ltdc.LTDC_PCPolarity &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; LTDC_PCPolarity_IPC;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    ltdc.LTDC_HorizontalSync       &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; HSW&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    ltdc.LTDC_VerticalSync         &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; VSW&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;;                &lt;span style=&#34;color:#75715e&#34;&gt;//垂直同步宽度&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;    ltdc.LTDC_AccumulatedHBP       &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; HSW&lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt;HBP&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;;            &lt;span style=&#34;color:#75715e&#34;&gt;//水平同步后沿宽度&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;    ltdc.LTDC_AccumulatedVBP       &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; VSW&lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt;VBP&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;;            &lt;span style=&#34;color:#75715e&#34;&gt;//垂直同步后沿高度&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;    ltdc.LTDC_AccumulatedActiveW   &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; HSW&lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt;HBP&lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt;WIDTH&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;;      &lt;span style=&#34;color:#75715e&#34;&gt;//有效宽度&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;    ltdc.LTDC_AccumulatedActiveH   &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; VSW&lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt;VBP&lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt;HEIGHT&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;;     &lt;span style=&#34;color:#75715e&#34;&gt;//有效高度&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;    ltdc.LTDC_TotalWidth           &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; HSW&lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt;HBP&lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt;WIDTH&lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt;HFP&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;;  &lt;span style=&#34;color:#75715e&#34;&gt;//总宽度&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;    ltdc.LTDC_TotalHeigh           &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; VSW&lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt;VBP&lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt;HEIGHT&lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt;VFP&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;; &lt;span style=&#34;color:#75715e&#34;&gt;//总高度&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;    ltdc.LTDC_BackgroundRedValue   &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    ltdc.LTDC_BackgroundGreenValue &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    ltdc.LTDC_BackgroundBlueValue  &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    RCC_APB2PeriphClockCmd(RCC_APB2Periph_LTDC,ENABLE);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    RCC_PLLSAIConfig(&lt;span style=&#34;color:#ae81ff&#34;&gt;256&lt;/span&gt;, &lt;span style=&#34;color:#ae81ff&#34;&gt;2&lt;/span&gt;, &lt;span style=&#34;color:#ae81ff&#34;&gt;4&lt;/span&gt;);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    RCC_PLLSAICmd(ENABLE);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;while&lt;/span&gt;(RCC_GetFlagStatus(RCC_FLAG_PLLSAIRDY)&lt;span style=&#34;color:#f92672&#34;&gt;==&lt;/span&gt;RESET);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    RCC_LTDCCLKDivConfig(RCC_PLLSAIDivR_Div8);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    LTDC_Init(&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;&lt;/span&gt;dc);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    LTDC_Cmd(ENABLE);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;static&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;void&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;ltdc_layer_init&lt;/span&gt;(&lt;span style=&#34;color:#66d9ef&#34;&gt;void&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;{&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;LTDC_Layer_InitTypeDef layer;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;layer.LTDC_HorizontalStart  &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; HBP&lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;layer.LTDC_HorizontalStop   &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; WIDTH&lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt;HBP;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;layer.LTDC_VerticalStart    &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; VBP&lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;layer.LTDC_VerticalStop     &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; HEIGHT&lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt;VBP;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;layer.LTDC_PixelFormat      &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; LTDC_Pixelformat_RGB565;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;layer.LTDC_ConstantAlpha    &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;255&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;layer.LTDC_BlendingFactor_1 &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; LTDC_BlendingFactor1_PAxCA;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;layer.LTDC_BlendingFactor_2 &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; LTDC_BlendingFactor2_PAxCA;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;layer.LTDC_CFBStartAdress   &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; FRAMEBUFFER;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;layer.LTDC_CFBLineLength    &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; (WIDTH &lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;2&lt;/span&gt;)&lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;3&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;layer.LTDC_CFBLineNumber    &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; HEIGHT;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;layer.LTDC_CFBPitch         &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; WIDTH &lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;2&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;layer.LTDC_DefaultColorRed  &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;layer.LTDC_DefaultColorGreen&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;layer.LTDC_DefaultColorBlue &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;layer.LTDC_DefaultColorAlpha&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;LTDC_LayerInit(LTDC_Layer1, &lt;span style=&#34;color:#f92672&#34;&gt;&amp;amp;&lt;/span&gt;layer);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;LTDC_ReloadConfig(LTDC_IMReload);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;LTDC_LayerCmd(LTDC_Layer1, ENABLE);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;LTDC_ReloadConfig(LTDC_IMReload);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;void&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;ltdc_init&lt;/span&gt;(&lt;span style=&#34;color:#66d9ef&#34;&gt;void&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;{&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;ltdc_gpio_init();&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;ltdc_clock_init();&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;ltdc_layer_init();&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description>
    </item>
    <item>
      <title>微软符号服务器使用方法</title>
      <link>https://xcdd.pages.dev/blog/2016/2016-11-18/</link>
      <pubDate>Fri, 18 Nov 2016 11:39:04 +0000</pubDate>
      <guid>https://xcdd.pages.dev/blog/2016/2016-11-18/</guid>
      <description>&lt;p&gt;微软提供系统文件的调试符号文件，需要另行下载。&lt;/p&gt;&#xA;&lt;p&gt;有了这些符号文件，在调试程序的时候，就能看到user32.dll,gdi32.dll等一系列文件的函数名称，&lt;/p&gt;&#xA;&lt;p&gt;否则就显示user32.dll.0x67003246这样的地址，&lt;/p&gt;&#xA;&lt;p&gt;以前的服务器地址：h &lt;a href=&#34;http://msdl.microsoft.com/download/symbols&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;ttp://msdl.microsoft.com/download/symbols&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;使用起来太慢了，Windows7以后的系统，提供全部符号文件打包下载：&lt;/p&gt;&#xA;&lt;p&gt;下载地址在这里： &lt;a href=&#34;https://developer.microsoft.com/zh-cn/windows/hardware/download-symbols&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;https://developer.microsoft.com/zh-cn/windows/hardware/download-symbols&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;安装包300MB左右，安装后1GB以上，包括非常多的pdb文件！慢慢用吧！&lt;/p&gt;&#xA;&lt;p&gt;等等。。。&lt;/p&gt;&#xA;&lt;p&gt;使用方法：&lt;/p&gt;&#xA;&lt;p&gt;打开VS2003以上的版本，在调试程序的时候，点击“模块”窗口，可以依次点击模块，右键，加载符号.&lt;/p&gt;&#xA;&lt;p&gt;还可以直接把同名的pdb文件，放到dll相同的目录，Visual Studio就会自动加载.&lt;/p&gt;</description>
    </item>
    <item>
      <title>通用点阵字库生成工具</title>
      <link>https://xcdd.pages.dev/blog/2016/2016-11-16/</link>
      <pubDate>Wed, 16 Nov 2016 16:55:45 +0000</pubDate>
      <guid>https://xcdd.pages.dev/blog/2016/2016-11-16/</guid>
      <description>&lt;p&gt;虽然点阵提取工具，网上有很多了，但是找来找去，没找到我满意的工具，于是自己写了一个小工具。&lt;/p&gt;&#xA;&lt;p&gt;点阵字体，在嵌入式GUI开发中，用得也是非常频繁的。&lt;/p&gt;&#xA;&lt;p&gt;主要有两种使用场景：&lt;/p&gt;&#xA;&lt;p&gt;1.生成某种编码的全部点阵，以BIN的形式放在FLASH中加载。&lt;/p&gt;&#xA;&lt;p&gt;2.生成部份文字的点阵，以C文件的方式，写在代码里。&lt;/p&gt;&#xA;&lt;p&gt;本工具的特点：&lt;/p&gt;&#xA;&lt;p&gt;1.完全免费，不用到处找破解工具;&lt;/p&gt;&#xA;&lt;p&gt;2.通用性好，支持任意编码，任意语言，可以自定义编码;&lt;/p&gt;&#xA;&lt;p&gt;3.可以生成BIN和C文件;&lt;/p&gt;&#xA;&lt;p&gt;4.可以使用WINDOWS全部字体;&lt;/p&gt;&#xA;&lt;p&gt;5.使用方便，界面整洁;&lt;/p&gt;&#xA;&lt;p&gt;界面效果图：&lt;/p&gt;&#xA;&lt;p&gt;&lt;img src=&#34;./044_1.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;作者：星沉地动&lt;/p&gt;&#xA;&lt;p&gt;//&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;-&lt;/p&gt;&#xA;&lt;p&gt;2017.09.02 (V1.1)&lt;/p&gt;&#xA;&lt;p&gt;添加高位在前和低位在前的选项;&lt;/p&gt;&#xA;&lt;p&gt;调整预览界面;&lt;/p&gt;&#xA;&lt;p&gt;下载地址1：http://446252221.ys168.com/  (我的工具/通用点阵提取工具V1.1.zip 247KB)&lt;/p&gt;&#xA;&lt;p&gt;下载地址2：https://pan.baidu.com/s/1kVBUGbt&lt;/p&gt;&#xA;&lt;p&gt;//&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;-&lt;/p&gt;&#xA;&lt;p&gt;2017.09.15&lt;/p&gt;&#xA;&lt;p&gt;公开此工具源代码。&lt;/p&gt;&#xA;&lt;p&gt;源码地址： &lt;a href=&#34;https://gitee.com/kerndev/FontMaker&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;https://gitee.com/kerndev/FontMaker&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;//&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&lt;/p&gt;&#xA;&lt;p&gt;2017.10.12(V1.1.2)&lt;/p&gt;&#xA;&lt;p&gt;优化输出C文件数据格式;&lt;/p&gt;&#xA;&lt;p&gt;下载地址1：http://446252221.ys168.com/  (我的工具/通用点阵提取工具-V1.1.2.zip 247KB)&lt;/p&gt;&#xA;&lt;p&gt;下载地址2： &lt;a href=&#34;https://pan.baidu.com/s/1geZ51rt&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;https://pan.baidu.com/s/1geZ51rt&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;//&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&lt;/p&gt;&#xA;&lt;p&gt;2018.07.31(V1.2.0)&lt;/p&gt;&#xA;&lt;p&gt;支持生成非等宽字库。&lt;/p&gt;&#xA;&lt;p&gt;下载地址： &lt;a href=&#34;https://gitee.com/kerndev/FontMaker&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;https://gitee.com/kerndev/FontMaker&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;//&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&lt;/p&gt;&#xA;&lt;p&gt;2020.10.11(V1.3.0)&lt;/p&gt;&#xA;&lt;p&gt;1.自定义码表添加去重功能;&#xA;2.输出CPP文件添加码表和字符计数;&#xA;3.更新GBK码表文件;&lt;/p&gt;&#xA;&lt;p&gt;下载地址： &lt;a href=&#34;https://gitee.com/kerndev/FontMaker&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;https://gitee.com/kerndev/FontMaker&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;常见问题：&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;1.如何使用其它标准字符集？&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;在软件目录下有一个&amp;quot;charset&amp;quot;文件夹，程序启动的时候会扫描该文件夹下面的*.cst文件，并加入标准字库列表中；&lt;/p&gt;&#xA;&lt;p&gt;cst文件就是码表文件，每个CST文件代表一种字符编码表，CST文件的数据格式为字符集中所有字符的UNICODE编码，2字节为一个单位，低字节在前。&lt;/p&gt;&#xA;&lt;p&gt;该文件夹下面有一个“charset.exe”的程序，可以方便地生成大多数标准码表.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;2.字符集中的“用户定义”是什么意思？&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;使用非标准字符集的使用可以使用自定义码表，比如简体中文的编码是GB2312，有6000多文字，但如果实际项目中你只想要“中华人民共和国”这7个汉字，&lt;/p&gt;&#xA;&lt;p&gt;就可以在输入框中输入你需要的文字，生成一个特殊应用的字库，当然这个字库中的文字的排列顺序与你输入的顺序保持一致。&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;3.如何使用生成的BIN文件？&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;本工具生成的BIN数据格式为最常用的数据格式，一般情况下兼容其它字库文件；&lt;/p&gt;&#xA;&lt;p&gt;对于水平扫描方式，8bit对齐格式，比如12x12像素的字库，每一行有12个点，但是会占用16bit即2个字节来表示；&lt;/p&gt;&#xA;&lt;p&gt;那么一个文字占用2x12=24字节，读取BIN的时候以24字节为单位读取即可；&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;4.生成BIN文件与生成C文件有什么区别？&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;BIN文件一般用在通过文件读取字库，C文件是嵌入到代码里的数据。&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;5.为什么有很多字体的中文文字看上去是一样的？&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;这是因为Windows自带的字体，大多数都不是中文字体，&lt;/p&gt;&#xA;&lt;p&gt;当显示中文的时候，系统会自动映射到默认的中文字体来显示，比如“宋体”，&lt;/p&gt;&#xA;&lt;p&gt;宋体是使用点阵最清晰，最常规的字体，推荐使用宋体来做中文字库。&lt;/p&gt;</description>
    </item>
    <item>
      <title>[代码片段]提升Win32进程权限</title>
      <link>https://xcdd.pages.dev/blog/2016/2016-10-31/</link>
      <pubDate>Mon, 31 Oct 2016 13:48:30 +0000</pubDate>
      <guid>https://xcdd.pages.dev/blog/2016/2016-10-31/</guid>
      <description>&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-cpp&#34; data-lang=&#34;cpp&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;//提高进程权限&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;BOOL &lt;span style=&#34;color:#a6e22e&#34;&gt;SelfPrivilegeUp&lt;/span&gt;(&lt;span style=&#34;color:#66d9ef&#34;&gt;void&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;{&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;BOOL   ret;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;HANDLE hToken;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;LUID luid;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;TOKEN_PRIVILEGES tp;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;ret &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES, &lt;span style=&#34;color:#f92672&#34;&gt;&amp;amp;&lt;/span&gt;hToken);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt;(&lt;span style=&#34;color:#f92672&#34;&gt;!&lt;/span&gt;ret)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;{&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&#x9;&lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt; FALSE;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;ret &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; LookupPrivilegeValue(NULL, SE_DEBUG_NAME, &lt;span style=&#34;color:#f92672&#34;&gt;&amp;amp;&lt;/span&gt;luid);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt;(&lt;span style=&#34;color:#f92672&#34;&gt;!&lt;/span&gt;ret)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;{&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&#x9;CloseHandle(hToken);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&#x9;&lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt; FALSE;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;tp.PrivilegeCount &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;tp.Privileges[&lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;].Luid &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; luid;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;tp.Privileges[&lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;].Attributes &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; SE_PRIVILEGE_ENABLED;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;ret &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; AdjustTokenPrivileges(hToken, FALSE, &lt;span style=&#34;color:#f92672&#34;&gt;&amp;amp;&lt;/span&gt;tp, &lt;span style=&#34;color:#66d9ef&#34;&gt;sizeof&lt;/span&gt;(TOKEN_PRIVILEGES), NULL, NULL);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt;(&lt;span style=&#34;color:#f92672&#34;&gt;!&lt;/span&gt;ret)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;{&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&#x9;CloseHandle(hToken);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&#x9;&lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt; FALSE;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;CloseHandle(hToken);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt; TRUE;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;提权之后，可以读写其它进程。&lt;/p&gt;</description>
    </item>
    <item>
      <title>某流氓安装程序的数据包(.data后缀)解压工具</title>
      <link>https://xcdd.pages.dev/blog/2016/2016-10-28-1144/</link>
      <pubDate>Fri, 28 Oct 2016 11:44:54 +0000</pubDate>
      <guid>https://xcdd.pages.dev/blog/2016/2016-10-28-1144/</guid>
      <description>&lt;p&gt;在网上下载了一个NES小游戏的合集，本来应该是一个压缩包，里面包含N个.nes文件就OK了，但是解压发现竟然还要安装！&lt;/p&gt;&#xA;&lt;p&gt;安装你大爷啊，这种文件还要安装？&lt;/p&gt;&#xA;&lt;p&gt;一看这个安装程序的图标就不是什么好东西，不用想也知道安装后，肯定会自带一堆乱七八糟的软件。&lt;/p&gt;&#xA;&lt;p&gt;目录下有一个20多MB的*.data文件，那所谓的安装程序，也就是把这个文件解压吧。&lt;/p&gt;&#xA;&lt;p&gt;用WinHEX看了一下文件内容，不是什么常规的zip,rar,7z等文件格式，是一种自定义的文件结构。&lt;/p&gt;&#xA;&lt;p&gt;作为一名程序猿！能被这种安装程序坑吗？&lt;/p&gt;&#xA;&lt;p&gt;果断IDA走起，分析一下解压思路。。。。。。&lt;/p&gt;&#xA;&lt;p&gt;N个小时以后，找到了关键点。&lt;/p&gt;&#xA;&lt;p&gt;嗯，是一个lzma压缩的数据文件。&lt;/p&gt;&#xA;&lt;p&gt;自己动手，写一个干净的解压程序吧！万一以后再次遇到这种文件，就有现成的工具可以用了。&lt;/p&gt;&#xA;&lt;p&gt;从这个文件里可以找到一些网址：貌似是叫快猴的网站提供的。&lt;/p&gt;&#xA;&lt;p&gt;放在这里，顺便方便网友使用。&lt;/p&gt;&#xA;&lt;p&gt;百度网盘：https://pan.baidu.com/s/1skHqZGp&lt;/p&gt;</description>
    </item>
    <item>
      <title>解决笔记本光驱位硬盘休眠卡顿问题</title>
      <link>https://xcdd.pages.dev/blog/2016/2016-10-28/</link>
      <pubDate>Fri, 28 Oct 2016 10:51:30 +0000</pubDate>
      <guid>https://xcdd.pages.dev/blog/2016/2016-10-28/</guid>
      <description>&lt;p&gt;买了固态硬盘，把机械硬盘放到了光驱位，用了一段时间发现机械硬盘总是不定时的卡顿，卡顿，卡顿&amp;hellip;&amp;hellip;&lt;/p&gt;&#xA;&lt;p&gt;查了些资料，原因是因为这个硬盘在一段时间未使用，会自动休眠，应该是为了省电吧，马达停止转动了！&lt;/p&gt;&#xA;&lt;p&gt;当要再次访问硬盘时，硬盘马达要重启启动，需要花时间，导致卡顿！&lt;/p&gt;&#xA;&lt;p&gt;这个功能叫做APM(Advanced Power Management 高级电源管理)，可以使用CrystalDiskInfo这个软件，手动关闭APM功能，达到效果。&lt;/p&gt;&#xA;&lt;p&gt;当然，这里是CSDN，如果只是告诉你怎么用这个软件，那就没意思了，现在重点开始！&lt;/p&gt;&#xA;&lt;p&gt;APM这个功能，每次开机都会重置，那么每次开机都要用CrystalDiskInfo设置一次APM，这不是很麻烦吗？&lt;/p&gt;&#xA;&lt;p&gt;作为一个程序猿，怎么能忍！必须要搞一个开机自动关闭APM的方法啊，网上找了半天，没有这样的工具，于是自己动手吧。&lt;/p&gt;&#xA;&lt;p&gt;令人兴奋的是CrystalDiskInfo 是一个开源软件，基于MIT协议开放源代码，非常感谢CrystalDiskInfo的作者！&lt;/p&gt;&#xA;&lt;p&gt;阅读了CrystalDiskInfo源码之后，终于找到了关闭APM的方法，写了一个小工具，开机运行就能关闭硬盘APM啦！&lt;/p&gt;&#xA;&lt;p&gt;目前这个小工具只考虑SATA硬盘的情况，不一定保证兼容所有硬盘，因此大家请自测。&lt;/p&gt;&#xA;&lt;p&gt;现送上这个小工具的BIN文件：http://pan.baidu.com/s/1pLFieAf&lt;/p&gt;&#xA;&lt;p&gt;开源大法好：http://download.csdn.net/detail/qq446252221/9666482&lt;/p&gt;&#xA;&lt;p&gt;2017.7.27更新：&lt;/p&gt;&#xA;&lt;p&gt;上个版本这个工具关闭窗口存在无法关闭的问题，现在已经修复了。&lt;/p&gt;&#xA;&lt;p&gt;下载地址：http://pan.baidu.com/s/1pLFieAf&lt;/p&gt;</description>
    </item>
    <item>
      <title>Keil 5使用JLink连接正在运行的CPU</title>
      <link>https://xcdd.pages.dev/blog/2016/2016-09-08/</link>
      <pubDate>Thu, 08 Sep 2016 09:46:27 +0000</pubDate>
      <guid>https://xcdd.pages.dev/blog/2016/2016-09-08/</guid>
      <description>&lt;p&gt;&lt;strong&gt;环境:&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;目标CPU:STM32F429&lt;/p&gt;&#xA;&lt;p&gt;连接工具:JLink V9&lt;/p&gt;&#xA;&lt;p&gt;连接方式:SWO&lt;/p&gt;&#xA;&lt;p&gt;调试工具:Keil MDK 5.20&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;使用场景:&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;目标板正在运行,但是出BUG了,需要调试,而当前又没有在线debug,&lt;/p&gt;&#xA;&lt;p&gt;于是就需要用调试器在不复位CPU的前提下附着到正在运行的板子上.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;使用步骤:&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;1.首先确认你有与当前CPU运行的程序一样的源码,编译时生成了调试信息(Debug Information).&lt;/p&gt;&#xA;&lt;p&gt;2.修改debug设置,去掉&amp;quot;Load Appcalition at Startup&amp;quot;的勾选.&lt;/p&gt;&#xA;&lt;p&gt;3.检查JLink的设置,&amp;ldquo;Connect:Normal&amp;quot;表示正常连接,不复位,&amp;ldquo;Reset:Normal&amp;rdquo; 表示连接后不复位,不勾选&amp;quot;Reset after Conn&amp;rdquo;,不勾选&amp;quot;Download to Flash&amp;quot;&lt;/p&gt;&#xA;&lt;p&gt;4.将JLink连接至目标板的调试接口.&lt;/p&gt;&#xA;&lt;p&gt;5.点击Keil中的调试按钮,启动调试.前面的设置正确的话CPU会停止运行,但不会复位,此时只能看汇编指令,没有C源码.&lt;/p&gt;&#xA;&lt;p&gt;6.在Command窗口输入命令:LOAD %L INCREMENTAL(这条命令是加载当前项目的输出文件,读取调试信息,这样就可以看到C源码了).&lt;/p&gt;&#xA;&lt;p&gt;7.现在就和正常调试一样了.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;备注:&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;第6步还有另一种方式自动加载,在&amp;quot;Debug&amp;quot;设置对话框里填入一个&amp;quot;Initialization File:&amp;quot;,&lt;/p&gt;&#xA;&lt;p&gt;在该文件里面写上&amp;quot;LOAD %L INCREMENTAL&amp;quot;,就可以了,点击&amp;quot;开始调试&amp;quot;后,Keil会自动执行该命令.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;参考图片:&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;&lt;img src=&#34;./040_1&#34; alt=&#34;&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;&lt;img src=&#34;./040_2&#34; alt=&#34;&#34;&gt;&lt;/p&gt;</description>
    </item>
    <item>
      <title>非常简洁易用的嵌入式RTOS内核----KLite</title>
      <link>https://xcdd.pages.dev/blog/2016/2016-06-21/</link>
      <pubDate>Tue, 21 Jun 2016 10:14:46 +0000</pubDate>
      <guid>https://xcdd.pages.dev/blog/2016/2016-06-21/</guid>
      <description>&lt;p&gt;KLite是一个为ARM Cortex-M微控制器设计的 &lt;strong&gt;微内核&lt;/strong&gt; ,设计思想是&amp;quot;简洁易用&amp;quot;.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;它最大的特性在于简洁易用,可能是目前为止最简单易用的嵌入式 &lt;a href=&#34;http://lib.csdn.net/base/operatingsystem&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;操作系统&lt;/a&gt; 内核.&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;简洁的API风格,简洁的调用方式,简单的移植方法,大大降低学习难度,&lt;/p&gt;&#xA;&lt;p&gt;即使是初学者也能很容易开始进入多线程的开发方式.&lt;/p&gt;&#xA;&lt;p&gt;KLite的特性：&lt;/p&gt;&#xA;&lt;p&gt;1.基于Cortex-M设计开发，免移植即可在CM0,CM3,CM4的MCU上运行；&lt;/p&gt;&#xA;&lt;p&gt;2.使用方便，免裁剪，预编译库只有3个文件，直接包含进工程即可；&lt;/p&gt;&#xA;&lt;p&gt;3.API风格简洁，命名规范，简洁易懂；&lt;/p&gt;&#xA;&lt;p&gt;4.支持内存管理，自动申请线程堆栈，拒绝繁琐；&lt;/p&gt;&#xA;&lt;p&gt;5.线程数量限制仅因内存限制；&lt;/p&gt;&#xA;&lt;p&gt;6.线程支持256级优先级抢占，相同优先级采用FCFS调度 &lt;a href=&#34;http://lib.csdn.net/base/datastructure&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;算法&lt;/a&gt; ；&lt;/p&gt;&#xA;&lt;p&gt;7.支持最核心的线程同步对象:互斥锁,信号量.&lt;/p&gt;&#xA;&lt;p&gt;8. 很容易扩展出其它功能如:消息队列,邮箱等功能.&lt;/p&gt;&#xA;&lt;p&gt;开源地址:&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;http://www.oschina.net/p/klite&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;http://www.oschina.net/p/klite&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;作者在git仓库准备了一份demo工程&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;http://git.oschina.net/kerndev/klite-demo&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;http://git.oschina.net/kerndev/klite-demo&lt;/a&gt;&lt;/p&gt;</description>
    </item>
    <item>
      <title>EPT分区表</title>
      <link>https://xcdd.pages.dev/blog/2016/2016-05-18/</link>
      <pubDate>Wed, 18 May 2016 11:59:58 +0000</pubDate>
      <guid>https://xcdd.pages.dev/blog/2016/2016-05-18/</guid>
      <description>&lt;p&gt;对，你没有看错是EPT，不是GPT，也不是MBR分区表！&lt;/p&gt;&#xA;&lt;p&gt;什么是EPT，目前根本没有EPT分区表，EPT是我自定义的一种分区表格式。&lt;/p&gt;&#xA;&lt;p&gt;EPT是介于MBR和GPT之间的一种分区表格式，比MBR支持更多的分区，比GPT更少的开销。&lt;/p&gt;&#xA;&lt;p&gt;一个MBR只能记录4个分区，局限比较大；GPT设计得“过于”复杂，在单片机等小系统中使用不太方便，特别是GUID的引入，一个表项数据太长了。&lt;/p&gt;&#xA;&lt;p&gt;于是我在嵌入式小系统项目中就自定义了一种分区格式，叫EPT！&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;EPT(E=Embedded P=Partition T=Table)只是我个人定义的规范，写在这里也是为了方便我以后查询，没有别的目的，各位看官不要深扒。&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;EPT储存方式：&lt;/p&gt;&#xA;&lt;p&gt;从磁盘(或FLASH)的第1个扇区做为主EPT数据储存区，第2个扇区做为备份EPT。&lt;/p&gt;&#xA;&lt;p&gt;EPT数据结构：&lt;/p&gt;&#xA;&lt;p&gt;EPT包括表头与表项，每项均占32字节，目的是为了数据对齐。&lt;/p&gt;&#xA;&lt;p&gt;表头储存在0－31字节，32字节以后为表项，每个表项均占32字节，且连续储存。&lt;/p&gt;&#xA;&lt;p&gt;字节顺序为小端格式，如32位字0x12345678，按字节储存为：78 56 34 12。&lt;/p&gt;&#xA;&lt;p&gt;EPT表头结构:&lt;/p&gt;&#xA;&lt;p&gt;struct ept_hdr&#xA;{&lt;/p&gt;&#xA;&lt;p&gt;uint32_t magic;//标记=0x00545045，&amp;ldquo;EPT\0&amp;rdquo;&lt;/p&gt;&#xA;&lt;p&gt;uint32_t blksize; //扇区/块大小&lt;/p&gt;&#xA;&lt;p&gt;uint32_t crc32;//所有表项的CRC32校验，确保完整性，CRC-32-IEEE 802.3标准&lt;/p&gt;&#xA;&lt;p&gt;uint8_t  revd[20]; //保留字节&#xA;};&lt;/p&gt;&#xA;&lt;p&gt;EPT表项结构:&lt;/p&gt;&#xA;&lt;p&gt;struct ept_item&#xA;{&#xA;char     name[16]; //分区名称&#xA;uint32_t start;  //起始扇区&#xA;uint32_t size;  //分区大小&#xA;uint8_t  revd[8]; //保留字节，以后可以用作分区类型标识&#xA;};&lt;/p&gt;&#xA;&lt;p&gt;示例:&lt;/p&gt;&#xA;&lt;p&gt;&lt;img src=&#34;./038_1&#34; alt=&#34;&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;示例说明：&lt;/p&gt;&#xA;&lt;p&gt;扇区大小:512字节&lt;/p&gt;&#xA;&lt;p&gt;名称       起始扇区 扇区数量 起始地址   分区大小&#xA;boot        0x0100   0x0800   0x020000  0x100000 1MB&#xA;logo        0x0900   0x0800   0x120000  0x100000 1MB&#xA;kernel     0x1100   0x4000   0x220000  0x800000 8MB&#xA;ramdisk  0x5100   0x4000   0xA20000  0x800000 8MB&lt;/p&gt;</description>
    </item>
    <item>
      <title>CRC32校验算法C语言版(查表法)</title>
      <link>https://xcdd.pages.dev/blog/2016/2016-05-16-1720/</link>
      <pubDate>Mon, 16 May 2016 17:20:27 +0000</pubDate>
      <guid>https://xcdd.pages.dev/blog/2016/2016-05-16-1720/</guid>
      <description>&lt;p&gt;最近用到CRC校验算法，就找了些资料，学习了一下，网上关于CRC32的资料也多，但感觉不是很完整，或者太高深。&lt;/p&gt;&#xA;&lt;p&gt;CRC算法查表法很常见，但表是怎么来的，有些资料说得不很清楚。&lt;/p&gt;&#xA;&lt;p&gt;我来说一下我的看法：&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;1.CRC校验变化太多，有CRC4/5/6/7/8/16/32，每一种的多项式也有很多种变化，并不是一成不变的；&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;2.输入输出方式也有区别，有一些初始值是0，有一些初始值是0xFFFFFFFF，有一些直接返回，有一些异或返回。&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;因此，CRC校验很难用一个代码兼容全部，只能根据项目需要修改相关参数了。&lt;/p&gt;&#xA;&lt;p&gt;计算方法：&lt;/p&gt;&#xA;&lt;p&gt;1.先要知道多项式是什么样子，以这个IEEE802.3标准CRC32多项式为例： &lt;em&gt;x&lt;/em&gt; &lt;sup&gt;32&lt;/sup&gt;+ &lt;em&gt;x&lt;/em&gt; &lt;sup&gt;26&lt;/sup&gt;+ &lt;em&gt;x&lt;/em&gt; &lt;sup&gt;23&lt;/sup&gt;+ &lt;em&gt;x&lt;/em&gt; &lt;sup&gt;22&lt;/sup&gt;+ &lt;em&gt;x&lt;/em&gt; &lt;sup&gt;16&lt;/sup&gt;+ &lt;em&gt;x&lt;/em&gt; &lt;sup&gt;12&lt;/sup&gt;+ &lt;em&gt;x&lt;/em&gt; &lt;sup&gt;11&lt;/sup&gt;+ &lt;em&gt;x&lt;/em&gt; &lt;sup&gt;10&lt;/sup&gt;+ &lt;em&gt;x&lt;/em&gt; &lt;sup&gt;8&lt;/sup&gt;+ &lt;em&gt;x&lt;/em&gt; &lt;sup&gt;7&lt;/sup&gt;+ &lt;em&gt;x&lt;/em&gt; &lt;sup&gt;5&lt;/sup&gt;+ &lt;em&gt;x&lt;/em&gt; &lt;sup&gt;4&lt;/sup&gt;+ &lt;em&gt;x&lt;/em&gt; &lt;sup&gt;2&lt;/sup&gt;+ &lt;em&gt;x&lt;/em&gt; +&#xA;1&lt;/p&gt;&#xA;&lt;p&gt;2.转换成一个值（这个值的命名我不知道啊）&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;x32  则对应32bit = 1, x26 则对应26bit=1，得出一个值：(1&amp;lt;&amp;lt;32)|(1&amp;lt;&amp;lt;26)|(1&amp;lt;&amp;lt;23)|(1&amp;lt;&amp;lt;22)|...|(1&amp;lt;&amp;lt;1)|(1)=0x104C11DB7，对于CRC32取低32位，则＝0x4C11DB7&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;3.用这个值通过一定方法生成长度为256的码表，对于CRC32表内每个元素都为32bit.&lt;/p&gt;&#xA;&lt;p&gt;4.用一定的方法查表得出CRC32值。&lt;/p&gt;&#xA;&lt;p&gt;好了，可以贴代码了:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-cpp&#34; data-lang=&#34;cpp&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;#include&lt;/span&gt; &lt;span style=&#34;color:#75715e&#34;&gt;&amp;lt;stdio.h&amp;gt;&lt;/span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;#include&lt;/span&gt; &lt;span style=&#34;color:#75715e&#34;&gt;&amp;lt;stdlib.h&amp;gt;&lt;/span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;#include&lt;/span&gt; &lt;span style=&#34;color:#75715e&#34;&gt;&amp;lt;stdint.h&amp;gt;&lt;/span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;static&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;uint32_t&lt;/span&gt; table[&lt;span style=&#34;color:#ae81ff&#34;&gt;256&lt;/span&gt;];&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;//位逆转&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;static&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;uint32_t&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;bitrev&lt;/span&gt;(&lt;span style=&#34;color:#66d9ef&#34;&gt;uint32_t&lt;/span&gt; input, &lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt; bw)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;{&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt; i;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;uint32_t&lt;/span&gt; var;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    var &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;for&lt;/span&gt;(i&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;; i&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;&lt;/span&gt;bw; i&lt;span style=&#34;color:#f92672&#34;&gt;++&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt;(input &lt;span style=&#34;color:#f92672&#34;&gt;&amp;amp;&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;0x01&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            var &lt;span style=&#34;color:#f92672&#34;&gt;|=&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;&amp;lt;&lt;/span&gt;(bw &lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt; i);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        input &lt;span style=&#34;color:#f92672&#34;&gt;&amp;gt;&amp;gt;=&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt; var;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;//码表生成&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;void&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;crc32_init&lt;/span&gt;(&lt;span style=&#34;color:#66d9ef&#34;&gt;uint32_t&lt;/span&gt; poly)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;{&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt; i;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt; j;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;uint32_t&lt;/span&gt; c;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    poly &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; bitrev(poly, &lt;span style=&#34;color:#ae81ff&#34;&gt;32&lt;/span&gt;);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;for&lt;/span&gt;(i&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;; i&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;256&lt;/span&gt;; i&lt;span style=&#34;color:#f92672&#34;&gt;++&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        c &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; i;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#66d9ef&#34;&gt;for&lt;/span&gt; (j&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;; j&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;8&lt;/span&gt;; j&lt;span style=&#34;color:#f92672&#34;&gt;++&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            c &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; (c &lt;span style=&#34;color:#f92672&#34;&gt;&amp;amp;&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;) &lt;span style=&#34;color:#f92672&#34;&gt;?&lt;/span&gt; (poly &lt;span style=&#34;color:#f92672&#34;&gt;^&lt;/span&gt; (c &lt;span style=&#34;color:#f92672&#34;&gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;)) &lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; (c &lt;span style=&#34;color:#f92672&#34;&gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        table[i] &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; c;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;//计算CRC&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;uint32_t&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;crc32&lt;/span&gt;(&lt;span style=&#34;color:#66d9ef&#34;&gt;uint32_t&lt;/span&gt; crc, &lt;span style=&#34;color:#66d9ef&#34;&gt;void&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt; input, &lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt; len)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;{&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt; i;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;uint8_t&lt;/span&gt; index;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;uint8_t&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;p;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    p &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; (&lt;span style=&#34;color:#66d9ef&#34;&gt;uint8_t&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;)input;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;for&lt;/span&gt;(i&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;; i&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;&lt;/span&gt;len; i&lt;span style=&#34;color:#f92672&#34;&gt;++&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        index &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; (&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;p &lt;span style=&#34;color:#f92672&#34;&gt;^&lt;/span&gt; crc);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        crc &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; (crc &lt;span style=&#34;color:#f92672&#34;&gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;8&lt;/span&gt;) &lt;span style=&#34;color:#f92672&#34;&gt;^&lt;/span&gt; table[index];&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        p&lt;span style=&#34;color:#f92672&#34;&gt;++&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt; crc;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;//测试用例&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;void&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;main&lt;/span&gt;(&lt;span style=&#34;color:#66d9ef&#34;&gt;void&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;{&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;uint32_t&lt;/span&gt; crc;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    crc32_init(&lt;span style=&#34;color:#ae81ff&#34;&gt;0x4C11DB7&lt;/span&gt;);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    crc &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; crc32(&lt;span style=&#34;color:#ae81ff&#34;&gt;0xFFFFFFFF&lt;/span&gt;, &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;1234567890&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#ae81ff&#34;&gt;10&lt;/span&gt;);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    printf(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;CRC32 = 0x%08X&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;\n&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&lt;/span&gt;, crc &lt;span style=&#34;color:#f92672&#34;&gt;^&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;0xFFFFFFFF&lt;/span&gt;);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    system(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;pause&amp;#34;&lt;/span&gt;);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;2017.11.07更新代码: 由于原代码使用unsigned long类型,在64位环境下是64位数据类型,会出现计算结果不正确,因此将其替换为uint32_t类型;&lt;/p&gt;</description>
    </item>
    <item>
      <title>简化版的SHA1算法C语言版</title>
      <link>https://xcdd.pages.dev/blog/2016/2016-05-16/</link>
      <pubDate>Mon, 16 May 2016 16:41:38 +0000</pubDate>
      <guid>https://xcdd.pages.dev/blog/2016/2016-05-16/</guid>
      <description>&lt;p&gt;最近用到了一些常规散列算法，学习一下SHA算法，网上SHA1介绍很多，也有实例，但代码风格似乎不符合我的审美。&lt;/p&gt;&#xA;&lt;p&gt;经过学习验证，编写了一个简化版的SHA1算法，为什么叫简化版呢？&lt;/p&gt;&#xA;&lt;p&gt;因为这个算法只能处理56字节以内的数据，大于等于56字节的情况要分组计算。&lt;/p&gt;&#xA;&lt;p&gt;分组补位有点麻烦，怎么合理分组，还有待思考。&lt;/p&gt;&#xA;&lt;p&gt;先贴出简化版的代码吧。&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-cpp&#34; data-lang=&#34;cpp&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;/*&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;* SHA1散列算法&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;* &amp;lt;kerndev@foxmail.com&amp;gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;* 参考:http://csrc.nist.gov/publications/fips/fips180-2/fips180-2.pdf&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;*/&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;#include&lt;/span&gt; &lt;span style=&#34;color:#75715e&#34;&gt;&amp;lt;stdio.h&amp;gt;&lt;/span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;#include&lt;/span&gt; &lt;span style=&#34;color:#75715e&#34;&gt;&amp;lt;string.h&amp;gt;&lt;/span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;#include&lt;/span&gt; &lt;span style=&#34;color:#75715e&#34;&gt;&amp;#34;sha1.h&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;#define S(x,n)&#x9;(((x)&amp;lt;&amp;lt;n)|(x)&amp;gt;&amp;gt;(32-n))&#x9;&lt;/span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;//SHA定义S函数为循环左移&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;static&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;unsigned&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;long&lt;/span&gt; h[&lt;span style=&#34;color:#ae81ff&#34;&gt;5&lt;/span&gt;];&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;static&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;unsigned&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;long&lt;/span&gt; m[&lt;span style=&#34;color:#ae81ff&#34;&gt;16&lt;/span&gt;];&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;static&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;unsigned&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;long&lt;/span&gt; w[&lt;span style=&#34;color:#ae81ff&#34;&gt;80&lt;/span&gt;];&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;//补位(余数=448)+补长度(64位)=512位M&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;static&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;void&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;sha1_pad&lt;/span&gt;(&lt;span style=&#34;color:#66d9ef&#34;&gt;unsigned&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;char&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;input, &lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt; len)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;{&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt; i;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt; n;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&lt;span style=&#34;color:#66d9ef&#34;&gt;for&lt;/span&gt;(i&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;;i&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;16&lt;/span&gt;;i&lt;span style=&#34;color:#f92672&#34;&gt;++&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;{&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&#x9;m[i] &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&lt;span style=&#34;color:#66d9ef&#34;&gt;for&lt;/span&gt;(i&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;;i&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;&lt;/span&gt;len;i&lt;span style=&#34;color:#f92672&#34;&gt;++&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;{&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&#x9;n &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;24&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;((i&lt;span style=&#34;color:#f92672&#34;&gt;&amp;amp;&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;0x03&lt;/span&gt;)&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;&amp;lt;&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;3&lt;/span&gt;);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&#x9;m[i&lt;span style=&#34;color:#f92672&#34;&gt;/&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;4&lt;/span&gt;] &lt;span style=&#34;color:#f92672&#34;&gt;|=&lt;/span&gt; input[i]&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;&amp;lt;&lt;/span&gt;n;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;n &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;24&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;((i&lt;span style=&#34;color:#f92672&#34;&gt;&amp;amp;&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;0x03&lt;/span&gt;)&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;&amp;lt;&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;3&lt;/span&gt;);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;m[i&lt;span style=&#34;color:#f92672&#34;&gt;/&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;4&lt;/span&gt;] &lt;span style=&#34;color:#f92672&#34;&gt;|=&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;0x80&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;&amp;lt;&lt;/span&gt;n;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;m[&lt;span style=&#34;color:#ae81ff&#34;&gt;15&lt;/span&gt;] &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; len&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;8&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;//由512位M生成80字W&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;static&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;void&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;sha1_prepare&lt;/span&gt;(&lt;span style=&#34;color:#66d9ef&#34;&gt;void&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;{&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt; i;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&lt;span style=&#34;color:#66d9ef&#34;&gt;for&lt;/span&gt;(i&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;;i&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;16&lt;/span&gt;;i&lt;span style=&#34;color:#f92672&#34;&gt;++&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;{&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&#x9;w[i]&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;m[i];&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&lt;span style=&#34;color:#66d9ef&#34;&gt;for&lt;/span&gt;(i&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;16&lt;/span&gt;;i&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;80&lt;/span&gt;;i&lt;span style=&#34;color:#f92672&#34;&gt;++&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;{&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&#x9;w[i]&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;w[i&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;16&lt;/span&gt;]&lt;span style=&#34;color:#f92672&#34;&gt;^&lt;/span&gt;w[i&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;14&lt;/span&gt;]&lt;span style=&#34;color:#f92672&#34;&gt;^&lt;/span&gt;w[i&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;8&lt;/span&gt;]&lt;span style=&#34;color:#f92672&#34;&gt;^&lt;/span&gt;w[i&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;3&lt;/span&gt;];&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&#x9;w[i]&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;S(w[i],&lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;//由80字W计算sha1&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;static&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;void&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;sha1_calc&lt;/span&gt;(&lt;span style=&#34;color:#66d9ef&#34;&gt;void&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;{&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt; i;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&lt;span style=&#34;color:#66d9ef&#34;&gt;unsigned&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;long&lt;/span&gt; a,b,c,d,e,f,k;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&lt;span style=&#34;color:#66d9ef&#34;&gt;unsigned&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;long&lt;/span&gt; temp;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;h[&lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;]&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;0x67452301&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;h[&lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;]&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;0xEFCDAB89&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;h[&lt;span style=&#34;color:#ae81ff&#34;&gt;2&lt;/span&gt;]&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;0x98BADCFE&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;h[&lt;span style=&#34;color:#ae81ff&#34;&gt;3&lt;/span&gt;]&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;0x10325476&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;h[&lt;span style=&#34;color:#ae81ff&#34;&gt;4&lt;/span&gt;]&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;0xC3D2E1F0&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;a &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; h[&lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;];&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;b &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; h[&lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;];&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;c &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; h[&lt;span style=&#34;color:#ae81ff&#34;&gt;2&lt;/span&gt;];&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;d &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; h[&lt;span style=&#34;color:#ae81ff&#34;&gt;3&lt;/span&gt;];&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;e &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; h[&lt;span style=&#34;color:#ae81ff&#34;&gt;4&lt;/span&gt;];&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&lt;span style=&#34;color:#66d9ef&#34;&gt;for&lt;/span&gt;(i&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;;i&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;80&lt;/span&gt;;i&lt;span style=&#34;color:#f92672&#34;&gt;++&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;{&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&#x9;&lt;span style=&#34;color:#66d9ef&#34;&gt;switch&lt;/span&gt;(i&lt;span style=&#34;color:#f92672&#34;&gt;/&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;20&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&#x9;{&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&#x9;&lt;span style=&#34;color:#66d9ef&#34;&gt;case&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&#x9;&#x9;k&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;0x5A827999&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&#x9;&#x9;f&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;(b&lt;span style=&#34;color:#f92672&#34;&gt;&amp;amp;&lt;/span&gt;c)&lt;span style=&#34;color:#f92672&#34;&gt;|&lt;/span&gt;(&lt;span style=&#34;color:#f92672&#34;&gt;~&lt;/span&gt;b&lt;span style=&#34;color:#f92672&#34;&gt;&amp;amp;&lt;/span&gt;d);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&#x9;&#x9;&lt;span style=&#34;color:#66d9ef&#34;&gt;break&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&#x9;&lt;span style=&#34;color:#66d9ef&#34;&gt;case&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&#x9;&#x9;k&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;0x6ED9EBA1&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&#x9;&#x9;f&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;b&lt;span style=&#34;color:#f92672&#34;&gt;^&lt;/span&gt;c&lt;span style=&#34;color:#f92672&#34;&gt;^&lt;/span&gt;d;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&#x9;&#x9;&lt;span style=&#34;color:#66d9ef&#34;&gt;break&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&#x9;&lt;span style=&#34;color:#66d9ef&#34;&gt;case&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;2&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&#x9;&#x9;k&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;0x8F1BBCDC&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&#x9;&#x9;f&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;(b&lt;span style=&#34;color:#f92672&#34;&gt;&amp;amp;&lt;/span&gt;c)&lt;span style=&#34;color:#f92672&#34;&gt;|&lt;/span&gt;(b&lt;span style=&#34;color:#f92672&#34;&gt;&amp;amp;&lt;/span&gt;d)&lt;span style=&#34;color:#f92672&#34;&gt;|&lt;/span&gt;(c&lt;span style=&#34;color:#f92672&#34;&gt;&amp;amp;&lt;/span&gt;d);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&#x9;&#x9;&lt;span style=&#34;color:#66d9ef&#34;&gt;break&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&#x9;&lt;span style=&#34;color:#66d9ef&#34;&gt;case&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;3&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&#x9;&#x9;k&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;0xCA62C1D6&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&#x9;&#x9;f&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;b&lt;span style=&#34;color:#f92672&#34;&gt;^&lt;/span&gt;c&lt;span style=&#34;color:#f92672&#34;&gt;^&lt;/span&gt;d;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&#x9;&#x9;&lt;span style=&#34;color:#66d9ef&#34;&gt;break&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&#x9;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&#x9;temp&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;S(a,&lt;span style=&#34;color:#ae81ff&#34;&gt;5&lt;/span&gt;)&lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt;f&lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt;e&lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt;w[i]&lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt;k;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&#x9;e&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;d;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&#x9;d&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;c;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&#x9;c&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;S(b,&lt;span style=&#34;color:#ae81ff&#34;&gt;30&lt;/span&gt;);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&#x9;b&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;a;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&#x9;a&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;temp;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;h[&lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;]&lt;span style=&#34;color:#f92672&#34;&gt;+=&lt;/span&gt;a;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;h[&lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;]&lt;span style=&#34;color:#f92672&#34;&gt;+=&lt;/span&gt;b;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;h[&lt;span style=&#34;color:#ae81ff&#34;&gt;2&lt;/span&gt;]&lt;span style=&#34;color:#f92672&#34;&gt;+=&lt;/span&gt;c;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;h[&lt;span style=&#34;color:#ae81ff&#34;&gt;3&lt;/span&gt;]&lt;span style=&#34;color:#f92672&#34;&gt;+=&lt;/span&gt;d;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;h[&lt;span style=&#34;color:#ae81ff&#34;&gt;4&lt;/span&gt;]&lt;span style=&#34;color:#f92672&#34;&gt;+=&lt;/span&gt;e;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;//SHA1算法接口&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;//input:待校验的数据&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;//len:数据长度(小于56字节)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;unsigned&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;long&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;sha1&lt;/span&gt;(&lt;span style=&#34;color:#66d9ef&#34;&gt;void&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt; input, &lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt; len)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;{&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;sha1_pad(input,len);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;sha1_prepare();&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;sha1_calc();&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt; h;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;测试用例：&lt;/p&gt;</description>
    </item>
    <item>
      <title>手动安装Keil5（制作绿色版/精简版MDK Keil）</title>
      <link>https://xcdd.pages.dev/blog/2016/2016-05-12-1832/</link>
      <pubDate>Thu, 12 May 2016 18:32:56 +0000</pubDate>
      <guid>https://xcdd.pages.dev/blog/2016/2016-05-12-1832/</guid>
      <description>&lt;p&gt;经常使用ARM Keil5；&lt;/p&gt;&#xA;&lt;p&gt;而它更新也很频繁；&lt;/p&gt;&#xA;&lt;p&gt;安装包也非常大；&lt;/p&gt;&#xA;&lt;p&gt;每次安装还自动安装ULink驱动，不能忍了，必须要动刀子了。&lt;/p&gt;&#xA;&lt;p&gt;手动制作Keil的绿色版，或者说手动安装Keil:&lt;/p&gt;&#xA;&lt;p&gt;首先要下载好MDK518.EXE，400多MB。这个安装包其实就是一个压缩包，可以直接解压。&lt;/p&gt;&#xA;&lt;p&gt;原理就不多说了，直接说步骤吧：&lt;/p&gt;&#xA;&lt;p&gt;1.解压它，得到&amp;quot;ARM&amp;quot;和&amp;quot;UV4&amp;quot;两个文件夹，和四个小文件。&lt;/p&gt;&#xA;&lt;p&gt;2.保留两个文件夹和&amp;quot;SETUP.INI&amp;quot;,把SETUP.INI改名为TOOLS.INI&lt;/p&gt;&#xA;&lt;p&gt;3.打开TOOLS.INI，&lt;/p&gt;&#xA;&lt;p&gt;删除[UV2]以前的全部内容，&lt;/p&gt;&#xA;&lt;p&gt;修改[UV2]下面的RTEPATH=&amp;ldquo;你当前目录\ARM\PACK&amp;rdquo;，&lt;/p&gt;&#xA;&lt;p&gt;修改[ARM]下面的PATH=&amp;ldquo;你当前目录\ARM&amp;rdquo;,&lt;/p&gt;&#xA;&lt;p&gt;修改[ARMADS]下面的PATH=&amp;ldquo;你当前目录\ARM&amp;rdquo;&lt;/p&gt;&#xA;&lt;p&gt;修改[ARMADS]下面的PATH1=&amp;quot;.\ARMCC\bin&amp;quot;&lt;/p&gt;&#xA;&lt;p&gt;4.现在你可以去UV4文件夹下面双击UV4.EXE，启动Keil了，实践证明Keil不能放到中文路径下，否则有问题。&lt;/p&gt;&#xA;&lt;p&gt;以上1－4步骤就是手动安装过程，下面说说精简：&lt;/p&gt;&#xA;&lt;p&gt;A.精简TOOLS.INI&lt;/p&gt;&#xA;&lt;p&gt;在[ARM]和[ARMADS]下面的BOOK开头的都可以删除，这个是帮助内容，以TDRV开头的是UV4工程Debug选项下面的调试器选项，一般用JLink的话只保留Segger\JLTAgdi.dll和Segger\JL2CM3.dll，其它都可以删除，免得看到烦，如果你要用其它的，自行选择删除。&lt;/p&gt;&#xA;&lt;p&gt;B.精简调试器&lt;/p&gt;&#xA;&lt;p&gt;刚才在TOOLS.INI中删除的TDRVx内容所对应的文件都可以删除，什么Signum\SigUV3Arm.dll, NULink\Nu_Link.dll这些文件统统都删掉，看到讨厌。&lt;/p&gt;&#xA;&lt;p&gt;C.精简其它文件&lt;/p&gt;&#xA;&lt;p&gt;在UV4目录下UV4.cdb,uv4.chm,uv4jp.chm可以放心删除。&lt;/p&gt;&#xA;&lt;p&gt;后缀为.SVCS的是版本控制功能选项，用不上的可以删除，删除了之后IDE界面的SVCS菜单就干净了。&lt;/p&gt;&#xA;&lt;p&gt;在ARM\Pack目录下的文件也用不上，可以删除。&lt;/p&gt;&#xA;&lt;p&gt;在ARM\Flash目录也可以删除。&lt;/p&gt;&#xA;&lt;p&gt;在ARM\Utilities目录也可以删除。&lt;/p&gt;&#xA;&lt;p&gt;在ARM\Startup目录也可以删除。&lt;/p&gt;&#xA;&lt;p&gt;在ARM\Help目录也可以删除，这个文件夹太大了。&lt;/p&gt;&#xA;&lt;p&gt;在ARM\ARMCC\lib\cpplib，如果不用C++开发，也可以删除&lt;/p&gt;&#xA;&lt;p&gt;D.完了，这下Keil绿色精简版就做好了。一下就清爽了&lt;/p&gt;&#xA;&lt;p&gt;附上一个编缉好的TOOLS.INI文件&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-plain&#34; data-lang=&#34;plain&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;[UV2]&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;ARMSEL=1&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;USERTE=1&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;RTEPATH=&amp;#34;C:\Program Files\Keil\ARM\PACK&amp;#34;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;TOOL_VARIANT=mdk_pro&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;[ARM]&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;PATH=&amp;#34;C:\Program Files\Keil\ARM\&amp;#34;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;LIC0=此处已删除&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;[ARMADS]&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;PATH=&amp;#34;C:\Program Files\Keil\ARM\&amp;#34;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;PATH1=&amp;#34;.\ARMCC\bin\&amp;#34;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;ARMCCPATH0=&amp;#34;ARMCC&amp;#34; (&amp;#34;V5.06u1 (build 61)&amp;#34;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;RTOS0=Dummy.DLL(&amp;#34;Dummy&amp;#34;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;CPUDLL0=SARM.DLL(TDRV0,TDRV4,TDRV5,TDRV8)                                                          # Drivers for ARM7/9 devices&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;CPUDLL1=SARMCM3.DLL(TDRV1,TDRV2,TDRV3,TDRV4,TDRV6,TDRV7,TDRV9,TDRV10,TDRV11,TDRV12,TDRV13,TDRV14)  # Drivers for Cortex-M devices&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;CPUDLL2=SARMCR4.DLL(TDRV6)                                                                         # Drivers for Cortex-R4 devices&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;TDRV0=Segger\JLTAgdi.dll(&amp;#34;J-LINK / J-TRACE ARM&amp;#34;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;TDRV1=Segger\JL2CM3.dll(&amp;#34;J-LINK / J-TRACE Cortex&amp;#34;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description>
    </item>
    <item>
      <title>发一个简洁实用的串口调试工具</title>
      <link>https://xcdd.pages.dev/blog/2016/2016-05-12/</link>
      <pubDate>Thu, 12 May 2016 17:56:37 +0000</pubDate>
      <guid>https://xcdd.pages.dev/blog/2016/2016-05-12/</guid>
      <description>&lt;p&gt;网上的串口调试工具，已经很多啦，但是大多数长得都差不多，而且都有一些小广告在上面，总不完美，&lt;/p&gt;&#xA;&lt;p&gt;因此本人编写了一个自认为比较体符合我需求的串口调试工具。&lt;/p&gt;&#xA;&lt;p&gt;此工具基于Win32 SDK开发，无需MFC库，文件体积小，只有一个exe，界面纯净，没有多余的东西！&lt;/p&gt;&#xA;&lt;p&gt;该有的功能都有，支持921600波特率！&lt;/p&gt;&#xA;&lt;p&gt;当前版本：2.0.4&lt;/p&gt;&#xA;&lt;p&gt;&lt;img src=&#34;./034_1&#34; alt=&#34;&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;下载地址：&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;http://pan.baidu.com/s/1mhQNJGs&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;http://pan.baidu.com/s/1mhQNJGs&lt;/a&gt;&lt;/p&gt;</description>
    </item>
    <item>
      <title>蓝牙手柄按键码</title>
      <link>https://xcdd.pages.dev/blog/2016/2016-02-16/</link>
      <pubDate>Tue, 16 Feb 2016 14:51:09 +0000</pubDate>
      <guid>https://xcdd.pages.dev/blog/2016/2016-02-16/</guid>
      <description>&lt;p&gt;/*&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&#xA;ZetaGC串口码与键码对应关系：&#xA;上     0x60 -&amp;gt; 0x26   &lt;br&gt;&#xA;下     0x30 -&amp;gt; 0x28   | 此4键只能相邻按键组合按下&#xA;左     0x20 -&amp;gt; 0x25   |&#xA;右     0x10 -&amp;gt; 0x27   /&#xA;A      0x01 -&amp;gt; 0xC1   &lt;br&gt;&#xA;AA     0x02 -&amp;gt; 0xC3   | 此4键可任意组合按下&#xA;B      0x04 -&amp;gt; 0xC2   |&#xA;BB     0x08 -&amp;gt; 0xC4   /&#xA;SELECT 0xE0 -&amp;gt; 0xC5   &lt;br&gt;&#xA;START  0xE1 -&amp;gt; 0xC6   | 此3键不能与其他键同时按下&#xA;OK     0xE2 -&amp;gt; 0x0D   /&#xA;*/&lt;/p&gt;&#xA;&lt;p&gt;/*&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&#xA;PhoneJoy商业手柄键码定义：&#xA;压下   抬起&#xA;上     BA45   FA05&#xA;下     BD42   FD02&#xA;左     BB44   FB04&#xA;右     BC43   FC03&#xA;A      B649   F609&#xA;B      B54A   F50A&#xA;C      BE41   FE01&#xA;D      B748   F708&#xA;SELECT B34C   F30C&#xA;START  B44B   F40B&#xA;L      B847   F807&#xA;R      B946   F906&#xA;*/&lt;/p&gt;</description>
    </item>
    <item>
      <title>在Keil环境下使用JLink实现printf输出重定向至debug窗口</title>
      <link>https://xcdd.pages.dev/blog/2016/2016-01-28/</link>
      <pubDate>Thu, 28 Jan 2016 22:06:46 +0000</pubDate>
      <guid>https://xcdd.pages.dev/blog/2016/2016-01-28/</guid>
      <description>&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-cpp&#34; data-lang=&#34;cpp&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;在工程里面添加下列代码：&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-cpp&#34; data-lang=&#34;cpp&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;#include&lt;/span&gt; &lt;span style=&#34;color:#75715e&#34;&gt;&amp;lt;stdio.h&amp;gt;&lt;/span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;#define ITM_Port8(n)    (*((volatile unsigned char *)(0xE0000000+4*n)))&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;#define ITM_Port16(n)   (*((volatile unsigned short*)(0xE0000000+4*n)))&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;#define ITM_Port32(n)   (*((volatile unsigned long *)(0xE0000000+4*n)))&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;#define DEMCR           (*((volatile unsigned long *)(0xE000EDFC)))&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;#define TRCENA          0x01000000&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;//半主机模式必须定义这个&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;struct&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;__FILE&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;{&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt; handle;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;};&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;FILE __stdout;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;FILE __stdin;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;fputc&lt;/span&gt;(&lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt; ch, FILE &lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;f)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;{&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt; (DEMCR &lt;span style=&#34;color:#f92672&#34;&gt;&amp;amp;&lt;/span&gt; TRCENA)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#66d9ef&#34;&gt;while&lt;/span&gt; (ITM_Port32(&lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;) &lt;span style=&#34;color:#f92672&#34;&gt;==&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        ITM_Port8(&lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;) &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; ch;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt;(ch);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;点击JLink的调试设置对话框，Trace页面，如下图设置即可：&lt;/p&gt;&#xA;&lt;p&gt;&lt;img src=&#34;./032_1&#34; alt=&#34;&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;原始文章：&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;http://www.keil.com/support/man/docs/jlink/jlink_trace_itm_viewer.htm&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;http://www.keil.com/support/man/docs/jlink/jlink_trace_itm_viewer.htm&lt;/a&gt;&lt;/p&gt;</description>
    </item>
    <item>
      <title>Keil 5中精简器件支持包,手动安装pack包</title>
      <link>https://xcdd.pages.dev/blog/2016/2016-01-20/</link>
      <pubDate>Wed, 20 Jan 2016 20:01:47 +0000</pubDate>
      <guid>https://xcdd.pages.dev/blog/2016/2016-01-20/</guid>
      <description>&lt;p&gt;Keil MDK 5.0以后的版本都使用软件包的方式来支持你的MCU，比如STM32F103要下载STM32F10x_DFP.pack，&lt;/p&gt;&#xA;&lt;p&gt;但是发现有一些设备提供的支持包竟然达到200MB以上，解压后1GB以上，简直不能忍，必须对它动刀子！&lt;/p&gt;&#xA;&lt;p&gt;经过分析后，pack包其实就是一个标准的zip文件，可以直接解压，精简方法也很简单，这里有两种途径：&lt;/p&gt;&#xA;&lt;p&gt;一，安装后精简&lt;/p&gt;&#xA;&lt;p&gt;先正常安装xxxxx.pack，然后到Keil安装目录下找到Keil\ARM\Pack\Keil\xxxxxxxx_DFP\a.b.c，删除那些用不上的文件，但是要保留Keil真正使用的文件：&lt;/p&gt;&#xA;&lt;p&gt;package.xml&lt;/p&gt;&#xA;&lt;p&gt;Keil.xxxxx_DFP.pdsc&lt;/p&gt;&#xA;&lt;p&gt;Flash/xxxxxxx.FLM (用于Keil直接加载程序到FLASH)&lt;/p&gt;&#xA;&lt;p&gt;SVD/xxxxx.SVD&lt;/p&gt;&#xA;&lt;p&gt;SVD/xxxxx.SFR (用于在线调试时，查看外设寄存器的值)&lt;/p&gt;&#xA;&lt;p&gt;这几个文件其实非常小，只有几MB而已。&lt;/p&gt;&#xA;&lt;p&gt;二，安装前精简&lt;/p&gt;&#xA;&lt;p&gt;直接解压xxxx.pack，直接删除不需要的文件，然后重新用ZIP打包，再用PackInstaller.exe导入这个zip文件即可。&lt;/p&gt;&#xA;&lt;p&gt;也可以手动安装这些文件，将解压后的文件按照原目录结构复制到Keil\ARM\Pack\Keil\xxxxxxxx_DFP\a.b.c目录，&lt;/p&gt;&#xA;&lt;p&gt;其中xxxxxxx_DFP这个名字从Keil.xxxxx_DFP.pdsc里面找到name&lt;/p&gt;&#xA;&lt;p&gt;a.b.c为版本号，也从Keil.xxxxx_DFP.pdsc里面找到&lt;/p&gt;&#xA;&lt;p&gt;值得注意的是：直接解压xxxxx.pack文件，SVD目录下面只有SVD文件而没有SFR文件，需要手动生成，生成方法:&lt;/p&gt;&#xA;&lt;p&gt;*&lt;em&gt;SVDConv.exe  xxxxxx.svd &amp;ndash;generate=sfr -o=Keil\ARM\Pack\Keil\xxxxxxxx_DFP\a.b.c\SVD*&lt;/em&gt;&lt;/p&gt;</description>
    </item>
    <item>
      <title>自己动手制作纯净版的WinPE</title>
      <link>https://xcdd.pages.dev/blog/2015/2015-11-13/</link>
      <pubDate>Fri, 13 Nov 2015 12:42:40 +0000</pubDate>
      <guid>https://xcdd.pages.dev/blog/2015/2015-11-13/</guid>
      <description>&lt;p&gt;WinPE作为系统维护工具，已经必不可少，WinPE有很多版本，官方介绍的WinPE版本如下：&lt;/p&gt;&#xA;&lt;p&gt;WinPE1.0  基于WinXP&lt;/p&gt;&#xA;&lt;p&gt;WinPE1.1 基于WinXP SP1&lt;/p&gt;&#xA;&lt;p&gt;WinPE1.2 基于Win2003&lt;/p&gt;&#xA;&lt;p&gt;WinPE1.5 基于WinXP SP2&lt;/p&gt;&#xA;&lt;p&gt;WinPE1.6 基于Win2003 SP1&lt;/p&gt;&#xA;&lt;p&gt;WinPE2.0 基于Win Vista&lt;/p&gt;&#xA;&lt;p&gt;WinPE2.1 基于Win Vista SP1&lt;/p&gt;&#xA;&lt;p&gt;WinPE2.2 基于Win Vista SP2&lt;/p&gt;&#xA;&lt;p&gt;WinPE3.0 基于Win7&lt;/p&gt;&#xA;&lt;p&gt;WinPE3.1 基于Win7 SP1&lt;/p&gt;&#xA;&lt;p&gt;WinPE4.0 基于Win8&lt;/p&gt;&#xA;&lt;p&gt;WinPE5.0 基于Win8.1&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;2016.5.12更新：我把做好的ISO文件也发上来共享，百度网盘：&lt;/strong&gt; &lt;a href=&#34;http://pan.baidu.com/s/1nuVIlip&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;http://pan.baidu.com/s/1nuVIlip&lt;/a&gt;&#xA;&lt;strong&gt;基于Win7企业版 64位系统，支持UEFI启动，完全纯净。&#xA;不保证兼容性，请自测。&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;这么多年来都是用网上下载的PE系统，最近心血来潮想自己做一个，于是花了2个星期的时间做了一个纯净版的WinPE3.0。在此记录一下制作过程，以备以后查阅。&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;1.准备工作&lt;/p&gt;&#xA;&lt;p&gt;下载原版系统镜像，提取boot.wim,install.wim，解压boot.wim的分卷1，这就是最基本WinPE环境，再解压install.wim，这个完整的Win7运行环境；新建工作目录BOOT，把Win7的文件拷贝进来，再把WinPE的文件合并并替换同名文件，这就得到一份超级完整的WinPE文件，有10GB以上，文件6万多个。&lt;/p&gt;&#xA;&lt;p&gt;2.注册表合并&lt;/p&gt;&#xA;&lt;p&gt;如果用win7的SOFTWARE用来启动WinPE，无法打开Explorer错误提示：因配置标识不正确，系统无法开始服务器。&lt;/p&gt;&#xA;&lt;p&gt;如果用WinPE的SOFTWARE用来启动WinPE，无法启动Explorer&lt;/p&gt;&#xA;&lt;p&gt;稳定的做法是以win7的SOFTWARE为模版，导入WinPE的SOFTWARE。&lt;/p&gt;&#xA;&lt;p&gt;3.注册表修改&lt;/p&gt;&#xA;&lt;p&gt;加载DEFAULT,SOFTWARE,SYSTEM，&lt;/p&gt;&#xA;&lt;p&gt;删除所有 &lt;strong&gt;Interactive User&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;替换 *&lt;em&gt;C:*&lt;/em&gt; , *&lt;em&gt;D:*&lt;/em&gt; 为 *&lt;em&gt;X:*&lt;/em&gt;&lt;/p&gt;&#xA;&lt;p&gt;替换 *&lt;em&gt;$windows.~bt*&lt;/em&gt; 为空字符&lt;/p&gt;&#xA;&lt;p&gt;修改以下注册表项：&lt;/p&gt;&#xA;&lt;p&gt;[HKEY_LOCAL_MACHINE__SYSTEM\Setup]&lt;/p&gt;&#xA;&lt;p&gt;CmdLine=”pecmd.exe main %SystemRoot%\System32\PECMD.INI”&lt;/p&gt;&#xA;&lt;p&gt;[HKEY_LOCAL_MACHINE__SOFTWARE\Microsoft\WindowsNT\CurrentVersion\Winlogon]&lt;/p&gt;&#xA;&lt;p&gt;Shell=”explorer.exe”&lt;/p&gt;&#xA;&lt;p&gt;通过以上操作就能启动这个完整的WinPE了，剩下的工作就是精简和优化了。（）&lt;/p&gt;&#xA;&lt;p&gt;精简步骤省略，可以删除的文件。这是一个枯燥而又没什么技术含量的工作，从原版的6万多个文件，反复对比删除，测试，然后又添加，最后可以精简到1000个文件左右。除了文件，就是注册表的修改，注册表表项也达60多MB容量的纯文本，也是一项非常费时的工作！&lt;/p&gt;&#xA;&lt;p&gt;在此列举我在这个过程中发现的问题，以及解决办法：&lt;/p&gt;&#xA;&lt;p&gt;常见的问题总结：&lt;/p&gt;</description>
    </item>
    <item>
      <title>windows系统MSDN下载地址</title>
      <link>https://xcdd.pages.dev/blog/2015/2015-03-06-1443/</link>
      <pubDate>Fri, 06 Mar 2015 14:43:09 +0000</pubDate>
      <guid>https://xcdd.pages.dev/blog/2015/2015-03-06-1443/</guid>
      <description>&lt;p&gt;有时候要装一些系统，要到处找下载地址，现在我记在这里，方便我以后找到&lt;/p&gt;&#xA;&lt;p&gt;Windows7 简体中文旗舰版（MSDN原版）&lt;/p&gt;&#xA;&lt;p&gt;32位：&lt;/p&gt;&#xA;&lt;p&gt;ed2k://|file|cn_windows_7_ultimate_x86_dvd_x15-65907.iso|2604238848|D6F139D7A45E81B76199DDCCDDC4B509|/&#xA;SHA1：B589336602E3B7E134E222ED47FC94938B04354F&lt;/p&gt;&#xA;&lt;p&gt;64位：&#xA;ed2k://|file|cn_windows_7_ultimate_x64_dvd_x15-66043.iso|3341268992|7DD7FA757CE6D2DB78B6901F81A6907A|/&#xA;SHA1：4A98A2F1ED794425674D04A37B70B9763522B0D4&lt;/p&gt;&#xA;&lt;p&gt;Windows 7 With SP1 简体中文旗舰版（MSDN原版）&lt;/p&gt;&#xA;&lt;p&gt;32位：&lt;/p&gt;&#xA;&lt;p&gt;ed2k://|file|cn_windows_7_ultimate_with_sp1_x86_dvd_u_677486.iso|2653276160|7503E4B9B8738DFCB95872445C72AEFB|/&lt;/p&gt;&#xA;&lt;p&gt;SHA1:B92119F5B732ECE1C0850EDA30134536E18CCCE7 ISO/CRC:76101970&lt;/p&gt;&#xA;&lt;p&gt;64位：&lt;/p&gt;&#xA;&lt;p&gt;ed2k://|file|cn_windows_7_ultimate_with_sp1_x64_dvd_u_677408.iso|3420557312|B58548681854236C7939003B583A8078|/&lt;/p&gt;&#xA;&lt;p&gt;SHA1: 2CE0B2DB34D76ED3F697CE148CB7594432405E23 ISO/CRC: 69F54CA4&lt;/p&gt;</description>
    </item>
    <item>
      <title>编译mplayer for arm记录</title>
      <link>https://xcdd.pages.dev/blog/2015/2015-03-06/</link>
      <pubDate>Fri, 06 Mar 2015 11:33:36 +0000</pubDate>
      <guid>https://xcdd.pages.dev/blog/2015/2015-03-06/</guid>
      <description>&lt;p&gt;mplayer( &lt;a href=&#34;http://www.mplayerhq.hu/&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;http://www.mplayerhq.hu/&lt;/a&gt; )&#xA;当前版本：mplayer-export-2015-01-12（SVN-r37353-snapshot-4.9.2）&lt;/p&gt;&#xA;&lt;p&gt;编译mplayer需要ffmpeg( &lt;a href=&#34;http://ffmpeg.org/&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;http://ffmpeg.org/&lt;/a&gt; )&lt;/p&gt;&#xA;&lt;p&gt;当前版本：ffmpeg-2.5.4&lt;/p&gt;&#xA;&lt;p&gt;之前在mplayer源码目录configure总是编译通不过，在编译到ffmpeg里面的vfp_fft.S的时候总报错，后来先在ffmpeg目录下make完成后，再返回mplayer目录make,就编译通过了&lt;/p&gt;&#xA;&lt;p&gt;，具体运行效果还没有测试。先记录一下编译配置，方便以后修改查看&lt;/p&gt;&#xA;&lt;p&gt;mplayer&#xA;./configure &amp;ndash;host-cc=gcc &amp;ndash;cc=arm-linux-gnueabi-gcc &amp;ndash;as=arm-linux-gnueabi-as &amp;ndash;ar=arm-linux-gnueabi-ar &amp;ndash;target=arm-linux &amp;ndash;enable-cross-compile &amp;ndash;enable-armv6 &amp;ndash;enable-armvfp &amp;ndash;enable-alsa &amp;ndash;enable-fbdev &amp;ndash;disable-gui &amp;ndash;disable-win32dll &amp;ndash;disable-tv &amp;ndash;disable-pvr &amp;ndash;disable-v4l2 &amp;ndash;disable-vcd &amp;ndash;disable-dvb &amp;ndash;disable-md5sum &amp;ndash;disable-yuv4mpeg &amp;ndash;disable-tga &amp;ndash;disable-pnm &amp;ndash;disable-dvdread &amp;ndash;disable-dvdnav  &amp;ndash;disable-mencoder &amp;ndash;disable-live &amp;ndash;disable-mad &amp;ndash;disable-xanim &amp;ndash;disable-real &amp;ndash;disable-decoder=hevc &amp;ndash;extra-ldflags=-L/home/arm/alsa-lib/lib &amp;ndash;extra-cflags=&amp;quot;-mcpu=arm1176jzf-s -I/home/arm/alsa-lib/include&amp;quot; &amp;ndash;prefix=/home/arm/mplayer&lt;/p&gt;&#xA;&lt;p&gt;ffmpeg:&#xA;./configure &amp;ndash;prefix=/home/arm/mplayer &amp;ndash;cross-prefix=arm-linux-gnueabi- &amp;ndash;arch=arm &amp;ndash;cpu=arm1176jzf-s &amp;ndash;enable-cross-compile &amp;ndash;target-os=linux &amp;ndash;enable-armv6 &amp;ndash;enable-vfp &amp;ndash;disable-armv6t2 &amp;ndash;disable-armv5te &amp;ndash;disable-neon &amp;ndash;disable-debug &amp;ndash;disable-programs &amp;ndash;disable-encoders &amp;ndash;disable-decoder=hevc &amp;ndash;disable-fft &amp;ndash;disable-network &amp;ndash;disable-doc&lt;/p&gt;</description>
    </item>
    <item>
      <title>2阶节IIR算法C语言源码</title>
      <link>https://xcdd.pages.dev/blog/2015/2015-01-14-1052/</link>
      <pubDate>Wed, 14 Jan 2015 10:52:22 +0000</pubDate>
      <guid>https://xcdd.pages.dev/blog/2015/2015-01-14-1052/</guid>
      <description>&lt;p&gt;纯C语言软件算法，没有做过多优化，只是实现了基本IIR算法&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-cpp&#34; data-lang=&#34;cpp&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;/******************************************************************************&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;* 二阶IIR滤波器单元,采用直接II型&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;* 由多个2阶节，可以组成更多高阶的滤波器&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;* 根据参数的不同，可以生成低通，高通，带通，带阻&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;******************************************************************************/&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;#include&lt;/span&gt; &lt;span style=&#34;color:#75715e&#34;&gt;&amp;#34;iir.h&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;//初始化IIR数据&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;void&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;IIR_Init&lt;/span&gt;(IIR_Typedef &lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;pIIR, IIR_COEF&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt; pCoef)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;{&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt; i;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&lt;span style=&#34;color:#66d9ef&#34;&gt;for&lt;/span&gt; (i&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;; i&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;3&lt;/span&gt;; i&lt;span style=&#34;color:#f92672&#34;&gt;++&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;{&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&#x9;pIIR&lt;span style=&#34;color:#f92672&#34;&gt;-&amp;gt;&lt;/span&gt;fCoefA[i] &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; pCoef&lt;span style=&#34;color:#f92672&#34;&gt;-&amp;gt;&lt;/span&gt;fCoefA[i];&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&#x9;pIIR&lt;span style=&#34;color:#f92672&#34;&gt;-&amp;gt;&lt;/span&gt;fCoefB[i] &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; pCoef&lt;span style=&#34;color:#f92672&#34;&gt;-&amp;gt;&lt;/span&gt;fCoefB[i];&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&#x9;pIIR&lt;span style=&#34;color:#f92672&#34;&gt;-&amp;gt;&lt;/span&gt;fTemp[i]  &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;//复位历史值&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;void&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;IIR_Reset&lt;/span&gt;(IIR_Typedef &lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;pIIR)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;{&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;pIIR&lt;span style=&#34;color:#f92672&#34;&gt;-&amp;gt;&lt;/span&gt;fTemp[&lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;] &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;pIIR&lt;span style=&#34;color:#f92672&#34;&gt;-&amp;gt;&lt;/span&gt;fTemp[&lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;] &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;pIIR&lt;span style=&#34;color:#f92672&#34;&gt;-&amp;gt;&lt;/span&gt;fTemp[&lt;span style=&#34;color:#ae81ff&#34;&gt;2&lt;/span&gt;] &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;//IIR滤波&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;float&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;IIR_Filter&lt;/span&gt;(IIR_Typedef &lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;pIIR, &lt;span style=&#34;color:#66d9ef&#34;&gt;float&lt;/span&gt; fInput)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;{&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&lt;span style=&#34;color:#66d9ef&#34;&gt;float&lt;/span&gt; fOutput;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&lt;span style=&#34;color:#75715e&#34;&gt;//计算输入值&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;&#x9;pIIR&lt;span style=&#34;color:#f92672&#34;&gt;-&amp;gt;&lt;/span&gt;fTemp[&lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;] &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; fInput;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;pIIR&lt;span style=&#34;color:#f92672&#34;&gt;-&amp;gt;&lt;/span&gt;fTemp[&lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;] &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; pIIR&lt;span style=&#34;color:#f92672&#34;&gt;-&amp;gt;&lt;/span&gt;fTemp[&lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;] &lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt; pIIR&lt;span style=&#34;color:#f92672&#34;&gt;-&amp;gt;&lt;/span&gt;fCoefA[&lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;] &lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt; pIIR&lt;span style=&#34;color:#f92672&#34;&gt;-&amp;gt;&lt;/span&gt;fTemp[&lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;];&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;pIIR&lt;span style=&#34;color:#f92672&#34;&gt;-&amp;gt;&lt;/span&gt;fTemp[&lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;] &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; pIIR&lt;span style=&#34;color:#f92672&#34;&gt;-&amp;gt;&lt;/span&gt;fTemp[&lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;] &lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt; pIIR&lt;span style=&#34;color:#f92672&#34;&gt;-&amp;gt;&lt;/span&gt;fCoefA[&lt;span style=&#34;color:#ae81ff&#34;&gt;2&lt;/span&gt;] &lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt; pIIR&lt;span style=&#34;color:#f92672&#34;&gt;-&amp;gt;&lt;/span&gt;fTemp[&lt;span style=&#34;color:#ae81ff&#34;&gt;2&lt;/span&gt;];&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&lt;span style=&#34;color:#75715e&#34;&gt;//计算输出值&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;&#x9;fOutput &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;;  &#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;fOutput &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; fOutput &lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt; pIIR&lt;span style=&#34;color:#f92672&#34;&gt;-&amp;gt;&lt;/span&gt;fCoefB[&lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;] &lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt; pIIR&lt;span style=&#34;color:#f92672&#34;&gt;-&amp;gt;&lt;/span&gt;fTemp[&lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;];  &#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;fOutput &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; fOutput &lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt; pIIR&lt;span style=&#34;color:#f92672&#34;&gt;-&amp;gt;&lt;/span&gt;fCoefB[&lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;] &lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt; pIIR&lt;span style=&#34;color:#f92672&#34;&gt;-&amp;gt;&lt;/span&gt;fTemp[&lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;]; &#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;fOutput &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; fOutput &lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt; pIIR&lt;span style=&#34;color:#f92672&#34;&gt;-&amp;gt;&lt;/span&gt;fCoefB[&lt;span style=&#34;color:#ae81ff&#34;&gt;2&lt;/span&gt;] &lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt; pIIR&lt;span style=&#34;color:#f92672&#34;&gt;-&amp;gt;&lt;/span&gt;fTemp[&lt;span style=&#34;color:#ae81ff&#34;&gt;2&lt;/span&gt;]; &#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&lt;span style=&#34;color:#75715e&#34;&gt;//移动历史值&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;&#x9;pIIR&lt;span style=&#34;color:#f92672&#34;&gt;-&amp;gt;&lt;/span&gt;fTemp[&lt;span style=&#34;color:#ae81ff&#34;&gt;2&lt;/span&gt;] &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; pIIR&lt;span style=&#34;color:#f92672&#34;&gt;-&amp;gt;&lt;/span&gt;fTemp[&lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;];  &#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;pIIR&lt;span style=&#34;color:#f92672&#34;&gt;-&amp;gt;&lt;/span&gt;fTemp[&lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;] &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; pIIR&lt;span style=&#34;color:#f92672&#34;&gt;-&amp;gt;&lt;/span&gt;fTemp[&lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;];&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt; fOutput; &#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;头文件iir.h&lt;/p&gt;</description>
    </item>
    <item>
      <title>编译ARM Linux GCC工具链</title>
      <link>https://xcdd.pages.dev/blog/2015/2015-01-14/</link>
      <pubDate>Wed, 14 Jan 2015 10:46:55 +0000</pubDate>
      <guid>https://xcdd.pages.dev/blog/2015/2015-01-14/</guid>
      <description>&lt;p&gt;近日心血来潮想自己编译一次ARM-GCC工具链&lt;/p&gt;&#xA;&lt;p&gt;于是上网找了找编译方法，并下载了源码，过程中出了很多错，但最终成功编译出了我想要的GCC，于是在此记录一下编译过程.&lt;/p&gt;&#xA;&lt;p&gt;我的目标GCC版本：4.8.4&lt;/p&gt;&#xA;&lt;p&gt;GNU编译工具链包括binutils, gcc, glibc&lt;/p&gt;&#xA;&lt;p&gt;binutils:汇编器、连接器&lt;/p&gt;&#xA;&lt;p&gt;gcc:预处理器、编译器&lt;/p&gt;&#xA;&lt;p&gt;glibc: C语言库&lt;/p&gt;&#xA;&lt;p&gt;编译arm-linux-gcc需要编译两次：&lt;/p&gt;&#xA;&lt;p&gt;第一次是编译一个不带库的临时gcc，可以用来编译裸机程序如linux内核和u-boot等.&lt;/p&gt;&#xA;&lt;p&gt;然后用第一次编译的gcc来编译目标平台的glibc(或者uclibc)&lt;/p&gt;&#xA;&lt;p&gt;然后再进行第二次gcc编译.&lt;/p&gt;&#xA;&lt;p&gt;准备以下源码：&lt;/p&gt;&#xA;&lt;p&gt;binutils-2.25.tar.bz2&lt;/p&gt;&#xA;&lt;p&gt;gcc-4.8.4.tar.bz2&lt;/p&gt;&#xA;&lt;p&gt;glibc-2.21.tar.xz&lt;/p&gt;&#xA;&lt;p&gt;gmp-5.1.3.tar.xz&lt;/p&gt;&#xA;&lt;p&gt;linux-3.4.106.tar.xz&lt;/p&gt;&#xA;&lt;p&gt;mpc-1.0.3.tar.gz&lt;/p&gt;&#xA;&lt;p&gt;mpfr-3.1.2.tar.xz&lt;/p&gt;&#xA;&lt;p&gt;编译顺序是这样的：&lt;/p&gt;&#xA;&lt;p&gt;gmp -&amp;gt; mpfr -&amp;gt; mpc -&amp;gt;binutils -&amp;gt; gcc -&amp;gt; glibc -&amp;gt; binutils -&amp;gt; gcc&lt;/p&gt;&#xA;&lt;p&gt;需要注意的是，最好在一个新的文件夹下面进行编译：&lt;/p&gt;&#xA;&lt;p&gt;#tar -xf gcc-4.8.4.tar.bz2&#xA;#cd gcc-4.8.4&#xA;#mkdir build&#xA;#cd build&lt;/p&gt;&#xA;&lt;p&gt;1.依次编译gmp,mpfr,mpc&lt;/p&gt;&#xA;&lt;p&gt;#../configure&amp;ndash;host=i686-linux-gnu &amp;ndash;disable-shared&#xA;#make&#xA;#make install&lt;/p&gt;&#xA;&lt;p&gt;说明：&#xA;可以使用../configure &amp;ndash;help来查看有哪些参数可以设置&#xA;&amp;ndash;prefix设置安装目录（默认是/usr/local/lib）&#xA;&amp;ndash;host指定目标平台&#xA;&amp;ndash;disable-shared不编译动态库&lt;/p&gt;&#xA;&lt;p&gt;2.编译binutils&lt;/p&gt;&#xA;&lt;p&gt;第一次编译的配置：&#xA;#../configure &amp;ndash;disable-nls&amp;ndash;disable-multilib &amp;ndash;disable-shared &amp;ndash;target=arm-none-linux-gnueabi&amp;ndash;prefix=/home/toolchain/arm-none-linux-gcc&lt;/p&gt;&#xA;&lt;h1 id=&#34;make&#34;&gt;make&lt;/h1&gt;&#xA;&lt;h1 id=&#34;make-install&#34;&gt;make install&lt;/h1&gt;&#xA;&lt;p&gt;3.编译gcc&lt;/p&gt;&#xA;&lt;p&gt;#../configure &amp;ndash;enable-targets=all&amp;ndash;enable-languages=c &amp;ndash;disable-checking &amp;ndash;disable-shared &amp;ndash;disable-threads&amp;ndash;disable-multilib &amp;ndash;disable-nls &amp;ndash;disable-decimal-float &amp;ndash;disable-libgomp&amp;ndash;disable-libmudflap &amp;ndash;disable-libssp &amp;ndash;disable-bootstrap &amp;ndash;disable-libquadmath&amp;ndash;disable-libatomic &amp;ndash;without-headers &amp;ndash;with-newlib &amp;ndash;host=i686-linux-gnu  &amp;ndash;target=arm-none-linux-gnueabi&amp;ndash;prefix=/home/toolchain/arm-none-linux-gnueabi&#xA;#make -j4&#xA;#make install&#xA;使用make -j4可以4线程编译，加快速度，我的机器上大约用了8分钟编译完成。&lt;/p&gt;</description>
    </item>
    <item>
      <title>256点FFT函数</title>
      <link>https://xcdd.pages.dev/blog/2014/2014-03-10/</link>
      <pubDate>Mon, 10 Mar 2014 13:36:19 +0000</pubDate>
      <guid>https://xcdd.pages.dev/blog/2014/2014-03-10/</guid>
      <description>&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-cpp&#34; data-lang=&#34;cpp&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;从网上找到的一段感觉比较好的&lt;/span&gt;FFT函数&lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;，可以直接使用，出处由于时间原因已经忘记了@@&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-cpp&#34; data-lang=&#34;cpp&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;//文件名：fft.c&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;#include&lt;/span&gt; &lt;span style=&#34;color:#75715e&#34;&gt;&amp;#34;fft.h&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;//128等分余弦表&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;static&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;const&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;double&lt;/span&gt; cosTable[] &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;{&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&lt;span style=&#34;color:#ae81ff&#34;&gt;1.0000&lt;/span&gt;,&lt;span style=&#34;color:#ae81ff&#34;&gt;0.9997&lt;/span&gt;,&lt;span style=&#34;color:#ae81ff&#34;&gt;0.9988&lt;/span&gt;,&lt;span style=&#34;color:#ae81ff&#34;&gt;0.9973&lt;/span&gt;,&lt;span style=&#34;color:#ae81ff&#34;&gt;0.9952&lt;/span&gt;,&lt;span style=&#34;color:#ae81ff&#34;&gt;0.9925&lt;/span&gt;,&lt;span style=&#34;color:#ae81ff&#34;&gt;0.9892&lt;/span&gt;,&lt;span style=&#34;color:#ae81ff&#34;&gt;0.9853&lt;/span&gt;,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&lt;span style=&#34;color:#ae81ff&#34;&gt;0.9808&lt;/span&gt;,&lt;span style=&#34;color:#ae81ff&#34;&gt;0.9757&lt;/span&gt;,&lt;span style=&#34;color:#ae81ff&#34;&gt;0.9700&lt;/span&gt;,&lt;span style=&#34;color:#ae81ff&#34;&gt;0.9638&lt;/span&gt;,&lt;span style=&#34;color:#ae81ff&#34;&gt;0.9569&lt;/span&gt;,&lt;span style=&#34;color:#ae81ff&#34;&gt;0.9495&lt;/span&gt;,&lt;span style=&#34;color:#ae81ff&#34;&gt;0.9415&lt;/span&gt;,&lt;span style=&#34;color:#ae81ff&#34;&gt;0.9330&lt;/span&gt;,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&lt;span style=&#34;color:#ae81ff&#34;&gt;0.9239&lt;/span&gt;,&lt;span style=&#34;color:#ae81ff&#34;&gt;0.9142&lt;/span&gt;,&lt;span style=&#34;color:#ae81ff&#34;&gt;0.9040&lt;/span&gt;,&lt;span style=&#34;color:#ae81ff&#34;&gt;0.8932&lt;/span&gt;,&lt;span style=&#34;color:#ae81ff&#34;&gt;0.8819&lt;/span&gt;,&lt;span style=&#34;color:#ae81ff&#34;&gt;0.8701&lt;/span&gt;,&lt;span style=&#34;color:#ae81ff&#34;&gt;0.8577&lt;/span&gt;,&lt;span style=&#34;color:#ae81ff&#34;&gt;0.8449&lt;/span&gt;,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&lt;span style=&#34;color:#ae81ff&#34;&gt;0.8315&lt;/span&gt;,&lt;span style=&#34;color:#ae81ff&#34;&gt;0.8176&lt;/span&gt;,&lt;span style=&#34;color:#ae81ff&#34;&gt;0.8032&lt;/span&gt;,&lt;span style=&#34;color:#ae81ff&#34;&gt;0.7883&lt;/span&gt;,&lt;span style=&#34;color:#ae81ff&#34;&gt;0.7730&lt;/span&gt;,&lt;span style=&#34;color:#ae81ff&#34;&gt;0.7572&lt;/span&gt;,&lt;span style=&#34;color:#ae81ff&#34;&gt;0.7410&lt;/span&gt;,&lt;span style=&#34;color:#ae81ff&#34;&gt;0.7242&lt;/span&gt;,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&lt;span style=&#34;color:#ae81ff&#34;&gt;0.7071&lt;/span&gt;,&lt;span style=&#34;color:#ae81ff&#34;&gt;0.6895&lt;/span&gt;,&lt;span style=&#34;color:#ae81ff&#34;&gt;0.6716&lt;/span&gt;,&lt;span style=&#34;color:#ae81ff&#34;&gt;0.6532&lt;/span&gt;,&lt;span style=&#34;color:#ae81ff&#34;&gt;0.6344&lt;/span&gt;,&lt;span style=&#34;color:#ae81ff&#34;&gt;0.6152&lt;/span&gt;,&lt;span style=&#34;color:#ae81ff&#34;&gt;0.5957&lt;/span&gt;,&lt;span style=&#34;color:#ae81ff&#34;&gt;0.5758&lt;/span&gt;,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&lt;span style=&#34;color:#ae81ff&#34;&gt;0.5556&lt;/span&gt;,&lt;span style=&#34;color:#ae81ff&#34;&gt;0.5350&lt;/span&gt;,&lt;span style=&#34;color:#ae81ff&#34;&gt;0.5141&lt;/span&gt;,&lt;span style=&#34;color:#ae81ff&#34;&gt;0.4929&lt;/span&gt;,&lt;span style=&#34;color:#ae81ff&#34;&gt;0.4714&lt;/span&gt;,&lt;span style=&#34;color:#ae81ff&#34;&gt;0.4496&lt;/span&gt;,&lt;span style=&#34;color:#ae81ff&#34;&gt;0.4276&lt;/span&gt;,&lt;span style=&#34;color:#ae81ff&#34;&gt;0.4052&lt;/span&gt;,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&lt;span style=&#34;color:#ae81ff&#34;&gt;0.3827&lt;/span&gt;,&lt;span style=&#34;color:#ae81ff&#34;&gt;0.3599&lt;/span&gt;,&lt;span style=&#34;color:#ae81ff&#34;&gt;0.3369&lt;/span&gt;,&lt;span style=&#34;color:#ae81ff&#34;&gt;0.3137&lt;/span&gt;,&lt;span style=&#34;color:#ae81ff&#34;&gt;0.2903&lt;/span&gt;,&lt;span style=&#34;color:#ae81ff&#34;&gt;0.2667&lt;/span&gt;,&lt;span style=&#34;color:#ae81ff&#34;&gt;0.2430&lt;/span&gt;,&lt;span style=&#34;color:#ae81ff&#34;&gt;0.2191&lt;/span&gt;,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&lt;span style=&#34;color:#ae81ff&#34;&gt;0.1951&lt;/span&gt;,&lt;span style=&#34;color:#ae81ff&#34;&gt;0.1710&lt;/span&gt;,&lt;span style=&#34;color:#ae81ff&#34;&gt;0.1467&lt;/span&gt;,&lt;span style=&#34;color:#ae81ff&#34;&gt;0.1224&lt;/span&gt;,&lt;span style=&#34;color:#ae81ff&#34;&gt;0.0980&lt;/span&gt;,&lt;span style=&#34;color:#ae81ff&#34;&gt;0.0736&lt;/span&gt;,&lt;span style=&#34;color:#ae81ff&#34;&gt;0.0491&lt;/span&gt;,&lt;span style=&#34;color:#ae81ff&#34;&gt;0.0245&lt;/span&gt;,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;0.0000&lt;/span&gt;,&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;0.0245&lt;/span&gt;,&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;0.0491&lt;/span&gt;,&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;0.0736&lt;/span&gt;,&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;0.0980&lt;/span&gt;,&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;0.1224&lt;/span&gt;,&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;0.1467&lt;/span&gt;,&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;0.1710&lt;/span&gt;,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;0.1951&lt;/span&gt;,&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;0.2191&lt;/span&gt;,&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;0.2430&lt;/span&gt;,&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;0.2667&lt;/span&gt;,&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;0.2903&lt;/span&gt;,&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;0.3137&lt;/span&gt;,&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;0.3369&lt;/span&gt;,&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;0.3599&lt;/span&gt;,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;0.3827&lt;/span&gt;,&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;0.4052&lt;/span&gt;,&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;0.4276&lt;/span&gt;,&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;0.4496&lt;/span&gt;,&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;0.4714&lt;/span&gt;,&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;0.4929&lt;/span&gt;,&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;0.5141&lt;/span&gt;,&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;0.5350&lt;/span&gt;,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;0.5556&lt;/span&gt;,&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;0.5758&lt;/span&gt;,&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;0.5957&lt;/span&gt;,&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;0.6152&lt;/span&gt;,&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;0.6344&lt;/span&gt;,&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;0.6532&lt;/span&gt;,&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;0.6716&lt;/span&gt;,&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;0.6895&lt;/span&gt;,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;0.7071&lt;/span&gt;,&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;0.7242&lt;/span&gt;,&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;0.7410&lt;/span&gt;,&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;0.7572&lt;/span&gt;,&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;0.7730&lt;/span&gt;,&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;0.7883&lt;/span&gt;,&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;0.8032&lt;/span&gt;,&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;0.8176&lt;/span&gt;,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;0.8315&lt;/span&gt;,&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;0.8449&lt;/span&gt;,&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;0.8577&lt;/span&gt;,&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;0.8701&lt;/span&gt;,&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;0.8819&lt;/span&gt;,&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;0.8932&lt;/span&gt;,&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;0.9040&lt;/span&gt;,&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;0.9142&lt;/span&gt;,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;0.9239&lt;/span&gt;,&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;0.9330&lt;/span&gt;,&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;0.9415&lt;/span&gt;,&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;0.9495&lt;/span&gt;,&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;0.9569&lt;/span&gt;,&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;0.9638&lt;/span&gt;,&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;0.9700&lt;/span&gt;,&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;0.9757&lt;/span&gt;,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;0.9808&lt;/span&gt;,&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;0.9853&lt;/span&gt;,&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;0.9892&lt;/span&gt;,&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;0.9925&lt;/span&gt;,&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;0.9952&lt;/span&gt;,&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;0.9973&lt;/span&gt;,&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;0.9988&lt;/span&gt;,&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;0.9997&lt;/span&gt;,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;};&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;//128等分正弦表&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;static&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;const&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;double&lt;/span&gt; sinTable[] &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;{&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&lt;span style=&#34;color:#ae81ff&#34;&gt;0.0000&lt;/span&gt;,&lt;span style=&#34;color:#ae81ff&#34;&gt;0.0245&lt;/span&gt;,&lt;span style=&#34;color:#ae81ff&#34;&gt;0.0491&lt;/span&gt;,&lt;span style=&#34;color:#ae81ff&#34;&gt;0.0736&lt;/span&gt;,&lt;span style=&#34;color:#ae81ff&#34;&gt;0.0980&lt;/span&gt;,&lt;span style=&#34;color:#ae81ff&#34;&gt;0.1224&lt;/span&gt;,&lt;span style=&#34;color:#ae81ff&#34;&gt;0.1467&lt;/span&gt;,&lt;span style=&#34;color:#ae81ff&#34;&gt;0.1710&lt;/span&gt;,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&lt;span style=&#34;color:#ae81ff&#34;&gt;0.1951&lt;/span&gt;,&lt;span style=&#34;color:#ae81ff&#34;&gt;0.2191&lt;/span&gt;,&lt;span style=&#34;color:#ae81ff&#34;&gt;0.2430&lt;/span&gt;,&lt;span style=&#34;color:#ae81ff&#34;&gt;0.2667&lt;/span&gt;,&lt;span style=&#34;color:#ae81ff&#34;&gt;0.2903&lt;/span&gt;,&lt;span style=&#34;color:#ae81ff&#34;&gt;0.3137&lt;/span&gt;,&lt;span style=&#34;color:#ae81ff&#34;&gt;0.3369&lt;/span&gt;,&lt;span style=&#34;color:#ae81ff&#34;&gt;0.3599&lt;/span&gt;,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&lt;span style=&#34;color:#ae81ff&#34;&gt;0.3827&lt;/span&gt;,&lt;span style=&#34;color:#ae81ff&#34;&gt;0.4052&lt;/span&gt;,&lt;span style=&#34;color:#ae81ff&#34;&gt;0.4276&lt;/span&gt;,&lt;span style=&#34;color:#ae81ff&#34;&gt;0.4496&lt;/span&gt;,&lt;span style=&#34;color:#ae81ff&#34;&gt;0.4714&lt;/span&gt;,&lt;span style=&#34;color:#ae81ff&#34;&gt;0.4929&lt;/span&gt;,&lt;span style=&#34;color:#ae81ff&#34;&gt;0.5141&lt;/span&gt;,&lt;span style=&#34;color:#ae81ff&#34;&gt;0.5350&lt;/span&gt;,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&lt;span style=&#34;color:#ae81ff&#34;&gt;0.5556&lt;/span&gt;,&lt;span style=&#34;color:#ae81ff&#34;&gt;0.5758&lt;/span&gt;,&lt;span style=&#34;color:#ae81ff&#34;&gt;0.5957&lt;/span&gt;,&lt;span style=&#34;color:#ae81ff&#34;&gt;0.6152&lt;/span&gt;,&lt;span style=&#34;color:#ae81ff&#34;&gt;0.6344&lt;/span&gt;,&lt;span style=&#34;color:#ae81ff&#34;&gt;0.6532&lt;/span&gt;,&lt;span style=&#34;color:#ae81ff&#34;&gt;0.6716&lt;/span&gt;,&lt;span style=&#34;color:#ae81ff&#34;&gt;0.6895&lt;/span&gt;,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&lt;span style=&#34;color:#ae81ff&#34;&gt;0.7071&lt;/span&gt;,&lt;span style=&#34;color:#ae81ff&#34;&gt;0.7242&lt;/span&gt;,&lt;span style=&#34;color:#ae81ff&#34;&gt;0.7410&lt;/span&gt;,&lt;span style=&#34;color:#ae81ff&#34;&gt;0.7572&lt;/span&gt;,&lt;span style=&#34;color:#ae81ff&#34;&gt;0.7730&lt;/span&gt;,&lt;span style=&#34;color:#ae81ff&#34;&gt;0.7883&lt;/span&gt;,&lt;span style=&#34;color:#ae81ff&#34;&gt;0.8032&lt;/span&gt;,&lt;span style=&#34;color:#ae81ff&#34;&gt;0.8176&lt;/span&gt;,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&lt;span style=&#34;color:#ae81ff&#34;&gt;0.8315&lt;/span&gt;,&lt;span style=&#34;color:#ae81ff&#34;&gt;0.8449&lt;/span&gt;,&lt;span style=&#34;color:#ae81ff&#34;&gt;0.8577&lt;/span&gt;,&lt;span style=&#34;color:#ae81ff&#34;&gt;0.8701&lt;/span&gt;,&lt;span style=&#34;color:#ae81ff&#34;&gt;0.8819&lt;/span&gt;,&lt;span style=&#34;color:#ae81ff&#34;&gt;0.8932&lt;/span&gt;,&lt;span style=&#34;color:#ae81ff&#34;&gt;0.9040&lt;/span&gt;,&lt;span style=&#34;color:#ae81ff&#34;&gt;0.9142&lt;/span&gt;,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&lt;span style=&#34;color:#ae81ff&#34;&gt;0.9239&lt;/span&gt;,&lt;span style=&#34;color:#ae81ff&#34;&gt;0.9330&lt;/span&gt;,&lt;span style=&#34;color:#ae81ff&#34;&gt;0.9415&lt;/span&gt;,&lt;span style=&#34;color:#ae81ff&#34;&gt;0.9495&lt;/span&gt;,&lt;span style=&#34;color:#ae81ff&#34;&gt;0.9569&lt;/span&gt;,&lt;span style=&#34;color:#ae81ff&#34;&gt;0.9638&lt;/span&gt;,&lt;span style=&#34;color:#ae81ff&#34;&gt;0.9700&lt;/span&gt;,&lt;span style=&#34;color:#ae81ff&#34;&gt;0.9757&lt;/span&gt;,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&lt;span style=&#34;color:#ae81ff&#34;&gt;0.9808&lt;/span&gt;,&lt;span style=&#34;color:#ae81ff&#34;&gt;0.9853&lt;/span&gt;,&lt;span style=&#34;color:#ae81ff&#34;&gt;0.9892&lt;/span&gt;,&lt;span style=&#34;color:#ae81ff&#34;&gt;0.9925&lt;/span&gt;,&lt;span style=&#34;color:#ae81ff&#34;&gt;0.9952&lt;/span&gt;,&lt;span style=&#34;color:#ae81ff&#34;&gt;0.9973&lt;/span&gt;,&lt;span style=&#34;color:#ae81ff&#34;&gt;0.9988&lt;/span&gt;,&lt;span style=&#34;color:#ae81ff&#34;&gt;0.9997&lt;/span&gt;,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&lt;span style=&#34;color:#ae81ff&#34;&gt;1.0000&lt;/span&gt;,&lt;span style=&#34;color:#ae81ff&#34;&gt;0.9997&lt;/span&gt;,&lt;span style=&#34;color:#ae81ff&#34;&gt;0.9988&lt;/span&gt;,&lt;span style=&#34;color:#ae81ff&#34;&gt;0.9973&lt;/span&gt;,&lt;span style=&#34;color:#ae81ff&#34;&gt;0.9952&lt;/span&gt;,&lt;span style=&#34;color:#ae81ff&#34;&gt;0.9925&lt;/span&gt;,&lt;span style=&#34;color:#ae81ff&#34;&gt;0.9892&lt;/span&gt;,&lt;span style=&#34;color:#ae81ff&#34;&gt;0.9853&lt;/span&gt;,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&lt;span style=&#34;color:#ae81ff&#34;&gt;0.9808&lt;/span&gt;,&lt;span style=&#34;color:#ae81ff&#34;&gt;0.9757&lt;/span&gt;,&lt;span style=&#34;color:#ae81ff&#34;&gt;0.9700&lt;/span&gt;,&lt;span style=&#34;color:#ae81ff&#34;&gt;0.9638&lt;/span&gt;,&lt;span style=&#34;color:#ae81ff&#34;&gt;0.9569&lt;/span&gt;,&lt;span style=&#34;color:#ae81ff&#34;&gt;0.9495&lt;/span&gt;,&lt;span style=&#34;color:#ae81ff&#34;&gt;0.9415&lt;/span&gt;,&lt;span style=&#34;color:#ae81ff&#34;&gt;0.9330&lt;/span&gt;,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&lt;span style=&#34;color:#ae81ff&#34;&gt;0.9239&lt;/span&gt;,&lt;span style=&#34;color:#ae81ff&#34;&gt;0.9142&lt;/span&gt;,&lt;span style=&#34;color:#ae81ff&#34;&gt;0.9040&lt;/span&gt;,&lt;span style=&#34;color:#ae81ff&#34;&gt;0.8932&lt;/span&gt;,&lt;span style=&#34;color:#ae81ff&#34;&gt;0.8819&lt;/span&gt;,&lt;span style=&#34;color:#ae81ff&#34;&gt;0.8701&lt;/span&gt;,&lt;span style=&#34;color:#ae81ff&#34;&gt;0.8577&lt;/span&gt;,&lt;span style=&#34;color:#ae81ff&#34;&gt;0.8449&lt;/span&gt;,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&lt;span style=&#34;color:#ae81ff&#34;&gt;0.8315&lt;/span&gt;,&lt;span style=&#34;color:#ae81ff&#34;&gt;0.8176&lt;/span&gt;,&lt;span style=&#34;color:#ae81ff&#34;&gt;0.8032&lt;/span&gt;,&lt;span style=&#34;color:#ae81ff&#34;&gt;0.7883&lt;/span&gt;,&lt;span style=&#34;color:#ae81ff&#34;&gt;0.7730&lt;/span&gt;,&lt;span style=&#34;color:#ae81ff&#34;&gt;0.7572&lt;/span&gt;,&lt;span style=&#34;color:#ae81ff&#34;&gt;0.7410&lt;/span&gt;,&lt;span style=&#34;color:#ae81ff&#34;&gt;0.7242&lt;/span&gt;,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&lt;span style=&#34;color:#ae81ff&#34;&gt;0.7071&lt;/span&gt;,&lt;span style=&#34;color:#ae81ff&#34;&gt;0.6895&lt;/span&gt;,&lt;span style=&#34;color:#ae81ff&#34;&gt;0.6716&lt;/span&gt;,&lt;span style=&#34;color:#ae81ff&#34;&gt;0.6532&lt;/span&gt;,&lt;span style=&#34;color:#ae81ff&#34;&gt;0.6344&lt;/span&gt;,&lt;span style=&#34;color:#ae81ff&#34;&gt;0.6152&lt;/span&gt;,&lt;span style=&#34;color:#ae81ff&#34;&gt;0.5957&lt;/span&gt;,&lt;span style=&#34;color:#ae81ff&#34;&gt;0.5758&lt;/span&gt;,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&lt;span style=&#34;color:#ae81ff&#34;&gt;0.5556&lt;/span&gt;,&lt;span style=&#34;color:#ae81ff&#34;&gt;0.5350&lt;/span&gt;,&lt;span style=&#34;color:#ae81ff&#34;&gt;0.5141&lt;/span&gt;,&lt;span style=&#34;color:#ae81ff&#34;&gt;0.4929&lt;/span&gt;,&lt;span style=&#34;color:#ae81ff&#34;&gt;0.4714&lt;/span&gt;,&lt;span style=&#34;color:#ae81ff&#34;&gt;0.4496&lt;/span&gt;,&lt;span style=&#34;color:#ae81ff&#34;&gt;0.4276&lt;/span&gt;,&lt;span style=&#34;color:#ae81ff&#34;&gt;0.4052&lt;/span&gt;,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&lt;span style=&#34;color:#ae81ff&#34;&gt;0.3827&lt;/span&gt;,&lt;span style=&#34;color:#ae81ff&#34;&gt;0.3599&lt;/span&gt;,&lt;span style=&#34;color:#ae81ff&#34;&gt;0.3369&lt;/span&gt;,&lt;span style=&#34;color:#ae81ff&#34;&gt;0.3137&lt;/span&gt;,&lt;span style=&#34;color:#ae81ff&#34;&gt;0.2903&lt;/span&gt;,&lt;span style=&#34;color:#ae81ff&#34;&gt;0.2667&lt;/span&gt;,&lt;span style=&#34;color:#ae81ff&#34;&gt;0.2430&lt;/span&gt;,&lt;span style=&#34;color:#ae81ff&#34;&gt;0.2191&lt;/span&gt;,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&lt;span style=&#34;color:#ae81ff&#34;&gt;0.1951&lt;/span&gt;,&lt;span style=&#34;color:#ae81ff&#34;&gt;0.1710&lt;/span&gt;,&lt;span style=&#34;color:#ae81ff&#34;&gt;0.1467&lt;/span&gt;,&lt;span style=&#34;color:#ae81ff&#34;&gt;0.1224&lt;/span&gt;,&lt;span style=&#34;color:#ae81ff&#34;&gt;0.0980&lt;/span&gt;,&lt;span style=&#34;color:#ae81ff&#34;&gt;0.0736&lt;/span&gt;,&lt;span style=&#34;color:#ae81ff&#34;&gt;0.0491&lt;/span&gt;,&lt;span style=&#34;color:#ae81ff&#34;&gt;0.0245&lt;/span&gt;,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;};&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;//快速求平方根&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;float&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;sqrt_fast&lt;/span&gt;(&lt;span style=&#34;color:#66d9ef&#34;&gt;float&lt;/span&gt; x)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;{&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&lt;span style=&#34;color:#66d9ef&#34;&gt;long&lt;/span&gt;  lx;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&lt;span style=&#34;color:#66d9ef&#34;&gt;float&lt;/span&gt; temp;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&lt;span style=&#34;color:#66d9ef&#34;&gt;float&lt;/span&gt; xhalf &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; x &lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;0.5f&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;lx &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;((&lt;span style=&#34;color:#66d9ef&#34;&gt;long&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;)&lt;span style=&#34;color:#f92672&#34;&gt;&amp;amp;&lt;/span&gt;x);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;lx &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;0x5F375A86&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt; (lx&lt;span style=&#34;color:#f92672&#34;&gt;&amp;gt;&amp;gt;&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;temp &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;((&lt;span style=&#34;color:#66d9ef&#34;&gt;float&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;)&lt;span style=&#34;color:#f92672&#34;&gt;&amp;amp;&lt;/span&gt;lx);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;temp &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; temp&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;(&lt;span style=&#34;color:#ae81ff&#34;&gt;1.5f&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt; xhalf&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;temp&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;temp);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;temp &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; temp&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;(&lt;span style=&#34;color:#ae81ff&#34;&gt;1.5f&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt; xhalf&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;temp&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;temp);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;temp &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; temp&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;(&lt;span style=&#34;color:#ae81ff&#34;&gt;1.5f&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt; xhalf&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;temp&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;temp);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt; temp &lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt; x;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;//8bit位反转&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;unsigned&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;char&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;bitrev&lt;/span&gt;(&lt;span style=&#34;color:#66d9ef&#34;&gt;unsigned&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;char&lt;/span&gt; i)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;{&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&lt;span style=&#34;color:#66d9ef&#34;&gt;unsigned&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;char&lt;/span&gt; r&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;r &lt;span style=&#34;color:#f92672&#34;&gt;|=&lt;/span&gt; (i&lt;span style=&#34;color:#f92672&#34;&gt;&amp;gt;&amp;gt;&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;)&lt;span style=&#34;color:#f92672&#34;&gt;&amp;amp;&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;0x01&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;r&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;&amp;lt;=&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;r &lt;span style=&#34;color:#f92672&#34;&gt;|=&lt;/span&gt; (i&lt;span style=&#34;color:#f92672&#34;&gt;&amp;gt;&amp;gt;&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;)&lt;span style=&#34;color:#f92672&#34;&gt;&amp;amp;&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;0x01&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;r&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;&amp;lt;=&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;r &lt;span style=&#34;color:#f92672&#34;&gt;|=&lt;/span&gt; (i&lt;span style=&#34;color:#f92672&#34;&gt;&amp;gt;&amp;gt;&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;2&lt;/span&gt;)&lt;span style=&#34;color:#f92672&#34;&gt;&amp;amp;&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;0x01&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;r&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;&amp;lt;=&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;r &lt;span style=&#34;color:#f92672&#34;&gt;|=&lt;/span&gt; (i&lt;span style=&#34;color:#f92672&#34;&gt;&amp;gt;&amp;gt;&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;3&lt;/span&gt;)&lt;span style=&#34;color:#f92672&#34;&gt;&amp;amp;&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;0x01&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;r&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;&amp;lt;=&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;r &lt;span style=&#34;color:#f92672&#34;&gt;|=&lt;/span&gt; (i&lt;span style=&#34;color:#f92672&#34;&gt;&amp;gt;&amp;gt;&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;4&lt;/span&gt;)&lt;span style=&#34;color:#f92672&#34;&gt;&amp;amp;&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;0x01&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;r&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;&amp;lt;=&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;r &lt;span style=&#34;color:#f92672&#34;&gt;|=&lt;/span&gt; (i&lt;span style=&#34;color:#f92672&#34;&gt;&amp;gt;&amp;gt;&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;5&lt;/span&gt;)&lt;span style=&#34;color:#f92672&#34;&gt;&amp;amp;&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;0x01&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;r&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;&amp;lt;=&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;r &lt;span style=&#34;color:#f92672&#34;&gt;|=&lt;/span&gt; (i&lt;span style=&#34;color:#f92672&#34;&gt;&amp;gt;&amp;gt;&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;6&lt;/span&gt;)&lt;span style=&#34;color:#f92672&#34;&gt;&amp;amp;&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;0x01&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;r&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;&amp;lt;=&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;r &lt;span style=&#34;color:#f92672&#34;&gt;|=&lt;/span&gt; (i&lt;span style=&#34;color:#f92672&#34;&gt;&amp;gt;&amp;gt;&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;7&lt;/span&gt;)&lt;span style=&#34;color:#f92672&#34;&gt;&amp;amp;&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;0x01&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt; r;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;//256点 fft运算&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;//输入256个采样数据,只用实数部分，虚数为0&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;//输出128个频域数据,已将复数转换为幅度(频谱)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;void&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;FFT256&lt;/span&gt;(&lt;span style=&#34;color:#66d9ef&#34;&gt;long&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt; pInputData, &lt;span style=&#34;color:#66d9ef&#34;&gt;long&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt; pOutputData)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;{&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&lt;span style=&#34;color:#66d9ef&#34;&gt;double&lt;/span&gt;&#x9;real[&lt;span style=&#34;color:#ae81ff&#34;&gt;256&lt;/span&gt;];&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&lt;span style=&#34;color:#66d9ef&#34;&gt;double&lt;/span&gt;&#x9;imag[&lt;span style=&#34;color:#ae81ff&#34;&gt;256&lt;/span&gt;];&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&lt;span style=&#34;color:#66d9ef&#34;&gt;long&lt;/span&gt;&#x9;swap;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&lt;span style=&#34;color:#66d9ef&#34;&gt;long&lt;/span&gt;&#x9;offset;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&lt;span style=&#34;color:#66d9ef&#34;&gt;double&lt;/span&gt;&#x9;tmp_real, tmp_imag, temp;&lt;span style=&#34;color:#75715e&#34;&gt;// 临时变量, 记录实部&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;&#x9;&lt;span style=&#34;color:#66d9ef&#34;&gt;double&lt;/span&gt;&#x9;tw1, tw2;&#x9;&lt;span style=&#34;color:#75715e&#34;&gt;// 旋转因子,tw1为旋转因子的实部cos部分, tw2为旋转因子的虚部sin部分.&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;&#x9;&lt;span style=&#34;color:#66d9ef&#34;&gt;long&lt;/span&gt;&#x9;cur_layer, gr_num, i, k, p;      &#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&lt;span style=&#34;color:#66d9ef&#34;&gt;long&lt;/span&gt;&#x9;step;&#x9;&#x9;&#x9;&lt;span style=&#34;color:#75715e&#34;&gt;// 步进&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;&#x9;&lt;span style=&#34;color:#66d9ef&#34;&gt;long&lt;/span&gt;&#x9;sample_num;&#x9;&#x9;&lt;span style=&#34;color:#75715e&#34;&gt;// 颗粒的样本总数(各层不同, 因为各层颗粒的输入不同) &#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&lt;span style=&#34;color:#75715e&#34;&gt;//虚部为0&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;&#x9;&lt;span style=&#34;color:#66d9ef&#34;&gt;for&lt;/span&gt;(i&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;; i&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;256&lt;/span&gt;; i&lt;span style=&#34;color:#f92672&#34;&gt;++&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;{&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&#x9;imag[i] &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&#x9;real[i] &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&lt;span style=&#34;color:#75715e&#34;&gt;//倒位序&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;&#x9;&lt;span style=&#34;color:#66d9ef&#34;&gt;for&lt;/span&gt;(i&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;; i&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;256&lt;/span&gt;; i&lt;span style=&#34;color:#f92672&#34;&gt;++&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;{&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&#x9;swap &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; bitrev((&lt;span style=&#34;color:#66d9ef&#34;&gt;unsigned&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;char&lt;/span&gt;)i);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&#x9;real[swap] &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; (&lt;span style=&#34;color:#66d9ef&#34;&gt;float&lt;/span&gt;)pInputData[i];&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&lt;span style=&#34;color:#75715e&#34;&gt;// 对层循环&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;&#x9;&lt;span style=&#34;color:#66d9ef&#34;&gt;for&lt;/span&gt;(cur_layer&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;; cur_layer&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;=&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;8&lt;/span&gt;; cur_layer&lt;span style=&#34;color:#f92672&#34;&gt;++&lt;/span&gt;)&#x9;&lt;span style=&#34;color:#75715e&#34;&gt;//2^8=256,所以循环8次&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;&#x9;{      &#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&#x9;&lt;span style=&#34;color:#75715e&#34;&gt;// 求当前层拥有多少个颗粒(gr_num)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;&#x9;&#x9;i &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;8&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt; cur_layer;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&#x9;gr_num&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;&amp;lt;&lt;/span&gt;i;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&#x9;&lt;span style=&#34;color:#75715e&#34;&gt;//每个颗粒的输入样本数N&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;&#x9;&#x9;sample_num &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;&amp;lt;&lt;/span&gt;cur_layer;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&#x9;&lt;span style=&#34;color:#75715e&#34;&gt;//步进. 步进是N/2&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;&#x9;&#x9;step &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; sample_num&lt;span style=&#34;color:#f92672&#34;&gt;/&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;2&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&#x9;k &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&#x9;&lt;span style=&#34;color:#75715e&#34;&gt;//对颗粒进行循环&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;&#x9;&#x9;&lt;span style=&#34;color:#66d9ef&#34;&gt;for&lt;/span&gt;(i&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;; i&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;&lt;/span&gt;gr_num; i&lt;span style=&#34;color:#f92672&#34;&gt;++&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&#x9;{&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&#x9;&#x9;&lt;span style=&#34;color:#75715e&#34;&gt;//对样本点进行循环, 注意上限和步进&#x9;&#x9;&#x9;&#x9;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;&#x9;&#x9;&#x9;&lt;span style=&#34;color:#66d9ef&#34;&gt;for&lt;/span&gt;(p&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;; p&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;&lt;/span&gt;sample_num&lt;span style=&#34;color:#f92672&#34;&gt;/&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;2&lt;/span&gt;; p&lt;span style=&#34;color:#f92672&#34;&gt;++&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&#x9;&#x9;{   &#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&#x9;&#x9;&#x9;offset &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; p&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;gr_num;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&#x9;&#x9;&#x9;tw1 &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; cosTable[offset];&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&#x9;&#x9;&#x9;tw2 &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; sinTable[offset];&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&#x9;&#x9;&#x9;tmp_real &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; real[k&lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt;p];&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&#x9;&#x9;&#x9;tmp_imag &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; imag[k&lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt;p];&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&#x9;&#x9;&#x9;temp &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; real[k&lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt;p&lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt;step];             &#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&#x9;&#x9;&#x9;&lt;span style=&#34;color:#75715e&#34;&gt;//蝶形算法&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;&#x9;&#x9;&#x9;&#x9;real[k&lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt;p]   &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; tmp_real &lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt; ( tw1&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;real[k&lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt;p&lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt;step] &lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt; tw2&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;imag[k&lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt;p&lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt;step] );&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&#x9;&#x9;&#x9;imag[k&lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt;p]   &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; tmp_imag &lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt; ( tw2&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;real[k&lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt;p&lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt;step] &lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt; tw1&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;imag[k&lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt;p&lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt;step] );&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&#x9;&#x9;&#x9;real[k&lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt;p&lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt;step] &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; tmp_real &lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt; ( tw1&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;temp &lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt; tw2&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;imag[k&lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt;p&lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt;step] );&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&#x9;&#x9;&#x9;imag[k&lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt;p&lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt;step] &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; tmp_imag &lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt; ( tw2&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;temp &lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt; tw1&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;imag[k&lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt;p&lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt;step] );             &#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&#x9;&#x9;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&#x9;&#x9;&lt;span style=&#34;color:#75715e&#34;&gt;//开跳&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;&#x9;&#x9;&#x9;k &lt;span style=&#34;color:#f92672&#34;&gt;+=&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;2&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;step;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&#x9;}   &#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&lt;span style=&#34;color:#75715e&#34;&gt;//对复数求平方根&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;&#x9;&lt;span style=&#34;color:#66d9ef&#34;&gt;for&lt;/span&gt;(i&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;; i&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;128&lt;/span&gt;;i&lt;span style=&#34;color:#f92672&#34;&gt;++&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;{&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&#x9;temp &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; real[i]&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;real[i] &lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt; imag[i]&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;imag[i];&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&#x9;temp &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; sqrt_fast(temp);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&#x9;pOutputData[i] &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; (&lt;span style=&#34;color:#66d9ef&#34;&gt;long&lt;/span&gt;)temp;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description>
    </item>
    <item>
      <title>FFT总结</title>
      <link>https://xcdd.pages.dev/blog/2014/2014-03-08/</link>
      <pubDate>Sat, 08 Mar 2014 13:53:12 +0000</pubDate>
      <guid>https://xcdd.pages.dev/blog/2014/2014-03-08/</guid>
      <description>&lt;p&gt;FFT是离散傅立叶变换的快速算法，可以将一个信号变换到频域。&lt;/p&gt;&#xA;&lt;p&gt;一个模拟信号，经过ADC采样之后，就变成了数字信号。&lt;/p&gt;&#xA;&lt;p&gt;采样得到的数字信号，就可以做FFT变换了。&lt;/p&gt;&#xA;&lt;p&gt;N个采样点，经过FFT之后，就可以得到N个点的FFT结果。&lt;/p&gt;&#xA;&lt;p&gt;为了方便进行FFT运算，通常N取2的整数次方。&lt;/p&gt;&#xA;&lt;p&gt;假设采样频率为Fs，信号频率F，采样点数为N。&lt;/p&gt;&#xA;&lt;p&gt;那么FFT之后结果就是一个为N点的复数。&lt;/p&gt;&#xA;&lt;p&gt;每一个点就对应着一个频率点。&lt;/p&gt;&#xA;&lt;p&gt;第n点所表示的频率为：Fn=(n-1)*Fs/N。&lt;/p&gt;&#xA;&lt;p&gt;FFT的结果是中心对称，中心点频率为Fs/2。&lt;/p&gt;&#xA;&lt;p&gt;假设原始信号的峰值为A，那么FFT的结果的每个点的模值就是A的N/2倍。&lt;/p&gt;&#xA;&lt;p&gt;第一个点例外，是直流分量，它的模值就是直流分量的N倍。&lt;/p&gt;</description>
    </item>
    <item>
      <title>WAV音频文件格式</title>
      <link>https://xcdd.pages.dev/blog/2014/2014-03-07/</link>
      <pubDate>Fri, 07 Mar 2014 17:34:54 +0000</pubDate>
      <guid>https://xcdd.pages.dev/blog/2014/2014-03-07/</guid>
      <description>&lt;table&gt;&#xA;  &lt;thead&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;th style=&#34;text-align: center&#34;&gt;起始地址&lt;/th&gt;&#xA;          &lt;th style=&#34;text-align: center&#34;&gt;占用空间&lt;/th&gt;&#xA;          &lt;th style=&#34;text-align: center&#34;&gt;本地址数字的含义&lt;/th&gt;&#xA;      &lt;/tr&gt;&#xA;  &lt;/thead&gt;&#xA;  &lt;tbody&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;00H&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;4byte&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;RIFF，资源交换文件标志。&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;04H&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;4byte&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;从下一个地址开始到文件尾的总字节数。高位字节在后面，这里就是001437ECH，换成十进制是1325036byte，算上这之前的8byte就正好1325044byte了。&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;08H&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;4byte&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;WAVE，代表wav文件格式。&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;0CH&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;4byte&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;FMT ，波形格式标志&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;10H&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;4byte&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;00000010H，16PCM，我的理解是用16bit的数据表示一个量化结果。&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;14H&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;2byte&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;为1时表示线性PCM编码，大于1时表示有压缩的编码。这里是0001H。&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;16H&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;2byte&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;1为单声道，2为双声道，这里是0001H。&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;18H&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;4byte&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;采样频率，这里是00002B11H，也就是11025Hz。&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;1CH&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;4byte&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;Byte率=采样频率&lt;em&gt;音频通道数&lt;/em&gt;每次采样得到的样本位数/8，00005622H，也就是22050Byte/s=11025&lt;em&gt;1&lt;/em&gt;16/2。&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;20H&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;2byte&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;块对齐=通道数&lt;em&gt;每次采样得到的样本位数/8，0002H，也就是2=1&lt;/em&gt;16/8。&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;22H&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;2byte&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;样本数据位数，0010H即16，一个量化样本占2byte。&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;24H&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;4byte&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;data，一个标志而已。&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;28H&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;4byte&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;Wav文件实际音频数据所占的大小，这里是001437C8H即1325000，再加上2CH就正好是1325044，整个文件的大小。&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;2CH&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;不定&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;量化数据。&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;  &lt;/tbody&gt;&#xA;&lt;/table&gt;</description>
    </item>
    <item>
      <title>GCC编译静态库和动态库</title>
      <link>https://xcdd.pages.dev/blog/2014/2014-01-22/</link>
      <pubDate>Wed, 22 Jan 2014 17:23:50 +0000</pubDate>
      <guid>https://xcdd.pages.dev/blog/2014/2014-01-22/</guid>
      <description>&lt;p&gt;&lt;strong&gt;一、动态库的编译和使用&lt;/strong&gt; ```cpp&#xA;//hello.c&#xA;#include&amp;lt;stdio.h&amp;gt;&lt;br&gt;&#xA;void hello()&lt;br&gt;&#xA;{&#xA;printf(&amp;ldquo;This is hello!\n&amp;rdquo;);&lt;br&gt;&#xA;}&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;&#xD;&#xA;编译命令：gcc -shared hello.c -o libhello.so&#xD;&#xA;&#xD;&#xA;可以看到，当前目录下多了一个文件libhello.so&#xD;&#xA;&#xD;&#xA;&#xD;&#xA;&#xD;&#xA;测试test.c&#xD;&#xA;&#xD;&#xA;```cpp&#xD;&#xA;//test.c&#xD;&#xA;#include&amp;lt;stdio.h&amp;gt;&#xD;&#xA;int main()&#xD;&#xA;{&#xD;&#xA;&#x9;printf(&amp;#34;call hello()\n&amp;#34;);&#xD;&#xA;&#x9;hello();&#xD;&#xA;}&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;编译这个测试程序：gcc test.c -lhello -L. -o test&lt;/p&gt;&#xA;&lt;p&gt;-lhello 指定要连接的库，文件名默认规则是libxxx.so&lt;/p&gt;&#xA;&lt;p&gt;-L . 是指定库的目录&lt;/p&gt;&#xA;&lt;p&gt;注意：编译成功但是执行会出错，执行是动态连接这个库会找不到路径，可以复制libhello.so到 /usr/lib等共用lib目录&lt;/p&gt;&#xA;&lt;p&gt;或者修改环境变量export LD_LIBRARY_PATH=.:$LD_LIBRARY_PATH&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;二、静态库的编译和使用&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;编译命令：gcc -c hello.c   这里会生成hello.o&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;生成静态库：ar -r libhello.a hello.o   将hello.o插入静态库&lt;/p&gt;&#xA;&lt;p&gt;编译测试程序：&lt;/p&gt;&#xA;&lt;p&gt;gcc test.c -lhello -L. -static -o hello.out&lt;/p&gt;&#xA;&lt;p&gt;gcc test.c libhello.a -L. -o hello.out&lt;/p&gt;</description>
    </item>
    <item>
      <title>USB描述符结构说明</title>
      <link>https://xcdd.pages.dev/blog/2013/2013-12-19/</link>
      <pubDate>Thu, 19 Dec 2013 11:36:24 +0000</pubDate>
      <guid>https://xcdd.pages.dev/blog/2013/2013-12-19/</guid>
      <description>&lt;p&gt;转载出处： &lt;a href=&#34;http://justmei.blog.163.com/blog/static/11609985320102421659260/?latestBlog&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;http://justmei.blog.163.com/blog/static/11609985320102421659260/?latestBlog&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;USB是个通用的总线，端口都是统一的。但是USB设备却各种各样，例如USB鼠标，USB键盘，U盘等等，那么USB主机是如何识别出不同的设备的呢？这就要依赖于描述符了。USB的描述符主要有设备描述符，配置描述符，接口描述符，端点描述符，字符串描述符，HID描述符，报告描述符等等。&lt;/p&gt;&#xA;&lt;p&gt;一个USB设备有一个设备描述符，设备描述符里面决定了该设备有多&lt;/p&gt;&#xA;&lt;p&gt;少种配置，每种配置描述符对应着配置描述符；而在配置描述符中又定义&lt;/p&gt;&#xA;&lt;p&gt;了该配置里面有多少个接口，每个接口有对应的接口描述符；在接口描&lt;/p&gt;&#xA;&lt;p&gt;述符里面又定义了该接口有多少个端点，每个端点对应一个端点描述符；&lt;/p&gt;&#xA;&lt;p&gt;端点描述符定义了端点的大小，类型等等。由此我们可以看出，USB的&lt;/p&gt;&#xA;&lt;p&gt;描述符之间的关系是一层一层的，最上一层是设备描述符，下面是配置&lt;/p&gt;&#xA;&lt;p&gt;描述符，再下面是接口描述符，再下面是端点描述符。在获取描述符时，&lt;/p&gt;&#xA;&lt;p&gt;先获取设备描述符，然后再获取配置描述符，根据配置描述符中的配置&lt;/p&gt;&#xA;&lt;p&gt;集合长度，一次将配置描述符、接口描述符、端点描述符一起一次读回。&lt;/p&gt;&#xA;&lt;p&gt;其中可能还会有获取设备序列号，厂商字符串，产品字符串等。&lt;/p&gt;&#xA;&lt;p&gt;每种描述符都有自己独立的编号，如下：&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-cpp&#34; data-lang=&#34;cpp&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;#define DEVICE_DESCRIPTOR               0x01  &lt;/span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;//设备描述符&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;#define CONFIGURATION_DESCRIPTOR        0x02  &lt;/span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;//配置描述符&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;#define STRING_DESCRIPTOR 0x03 &lt;/span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;//字符串描述符&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;#define INTERFACE_DESCRIPTOR            0x04  &lt;/span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;//接口描述符&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;#define ENDPOINT_DESCRIPTOR             0x05  &lt;/span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;//端点描述符&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;下面分别详细介绍一下各描述符。&lt;/p&gt;&#xA;&lt;p&gt;1.设备描述符&lt;/p&gt;&#xA;&lt;p&gt;//定义标准的设备描述符结构&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-cpp&#34; data-lang=&#34;cpp&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;typedef&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;struct&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;_DEVICE_DCESCRIPTOR_STRUCT&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;{&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; BYTE blength;                               &lt;span style=&#34;color:#75715e&#34;&gt;//设备描述符的字节数大小&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; BYTE bDescriptorType;                      &lt;span style=&#34;color:#75715e&#34;&gt;//设备描述符类型编号&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; WORD bcdUSB;                                &lt;span style=&#34;color:#75715e&#34;&gt;//USB版本号&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; BYTE bDeviceClass;                          &lt;span style=&#34;color:#75715e&#34;&gt;//USB分配的设备类代码&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; BYTE bDeviceSubClass;                       &lt;span style=&#34;color:#75715e&#34;&gt;//USB分配的子类代码&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; BYTE bDeviceProtocol; &lt;span style=&#34;color:#75715e&#34;&gt;//USB分配的设备协议代码&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; BYTE bMaxPacketSize0;                       &lt;span style=&#34;color:#75715e&#34;&gt;//端点0的最大包大小&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; WORD idVendor;                              &lt;span style=&#34;color:#75715e&#34;&gt;//厂商编号&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; WORD idProduct;                             &lt;span style=&#34;color:#75715e&#34;&gt;//产品编号&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; WORD bcdDevice;                             &lt;span style=&#34;color:#75715e&#34;&gt;//设备出厂编号&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; BYTE iManufacturer;                         &lt;span style=&#34;color:#75715e&#34;&gt;//设备厂商字符串的索引&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; BYTE iProduct;                              &lt;span style=&#34;color:#75715e&#34;&gt;//描述产品字符串的索引&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; BYTE iSerialNumber; &lt;span style=&#34;color:#75715e&#34;&gt;//描述设备序列号字符串的索引&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; BYTE bNumConfigurations;                    &lt;span style=&#34;color:#75715e&#34;&gt;//可能的配置数量&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;DEVICE_DESCRIPTOR_STRUCT, &lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt; pDEVICE_DESCRIPTOR_STRUCT;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;//实际的设备描述符示例&lt;/p&gt;</description>
    </item>
    <item>
      <title>VC/MFC MFC中保存ini配置文件，代码片段</title>
      <link>https://xcdd.pages.dev/blog/2013/2013-12-17-1725/</link>
      <pubDate>Tue, 17 Dec 2013 17:25:15 +0000</pubDate>
      <guid>https://xcdd.pages.dev/blog/2013/2013-12-17-1725/</guid>
      <description>&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-cpp&#34; data-lang=&#34;cpp&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;//在xxxApp::InitInstance()函数里面添加以下内容&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;delete&lt;/span&gt; m_pszProfileName;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;delete&lt;/span&gt; m_pszRegistryKey;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;m_pszRegistryKey &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; NULL;&#x9;&lt;span style=&#34;color:#75715e&#34;&gt;//如果不为空则会把配置存在注册表里面&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;m_pszProfileName &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; _wcsdup(&lt;span style=&#34;color:#e6db74&#34;&gt;L&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;./config.ini&amp;#34;&lt;/span&gt;);&lt;span style=&#34;color:#75715e&#34;&gt;//ini文件路径，可以修改为绝对路径&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;然后就可以使用这一类函数来读写配置了&lt;/p&gt;&#xA;&lt;p&gt;GetProfileInt(L&amp;quot;Section&amp;quot;, L&amp;quot;Name&amp;quot;,nValue);&lt;/p&gt;&#xA;&lt;p&gt;WriteProfileInt(L&amp;quot;Section&amp;quot;, L&amp;quot;Name&amp;quot;, nValue);&lt;/p&gt;</description>
    </item>
    <item>
      <title>VC/MFC 文件选择和文件夹选择，代码片段</title>
      <link>https://xcdd.pages.dev/blog/2013/2013-12-17-1715/</link>
      <pubDate>Tue, 17 Dec 2013 17:15:06 +0000</pubDate>
      <guid>https://xcdd.pages.dev/blog/2013/2013-12-17-1715/</guid>
      <description>&lt;p&gt;1、批量选择文件&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-cpp&#34; data-lang=&#34;cpp&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;// 批量添加文件列表&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;void&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;AddFile&lt;/span&gt;()&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;{&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;CString&#x9;&#x9;szFileName;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;CString&#x9;&#x9;szCount;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;POSITION&#x9;pos;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt;&#x9;&#x9;i;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt;&#x9;&#x9;nCount&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;;&#x9;&#x9;&lt;span style=&#34;color:#75715e&#34;&gt;//文件数量&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;&#x9;&lt;span style=&#34;color:#75715e&#34;&gt;//输入文件&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;&#x9;CFileDialog InFile( TRUE,NULL,NULL,OFN_FILEMUSTEXIST&lt;span style=&#34;color:#f92672&#34;&gt;|&lt;/span&gt;OFN_ALLOWMULTISELECT,_T(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;某种格式|*.fmt|所有文件(*.*)|*.*||&amp;#34;&lt;/span&gt;) );&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;InFile.m_ofn.nMaxFile  &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;10000&lt;/span&gt;;&#x9;&#x9;&lt;span style=&#34;color:#75715e&#34;&gt;//文件上限&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;&#x9;InFile.m_ofn.lpstrFile &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; (LPWSTR)malloc(InFile.m_ofn.nMaxFile&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;sizeof&lt;/span&gt;(TCHAR));&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;memset(InFile.m_ofn.lpstrFile,&lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;,InFile.m_ofn.nMaxFile);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&lt;span style=&#34;color:#75715e&#34;&gt;//按了OK按钮，开始获取文件列表&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;&#x9;&lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt;(InFile.DoModal() &lt;span style=&#34;color:#f92672&#34;&gt;==&lt;/span&gt; IDOK)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;{&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&#x9;pos&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;InFile.GetStartPosition(); &#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&#x9;&lt;span style=&#34;color:#66d9ef&#34;&gt;while&lt;/span&gt;(pos)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&#x9;{&#x9;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&#x9;&#x9;szFileName&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;InFile.GetNextPathName(pos);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&#x9;&#x9;&lt;span style=&#34;color:#75715e&#34;&gt;//这里szFileName就是文件路径&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;&#x9;&#x9;&#x9;&lt;span style=&#34;color:#75715e&#34;&gt;//做点什么事情，比如添加到列表框&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;&#x9;&#x9;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&lt;span style=&#34;color:#75715e&#34;&gt;//释放空间&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;&#x9;free(InFile.m_ofn.lpstrFile);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;2、选择文件夹&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-cpp&#34; data-lang=&#34;cpp&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;void&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;SelectPath&lt;/span&gt;()&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;{&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&lt;span style=&#34;color:#75715e&#34;&gt;//选择输出路径&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;&#x9;TCHAR szDir[MAX_PATH];&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;BROWSEINFO bi; &#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;ITEMIDLIST &lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;pidl; &#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;bi.hwndOwner &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;this&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;-&amp;gt;&lt;/span&gt;m_hWnd; &#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;bi.pidlRoot &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; NULL;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;bi.pszDisplayName &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; szDir;&lt;span style=&#34;color:#75715e&#34;&gt;//这个是输出缓冲区 &#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;&#x9;bi.lpszTitle &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; _T(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;选择输出文件夹：&amp;#34;&lt;/span&gt;); &lt;span style=&#34;color:#75715e&#34;&gt;//标题&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;&#x9;bi.ulFlags &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; BIF_NEWDIALOGSTYLE;&lt;span style=&#34;color:#75715e&#34;&gt;//使用新的界面,在win7中效果较好//BIF_RETURNONLYFSDIRS; &#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;&#x9;bi.lpfn &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; NULL;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;bi.lParam &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;bi.iImage &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;pidl &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; SHBrowseForFolder(&lt;span style=&#34;color:#f92672&#34;&gt;&amp;amp;&lt;/span&gt;bi);&lt;span style=&#34;color:#75715e&#34;&gt;//弹出对话框 &#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;&#x9;&lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt; (pidl &lt;span style=&#34;color:#f92672&#34;&gt;==&lt;/span&gt; NULL)&lt;span style=&#34;color:#75715e&#34;&gt;//点了取消，或者选择了无效的文件夹则返回NULL&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;&#x9;&#x9;&lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt;(SHGetPathFromIDList(pidl, szDir)) &#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&#x9;szDir &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; szDir;&lt;span style=&#34;color:#75715e&#34;&gt;//szDir就是要获取的文件夹&#x9;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;&#x9;&lt;span style=&#34;color:#75715e&#34;&gt;//得到之后做点什么&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description>
    </item>
    <item>
      <title>VC/MFC 访问进程内存，代码片段</title>
      <link>https://xcdd.pages.dev/blog/2013/2013-12-17-1655/</link>
      <pubDate>Tue, 17 Dec 2013 16:55:49 +0000</pubDate>
      <guid>https://xcdd.pages.dev/blog/2013/2013-12-17-1655/</guid>
      <description>&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-cpp&#34; data-lang=&#34;cpp&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;#include&lt;/span&gt; &lt;span style=&#34;color:#75715e&#34;&gt;&amp;#34;StdAfx.h&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;#include&lt;/span&gt; &lt;span style=&#34;color:#75715e&#34;&gt;&amp;lt;TlHelp32.h&amp;gt;&lt;/span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;#include&lt;/span&gt; &lt;span style=&#34;color:#75715e&#34;&gt;&amp;#34;ProcessMemory.h&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;//打开进程内存&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;BOOL CProcessMemory&lt;span style=&#34;color:#f92672&#34;&gt;::&lt;/span&gt;Open(INT nPID)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;{&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;HANDLE hToken;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;INT    nFlag;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;nFlag &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES, &lt;span style=&#34;color:#f92672&#34;&gt;&amp;amp;&lt;/span&gt;hToken);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt;(&lt;span style=&#34;color:#f92672&#34;&gt;!&lt;/span&gt;nFlag)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;{&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&#x9;OutputDebugString(_T(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;OpenProcessToken Fail!&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;\n&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&lt;/span&gt;));&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&#x9;&lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;SetPrivilege(hToken, SE_DEBUG_NAME, TRUE);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&lt;span style=&#34;color:#f92672&#34;&gt;::&lt;/span&gt;CloseHandle(hToken);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;m_hProc &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; OpenProcess(PROCESS_ALL_ACCESS, FALSE, nPID);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt; (m_hProc &lt;span style=&#34;color:#f92672&#34;&gt;==&lt;/span&gt; INVALID_HANDLE_VALUE)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&#x9;&lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt; FALSE;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt; TRUE;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;BOOL CProcessMemory&lt;span style=&#34;color:#f92672&#34;&gt;::&lt;/span&gt;Open(LPCTSTR pzProcessName)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;{&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;INT nPID;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;nPID &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; GetProcessID(pzProcessName);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;Open&lt;/span&gt;(nPID);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;//设置进程权限&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt; CProcessMemory&lt;span style=&#34;color:#f92672&#34;&gt;::&lt;/span&gt;SetPrivilege(HANDLE hToken, LPCTSTR lpszStr, BOOL bEnable)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;{&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;TOKEN_PRIVILEGES tp;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;LUID luid;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;BOOL bRet;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;bRet &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; LookupPrivilegeValue(NULL, lpszStr, &lt;span style=&#34;color:#f92672&#34;&gt;&amp;amp;&lt;/span&gt;luid);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt;(bRet &lt;span style=&#34;color:#f92672&#34;&gt;==&lt;/span&gt; FALSE)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;{&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&#x9;OutputDebugString(_T(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Lookup Privilege Value Fail!&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;\n&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&lt;/span&gt;));&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&#x9;&lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt; FALSE;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;tp.PrivilegeCount &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;tp.Privileges[&lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;].Luid &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; luid;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt;(bEnable)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&#x9;tp.Privileges[&lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;].Attributes &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; SE_PRIVILEGE_ENABLED;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&lt;span style=&#34;color:#66d9ef&#34;&gt;else&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&#x9;tp.Privileges[&lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;].Attributes &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;bRet &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; AdjustTokenPrivileges(hToken, FALSE, &lt;span style=&#34;color:#f92672&#34;&gt;&amp;amp;&lt;/span&gt;tp, &lt;span style=&#34;color:#66d9ef&#34;&gt;sizeof&lt;/span&gt;(TOKEN_PRIVILEGES), NULL, NULL);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt; bRet;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;//写入&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;DWORD CProcessMemory&lt;span style=&#34;color:#f92672&#34;&gt;::&lt;/span&gt;Write(LPVOID lpBaseAddress,  LPVOID lpBuffer, DWORD nSize)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;{&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;BOOL  bRet;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;DWORD dwReaded &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&lt;span style=&#34;color:#75715e&#34;&gt;//句柄无效&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;&#x9;&lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt;(m_hProc &lt;span style=&#34;color:#f92672&#34;&gt;==&lt;/span&gt; NULL)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&#x9;&lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt; FALSE;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;bRet &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;::&lt;/span&gt;WriteProcessMemory(m_hProc, lpBaseAddress, lpBuffer, nSize, &lt;span style=&#34;color:#f92672&#34;&gt;&amp;amp;&lt;/span&gt;dwReaded);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt; (bRet &lt;span style=&#34;color:#f92672&#34;&gt;==&lt;/span&gt; FALSE)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&#x9;dwReaded &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt; dwReaded;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;//读取&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;DWORD CProcessMemory&lt;span style=&#34;color:#f92672&#34;&gt;::&lt;/span&gt;Read(LPCVOID  lpBaseAddress,  LPVOID lpBuffer, DWORD nSize)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;{&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;BOOL  bRet;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;DWORD dwReaded &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&lt;span style=&#34;color:#75715e&#34;&gt;//句柄无效&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;&#x9;&lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt;(m_hProc &lt;span style=&#34;color:#f92672&#34;&gt;==&lt;/span&gt; NULL)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&#x9;&lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt; FALSE;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;bRet &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;::&lt;/span&gt;ReadProcessMemory(m_hProc, lpBaseAddress, lpBuffer, nSize, &lt;span style=&#34;color:#f92672&#34;&gt;&amp;amp;&lt;/span&gt;dwReaded);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt; (bRet &lt;span style=&#34;color:#f92672&#34;&gt;==&lt;/span&gt; FALSE)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&#x9;dwReaded &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt; dwReaded;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;//关闭&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;void&lt;/span&gt; CProcessMemory&lt;span style=&#34;color:#f92672&#34;&gt;::&lt;/span&gt;Close()&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;{&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt; (m_hProc)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;{&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&#x9;&lt;span style=&#34;color:#f92672&#34;&gt;::&lt;/span&gt;CloseHandle(m_hProc);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;//根据进程名，返回第一个进程实例的PID&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;INT CProcessMemory&lt;span style=&#34;color:#f92672&#34;&gt;::&lt;/span&gt;GetProcessID(LPCTSTR pzProcessName)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;{&#x9;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;BOOL bRet;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;CString &lt;span style=&#34;color:#a6e22e&#34;&gt;szExeName&lt;/span&gt;(pzProcessName);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;HANDLE hProcess;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;PROCESSENTRY32 procEntry;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;procEntry.dwSize &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;sizeof&lt;/span&gt;(PROCESSENTRY32); &#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&lt;span style=&#34;color:#75715e&#34;&gt;//进行进程快照&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;&#x9;hProcess&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,&lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&lt;span style=&#34;color:#75715e&#34;&gt;//开始进程查找&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;&#x9;bRet&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;Process32First(hProcess,&lt;span style=&#34;color:#f92672&#34;&gt;&amp;amp;&lt;/span&gt;procEntry);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&lt;span style=&#34;color:#75715e&#34;&gt;//循环比较，得出ProcessID&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;&#x9;&lt;span style=&#34;color:#66d9ef&#34;&gt;while&lt;/span&gt;(bRet)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;{&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&#x9;&lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt;(&lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;==&lt;/span&gt; szExeName.Compare(procEntry.szExeFile))&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&#x9;&#x9;&lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt; procEntry.th32ProcessID;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&#x9;bRet&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;Process32Next(hProcess,&lt;span style=&#34;color:#f92672&#34;&gt;&amp;amp;&lt;/span&gt;procEntry);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;VC/MFC 访问进程内存，代码片段&lt;/p&gt;</description>
    </item>
    <item>
      <title>VC/MFC 键盘钩子，代码片断</title>
      <link>https://xcdd.pages.dev/blog/2013/2013-12-17/</link>
      <pubDate>Tue, 17 Dec 2013 16:30:49 +0000</pubDate>
      <guid>https://xcdd.pages.dev/blog/2013/2013-12-17/</guid>
      <description>&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-cpp&#34; data-lang=&#34;cpp&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;在&lt;/span&gt;MFC程序中使用键盘钩子来获取按键消息&lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;，例程：&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-cpp&#34; data-lang=&#34;cpp&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;#include&lt;/span&gt; &lt;span style=&#34;color:#75715e&#34;&gt;&amp;#34;StdAfx.h&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;#include&lt;/span&gt; &lt;span style=&#34;color:#75715e&#34;&gt;&amp;#34;KeyboardHook.h&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;static&lt;/span&gt; HHOOK g_hHook &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; NULL;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;static&lt;/span&gt; CWnd&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt; g_pWnd  &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; NULL;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;BOOL CKeyboardHook&lt;span style=&#34;color:#f92672&#34;&gt;::&lt;/span&gt;Init(HINSTANCE hInst, CWnd &lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;pWnd)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;{&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;g_pWnd &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; pWnd;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;g_hHook &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; SetWindowsHookEx(WH_KEYBOARD_LL,CKeyboardHook&lt;span style=&#34;color:#f92672&#34;&gt;::&lt;/span&gt;KeyboardHookProc,hInst,NULL);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt; g_hHook &lt;span style=&#34;color:#f92672&#34;&gt;==&lt;/span&gt; NULL &lt;span style=&#34;color:#f92672&#34;&gt;?&lt;/span&gt; FALSE : TRUE;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;void&lt;/span&gt; CKeyboardHook&lt;span style=&#34;color:#f92672&#34;&gt;::&lt;/span&gt;Close()&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;{&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;UnhookWindowsHookEx(g_hHook);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;LRESULT CALLBACK CKeyboardHook&lt;span style=&#34;color:#f92672&#34;&gt;::&lt;/span&gt;KeyboardHookProc(&lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt; code, WPARAM wParam, LPARAM lParam)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;{&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt;(code &lt;span style=&#34;color:#f92672&#34;&gt;==&lt;/span&gt; HC_ACTION)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;{&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&#x9;PKBDLLHOOKSTRUCT pStruct &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; (PKBDLLHOOKSTRUCT)lParam;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&#x9;&lt;span style=&#34;color:#66d9ef&#34;&gt;switch&lt;/span&gt;(pStruct&lt;span style=&#34;color:#f92672&#34;&gt;-&amp;gt;&lt;/span&gt;vkCode)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&#x9;{&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&#x9;&lt;span style=&#34;color:#66d9ef&#34;&gt;case&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;a&amp;#39;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&#x9;&lt;span style=&#34;color:#66d9ef&#34;&gt;case&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;A&amp;#39;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&#x9;&lt;span style=&#34;color:#66d9ef&#34;&gt;case&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;s&amp;#39;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&#x9;&lt;span style=&#34;color:#66d9ef&#34;&gt;case&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;S&amp;#39;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&#x9;&lt;span style=&#34;color:#66d9ef&#34;&gt;case&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;d&amp;#39;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&#x9;&lt;span style=&#34;color:#66d9ef&#34;&gt;case&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;D&amp;#39;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&#x9;&lt;span style=&#34;color:#66d9ef&#34;&gt;case&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;j&amp;#39;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&#x9;&lt;span style=&#34;color:#66d9ef&#34;&gt;case&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;J&amp;#39;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&#x9;&lt;span style=&#34;color:#66d9ef&#34;&gt;case&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39; &amp;#39;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&#x9;&#x9;&lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt; (wParam &lt;span style=&#34;color:#f92672&#34;&gt;==&lt;/span&gt; WM_KEYDOWN)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&#x9;&#x9;{&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&#x9;&#x9;&#x9;g_pWnd&lt;span style=&#34;color:#f92672&#34;&gt;-&amp;gt;&lt;/span&gt;PostMessage(WM_KEYDOWN, pStruct&lt;span style=&#34;color:#f92672&#34;&gt;-&amp;gt;&lt;/span&gt;vkCode, pStruct&lt;span style=&#34;color:#f92672&#34;&gt;-&amp;gt;&lt;/span&gt;scanCode);                               &#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&#x9;&#x9;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&#x9;&#x9;&lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt; TRUE;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&#x9;&#x9;&lt;span style=&#34;color:#66d9ef&#34;&gt;break&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&#x9;&lt;span style=&#34;color:#66d9ef&#34;&gt;default&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt;  &lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt; CallNextHookEx(g_hHook, code, wParam, lParam);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&#x9;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;CallNextHookEx&lt;/span&gt;(g_hHook, code, wParam, lParam);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description>
    </item>
    <item>
      <title>WMV文件格式</title>
      <link>https://xcdd.pages.dev/blog/2013/2013-10-16-0948/</link>
      <pubDate>Wed, 16 Oct 2013 09:48:14 +0000</pubDate>
      <guid>https://xcdd.pages.dev/blog/2013/2013-10-16-0948/</guid>
      <description>&lt;p&gt;wma文件结构示意图&lt;/p&gt;&#xA;&lt;p&gt;格式的简单说明：&lt;/p&gt;&#xA;&lt;p&gt;如图1，每一个WMA文件，它的 &lt;strong&gt;头16个字节是固定的&lt;/strong&gt; ，为十六进制的“30 26 B2 75 8E 66 CF 11 A6 D9 00 AA 00 62 CE 6C”，用来标识这个是否为WMA文件。接下来的 &lt;strong&gt;8个字节为一个整数，表示整个WMA文件头部的大小&lt;/strong&gt; ，这个头部里面包含了Tag信息等所有非音频信息， &lt;strong&gt;头部后面的是音频信息&lt;/strong&gt; ，我们在这里就不深入了解了。那个整数接下来的6个字节还没搞清楚是什么用的，不过不影响我们对Tag信息的读写。&lt;/p&gt;&#xA;&lt;p&gt;也就是说从文件开始偏移量为31开始，里面存放了很多帧，有我们需要的 &lt;strong&gt;标准Tag信息，扩展Tag信息，WMA文件控制信息等等&lt;/strong&gt; 。每个帧 &lt;u&gt;不是等长&lt;/u&gt; 的，但是 &lt;strong&gt;帧头是固定的24个字节，其中前16字节是用来标识这个帧的名字，后8个字节是用来表示这个帧（包括帧头）的大小&lt;/strong&gt; 。这一点和MP3文件的ID3V2信息比 较像。&#xA;由于我们只需要读写Tag信息，而Tag信息又分别保存在两个帧里，分别为标准Tag帧和扩展Tag帧，所有我们只需要处理这两个帧，其他帧完全可以根据获得的帧长度来跳过。&#xA;如图2，标 &lt;strong&gt;准Tag帧只包含歌曲标题，艺术家，版权，备注四个内容&lt;/strong&gt; 。它的帧名是十六进制的“3326 B2 75 8E 66 CF 11 A6 D9 00 AA 00 62 CE 6C”，在24个字节的帧头后紧跟着5个分别为2个字节的整数，分别表示歌曲标题，艺术家，版权，备注，未知信息的大小，未知信息大部分情况下是不使用的，即它的大小为0的。&lt;/p&gt;&#xA;&lt;p&gt;在这10个字节后，这五个信息的内容就按顺序存放了。记住，在WMA文件里，所有的文字都是按Unicode宽字符的编码方式储存的，而且每个字符串后面都有一个0x00 0x00结束字符的。&#xA;如图3，再看扩展Tag帧，这里就比较麻烦了，里面包含的信息的个数是不确定的，每个信息也是按照像帧一样的方式组织起来的。扩展Tag帧的帧名是十六进制的“40 A4 D0 D2 07 E3 D2 11 97 F000 A0 C9 5E A8 50”，在 &lt;strong&gt;24字节的帧头(HeadFlag:16，HeadSize:8)后先有一个两个字节的整数表示这个帧里一共有的扩展信息个数（ExNo）。紧接着是扩展信息。&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;如图4，每一个扩展信息 &lt;strong&gt;包含扩展信息名字大小（2字节）和对应的内容&lt;/strong&gt; 。先有一个两个字节的整数来表示扩展名字信息的大小，接着是扩展信息名称，然后有一个两个字节的整数标志（Flag）。然后又是一个两个字节的整数，表示值的大小。接着就是这个值。&#xA;当扩展信息名字为WMFSDKVersion时，这个值表示的是这个WMA文件的版本；&lt;/p&gt;</description>
    </item>
    <item>
      <title>MP4文件格式</title>
      <link>https://xcdd.pages.dev/blog/2013/2013-10-16-0947/</link>
      <pubDate>Wed, 16 Oct 2013 09:47:07 +0000</pubDate>
      <guid>https://xcdd.pages.dev/blog/2013/2013-10-16-0947/</guid>
      <description>&lt;p&gt;&lt;strong&gt;MP4&lt;/strong&gt; 文件格式&lt;/p&gt;&#xA;&lt;p&gt;综述&lt;/p&gt;&#xA;&lt;p&gt;关键概念&lt;/p&gt;&#xA;&lt;p&gt;MP4文件格式中，所有的内容存在一个称为 &lt;strong&gt;movie&lt;/strong&gt; 的容器中。一个 &lt;strong&gt;movie&lt;/strong&gt; 可以由多个 &lt;strong&gt;track&lt;/strong&gt; s 组成。每个 &lt;strong&gt;track&lt;/strong&gt; 就是一个随时间变化的媒体序列，例如，视频帧序列。 &lt;strong&gt;track&lt;/strong&gt; 里的每个时间单位是一个 &lt;strong&gt;sample&lt;/strong&gt; ，它可以是一帧视频，或者音频。 &lt;strong&gt;sample&lt;/strong&gt; 按照时间顺序排列。注意，一帧音频可以分解成多个音频 &lt;strong&gt;sample&lt;/strong&gt; ，所以音频一般用 &lt;strong&gt;sample&lt;/strong&gt; 作为单位，而不用帧。MP4&#xA;文件格式的定义里面，用 &lt;strong&gt;sample&lt;/strong&gt; 这个单词表示一个时间帧或者数据单元。每个 &lt;strong&gt;track&lt;/strong&gt; 会有一个或者多个 &lt;strong&gt;sample description&lt;/strong&gt; s。 &lt;strong&gt;track&lt;/strong&gt; 里面的每个 &lt;strong&gt;sample&lt;/strong&gt; 通过引用关联到一个 &lt;strong&gt;sample description&lt;/strong&gt; 。这个 &lt;strong&gt;sample description&lt;/strong&gt; s&#xA;定义了怎样解码这个 &lt;strong&gt;sample&lt;/strong&gt; ，例如使用的压缩算法。与其他的多媒体文件格式不同的是，MP4 文件格式经常使用几个不同的概念，理解其不同是理解这个文件格式的关键。&lt;/p&gt;&#xA;&lt;p&gt;这个文件的物理格式没有限定媒体本身的格式。例如，许多文件格式将媒体数据分成帧，头部或者其他数据紧紧跟随每一帧视频，！！！TODO（例如MPEG2）。而MP4 文件格式不是如此。文件的物理格式和媒体数据的排列都不受媒体的时间顺序的限制。视频帧不需要在文件按时间顺序排列。这就意味着如果文件中真的存在这样的一些帧，那么就有一些文件结构来描述媒体的排列和对应的时间信息。&lt;/p&gt;&#xA;&lt;p&gt;MP4文件中所有的数据都封装在一些 &lt;strong&gt;box&lt;/strong&gt; 中（以前叫 &lt;strong&gt;atom&lt;/strong&gt; ）。所有的metadata(媒体描述元数据)，包括定义媒体的排列和时间信息的数据都包含在这样的一些结构 &lt;strong&gt;box&lt;/strong&gt; 中。MP4 文件格式定义了这些这些 &lt;strong&gt;box&lt;/strong&gt; 的格式。Metadata 对媒体数据（例如，视频帧）引用说明。媒体数据可以包含在同一个的一个或多个 &lt;strong&gt;box&lt;/strong&gt; 里，也可以在其他文件中，metadata&#xA;允许使用URLs 来引用其他的文件，而媒体数据在这些引用文件中的排列关系全部在第一个主文件中的metadata 描述。其他的文件不一定是MP4 文件格式，例如，可能就没有一个box。&lt;/p&gt;&#xA;&lt;p&gt;有很多种类的 &lt;strong&gt;track&lt;/strong&gt; ，其中有三个最重要， &lt;strong&gt;video track&lt;/strong&gt; 包含了视频 &lt;strong&gt;sample&lt;/strong&gt; ； &lt;strong&gt;audio track&lt;/strong&gt; 包含了audio &lt;strong&gt;sample&lt;/strong&gt; ； &lt;strong&gt;hint track&lt;/strong&gt; 稍有不同，它描述了一个流媒体服务器如何把文件中的媒体数据组成符合流媒体协议的数据包。如果文件只是本地播放，可以忽略 &lt;strong&gt;hint track&lt;/strong&gt; ，他们只与流媒体有关系。&lt;/p&gt;</description>
    </item>
    <item>
      <title>FLV文件格式</title>
      <link>https://xcdd.pages.dev/blog/2013/2013-10-16-0943/</link>
      <pubDate>Wed, 16 Oct 2013 09:43:42 +0000</pubDate>
      <guid>https://xcdd.pages.dev/blog/2013/2013-10-16-0943/</guid>
      <description>&lt;p&gt;[ &lt;img src=&#34;./014/014_1.jpeg&#34; alt=&#34;FLV文件格式解析&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;](&lt;a href=&#34;http://photo.blog.sina.com.cn/showpic.html#blogid=48f93b530100eyoe&amp;amp;url=http://s6.sinaimg.cn/orignal/48f93b53g74f5adde2875&amp;amp;690&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;http://photo.blog.sina.com.cn/showpic.html#blogid=48f93b530100eyoe&amp;url=http://s6.sinaimg.cn/orignal/48f93b53g74f5adde2875&amp;690&lt;/a&gt;)&lt;/p&gt;&#xA;&lt;p&gt;其中，Previous Tag Size紧跟在每个Tag之后，占4个字节表示一个UI32类型的数值，表示前面一个Tag的大小。需要注意的是，Previous Tag Size #0的值总是为0。Tag类型包括视频、音频和Script，且每个Tag只能包含一种类型的数据。下面我们看看File Header和Tag的具体结构，为了方便大家理解，我贴一个实际FLV文件的字节流图片，图片中把不同部分区分了颜色。&lt;/p&gt;&#xA;&lt;p&gt;[ &lt;img src=&#34;./014/014_2.jpeg&#34; alt=&#34;FLV文件格式解析&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;](&lt;a href=&#34;http://photo.blog.sina.com.cn/showpic.html#blogid=48f93b530100eyoe&amp;amp;url=http://s1.sinaimg.cn/orignal/48f93b53g74f5d8e518d0&amp;amp;690&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;http://photo.blog.sina.com.cn/showpic.html#blogid=48f93b530100eyoe&amp;url=http://s1.sinaimg.cn/orignal/48f93b53g74f5d8e518d0&amp;690&lt;/a&gt;)&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;一、File Header结构&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;File Header在当前版本中总是由9个字节组成，如图中蓝色区域所示。&lt;/p&gt;&#xA;&lt;p&gt;第1-3字节为文件标识（Signature），总为“FLV”（0x46 0x4C 0x56），如图中紫色区域。&lt;/p&gt;&#xA;&lt;p&gt;第4字节为版本，目前为1（0x01）。&lt;/p&gt;&#xA;&lt;p&gt;第5个字节的前5位保留，必须为0。&lt;/p&gt;&#xA;&lt;p&gt;第5个字节的第6位表示是否存在音频Tag。&lt;/p&gt;&#xA;&lt;p&gt;第5个字节的第7位保留，必须为0。&lt;/p&gt;&#xA;&lt;p&gt;第5个字节的第8位表示是否存在视频Tag。&lt;/p&gt;&#xA;&lt;p&gt;第6-9个字节为UI32类型的值，表示从File Header开始到File Body开始的字节数，版本1中总为9。&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;二、Previous Tag Size结构&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;如图中红色位置所示。&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;三、Tag结构&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;Tag包括Tag Header和Tag Data两部分。不同类型的Tag的Header结构是相同的，但是Data结构各不相同。如图中绿色和黄色区域分别表示Tag Header数据和Tag Data数据。&lt;/p&gt;&#xA;&lt;p&gt;当前版本的Tag Header结构占用11个字节。&lt;/p&gt;&#xA;&lt;p&gt;第1个字节表示Tag类型，包括音频（0x08）、视频（0x09）和script data（0x12），其他类型值被保留。&lt;/p&gt;&#xA;&lt;p&gt;第2-4字节为UI24类型的值，表示该Tag Data部分的大小。&lt;/p&gt;&#xA;&lt;p&gt;第5-7字节为UI24类型的值，表示该Tag的时间戳（单位为ms），第一个Tag的时间戳总是0。&lt;/p&gt;&#xA;&lt;p&gt;第8个字节为时间戳的扩展字节，当24位数值不够时，该字节作为最高位将时间戳扩展为32位值。&lt;/p&gt;&#xA;&lt;p&gt;第9-11字节为UI24类型的值，表示stream id，总是0。&lt;/p&gt;&#xA;&lt;p&gt;后面的字节为Tag Data数据，Data的大小由第2-4字节的数值指示，根据第1个字节指示的Tag类型，按照不同的结构解析Tag Data。下面分别介绍。&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;四、Audio Tag Data结构&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;音频Tag开始的第1个字节包含了音频数据的参数信息，从第2个字节开始为音频流数据。&lt;/p&gt;&#xA;&lt;p&gt;第1个字节的前4位的数值表示了音频数据格式，各值代表的意义大家可以查阅Adobe公司发布的FLV格式说明文档（可以到我的磁盘空间的“资料”目录去下载 &lt;a href=&#34;http://e.ys168.com/?tinyfun&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;http://e.ys168.com/?tinyfun&lt;/a&gt; ）。&lt;/p&gt;&#xA;&lt;p&gt;第1个字节的第5-6位的数值表示采样率，0 = 5.5 kHz，1 = 11 kHz，2 = 22 kHz，3 = 44 kHz。&lt;/p&gt;&#xA;&lt;p&gt;第1个字节的第7位表示采样精度，0 = 8bits，1 = 16bits。&lt;/p&gt;</description>
    </item>
    <item>
      <title>AVI文件格式</title>
      <link>https://xcdd.pages.dev/blog/2013/2013-10-16-0941/</link>
      <pubDate>Wed, 16 Oct 2013 09:41:14 +0000</pubDate>
      <guid>https://xcdd.pages.dev/blog/2013/2013-10-16-0941/</guid>
      <description>&lt;p&gt;AVI（Audio Video Interleaved的缩写）是一种RIFF（Resource Interchange File Format的缩写）文件格式，多用于音视频捕捉、编辑、回放等应用程序中。通常情况下，一个AVI文件可以包含多个不同类型的媒体流（典型的情况下有一个音频流和一个视频流），不过含有单一音频流或单一视频流的AVI文件也是合法的。AVI可以算是Windows操作系统上最基本的、也是最常用的一种媒体文件格式。&lt;/p&gt;&#xA;&lt;p&gt;先来介绍RIFF文件格式。RIFF文件使用四字符码FOURCC（four-character code）来表征数据类型，比如‘RIFF’、‘AVI ’、‘LIST’等。注意，Windows操作系统使用的字节顺序是little-endian，因此一个四字符码‘abcd’实际的DWORD值应为0x64636261。另外，四字符码中像‘AVI ’一样含有空格也是合法的。&lt;/p&gt;&#xA;&lt;p&gt;RIFF文件首先含有一个如图3.31的文件头结构。&lt;/p&gt;&#xA;&lt;p&gt;&lt;img src=&#34;./013_1.jpg&#34; alt=&#34;&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;图3.31 RIFF文件结构&lt;/p&gt;&#xA;&lt;p&gt;最开始的4个字节是一个四字符码‘RIFF’，表示这是一个RIFF文件；紧跟着后面用4个字节表示此RIFF文件的大小；然后又是一个四字符码说明文件的具体类型（比如AVI、WAVE等）；最后就是实际的数据。注意文件大小值的计算方法为：实际数据长度 + 4（文件类型域的大小）；也就是说，文件大小的值不包括‘RIFF’域和“文件大小”域本身的大小。&lt;/p&gt;&#xA;&lt;p&gt;RIFF文件的实际数据中，通常还使用了列表（List）和块（Chunk）的形式来组织。列表可以嵌套子列表和块。其中，列表的结构为：‘LIST’ listSize listType listData ——‘LIST’是一个四字符码，表示这是一个列表；listSize占用4字节，记录了整个列表的大小；listType也是一个四字符码，表示本列表的具体类型；listData就是实际的列表数据。注意listSize值的计算方法为：实际的列表数据长度 + 4（listType域的大小）；也就是说listSize值不包括‘LIST’域和listSize域本身的大小。再来看块的结构：ckID&#xA;ckSize ckData ——ckID是一个表示块类型的四字符码；ckSize占用4字节，记录了整个块的大小；ckData为实际的块数据。注意ckSize值指的是实际的块数据长度，而不包括ckID域和ckSize域本身的大小。（注意：在下面的内容中，将以LIST ( listType ( listData ) )的形式来表示一个列表，以ckID ( ckData )的形式来表示一个块，如[ optional element ]中括号中的元素表示为可选项。）&lt;/p&gt;&#xA;&lt;p&gt;接下来介绍AVI文件格式。AVI文件类型用一个四字符码‘AVI ’来表示。整个AVI文件的结构为：一个RIFF头 + 两个列表（一个用于描述媒体流格式、一个用于保存媒体流数据） + 一个可选的索引块。AVI文件的展开结构大致如下：&lt;/p&gt;&#xA;&lt;p&gt;RIFF (‘AVI ’&#xA;LIST (‘hdrl’&#xA;‘avih’(主AVI信息头数据)&#xA;LIST (‘strl’&#xA;‘strh’ (流的头信息数据)&#xA;‘strf’ (流的格式信息数据)&#xA;[‘strd’ (可选的额外的头信息数据) ]&#xA;[‘strn’ (可选的流的名字) ]&#xA;&amp;hellip;&#xA;)&#xA;&amp;hellip;&#xA;)&#xA;LIST (‘movi’&#xA;{ SubChunk | LIST (‘rec ’&#xA;SubChunk1&#xA;SubChunk2&#xA;&amp;hellip;&#xA;)&#xA;&amp;hellip;&#xA;}&#xA;&amp;hellip;&#xA;)&#xA;[‘idx1’ (可选的AVI索引块数据) ]&#xA;)&lt;/p&gt;</description>
    </item>
    <item>
      <title>MP3文件格式</title>
      <link>https://xcdd.pages.dev/blog/2013/2013-10-16/</link>
      <pubDate>Wed, 16 Oct 2013 09:35:45 +0000</pubDate>
      <guid>https://xcdd.pages.dev/blog/2013/2013-10-16/</guid>
      <description>&lt;p&gt;&lt;a href=&#34;&#34;&gt; &lt;strong&gt;一、概述&lt;/strong&gt; &lt;/a&gt;&#xA;MP3 文件是由帧(frame)构成的,帧是 MP3 文件最小的组成单位。MP3 的全称应为 MPEG1 Layer-3 音频&#xA;文件,MPEG(Moving Picture Experts Group)在汉语中译为活动图像专家组,特指活动影音压缩标准,MPEG&#xA;音频文件是 MPEG1 标准中的声音部分,也叫 MPEG 音频层,它根据压缩质量和编码复杂程度划分为三层,即&#xA;Layer-1、Layer2、Layer3,且分别对应 MP1、MP2、MP3 这三种声音文件,并根据不同的用途,使用不同层&#xA;次的编码。MPEG 音频编码的层次越高,编码器越复杂,压缩率也越高,MP1 和 MP2 的压缩率分别为 4:1 和&#xA;6:1-8:1,而 MP3 的压缩率则高达 10:1-12:1,也就是说,一分钟 CD 音质的音乐,未经压缩需要 10MB&#xA;的存储空间,而经过 MP3 压缩编码后只有 1MB 左右。不过 MP3 对音频信号采用的是有损压缩方式,为了降&#xA;低声音失真度,MP3 采取了“感官编码技术”,即编码时先对音频文件进行频谱分析,然后用过滤器滤掉&#xA;噪音电平,接着通过量化的方式将剩下的每一位打散排列,最后形成具有较高压缩比的 MP3 文件,并使压&#xA;缩后的文件在回放时能够达到比较接近原音源的声音效果。&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;&#34;&gt; &lt;strong&gt;二、整个MP3&lt;/strong&gt; &lt;/a&gt; &lt;strong&gt;文件结构&lt;/strong&gt;&#xA;MP3文件大体分为三部分：TAG_V2(ID3V2)，Frame, TAG_V1(ID3V1)&#xA;ID3V2&#xA;包含了作者，作曲，专辑等信息，长度不固定，扩展了ID3V1的信息量。&#xA;Frame&#xA;.&#xA;.&#xA;.&#xA;Frame&#xA;一系列的帧，个数由文件大小和帧长决定&#xA;每个FRAME的长度可能不固定，也可能固定，由位率bitrate决定&#xA;每个FRAME又分为帧头和数据实体两部分&#xA;帧头记录了mp3的位率，采样率，版本等信息，每个帧之间相互独立&#xA;ID3V1&#xA;包含了作者，作曲，专辑等信息，长度为128BYTE。&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;&#34;&gt; &lt;strong&gt;三、MP3&lt;/strong&gt; &lt;/a&gt; &lt;strong&gt;帧格式&lt;/strong&gt;&#xA;&lt;a href=&#34;&#34;&gt; &lt;strong&gt;1.&lt;/strong&gt; &lt;/a&gt; &lt;strong&gt;帧头格式&lt;/strong&gt;&#xA;帧头长4字节，对于固定位率的MP3文件，所有帧的帧头格式一样其数据结构如下：&lt;/p&gt;</description>
    </item>
    <item>
      <title>可能会用到的一些网页，先存在这里免得以后找不到</title>
      <link>https://xcdd.pages.dev/blog/2013/2013-09-03/</link>
      <pubDate>Tue, 03 Sep 2013 10:36:10 +0000</pubDate>
      <guid>https://xcdd.pages.dev/blog/2013/2013-09-03/</guid>
      <description>&lt;p&gt;流媒体相关：&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;http://www.rosoo.net/a/201012/10570.html&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;http://www.rosoo.net/a/201012/10570.html&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;Linux相关：&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://www.kernel.org/&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;https://www.kernel.org/&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;http://www.linaro.org/&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;http://www.linaro.org/&lt;/a&gt;&lt;/p&gt;</description>
    </item>
    <item>
      <title>Makefile参考样例1：单文件夹多个.c和.h的编译</title>
      <link>https://xcdd.pages.dev/blog/2013/2013-09-02-1701/</link>
      <pubDate>Mon, 02 Sep 2013 17:01:03 +0000</pubDate>
      <guid>https://xcdd.pages.dev/blog/2013/2013-09-02-1701/</guid>
      <description>&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-plain&#34; data-lang=&#34;plain&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;以下makefile比较简单，适用于所有源码在一个文件夹下面；&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-plain&#34; data-lang=&#34;plain&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;缺点：编译的时候没有检查.h文件修改，所以修改了.h文件需要clean之后重新编译.&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-plain&#34; data-lang=&#34;plain&#34;&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-plain&#34; data-lang=&#34;plain&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;SRCDIR:=.&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;OBJDIR:=.&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;CC:=gcc&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;STRIP:=strip&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;CFLAGS:=-w -O2 &#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;.PHONY: all&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;.DEFAULT: all&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;OBJDIR:=./obj&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;SRCS:=$(wildcard $(SRCDIR)/*.c)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;OBJS:=$(addprefix $(OBJDIR)/,$(patsubst %.c,%.o,$(SRCS)))&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;PROGRAM:=main.elf&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;all: $(PROGRAM)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;$(OBJS): $(OBJDIR)/%.o : %.c&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;@if [ ! -d $(dir $@) ] ; then mkdir -v -p $(dir $@) ; fi&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;@echo compile: $&amp;lt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;$(CC) $(CFLAGS) -c $&amp;lt; -o $@&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;$(PROGRAM): $(OBJS)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;$(CC) $(OBJS) -o $(PROGRAM) -lpthread -static&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;$(STRIP) $(PROGRAM)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;clean:&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;rm -f $(OBJDIR)/* $(PROGRAM)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description>
    </item>
    <item>
      <title>arm linux挂载nfs根文件系统</title>
      <link>https://xcdd.pages.dev/blog/2013/2013-09-02-1651/</link>
      <pubDate>Mon, 02 Sep 2013 16:51:41 +0000</pubDate>
      <guid>https://xcdd.pages.dev/blog/2013/2013-09-02-1651/</guid>
      <description>&lt;p&gt;一、在主机里安装nfs服务&lt;/p&gt;&#xA;&lt;p&gt;apt-get install nfs-kernel-server&lt;/p&gt;&#xA;&lt;p&gt;配置nfs输出目录：/etc/exports&lt;/p&gt;&#xA;&lt;p&gt;在该文件中添加一行：/home/arm *(rw,sync,no_root_squash)  根据实际情况修改/home/arm为想要的路径就行了。&lt;/p&gt;&#xA;&lt;p&gt;二、编译arm linux内核勾选nfs client&lt;/p&gt;&#xA;&lt;p&gt;[Filesystem] -&amp;gt; Mi&amp;hellip;&amp;hellip;&amp;hellip;&amp;hellip;&amp;hellip;&amp;hellip;&lt;/p&gt;&#xA;&lt;p&gt;三、设置启动参数&lt;/p&gt;&#xA;&lt;p&gt;[仅供参考]&lt;/p&gt;&#xA;&lt;p&gt;&amp;ldquo;root=/dev/nfs init=/sbin/init console=ttySAC0 nfsroot=192.168.0.100:/home/arm ip=192.168.0.101&amp;rdquo;&lt;/p&gt;</description>
    </item>
    <item>
      <title>Linux启动参数</title>
      <link>https://xcdd.pages.dev/blog/2013/2013-09-02-1645/</link>
      <pubDate>Mon, 02 Sep 2013 16:45:21 +0000</pubDate>
      <guid>https://xcdd.pages.dev/blog/2013/2013-09-02-1645/</guid>
      <description>&lt;p&gt;U-boot的环境变量值得注意的有两个： bootcmd 和bootargs。&#xA;u-bootcmd&#xA;前面有说过bootcmd是自动启动时默认执行的一些命令，因此你可以在当前环境中定义各种不同配置，不同环境的参数设置，然后设置bootcmd为你经常使用的那种参数。&#xA;u-bootargs&#xA;bootargs是环境变量中的重中之重，甚至可以说整个环境变量都是围绕着bootargs来设置的。bootargs的种类非常非常的多，我们平常只是使用了几种而已，感兴趣的可以看看这篇文章说的很全：http://blog.chinaunix.net/u2/79570/showart_1675071.html。bootargs非常的灵活，内核和文件系统的不同搭配就会有不同的设置方法，甚至你也可以不设置bootargs,而直接将其写到内核中去（在配置内核的选项中可以进行这样的设置），正是这些原因导致了bootargs使用上的困难。&#xA;下面介绍一下bootargs常用参数，bootargs的种类非常的多，而且随着kernel的发展会出现一些新的参数，使得设置会更加灵活多样。&lt;/p&gt;&#xA;&lt;p&gt;A. root&#xA;用来指定rootfs的位置， 常见的情况有:&#xA;root=/dev/ram rw&#xA;root=/dev/ram0 rw&#xA;请注意上面的这两种设置情况是通用的，我做过测试甚至root=/dev/ram1 rw和root=/dev/ram2 rw也是可以的，网上有人说在某些情况下是不通用的，即必须设置成ram或者ram0，但是目前还没有遇到，还需要进一步确认，遇到不行的时候可以逐一尝试。&lt;/p&gt;&#xA;&lt;p&gt;root=/dev/mtdx rw&#xA;root=/dev/mtdblockx rw&#xA;root=/dev/mtdblock/x rw&#xA;root=31:0x&lt;/p&gt;&#xA;&lt;p&gt;上面的这几个在一定情况下是通用的，当然这要看你当前的系统是否支持，不过mtd是字符设备，而mtdblock是块设备，有时候你的挨个的试到底当前的系统支持上面那种情况下，不过root=/dev/mtdblockx rw比较通用。此外，如果直接指定设备名可以的话，那么使用此设备的设备号也是可以的。&lt;/p&gt;&#xA;&lt;p&gt;root=/dev/nfs&#xA;在文件系统为基于nfs的文件系统的时候使用。当然指定root=/dev/nfs之后，还需要指定nfsroot=serverip:nfs_dir，即指明文件系统存在那个主机的那个目录下面。&lt;/p&gt;&#xA;&lt;p&gt;B. rootfstype&#xA;这个选项需要跟root一起配合使用，一般如果根文件系统是ext2的话，有没有这个选项是无所谓的，但是如果是jffs2,squashfs等文件系统的话，就需要rootfstype指明文件系统的类型，不然会无法挂载根分区.&lt;/p&gt;&#xA;&lt;p&gt;C. console&#xA;console=tty  使用虚拟串口终端设备 .&#xA;console=ttyS[,options] 使用特定的串口，options可以是这样的形式bbbbpnx，这里bbbb是指串口的波特率，p是奇偶位（从来没有看过使用过），n是指的bits。&#xA;console=ttySAC[,options] 同上面。&lt;/p&gt;&#xA;&lt;p&gt;看你当前的环境，有时用ttyS，有时用ttySAC，网上有人说，这是跟内核的版本有关，2.4用ttyS，2.6用ttySAC，但实际情况是官方文档中也是使用ttyS，所以应该是跟内核版本没有关联的。可以查看Documentation/serial-console.txt找到相关描述。&lt;/p&gt;&#xA;&lt;p&gt;D. mem&#xA;mem=xxM 指定内存的大小，不是必须的&lt;/p&gt;&#xA;&lt;p&gt;E. ramdisk_size&#xA;ramdisk=xxxxx           不推荐&#xA;ramdisk_size=xxxxx   推荐&#xA;上面这两个都可以告诉ramdisk 驱动，创建的ramdisk的size，默认情况下是4m(s390默认8M)，你可以查看Documentation/ramdisk.txt找到相关的描述，不过ramdisk=xxxxx在新版的内核都已经没有提了，不推荐使用。&lt;/p&gt;&#xA;&lt;p&gt;F. initrd, noinitrd&#xA;当你没有使用ramdisk启动系统的时候，你需要使用noinitrd这个参数，但是如果使用了的话，就需要指定initrd=r_addr,size, r_addr表示initrd在内存中的位置，size表示initrd的大小。&lt;/p&gt;&#xA;&lt;p&gt;G. init&#xA;init指定的是内核启起来后，进入系统中运行的第一个脚本，一般init=/linuxrc, 或者init=/etc/preinit，preinit的内容一般是创建console,null设备节点，运行init程序，挂载一些文件系统等等操作。请注意，很多初学者以为init=/linuxrc是固定写法，其实不然，/linuxrc指的是/目录下面的linuxrc脚本，一般是一个连接罢了。&lt;/p&gt;&#xA;&lt;p&gt;H. mtdparts&#xA;mtdparts=fc000000.nor_flash:1920k(linux),128k(fdt),20M(ramdisk),4M(jffs2),38272k(user),256k(env),384k(uboot)&#xA;要想这个参数起作用，内核中的mtd驱动必须要支持，即内核配置时需要选上Device Drivers  &amp;mdash;&amp;gt; Memory Technology Device (MTD) support  &amp;mdash;&amp;gt; Command line partition table parsing&lt;/p&gt;</description>
    </item>
    <item>
      <title>GCC编译生成bin</title>
      <link>https://xcdd.pages.dev/blog/2013/2013-09-02-1644/</link>
      <pubDate>Mon, 02 Sep 2013 16:44:42 +0000</pubDate>
      <guid>https://xcdd.pages.dev/blog/2013/2013-09-02-1644/</guid>
      <description>&lt;p&gt;#连接&#xA;arm-linux-ld -Tboot.lds -o a.out $^&lt;/p&gt;&#xA;&lt;p&gt;#将elf文件转换为bin&#xA;arm-linux-objcopy -O binary -S a.out a.bin&lt;/p&gt;&#xA;&lt;p&gt;#boot.lds文件&#xA;SECTIONS {&lt;/p&gt;&#xA;&lt;p&gt;. = 0x30000000;&#xA;.text          :   { &lt;em&gt;(.text) }&#xA;.rodata ALIGN(4) : {&lt;/em&gt;(.rodata)}&#xA;.data ALIGN(4) : { *(.data) }&#xA;.bss ALIGN(4)  : { *(.bss)  *(COMMON) }&#xA;}&lt;/p&gt;</description>
    </item>
    <item>
      <title>配置纯净版Debian开发环境</title>
      <link>https://xcdd.pages.dev/blog/2013/2013-09-02-1642/</link>
      <pubDate>Mon, 02 Sep 2013 16:42:06 +0000</pubDate>
      <guid>https://xcdd.pages.dev/blog/2013/2013-09-02-1642/</guid>
      <description>&lt;p&gt;为了在虚拟机中编译使用linux环境开发一些软件需要用到Linux开发环境，而我不需要ubuntu之类的桌面系统，它太庞大了。&#xA;在实际开发中，使用虚拟机+Windows共享文件的方式，代码编辑在windows进行，而linux只需要make一下，所以我只需要一个控制台。&#xA;所以要自己安装一个精简的Linux开发环境。&lt;/p&gt;&#xA;&lt;p&gt;发现Debian有一个网络安装系统的iso文件，很小只有200MB左右，安装完后什么都没有，只有控制台，非常nice！&#xA;这就是我想要的了，从这个最小系统为基础，开始搭建我的linux开发环境。&lt;/p&gt;&#xA;&lt;p&gt;debian的所有版本安装包在这里下载：http://cdimage.debian.org/cdimage/archive/&lt;/p&gt;&#xA;&lt;p&gt;下载好netinst.iso后，在安装的时候，选择：Advanced options &amp;ndash;&amp;gt; Expert install&#xA;这样在安装的时候会有更多选择.比如可以选择只建立root账号，而不用建立一个无用的普通账号。&lt;/p&gt;&#xA;&lt;p&gt;########################################################################################################################&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;常用配置文件&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;系统启动菜单：/boot/grub/grub.cfg&#xA;初始化脚本：/etc/init.d/&#xA;配置环境变量：/etc/profiles&#xA;配置环境变量：/etc/bash.bashrc&#xA;IP地址设置：/etc/networks/interface&#xA;DNS服务器： /etc/resolv.conf&#xA;安装包配置：/etc/apt/sources.list&lt;/p&gt;&#xA;&lt;p&gt;########################################################################################################################&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;修改vim的配置&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;配置文件：/etc/vim/vimrc.tiny&#xA;添加代码：&#xA;set nocompatible&#xA;set backspace=2&#xA;set tabstop=4&lt;/p&gt;&#xA;&lt;p&gt;########################################################################################################################&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;设置别名&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;配置文件：/etc/bash.bashrc&#xA;参考设置：&#xA;alias ls=&amp;lsquo;ls &amp;ndash;color&amp;rsquo;&#xA;alias ll=&amp;lsquo;ls -l&amp;rsquo;&#xA;alias ps=&amp;lsquo;ps - x&amp;rsquo;&lt;/p&gt;&#xA;&lt;p&gt;########################################################################################################################&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;设置网络连接&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;配置文件：/etc/network/interfaces&#xA;自动获取IP&#xA;iface eth0 inet dhcp&lt;/p&gt;&#xA;&lt;p&gt;静态IP地址：&#xA;iface eth0 inet static&#xA;address 192.168.0.100&#xA;gateway 192.168.0.1&#xA;netmask 255.255.255.0&lt;/p&gt;&#xA;&lt;p&gt;DNS地址配置：&#xA;配置文件：/etc/resolv.conf&#xA;nameserver 192.168.0.1&lt;/p&gt;&#xA;&lt;p&gt;手动配置命令：&#xA;ifconfig eth0 up&#xA;dhclient eth0&#xA;route add default gw 192.168.0.1&lt;/p&gt;</description>
    </item>
    <item>
      <title>MFC加载纯资源DLL</title>
      <link>https://xcdd.pages.dev/blog/2013/2013-09-02/</link>
      <pubDate>Mon, 02 Sep 2013 16:33:14 +0000</pubDate>
      <guid>https://xcdd.pages.dev/blog/2013/2013-09-02/</guid>
      <description>&lt;p&gt;不同语言的资源放到不同的DLL中，在运行时加载特定语言的DLL。&lt;/p&gt;&#xA;&lt;p&gt;一、制作纯资源DLL&lt;/p&gt;&#xA;&lt;p&gt;新建Win32工程，选择动态链接库。&lt;/p&gt;&#xA;&lt;p&gt;在工程选项里，链接器 -&amp;gt; 高级 -&amp;gt; 无入口程序 = 是/NOENTRY&lt;/p&gt;&#xA;&lt;p&gt;然后在资源里面添加想要的各种资源。&lt;/p&gt;&#xA;&lt;p&gt;最后添加DLL入口程序&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-cpp&#34; data-lang=&#34;cpp&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;#include&amp;lt;windows.h&amp;gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;extern&lt;/span&gt;&#x9;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;C&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;BOOL   WINAPI   DllMain(   HINSTANCE   hInstance,   DWORD   dwReason,   LPVOID)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;{  &#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt;&#x9;TRUE;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;编译完就会生成一个DLL。二、加载DLL&lt;/p&gt;&#xA;&lt;p&gt;新建MFC工程，在xxxApp.cpp里面的::InitInstance()函数添加&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-cpp&#34; data-lang=&#34;cpp&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    HINSTANCE   hDll;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    hDll &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;::&lt;/span&gt;LoadLibrary(&lt;span style=&#34;color:#e6db74&#34;&gt;L&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;0804.dll&amp;#34;&lt;/span&gt;);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#75715e&#34;&gt;//使用图标资源    &#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;    AfxSetResourceHandle(hDll); &#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;后面创建的对话框，资源等都会自动从该DLL的去实现。&#xA;哦，还有一个，resource.h资源头文件要使用资源那个工程的&lt;/p&gt;</description>
    </item>
    <item>
      <title>手机在于折腾，历时5个月终于救回来了！</title>
      <link>https://xcdd.pages.dev/blog/2013/2013-05-07/</link>
      <pubDate>Tue, 07 May 2013 16:16:39 +0000</pubDate>
      <guid>https://xcdd.pages.dev/blog/2013/2013-05-07/</guid>
      <description>&lt;p&gt;经历了5个月的研究，终于把我的手机救回来了。&lt;/p&gt;&#xA;&lt;p&gt;之前的分析结果是正确的，PXA300启动过程是要加载NTIM，OBM，EBOOT，IPL。&lt;/p&gt;&#xA;&lt;p&gt;不过这样是不能开机的，因为缺少EBOOTCFG，也就是EBOOT的启动参数，而这个启动参数却不包含在刷机ROM文件之中。&lt;/p&gt;&#xA;&lt;p&gt;这就是导致我怎么折腾都不能启动的原因！&lt;/p&gt;&#xA;&lt;p&gt;疑问就是这个启动参数不在ROM文件内，那它是怎么生成的呢？其内容也不会因为刷机而改变，那估计只能是厂家出厂的时候写进去的吧。&lt;/p&gt;&#xA;&lt;p&gt;为了得到这个启动参数的内容，我在淘宝找到一个类似我手机的主板PXA310的，一个二手主板，拿回家用JTAG读Flash。&lt;/p&gt;&#xA;&lt;p&gt;果然读到了128KB的EBOOTCFG，这里面的内容在ROM文件里是查不到的，我把这128KB写到我手机主板的FLASH里面，插上电池&amp;hellip;&lt;/p&gt;&#xA;&lt;p&gt;终于让我看到了久违的开机画面啊！！！太兴奋了啊，为了这个手机我花了多少的心血！&lt;/p&gt;&#xA;&lt;p&gt;不过此时还是启动不了，因为NK部分已经残缺不全，不过这个问题很容易啦，重新进入USB Update Mode，刷入之前能用的ROM。OK&lt;/p&gt;&#xA;&lt;p&gt;一切搞定！！！&lt;/p&gt;&#xA;&lt;p&gt;在此保存一下研究结果，方便以后查询：&lt;/p&gt;&#xA;&lt;p&gt;1、Nand存储结构：&lt;/p&gt;&#xA;&lt;p&gt;Nand大小：256MB&lt;/p&gt;&#xA;&lt;p&gt;共2048个块，块大小：128KB&lt;/p&gt;&#xA;&lt;table&gt;&#xA;  &lt;thead&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;th style=&#34;text-align: center&#34;&gt;起始地址&lt;/th&gt;&#xA;      &lt;/tr&gt;&#xA;  &lt;/thead&gt;&#xA;  &lt;tbody&gt;&#xA;  &lt;/tbody&gt;&#xA;&lt;/table&gt;&#xA;&lt;table&gt;&#xA;  &lt;thead&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;th style=&#34;text-align: center&#34;&gt;长度&lt;/th&gt;&#xA;      &lt;/tr&gt;&#xA;  &lt;/thead&gt;&#xA;  &lt;tbody&gt;&#xA;  &lt;/tbody&gt;&#xA;&lt;/table&gt;&#xA;&lt;table&gt;&#xA;  &lt;thead&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;th style=&#34;text-align: center&#34;&gt;内容&lt;/th&gt;&#xA;      &lt;/tr&gt;&#xA;  &lt;/thead&gt;&#xA;  &lt;tbody&gt;&#xA;  &lt;/tbody&gt;&#xA;&lt;/table&gt;&#xA;&lt;table&gt;&#xA;  &lt;thead&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;th style=&#34;text-align: center&#34;&gt;0x00000&lt;/th&gt;&#xA;          &lt;th style=&#34;text-align: center&#34;&gt;0x20000&lt;/th&gt;&#xA;          &lt;th style=&#34;text-align: center&#34;&gt;NTIM&lt;/th&gt;&#xA;      &lt;/tr&gt;&#xA;  &lt;/thead&gt;&#xA;  &lt;tbody&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;0x20000&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;0x20000&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;OBM&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;0x40000&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;0x40000&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;EBOOT&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;0x80000&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;0x20000&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;IPL&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;0xA0000&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;0x20000&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;EBTCFG&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;0xC0000&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;0x60000&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;LOGO&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;0x120000&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;&amp;mdash;&amp;mdash;&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;MBR&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;  &lt;/tbody&gt;&#xA;&lt;/table&gt;&#xA;&lt;p&gt;2、主板JTAG接口&lt;/p&gt;&#xA;&lt;p&gt;&lt;img src=&#34;./004_1&#34; alt=&#34;&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;从2013-01-01到今日2013-05-05整整5个月，我早已买了Android手机，面对这个旧手机，似乎有种物是人非的感觉啊。&lt;/p&gt;</description>
    </item>
    <item>
      <title>手机在于折腾，探索未知世界！</title>
      <link>https://xcdd.pages.dev/blog/2013/2013-01-13-2200/</link>
      <pubDate>Sun, 13 Jan 2013 22:00:24 +0000</pubDate>
      <guid>https://xcdd.pages.dev/blog/2013/2013-01-13-2200/</guid>
      <description>&lt;p&gt;我最近折腾一个WM系统的手机。&#xA;手机和开发板的区别就在于：手机没有任何资料，而开发板有全套电路图+BSP源码！&#xA;为了探索手机中的未知世界，唯一的办法就是逆向工程，逆向分析最好的就是写程序去验证。&lt;/p&gt;&#xA;&lt;p&gt;一个不知天高地厚的少年就开始折腾他的手机：&#xA;花了大量时间去寻找JTAG测试点   &amp;mdash;&amp;ndash;&amp;gt;成功&#xA;寻找支持PXA300的廉价JTAG工具 &amp;mdash;&amp;ndash;&amp;gt;成功&#xA;用JTAG访问NandFlash                  &amp;mdash;&amp;ndash;&amp;gt;  成功&#xA;写程序检测GPIO连接                     &amp;mdash;&amp;ndash;&amp;gt;  部分成功&lt;/p&gt;&#xA;&lt;p&gt;后来他疯了，居然对Bootloader下毒手：&#xA;用JTAG把Flash清空了                 &amp;mdash;&amp;mdash;-&amp;gt; 成功了&lt;/p&gt;&#xA;&lt;p&gt;验证手机肯定不能开机                  &amp;mdash;&amp;mdash;-&amp;gt; XD 成功了&lt;/p&gt;&#xA;&lt;p&gt;他醒悟了：&lt;/p&gt;&#xA;&lt;p&gt;用JTAG重新烧写Bootloader        &amp;mdash;&amp;mdash;&amp;mdash;&amp;gt; 成功了&lt;/p&gt;&#xA;&lt;p&gt;验证手机重新开机                       &amp;mdash;&amp;mdash;&amp;mdash;-&amp;gt;失败了！！！！&lt;/p&gt;&#xA;&lt;p&gt;XD&amp;hellip; 他崩溃了。。。。。&lt;/p&gt;&#xA;&lt;p&gt;：：：为什么把原厂ROM中的Boot部分重新写入Flash就不能开机了呢&amp;hellip;???&lt;/p&gt;</description>
    </item>
    <item>
      <title>手机在于折腾，这下玩火自焚了...</title>
      <link>https://xcdd.pages.dev/blog/2013/2013-01-13/</link>
      <pubDate>Sun, 13 Jan 2013 21:38:54 +0000</pubDate>
      <guid>https://xcdd.pages.dev/blog/2013/2013-01-13/</guid>
      <description>&lt;p&gt;&lt;strong&gt;前言&lt;/strong&gt; 这是一个基于Marvell PXA300的WM6系统的手机。我前不久想把它当成“开发板”来折腾一下，写几个ARM的裸机程序来玩玩。&lt;/p&gt;&#xA;&lt;p&gt;于是我对其进行大量逆向工程，现在我已经知道大部分GPIO连接方式和主板上的JTAG引脚。&lt;/p&gt;&#xA;&lt;p&gt;我大胆地用JTAG把里面的Flash（型号：H8BCS0SI0MBR,256MB）给清空了，全部block,当然包括bootloader部分。&lt;/p&gt;&#xA;&lt;p&gt;然后自然就无法开机了。我就可以自己写程序来用这个“开发板”了&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;现在想还原&lt;/strong&gt; 我现在想把Bootloader还原，重新变成手机，发现问题来了，我虽然有这个手机原厂的ROM，文件名：SMART.UPR。&lt;/p&gt;&#xA;&lt;p&gt;这个文件里面包括了Bootloader + OS Image + Modem CLA(NXP5209)。&#xA;我原来以为只要把这里面的bootloader部分重新写入Flash的0地址就可以解决问题。但是结果失败了！！！伤心啊~~~&lt;/p&gt;&#xA;&lt;p&gt;后悔当初太冲动，应该先把Flash里面的内容备份出来再清空啊！！！&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;以下是分析过程&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;首先原厂ROM的结构：header + bootloader + NK + Modem，这个是确定无误的。&lt;/p&gt;&#xA;&lt;p&gt;header 大小为0x400（1024B），就是对这个文件的一些描述，估计只有厂家才知道这些数据的格式。&lt;/p&gt;&#xA;&lt;p&gt;bootloader，这部分结构为 IPL1 + NTIM + OBM + EBOOT + IPL2 + LOGO&lt;/p&gt;&#xA;&lt;p&gt;IPL1和IPL2我不敢肯定哪个是真正的IPL，我感觉应该是 IPL2，原因是：&lt;/p&gt;&#xA;&lt;p&gt;WM的启动过程是BootROM -&amp;gt; NTIM -&amp;gt; OBM -&amp;gt; EBOOT -&amp;gt; IPL -&amp;gt; OS&lt;/p&gt;&#xA;&lt;p&gt;一般说来是按照顺序储存在NandFlash里面的。而这个IPL1的位置却放在最前面，我有点搞不懂它的作用。&lt;/p&gt;&#xA;&lt;p&gt;通过反汇编（要是有源码看就不用反汇编了）可以看出来IPL1和IPL2有很多相同的代码。&lt;/p&gt;&#xA;&lt;p&gt;IPL1为64KB，IPL2为128KB，其中IPL2添加了大量关于NXP5209的处理代码，所以我觉得IPL2应该才是正常启动用的IPL。&lt;/p&gt;&#xA;&lt;p&gt;在IPL1这64KB中，有个明显的字符串：“Microsoft Windows CE IPL for Intel PXA 310 Zylonite”，这不科学呀！它应该在EBOOT的后面才对。&lt;/p&gt;&#xA;&lt;p&gt;在Flash里面的储存结构理论上应该是下面这样：&lt;/p&gt;&#xA;&lt;table&gt;&#xA;  &lt;thead&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;th style=&#34;text-align: center&#34;&gt;block5&lt;/th&gt;&#xA;          &lt;th style=&#34;text-align: center&#34;&gt;LOGO&lt;/th&gt;&#xA;          &lt;th style=&#34;text-align: center&#34;&gt;128KB&lt;/th&gt;&#xA;      &lt;/tr&gt;&#xA;  &lt;/thead&gt;&#xA;  &lt;tbody&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;block4&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;IPL&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;128KB&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;block3&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;EBOOT&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;128KB&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;block2&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;EBOOT&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;128KB&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;block1&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;OBM&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;128KB&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;block0&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;NTIM&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;128KB&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;  &lt;/tbody&gt;&#xA;&lt;/table&gt;&#xA;&lt;p&gt;PXA300的BootROM手册里面有关于NTIM的描述，所以我从SMART.ROM文件里的NTIM部分可以肯定NTIM,OBM,EBOOT的储存位置肯定是在Flash中从block0连续存放的。&#xA;我最先做的就是把NTIM+OBM+EBOOT一共512KB连续地放在Flash的第block0,1,2,3里面。&#xA;我原本以为这样就正确了，当我连接电源的时候，充电灯亮了，屏幕也亮了，但是按开机却一直黑屏。&#xA;我又试了以前常规的刷机方法，按Vol+Power，嗯，能进入USB Update Mode，一切看上去很正常，用刷机软件刷入smart.upr,重启还是黑屏，依旧不能开机。&lt;/p&gt;</description>
    </item>
    <item>
      <title>QSV文件格式简单分析</title>
      <link>https://xcdd.pages.dev/blog/2012/2012-03-16/</link>
      <pubDate>Fri, 16 Mar 2012 19:00:49 +0000</pubDate>
      <guid>https://xcdd.pages.dev/blog/2012/2012-03-16/</guid>
      <description>&lt;p&gt;QSV文件是奇艺为了保护版本而产生的一种文件格式。&lt;/p&gt;&#xA;&lt;p&gt;但这一措施使得想在手机、平板等非PC平台上播放该视频带来严重不便，于是想方设法把QSV文件转换为别的平台可播放的格式。&lt;/p&gt;&#xA;&lt;h2 id=&#34;一个qsv文件包含文件头和视频数据加部分&#34;&gt;前段时间我对奇艺的QSV文件格式也做了少量的研究。因为我也想在手机上播放奇艺影音下载的视频。&#xA;事实上奇艺的所有视频都是f4v格式的，f4v其实就是一种FLV格式，只是其视频编码采用的是H.264；&#xA;通过奇艺影音下载的视频都被奇艺影音加密处理了一下把后缀改成了QSV。&#xA;下面我就说说我研究QSV文件所得到的结论：&#xA;一个QSV文件包含文件头和视频数据加部分。&lt;/h2&gt;&#xA;&lt;p&gt;一、文件头部&#xA;1.QSV文件前面9个字节为固定“QIYI VIDEO”，文件格式标识符&#xA;2.第0A-0D字节，是QSV文件内部版本号，以前的QSV文件版本号都是01，现在奇艺已经更新版本号为02，当然结构也会跟着变化&#xA;3.第0E-1D字节，是视频ID号&#xA;4.第1E-45字节，作用暂时未知，大部分为0&#xA;5.第46-49字节，标识是否有视频信息，为1则有，为0则无&#xA;6.第4A-4D字节，视频信息的偏移值&#xA;7.第4E-51字节，全为0，作用未知&#xA;8.第52-55字节，视频信息的长度（视频信息为一段XML文件）&#xA;9.第56-59字节，视频分段数量（奇艺视频将一个F4V文件分成了若干段，一段大约6分钟）&#xA;10.第5A-5B字节，作用未知&lt;/p&gt;&#xA;&lt;p&gt;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;ndash;以下是F4V分段索引&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;ndash;&#xA;11.第5B-6A字节，作用未知，猜测为本小段f4v文件的校验码&#xA;12.第6B-6E字节，本段F4V文件的偏移地址&#xA;13.第6F-72字节，全为0&#xA;13.第73-76字节，本小段F4V文件的长度&lt;/p&gt;&#xA;&lt;p&gt;14.第77-86字节，下一段F4V的校验&#xA;15.第87-8A字节，下一段F4V的偏移地址&#xA;16&amp;hellip;&amp;hellip;&amp;hellip;&amp;hellip;&amp;hellip;&amp;hellip;&amp;hellip;&amp;hellip;&amp;hellip;&amp;hellip;&amp;hellip;&lt;/p&gt;&#xA;&lt;hr&gt;&#xA;&lt;h2 id=&#34;加密算法为以4个字节为单位进行异或操作异或的数据为0x79706762&#34;&gt;二、视频数据&#xA;从文件头部可以得到各个F4V分段的偏移地址和分段长度。&#xA;直接提取出来是不行的，因为奇艺对这些F4V文件进行了加密处理。&#xA;加密方式为：&#xA;将各F4V分段的前面1024字节进行加密，后面的没有加密。&#xA;加密算法为以4个字节为单位进行异或操作，异或的数据为0X79706762&lt;/h2&gt;&#xA;&lt;p&gt;附上QSV转换工具&lt;/p&gt;&#xA;&lt;p&gt;QSV2FLV:  &lt;a href=&#34;http://pan.baidu.com/share/home?uk=1526776463#category/type=0&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;http://pan.baidu.com/share/home?uk=1526776463#category/type=0&lt;/a&gt;&lt;/p&gt;</description>
    </item>
  </channel>
</rss>
