<?xml version="1.0" encoding="utf-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" version="2.0"><channel><title>悦源财经网</title><link>https://www.dihkvq.cn/</link><description>灵灵猴</description><item><title>（寻味中华丨艺林）兰州太平鼓：刚柔相济凌空跃 擂鼓发声寄太平</title><link>https://www.dihkvq.cn/yueyuan/2734.html</link><description>&lt;p&gt;　　中新社兰州10月11日电 题：兰州太平鼓：刚柔相济凌空跃 擂鼓发声寄太平&lt;/p&gt; 
&lt;p&gt;　　中新社记者 闫姣&lt;/p&gt; 
&lt;p&gt;　　“太平年求太平事，太平人打太平鼓。”这句流传西北民间数百年的俗语，道出了中华儿女祈愿国泰民安、风调雨顺的质朴初心。国庆节假期前后，在甘肃兰州黄河岸畔，铿锵错落的兰州太平鼓点起落有致，鼓潮奔涌。&lt;/p&gt; 
&lt;p&gt;　　兰州太平鼓是西北黄土高原最具代表性的民俗符号之一。这项扎根陇原沃土的古老鼓舞已有数百年传承史，2006年被列入第一批国家级非物质文化遗产名录，以磅礴气势、严谨技艺体系，成为黄河文明与丝路文脉交融孕育的活态民俗遗存。&lt;/p&gt;  
&lt;img style=&quot;display: block; margin: auto; cursor: pointer;&quot; src=&quot;https://i2.chinanews.com.cn/simg/ypt/2026/261011/fca97297-a821-46c4-ab66-b716aa1ae304_zsite.jpg&quot; class=&quot;aligncenter&quot;&gt;   10月4日，甘肃省兰州市城关区，兰州太平鼓队热闹开演。中新社记者 闫姣 摄  
&lt;p&gt;　　年过七旬的兰州太平鼓国家级非遗代表性传承人缪正发，深耕太平鼓技艺四十余载。他对中新社记者说，兰州太平鼓的西北风骨，藏在形制、打法与阵式的独特规制中。其鼓形硕大庄重，双面蒙牛皮鼓面，鼓身绘二龙戏珠等传统纹样。不同于常规鼓乐使用鼓槌敲击，太平鼓以麻绳、皮条拧制鼓条“擂鼓发声”，讲究“人舞鼓，鼓带人，人鼓合一”。&lt;/p&gt; 
&lt;p&gt;　　完整的太平鼓表演体系章法有序，分为低鼓、中鼓、高鼓三大核心打法，民间称“高鼓打花样，中鼓打技巧，低鼓打深沉”。表演融合戏曲架子功与西北武术技法，衍生出轻重缓急、刚柔并济的多元节奏；跳打、骑打、翻身打等基础动作，搭配“鹞子翻身”“策马扬鞭”等经典身法，尽显力量之美。&lt;/p&gt; 
&lt;p&gt;　　太平鼓的阵法体系源自古时边关军阵，“金龙交尾”“一字长蛇”“八卦合围”等阵型规模考究，少则24人，多则108人，阵形开合流转、气势层层递进。&lt;/p&gt;   10月1日，甘肃兰州市永登县苦水镇苦水街村，鼓手敲响太平鼓。鲍欣怡 摄  
&lt;p&gt;　　任职于兰州太平鼓教育保护实践基地的赵恒长，16岁便入门扎根乡村社火队伍潜心历练，与鼓相伴数十载。他说，太平鼓是中华鼓艺中最难驾驭的品类之一，鼓身无固定支点，仅凭鼓带斜挎肩头，鼓手需在凌空跳跃、腾挪转身间精准控鼓、稳落鼓点，力量、节奏、身法、默契缺一不可，是对体力、耐力与专注力的多重考验。&lt;/p&gt; 
&lt;p&gt;　　为适配当代舞台，兰州太平鼓匠人们在不改其魂、不减其韵的前提下适度改良：古时重达数十斤的鼓身优化为几斤重，降低练习门槛，更适配青少年、女性学习者。&lt;/p&gt;   2月5日，甘肃省兰州市榆中县小康营乡红寺村，年轻人舞动太平鼓。中新社记者 李亚龙 摄  
&lt;p&gt;　　岁月流转间，这项古老技艺历经深刻蜕变。从乡村社火、节庆巡游，到赛事开幕式、校园课堂，兰州太平鼓的舞台不断拓宽。如今，兰州市皋兰县将太平鼓纳入中小学课后服务，组建多支校园鼓队，实现非遗进校园全覆盖。&lt;/p&gt;</description><pubDate>Tue, 13 Oct 2026 08:24:02 +0800</pubDate></item><item><title>上电那一刻，谁决定进recovery？——U-Boot侧的分流逻辑</title><link>https://www.dihkvq.cn/yueyuan/2733.html</link><description>&lt;p class=&quot;rich_media_content js_underline_content autoTypeSetting24psection&quot;&gt; 
 &lt;p style=&quot;color:rgb(17,17,17);font-family:'-apple-system', 'PingFang SC', 'Microsoft YaHei', 'Noto Sans SC', sans-serif;font-style:normal;font-weight:400;letter-spacing:normal;text-indent:0px;text-transform:none;white-space:normal;word-spacing:0px;background-color:rgb(255,255,255);text-decoration-thickness:initial;text-decoration-style:initial;text-decoration-color:initial;font-size:14px;margin:0px 0px 22px;border-bottom:1px solid rgb(229,231,235);padding-bottom:14px;&quot;&gt; &lt;span&gt;先说一个容易踩的坑：网上和文档里常说的&quot;SPL 阶段就决定加载 boot 还是 recovery&quot;，在这份 &lt;u&gt;SD&lt;/u&gt;K 里是不成立的——那段代码被一个默认关闭的编译开关挡住了。真正的分流全在 U-Boot proper 里。中间还夹着一层环境变量，可以越过整个判断链。&lt;/span&gt;&lt;/p&gt; 
 &lt;h2 style=&quot;color:rgb(17,17,17);font-family:'-apple-system', 'PingFang SC', 'Microsoft YaHei', 'Noto Sans SC', sans-serif;font-style:normal;letter-spacing:normal;text-indent:0px;text-transform:none;white-space:normal;word-spacing:0px;background-color:rgb(255,255,255);text-decoration-thickness:initial;text-decoration-style:initial;text-decoration-color:initial;font-size:20px;border-left:4px solid rgb(17,17,17);padding-left:10px;margin:34px 0px 12px;&quot;&gt; &lt;span&gt;问题场景&lt;/span&gt;&lt;/h2&gt; 
 &lt;p style=&quot;color:rgb(17,17,17);font-family:'-apple-system', 'PingFang SC', 'Microsoft YaHei', 'Noto Sans SC', sans-serif;font-size:medium;font-style:normal;font-weight:400;letter-spacing:normal;text-indent:0px;text-transform:none;white-space:normal;word-spacing:0px;background-color:rgb(255,255,255);text-decoration-thickness:initial;text-decoration-style:initial;text-decoration-color:initial;&quot;&gt; &lt;span&gt;上一篇讲清楚了&quot;进不进 recovery&quot;取决于 misc 分区 16K 处那 32 个字节的 command 字段。但那是&lt;/span&gt;&lt;b&gt;&lt;span&gt;数据&lt;/span&gt;&lt;/b&gt;&lt;span&gt;，还得有人去读它、并且据此改变启动路径。&lt;/span&gt;&lt;/p&gt; 
 &lt;p style=&quot;color:rgb(17,17,17);font-family:'-apple-system', 'PingFang SC', 'Microsoft YaHei', 'Noto Sans SC', sans-serif;font-size:medium;font-style:normal;font-weight:400;letter-spacing:normal;text-indent:0px;text-transform:none;white-space:normal;word-spacing:0px;background-color:rgb(255,255,255);text-decoration-thickness:initial;text-decoration-style:initial;text-decoration-color:initial;&quot;&gt; &lt;span&gt;官方文档第 3 章贴了一段 SD 卡启动的串口日志，里面有一行 en&lt;u&gt;te&lt;/u&gt;r Recovery mode!，后面跟着 &lt;u&gt;ANDROID&lt;/u&gt;: reboot reason: &quot;recovery&quot;。（这行和代码里实际打的不完全一样——代码里是小写的 entering recovery mode!，对着串口找的时候别被大小写卡住。）这两行分别是谁打的？除了 misc，还有没有别的办法让设备进 recovery？按住某个键上电是怎么生效的？&lt;/span&gt;&lt;/p&gt; 
 &lt;h2 style=&quot;color:rgb(17,17,17);font-family:'-apple-system', 'PingFang SC', 'Microsoft YaHei', 'Noto Sans SC', sans-serif;font-style:normal;letter-spacing:normal;text-indent:0px;text-transform:none;white-space:normal;word-spacing:0px;background-color:rgb(255,255,255);text-decoration-thickness:initial;text-decoration-style:initial;text-decoration-color:initial;font-size:20px;border-left:4px solid rgb(17,17,17);padding-left:10px;margin:34px 0px 12px;&quot;&gt; &lt;span&gt;一、先纠正一个常见的误解&lt;/span&gt;&lt;/h2&gt; 
 &lt;p style=&quot;color:rgb(17,17,17);font-family:'-apple-system', 'PingFang SC', 'Microsoft YaHei', 'Noto Sans SC', sans-serif;font-size:medium;font-style:normal;font-weight:400;letter-spacing:normal;text-indent:0px;text-transform:none;white-space:normal;word-spacing:0px;background-color:rgb(255,255,255);text-decoration-thickness:initial;text-decoration-style:initial;text-decoration-color:initial;&quot;&gt; &lt;span&gt;先明确一个前提，否则后面容易看错代码。&lt;/span&gt;&lt;/p&gt; 
 &lt;p style=&quot;color:rgb(17,17,17);font-family:'-apple-system', 'PingFang SC', 'Microsoft YaHei', 'Noto Sans SC', sans-serif;font-size:medium;font-style:normal;font-weight:400;letter-spacing:normal;text-indent:0px;text-transform:none;white-space:normal;word-spacing:0px;background-color:rgb(255,255,255);text-decoration-thickness:initial;text-decoration-style:initial;text-decoration-color:initial;&quot;&gt; &lt;span&gt;RK 的 U-Boot 里确实写了一套「&lt;/span&gt;&lt;b&gt;&lt;span&gt;SPL 直接决定加载 boot 还是 recovery&lt;/span&gt;&lt;/b&gt;&lt;span&gt;」的逻辑，函数叫 spl_kernel_par&lt;u&gt;ti&lt;/u&gt;tion()。&lt;/span&gt;&lt;b&gt;&lt;span&gt;但它被关在 CONFIG_SPL_KERNEL_BOOT 后面，而这份 SDK 里这个开关是关的&lt;/span&gt;&lt;/b&gt;&lt;span&gt;：&lt;/span&gt;&lt;/p&gt; 
 &lt;ul class=&quot;code-snippet__line-index code-snippet__js&quot;&gt;
  &lt;li&gt; &lt;/li&gt; 
  &lt;li&gt; &lt;/li&gt; 
 &lt;/ul&gt;
 &lt;pre class=&quot;code-snippet__js&quot;&gt;
&lt;code&gt;&lt;span&gt;# u-boot/.config&lt;/span&gt;&lt;/code&gt;&lt;code&gt;&lt;span&gt;# CONFIG_SPL_KERNEL_BOOT is not set&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt; 
 &lt;p style=&quot;color:rgb(17,17,17);font-family:'-apple-system', 'PingFang SC', 'Microsoft YaHei', 'Noto Sans SC', sans-serif;font-size:medium;font-style:normal;font-weight:400;letter-spacing:normal;text-indent:0px;text-transform:none;white-space:normal;word-spacing:0px;background-color:rgb(255,255,255);text-decoration-thickness:initial;text-decoration-style:initial;text-decoration-color:initial;&quot;&gt; &lt;span&gt;所以在这份 SDK 上：&lt;/span&gt;&lt;/p&gt; 
 &lt;table style=&quot;color:rgb(17,17,17);font-family:'-apple-system', 'PingFang SC', 'Microsoft YaHei', 'Noto Sans SC', sans-serif;font-style:normal;font-weight:400;letter-spacing:normal;text-transform:none;white-space:normal;word-spacing:0px;background-color:rgb(255,255,255);text-decoration-thickness:initial;text-decoration-style:initial;text-decoration-color:initial;border-collapse:collapse;width:720px;font-size:13.5px;margin:10px 0px;border:1px solid rgb(229,231,235);&quot;&gt;
  &lt;tbody&gt;
   &lt;tr style=&quot;background:rgb(249,250,251);&quot;&gt;
    &lt;th style=&quot;border:1px solid rgb(229,231,235);padding:8px 10px;text-align:left;&quot;&gt; &lt;span&gt;阶段&lt;/span&gt;&lt;/th&gt; 
    &lt;th style=&quot;border:1px solid rgb(229,231,235);padding:8px 10px;text-align:left;&quot;&gt; &lt;span&gt;谁做决定&lt;/span&gt;&lt;/th&gt; 
   &lt;/tr&gt;
   &lt;tr&gt;
    &lt;td style=&quot;border:1px solid rgb(229,231,235);padding:8px 10px;text-align:left;&quot;&gt; &lt;span&gt;SPL&lt;/span&gt;&lt;/td&gt; 
    &lt;td style=&quot;border:1px solid rgb(229,231,235);padding:8px 10px;text-align:left;&quot;&gt; &lt;span&gt;只管把&lt;/span&gt;&lt;b&gt;&lt;span&gt;U-Boot proper&lt;/span&gt;&lt;/b&gt;&lt;span&gt;（lo&lt;u&gt;ad&lt;/u&gt;er）拉起来，&lt;/span&gt;&lt;b&gt;&lt;span&gt;不碰 boot/recovery&lt;/span&gt;&lt;/b&gt;&lt;/td&gt; 
   &lt;/tr&gt;
   &lt;tr&gt;
    &lt;td style=&quot;border:1px solid rgb(229,231,235);padding:8px 10px;text-align:left;&quot;&gt; &lt;span&gt;U-Boot proper&lt;/span&gt;&lt;/td&gt; 
    &lt;td style=&quot;border:1px solid rgb(229,231,235);padding:8px 10px;text-align:left;&quot;&gt; &lt;span&gt;&lt;u&gt;rockchip&lt;/u&gt;_get_boot_mode() ——&lt;/span&gt;&lt;b&gt;&lt;span&gt;真正的分流在这里&lt;/span&gt;&lt;/b&gt;&lt;/td&gt; 
   &lt;/tr&gt;
  &lt;/tbody&gt;
 &lt;/table&gt;
 &lt;p style=&quot;color:rgb(17,17,17);font-family:'-apple-system', 'PingFang SC', 'Microsoft YaHei', 'Noto Sans SC', sans-serif;font-size:medium;font-style:normal;font-weight:400;letter-spacing:normal;text-indent:0px;text-transform:none;white-space:normal;word-spacing:0px;background-color:rgb(255,255,255);text-decoration-thickness:initial;text-decoration-style:initial;text-decoration-color:initial;&quot;&gt; &lt;span&gt;CONFIG_SPL_KERNEL_BOOT 是给&lt;/span&gt;&lt;b&gt;&lt;span&gt;Thunder Boot&lt;/span&gt;&lt;/b&gt;&lt;span&gt;（rk3576-tb 那类配置）用的——那种方案要让 SPL 直接把内核拉起来以缩短启动时间，所以才需要在 SPL 阶段就决定加载哪个分区。普通配置下 SPL 只负责引导 U-Boot proper，分区选择留到后面做。&lt;/span&gt;&lt;/p&gt; 
 &lt;p style=&quot;color:rgb(17,17,17);font-family:'-apple-system', 'PingFang SC', 'Microsoft YaHei', 'Noto Sans SC', sans-serif;font-size:medium;font-style:normal;font-weight:400;letter-spacing:normal;text-indent:0px;text-transform:none;white-space:normal;word-spacing:0px;background-color:rgb(255,255,255);text-decoration-thickness:initial;text-decoration-style:initial;text-decoration-color:initial;&quot;&gt; &lt;b&gt;&lt;span&gt;这一篇主要讲 U-Boot proper 的逻辑；第二节顺带介绍 SPL 那套（只在 Thunder Boot 配置下生效），看的时候留意别把它当成当前配置的行为。&lt;/span&gt;&lt;/b&gt;&lt;/p&gt; 
 &lt;h2 style=&quot;color:rgb(17,17,17);font-family:'-apple-system', 'PingFang SC', 'Microsoft YaHei', 'Noto Sans SC', sans-serif;font-style:normal;letter-spacing:normal;text-indent:0px;text-transform:none;white-space:normal;word-spacing:0px;background-color:rgb(255,255,255);text-decoration-thickness:initial;text-decoration-style:initial;text-decoration-color:initial;font-size:20px;border-left:4px solid rgb(17,17,17);padding-left:10px;margin:34px 0px 12px;&quot;&gt; &lt;span&gt;二、SPL 阶段：读 16K 处的那个字符串&lt;/span&gt;&lt;/h2&gt; 
 &lt;p style=&quot;color:rgb(17,17,17);font-family:'-apple-system', 'PingFang SC', 'Microsoft YaHei', 'Noto Sans SC', sans-serif;font-size:medium;font-style:normal;font-weight:400;letter-spacing:normal;text-indent:0px;text-transform:none;white-space:normal;word-spacing:0px;background-color:rgb(255,255,255);text-decoration-thickness:initial;text-decoration-style:initial;text-decoration-color:initial;&quot;&gt; &lt;span&gt;SPL 的判断代码短到可以整段看完：&lt;/span&gt;&lt;/p&gt; 
 &lt;ul class=&quot;code-snippet__line-index code-snippet__js&quot;&gt;
  &lt;li&gt; &lt;/li&gt; 
  &lt;li&gt; &lt;/li&gt; 
  &lt;li&gt; &lt;/li&gt; 
  &lt;li&gt; &lt;/li&gt; 
  &lt;li&gt; &lt;/li&gt; 
  &lt;li&gt; &lt;/li&gt; 
  &lt;li&gt; &lt;/li&gt; 
  &lt;li&gt; &lt;/li&gt; 
  &lt;li&gt; &lt;/li&gt; 
  &lt;li&gt; &lt;/li&gt; 
  &lt;li&gt; &lt;/li&gt; 
  &lt;li&gt; &lt;/li&gt; 
  &lt;li&gt; &lt;/li&gt; 
  &lt;li&gt; &lt;/li&gt; 
  &lt;li&gt; &lt;/li&gt; 
  &lt;li&gt; &lt;/li&gt; 
  &lt;li&gt; &lt;/li&gt; 
  &lt;li&gt; &lt;/li&gt; 
  &lt;li&gt; &lt;/li&gt; 
  &lt;li&gt; &lt;/li&gt; 
  &lt;li&gt; &lt;/li&gt; 
  &lt;li&gt; &lt;/li&gt; 
 &lt;/ul&gt;
 &lt;pre class=&quot;code-snippet__js&quot;&gt;
&lt;code&gt;&lt;span&gt;// u-boot/arch/&lt;u&gt;arm&lt;/u&gt;/mach-rockchip/spl.c&lt;/span&gt;&lt;/code&gt;&lt;code&gt;&lt;span&gt;const char *spl_kernel_partition(struct spl_image_info *spl,&lt;/span&gt;&lt;/code&gt;&lt;code&gt;&lt;span&gt; struct spl_load_info *info)&lt;/span&gt;&lt;/code&gt;&lt;code&gt;&lt;span&gt;{&lt;/span&gt;&lt;/code&gt;&lt;code&gt;&lt;span&gt; ...&lt;/span&gt;&lt;/code&gt;&lt;code&gt;&lt;span&gt; sector = 0;&lt;/span&gt;&lt;/code&gt;&lt;code&gt;&lt;span&gt; ret = part_get_info_by_name(info-&amp;gt;dev, PART_MISC, &amp;amp;part_info);&lt;/span&gt;&lt;/code&gt;&lt;code&gt;&lt;span&gt; if (ret &amp;gt;= 0)&lt;/span&gt;&lt;/code&gt;&lt;code&gt;&lt;span&gt; sector = part_info.start;&lt;/span&gt;&lt;/code&gt;
&lt;code&gt;&lt;span&gt; if (sector) {&lt;/span&gt;&lt;/code&gt;&lt;code&gt;&lt;span&gt; ret = info-&amp;gt;read(info, sector + BCB_MESSAGE_BLK_OFFSET, cnt, bmsg);&lt;/span&gt;&lt;/code&gt;&lt;code&gt;&lt;span&gt; if (ret == cnt &amp;amp;&amp;amp; !strcmp(bmsg-&amp;gt;command, &quot;boot-recovery&quot;)) {&lt;/span&gt;&lt;/code&gt;&lt;code&gt;&lt;span&gt; free(bmsg);&lt;/span&gt;&lt;/code&gt;&lt;code&gt;&lt;span&gt; return PART_RECOVERY;&lt;/span&gt;&lt;/code&gt;&lt;code&gt;&lt;span&gt; }&lt;/span&gt;&lt;/code&gt;&lt;code&gt;&lt;span&gt; ...&lt;/span&gt;&lt;/code&gt;&lt;code&gt;&lt;span&gt; }&lt;/span&gt;&lt;/code&gt;
&lt;code&gt;&lt;span&gt; boot_mode = readl((void *)CONFIG_ROCKCHIP_BOOT_MODE_REG); //  无条件读&lt;/span&gt;&lt;/code&gt;&lt;code&gt;&lt;span&gt; return (boot_mode == BOOT_RECOVERY) ? PART_RECOVERY : PART_BOOT;&lt;/span&gt;&lt;/code&gt;&lt;code&gt;&lt;span&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt; 
 &lt;p style=&quot;color:rgb(17,17,17);font-family:'-apple-system', 'PingFang SC', 'Microsoft YaHei', 'Noto Sans SC', sans-serif;font-size:medium;font-style:normal;font-weight:400;letter-spacing:normal;text-indent:0px;text-transform:none;white-space:normal;word-spacing:0px;background-color:rgb(255,255,255);text-decoration-thickness:initial;text-decoration-style:initial;text-decoration-color:initial;&quot;&gt; &lt;span&gt;几个细节和直觉不太一样：&lt;/span&gt;&lt;/p&gt; 
 &lt;ul class=&quot;list-paddingleft-1&quot; style=&quot;color:rgb(17,17,17);font-family:'-apple-system', 'PingFang SC', 'Microsoft YaHei', 'Noto Sans SC', sans-serif;font-size:medium;font-style:normal;font-weight:400;letter-spacing:normal;text-indent:0px;text-transform:none;white-space:normal;word-spacing:0px;background-color:rgb(255,255,255);text-decoration-thickness:initial;text-decoration-style:initial;text-decoration-color:initial;margin:6px 0px 6px 22px;padding-left:0px;&quot;&gt;
  &lt;li&gt; &lt;b&gt;&lt;span&gt;返回的是字符串，不是整数枚举。&lt;/span&gt;&lt;/b&gt; &lt;span&gt;PART_RECOVERY / PART_BOOT 就是字面量 &quot;recovery&quot; / &quot;boot&quot;（定义在 boot_rkimg.h）——SPL 拿这个字符串去当分区名用&lt;/span&gt;&lt;/li&gt; 
  &lt;li&gt; &lt;b&gt;&lt;span&gt;boot_mode &lt;u&gt;寄存器&lt;/u&gt;是无条件读的&lt;/span&gt;&lt;/b&gt; &lt;span&gt;，不是&quot;读 misc 失败才读&quot;。只要 command 不等于 boot-recovery，就会走到最后那行三元表达式&lt;/span&gt;&lt;/li&gt; 
  &lt;li&gt; &lt;span&gt;所以逻辑是两句：&lt;/span&gt;&lt;b&gt;&lt;span&gt;misc 里写着 boot-recovery 就加载 recovery 分区；否则看 boot_mode 寄存器，是 BOOT_RECOVERY 加载 recovery，其余都加载 boot。&lt;/span&gt;&lt;/b&gt;&lt;/li&gt; 
 &lt;/ul&gt;
 &lt;p style=&quot;color:rgb(17,17,17);font-family:'-apple-system', 'PingFang SC', 'Microsoft YaHei', 'Noto Sans SC', sans-serif;font-size:medium;font-style:normal;font-weight:400;letter-spacing:normal;text-indent:0px;text-transform:none;white-space:normal;word-spacing:0px;background-color:rgb(255,255,255);text-decoration-thickness:initial;text-decoration-style:initial;text-decoration-color:initial;&quot;&gt; &lt;span&gt;BCB_MESSAGE_BLK_OFFSET 这个偏移的定义在 U-Boot 的头文件里：&lt;/span&gt;&lt;/p&gt; 
 &lt;ul class=&quot;code-snippet__line-index code-snippet__js&quot;&gt;
  &lt;li&gt; &lt;/li&gt; 
  &lt;li&gt; &lt;/li&gt; 
 &lt;/ul&gt;
 &lt;pre class=&quot;code-snippet__js&quot;&gt;
&lt;code&gt;&lt;span&gt;// u-boot/include/boot_rkimg.h&lt;/span&gt;&lt;/code&gt;&lt;code&gt;&lt;span&gt;#defineBCB_MESSAGE_BLK_OFFSET(16 * 1024 &amp;gt;&amp;gt; 9)&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt; 
 &lt;p style=&quot;color:rgb(17,17,17);font-family:'-apple-system', 'PingFang SC', 'Microsoft YaHei', 'Noto Sans SC', sans-serif;font-size:medium;font-style:normal;font-weight:400;letter-spacing:normal;text-indent:0px;text-transform:none;white-space:normal;word-spacing:0px;background-color:rgb(255,255,255);text-decoration-thickness:initial;text-decoration-style:initial;text-decoration-color:initial;&quot;&gt; &lt;span&gt;&amp;gt;&amp;gt; 9 就是除以 512 换成扇区数：&lt;/span&gt;&lt;b&gt;&lt;span&gt;32 扇区 = 16384 字节 = 16 KiB&lt;/span&gt;&lt;/b&gt;&lt;span&gt;。和 recovery 那边 BOOTLOADER_MESSAGE_OFFSET_IN_MISC = 16 * 1024 完全对得上，也和 mk-misc.sh 里写死的 seek=$((16*1024)) 对得上。&lt;/span&gt;&lt;b&gt;&lt;span&gt;三处独立写的数字，指的是同一个位置。&lt;/span&gt;&lt;/b&gt;&lt;/p&gt; 
 &lt;p style=&quot;color:rgb(17,17,17);font-family:'-apple-system', 'PingFang SC', 'Microsoft YaHei', 'Noto Sans SC', sans-serif;font-size:medium;font-style:normal;font-weight:400;letter-spacing:normal;text-indent:0px;text-transform:none;white-space:normal;word-spacing:0px;background-color:rgb(255,255,255);text-decoration-thickness:initial;text-decoration-style:initial;text-decoration-color:initial;&quot;&gt; &lt;span&gt;boot_mode 那一路对应的是&quot;reboot recovery 命令&quot;——那是另一条独立入口，第三节会讲全。&lt;/span&gt;&lt;/p&gt; 
 &lt;h2 style=&quot;color:rgb(17,17,17);font-family:'-apple-system', 'PingFang SC', 'Microsoft YaHei', 'Noto Sans SC', sans-serif;font-style:normal;letter-spacing:normal;text-indent:0px;text-transform:none;white-space:normal;word-spacing:0px;background-color:rgb(255,255,255);text-decoration-thickness:initial;text-decoration-style:initial;text-decoration-color:initial;font-size:20px;border-left:4px solid rgb(17,17,17);padding-left:10px;margin:34px 0px 12px;&quot;&gt; &lt;span&gt;三、U-Boot 阶段：三路来源，优先级写得很死&lt;/span&gt;&lt;/h2&gt; 
 &lt;p style=&quot;color:rgb(17,17,17);font-family:'-apple-system', 'PingFang SC', 'Microsoft YaHei', 'Noto Sans SC', sans-serif;font-size:medium;font-style:normal;font-weight:400;letter-spacing:normal;text-indent:0px;text-transform:none;white-space:normal;word-spacing:0px;background-color:rgb(255,255,255);text-decoration-thickness:initial;text-decoration-style:initial;text-decoration-color:initial;&quot;&gt; &lt;span&gt;到了 U-Boot proper，判断逻辑集中在 boot_mode.c 的 rockchip_get_boot_mode()。注释里把三路来源列得很清楚：&lt;/span&gt;&lt;/p&gt; 
 &lt;ul class=&quot;code-snippet__line-index code-snippet__js&quot;&gt;
  &lt;li&gt; &lt;/li&gt; 
  &lt;li&gt; &lt;/li&gt; 
  &lt;li&gt; &lt;/li&gt; 
  &lt;li&gt; &lt;/li&gt; 
  &lt;li&gt; &lt;/li&gt; 
  &lt;li&gt; &lt;/li&gt; 
  &lt;li&gt; &lt;/li&gt; 
  &lt;li&gt; &lt;/li&gt; 
  &lt;li&gt; &lt;/li&gt; 
  &lt;li&gt; &lt;/li&gt; 
  &lt;li&gt; &lt;/li&gt; 
  &lt;li&gt; &lt;/li&gt; 
 &lt;/ul&gt;
 &lt;pre class=&quot;code-snippet__js&quot;&gt;
&lt;code&gt;&lt;span&gt;/*&lt;/span&gt;&lt;/code&gt;&lt;code&gt;&lt;span&gt;* There are three ways to get reboot-mode:&lt;/span&gt;&lt;/code&gt;&lt;code&gt;&lt;span&gt;*&lt;/span&gt;&lt;/code&gt;&lt;code&gt;&lt;span&gt;* No1. Android BCB which is defined in misc.img (0KB or 16KB offset)&lt;/span&gt;&lt;/code&gt;&lt;code&gt;&lt;span&gt;* No2. CONFIG_ROCKCHIP_BOOT_MODE_REG that supports &quot;reboot xxx&quot; commands&lt;/span&gt;&lt;/code&gt;&lt;code&gt;&lt;span&gt;* No3. Env variable &quot;reboot_mode&quot; which is added by U-Boot&lt;/span&gt;&lt;/code&gt;&lt;code&gt;&lt;span&gt;*&lt;/span&gt;&lt;/code&gt;&lt;code&gt;&lt;span&gt;* Recovery mode from:&lt;/span&gt;&lt;/code&gt;&lt;code&gt;&lt;span&gt;*- Android BCB in misc.img&lt;/span&gt;&lt;/code&gt;&lt;code&gt;&lt;span&gt;*- &quot;reboot recovery&quot; command&lt;/span&gt;&lt;/code&gt;&lt;code&gt;&lt;span&gt;*- recovery key pressed without &lt;u&gt;usb&lt;/u&gt; att&lt;u&gt;ac&lt;/u&gt;h&lt;/span&gt;&lt;/code&gt;&lt;code&gt;&lt;span&gt;*/&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt; 
 &lt;p style=&quot;color:rgb(17,17,17);font-family:'-apple-system', 'PingFang SC', 'Microsoft YaHei', 'Noto Sans SC', sans-serif;font-size:medium;font-style:normal;font-weight:400;letter-spacing:normal;text-indent:0px;text-transform:none;white-space:normal;word-spacing:0px;background-color:rgb(255,255,255);text-decoration-thickness:initial;text-decoration-style:initial;text-decoration-color:initial;&quot;&gt; &lt;span&gt;函数内部用了三个优先级槽位来缓存结果：&lt;/span&gt;&lt;/p&gt; 
 &lt;ul class=&quot;code-snippet__line-index code-snippet__js&quot;&gt;
  &lt;li&gt; &lt;/li&gt; 
  &lt;li&gt; &lt;/li&gt; 
  &lt;li&gt; &lt;/li&gt; 
  &lt;li&gt; &lt;/li&gt; 
  &lt;li&gt; &lt;/li&gt; 
 &lt;/ul&gt;
 &lt;pre class=&quot;code-snippet__js&quot;&gt;
&lt;code&gt;&lt;span&gt;enum {&lt;/span&gt;&lt;/code&gt;&lt;code&gt;&lt;span&gt;PH = 0,/* P: Priority, H: high, M: middle, L: low*/&lt;/span&gt;&lt;/code&gt;&lt;code&gt;&lt;span&gt;PM,&lt;/span&gt;&lt;/code&gt;&lt;code&gt;&lt;span&gt;PL,&lt;/span&gt;&lt;/code&gt;&lt;code&gt;&lt;span&gt;};&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt; 
 &lt;p style=&quot;color:rgb(17,17,17);font-family:'-apple-system', 'PingFang SC', 'Microsoft YaHei', 'Noto Sans SC', sans-serif;font-size:medium;font-style:normal;font-weight:400;letter-spacing:normal;text-indent:0px;text-transform:none;white-space:normal;word-spacing:0px;background-color:rgb(255,255,255);text-decoration-thickness:initial;text-decoration-style:initial;text-decoration-color:initial;&quot;&gt; &lt;span&gt;对应的判断顺序是：&lt;/span&gt;&lt;/p&gt; 
 &lt;img src=&quot;https://file1.elecfans.com//web3/M00/7C/F8/wKgZPGrBjHWAMsZtAAHH5bwwNrI791.png&quot; alt=&quot;wKgZPGrBjHWAMsZtAAHH5bwwNrI791.png&quot; class=&quot;aligncenter&quot;&gt;
 &lt;p style=&quot;color:rgb(17,17,17);font-family:'-apple-system', 'PingFang SC', 'Microsoft YaHei', 'Noto Sans SC', sans-serif;font-size:medium;font-style:normal;font-weight:400;letter-spacing:normal;text-indent:0px;text-transform:none;white-space:normal;word-spacing:0px;background-color:rgb(255,255,255);text-decoration-thickness:initial;text-decoration-style:initial;text-decoration-color:initial;&quot;&gt; &lt;span&gt;这个优先级设计有个很实际的用意，注释里也写了：&lt;/span&gt;&lt;b&gt;&lt;span&gt;reboot loader / reboot bootloader / reboot fastboot 这类&quot;下载模式&quot;命令必须优先级最高&lt;/span&gt;&lt;/b&gt;&lt;span&gt;，否则设备一旦 misc 里残留了 boot-recovery，你就再也进不了烧写模式——只能拆机短接。&lt;/span&gt;&lt;/p&gt; 
 &lt;p style=&quot;color:rgb(17,17,17);font-family:'-apple-system', 'PingFang SC', 'Microsoft YaHei', 'Noto Sans SC', sans-serif;font-size:medium;font-style:normal;font-weight:400;letter-spacing:normal;text-indent:0px;text-transform:none;white-space:normal;word-spacing:0px;background-color:rgb(255,255,255);text-decoration-thickness:initial;text-decoration-style:initial;text-decoration-color:initial;&quot;&gt; &lt;span&gt;所以这里的顺序是：&lt;/span&gt;&lt;b&gt;&lt;span&gt;下载模式 &amp;gt; misc 里的 recovery &amp;gt; 其它 reboot 参数&lt;/span&gt;&lt;/b&gt;&lt;span&gt;（这是 U-Boot proper 内部三路来源之间的顺序，加上环境变量之后的完整优先级见第四节末尾）。&lt;/span&gt;&lt;/p&gt; 
 &lt;p style=&quot;color:rgb(17,17,17);font-family:'-apple-system', 'PingFang SC', 'Microsoft YaHei', 'Noto Sans SC', sans-serif;font-size:medium;font-style:normal;font-weight:400;letter-spacing:normal;text-indent:0px;text-transform:none;white-space:normal;word-spacing:0px;background-color:rgb(255,255,255);text-decoration-thickness:initial;text-decoration-style:initial;text-decoration-color:initial;&quot;&gt; &lt;span&gt;串口上那句 boot mode: recovery (misc) 就是 PM 那一路打出来的，boot mode: recovery (cmd) 则是 PL 那一路（来自寄存器）。&lt;/span&gt;&lt;/p&gt; 
 &lt;h2 style=&quot;color:rgb(17,17,17);font-family:'-apple-system', 'PingFang SC', 'Microsoft YaHei', 'Noto Sans SC', sans-serif;font-style:normal;letter-spacing:normal;text-indent:0px;text-transform:none;white-space:normal;word-spacing:0px;background-color:rgb(255,255,255);text-decoration-thickness:initial;text-decoration-style:initial;text-decoration-color:initial;font-size:20px;border-left:4px solid rgb(17,17,17);padding-left:10px;margin:34px 0px 12px;&quot;&gt; &lt;span&gt;四、热键那条路为什么能&quot;抢先&quot;&lt;/span&gt;&lt;/h2&gt; 
 &lt;p style=&quot;color:rgb(17,17,17);font-family:'-apple-system', 'PingFang SC', 'Microsoft YaHei', 'Noto Sans SC', sans-serif;font-size:medium;font-style:normal;font-weight:400;letter-spacing:normal;text-indent:0px;text-transform:none;white-space:normal;word-spacing:0px;background-color:rgb(255,255,255);text-decoration-thickness:initial;text-decoration-style:initial;text-decoration-color:initial;&quot;&gt; &lt;span&gt;reboot_mode 环境变量是在&lt;/span&gt;&lt;b&gt;&lt;span&gt;更早的下载模式检测&lt;/span&gt;&lt;/b&gt;&lt;span&gt;里被设上的，位置在 boot_rkimg.c：&lt;/span&gt;&lt;/p&gt; 
 &lt;ul class=&quot;code-snippet__line-index code-snippet__js&quot;&gt;
  &lt;li&gt; &lt;/li&gt; 
  &lt;li&gt; &lt;/li&gt; 
  &lt;li&gt; &lt;/li&gt; 
  &lt;li&gt; &lt;/li&gt; 
  &lt;li&gt; &lt;/li&gt; 
  &lt;li&gt; &lt;/li&gt; 
  &lt;li&gt; &lt;/li&gt; 
  &lt;li&gt; &lt;/li&gt; 
  &lt;li&gt; &lt;/li&gt; 
  &lt;li&gt; &lt;/li&gt; 
  &lt;li&gt; &lt;/li&gt; 
  &lt;li&gt; &lt;/li&gt; 
  &lt;li&gt; &lt;/li&gt; 
  &lt;li&gt; &lt;/li&gt; 
  &lt;li&gt; &lt;/li&gt; 
  &lt;li&gt; &lt;/li&gt; 
  &lt;li&gt; &lt;/li&gt; 
  &lt;li&gt; &lt;/li&gt; 
  &lt;li&gt; &lt;/li&gt; 
 &lt;/ul&gt;
 &lt;pre class=&quot;code-snippet__js&quot;&gt;
&lt;code&gt;&lt;span&gt;// u-boot/arch/arm/mach-rockchip/boot_rkimg.c&lt;/span&gt;&lt;/code&gt;&lt;code&gt;&lt;span&gt;void setup_download_mode(void)&lt;/span&gt;&lt;/code&gt;&lt;code&gt;&lt;span&gt;{&lt;/span&gt;&lt;/code&gt;&lt;code&gt;&lt;span&gt; int vbus = 1;&lt;/span&gt;&lt;/code&gt;
&lt;code&gt;&lt;span&gt; if (rockchip_dnl_key_pressed() || is_hotkey(HK_ROCKUSB_DNL)) {&lt;/span&gt;&lt;/code&gt;&lt;code&gt;&lt;span&gt; vbus = rockchip_u2phy_vbus_detect();&lt;/span&gt;&lt;/code&gt;
&lt;code&gt;&lt;span&gt; if (vbus &amp;gt; 0) {&lt;/span&gt;&lt;/code&gt;&lt;code&gt;&lt;span&gt; printf(&quot;%sentering download mode...n&quot;, ...);&lt;/span&gt;&lt;/code&gt;&lt;code&gt;&lt;span&gt; run_command(&quot;download&quot;, 0);&lt;/span&gt;&lt;/code&gt;&lt;code&gt;&lt;span&gt; } else {&lt;/span&gt;&lt;/code&gt;&lt;code&gt;&lt;span&gt; printf(&quot;entering recovery mode!n&quot;);&lt;/span&gt;&lt;/code&gt;&lt;code&gt;&lt;span&gt; env_set(&quot;reboot_mode&quot;, &quot;recovery-key&quot;);&lt;/span&gt;&lt;/code&gt;&lt;code&gt;&lt;span&gt; }&lt;/span&gt;&lt;/code&gt;&lt;code&gt;&lt;span&gt; } else if (is_hotkey(HK_FASTBOOT)) {&lt;/span&gt;&lt;/code&gt;&lt;code&gt;&lt;span&gt; env_set(&quot;reboot_mode&quot;, &quot;fastboot&quot;);&lt;/span&gt;&lt;/code&gt;&lt;code&gt;&lt;span&gt; }&lt;/span&gt;&lt;/code&gt;&lt;code&gt;&lt;span&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt; 
 &lt;p style=&quot;color:rgb(17,17,17);font-family:'-apple-system', 'PingFang SC', 'Microsoft YaHei', 'Noto Sans SC', sans-serif;font-size:medium;font-style:normal;font-weight:400;letter-spacing:normal;text-indent:0px;text-transform:none;white-space:normal;word-spacing:0px;background-color:rgb(255,255,255);text-decoration-thickness:initial;text-decoration-style:initial;text-decoration-color:initial;&quot;&gt; &lt;span&gt;官方文档那段日志里的&lt;/span&gt;&lt;b&gt;&lt;span&gt;entering recovery mode! 就是这里打的&lt;/span&gt;&lt;/b&gt;&lt;span&gt;。&lt;/span&gt;&lt;/p&gt; 
 &lt;p style=&quot;color:rgb(17,17,17);font-family:'-apple-system', 'PingFang SC', 'Microsoft YaHei', 'Noto Sans SC', sans-serif;font-size:medium;font-style:normal;font-weight:400;letter-spacing:normal;text-indent:0px;text-transform:none;white-space:normal;word-spacing:0px;background-color:rgb(255,255,255);text-decoration-thickness:initial;text-decoration-style:initial;text-decoration-color:initial;&quot;&gt; &lt;span&gt;关键在 vbus 那个分支——&lt;/span&gt;&lt;b&gt;&lt;span&gt;同一个按键，插不插 USB 走向完全不同&lt;/span&gt;&lt;/b&gt;&lt;span&gt;：&lt;/span&gt;&lt;/p&gt; 
 &lt;table style=&quot;color:rgb(17,17,17);font-family:'-apple-system', 'PingFang SC', 'Microsoft YaHei', 'Noto Sans SC', sans-serif;font-style:normal;font-weight:400;letter-spacing:normal;text-transform:none;white-space:normal;word-spacing:0px;background-color:rgb(255,255,255);text-decoration-thickness:initial;text-decoration-style:initial;text-decoration-color:initial;border-collapse:collapse;width:720px;font-size:13.5px;margin:10px 0px;border:1px solid rgb(229,231,235);&quot;&gt;
  &lt;tbody&gt;
   &lt;tr style=&quot;background:rgb(249,250,251);&quot;&gt;
    &lt;th style=&quot;border:1px solid rgb(229,231,235);padding:8px 10px;text-align:left;&quot;&gt; &lt;span&gt;上电时按键 + USB&lt;/span&gt;&lt;/th&gt; 
    &lt;th style=&quot;border:1px solid rgb(229,231,235);padding:8px 10px;text-align:left;&quot;&gt; &lt;span&gt;结果&lt;/span&gt;&lt;/th&gt; 
   &lt;/tr&gt;
   &lt;tr&gt;
    &lt;td style=&quot;border:1px solid rgb(229,231,235);padding:8px 10px;text-align:left;&quot;&gt; &lt;span&gt;按键 + 插着 USB（vbus &amp;gt; 0）&lt;/span&gt;&lt;/td&gt; 
    &lt;td style=&quot;border:1px solid rgb(229,231,235);padding:8px 10px;text-align:left;&quot;&gt; &lt;span&gt;进 download 模式（能烧写整片）&lt;/span&gt;&lt;/td&gt; 
   &lt;/tr&gt;
   &lt;tr&gt;
    &lt;td style=&quot;border:1px solid rgb(229,231,235);padding:8px 10px;text-align:left;&quot;&gt; &lt;span&gt;按键 + 没插 USB（vbus == 0）&lt;/span&gt;&lt;/td&gt; 
    &lt;td style=&quot;border:1px solid rgb(229,231,235);padding:8px 10px;text-align:left;&quot;&gt; &lt;span&gt;reboot_mode = recovery-key，进 recovery&lt;/span&gt;&lt;/td&gt; 
   &lt;/tr&gt;
  &lt;/tbody&gt;
 &lt;/table&gt;
 &lt;p style=&quot;color:rgb(17,17,17);font-family:'-apple-system', 'PingFang SC', 'Microsoft YaHei', 'Noto Sans SC', sans-serif;font-size:medium;font-style:normal;font-weight:400;letter-spacing:normal;text-indent:0px;text-transform:none;white-space:normal;word-spacing:0px;background-color:rgb(255,255,255);text-decoration-thickness:initial;text-decoration-style:initial;text-decoration-color:initial;&quot;&gt; &lt;span&gt;这个设计避免了误触发：做量产烧写的人习惯按住键插线，而现场维护的人只是按键上电，两者不会互相干扰。&lt;/span&gt;&lt;/p&gt; 
 &lt;p style=&quot;color:rgb(17,17,17);font-family:'-apple-system', 'PingFang SC', 'Microsoft YaHei', 'Noto Sans SC', sans-serif;font-size:medium;font-style:normal;font-weight:400;letter-spacing:normal;text-indent:0px;text-transform:none;white-space:normal;word-spacing:0px;background-color:rgb(255,255,255);text-decoration-thickness:initial;text-decoration-style:initial;text-decoration-color:initial;&quot;&gt; &lt;span&gt;而 rockchip_get_boot_mode() 里，环境变量是&lt;/span&gt;&lt;b&gt;&lt;span&gt;第一个查的&lt;/span&gt;&lt;/b&gt;&lt;span&gt;，查到就直接 return——不碰寄存器，也不读 misc。这就是为什么热键能&quot;抢先&quot;：它绕过了整个 misc 判断链路。&lt;/span&gt;&lt;/p&gt; 
 &lt;p style=&quot;color:rgb(17,17,17);font-family:'-apple-system', 'PingFang SC', 'Microsoft YaHei', 'Noto Sans SC', sans-serif;font-size:medium;font-style:normal;font-weight:400;letter-spacing:normal;text-indent:0px;text-transform:none;white-space:normal;word-spacing:0px;background-color:rgb(255,255,255);text-decoration-thickness:initial;text-decoration-style:initial;text-decoration-color:initial;&quot;&gt; &lt;span&gt;按键本身在 boot_rkimg.c 里是弱定义，板级可以覆盖：&lt;/span&gt;&lt;/p&gt; 
 &lt;ul class=&quot;code-snippet__line-index code-snippet__js&quot;&gt;
  &lt;li&gt; &lt;/li&gt; 
  &lt;li&gt; &lt;/li&gt; 
  &lt;li&gt; &lt;/li&gt; 
  &lt;li&gt; &lt;/li&gt; 
  &lt;li&gt; &lt;/li&gt; 
  &lt;li&gt; &lt;/li&gt; 
  &lt;li&gt; &lt;/li&gt; 
  &lt;li&gt; &lt;/li&gt; 
  &lt;li&gt; &lt;/li&gt; 
  &lt;li&gt; &lt;/li&gt; 
  &lt;li&gt; &lt;/li&gt; 
 &lt;/ul&gt;
 &lt;pre class=&quot;code-snippet__js&quot;&gt;
&lt;code&gt;&lt;span&gt;// 默认实现：有 DM_KEY 就用按键驱动，否则退回 &lt;u&gt;adc&lt;/u&gt;-keys&lt;/span&gt;&lt;/code&gt;&lt;code&gt;&lt;span&gt;__weak int rockchip_dnl_key_pressed(void)&lt;/span&gt;&lt;/code&gt;&lt;code&gt;&lt;span&gt;{&lt;/span&gt;&lt;/code&gt;&lt;code&gt;&lt;span&gt;#ifdefined(CONFIG_DM_KEY)&lt;/span&gt;&lt;/code&gt;&lt;code&gt;&lt;span&gt; return key_is_pressed(key_read(KEY_VOLUMEUP));&lt;/span&gt;&lt;/code&gt;&lt;code&gt;&lt;span&gt;#elifdefined(CONFIG_ADC)&lt;/span&gt;&lt;/code&gt;&lt;code&gt;&lt;span&gt; // 走 adc-keys，判断电压是否落在 KEY_DOWN_MIN_VAL ~ KEY_DOWN_MAX_VAL&lt;/span&gt;&lt;/code&gt;&lt;code&gt;&lt;span&gt; ...&lt;/span&gt;&lt;/code&gt;&lt;code&gt;&lt;span&gt; return 0;&lt;/span&gt;&lt;/code&gt;&lt;code&gt;&lt;span&gt;#endif&lt;/span&gt;&lt;/code&gt;&lt;code&gt;&lt;span&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt; 
 &lt;p style=&quot;color:rgb(17,17,17);font-family:'-apple-system', 'PingFang SC', 'Microsoft YaHei', 'Noto Sans SC', sans-serif;font-size:medium;font-style:normal;font-weight:400;letter-spacing:normal;text-indent:0px;text-transform:none;white-space:normal;word-spacing:0px;background-color:rgb(255,255,255);text-decoration-thickness:initial;text-decoration-style:initial;text-decoration-color:initial;&quot;&gt; &lt;b&gt;&lt;span&gt;默认认的是 KEY_VOLUMEUP（音量加）。&lt;/span&gt;&lt;/b&gt;&lt;span&gt;自己的板子按键映射不一样的话，在板级文件里覆盖这个弱函数就行——这也是官方文档 9.1 节提到的 RECOVERY + VOLUMEUP 触发恢复出厂设置的硬件基础。&lt;/span&gt;&lt;/p&gt; 
 &lt;h2 style=&quot;color:rgb(17,17,17);font-family:'-apple-system', 'PingFang SC', 'Microsoft YaHei', 'Noto Sans SC', sans-serif;font-style:normal;letter-spacing:normal;text-indent:0px;text-transform:none;white-space:normal;word-spacing:0px;background-color:rgb(255,255,255);text-decoration-thickness:initial;text-decoration-style:initial;text-decoration-color:initial;font-size:20px;border-left:4px solid rgb(17,17,17);padding-left:10px;margin:34px 0px 12px;&quot;&gt; &lt;span&gt;五、三种进入 recovery 的方式&lt;/span&gt;&lt;/h2&gt; 
 &lt;p style=&quot;color:rgb(17,17,17);font-family:'-apple-system', 'PingFang SC', 'Microsoft YaHei', 'Noto Sans SC', sans-serif;font-size:medium;font-style:normal;font-weight:400;letter-spacing:normal;text-indent:0px;text-transform:none;white-space:normal;word-spacing:0px;background-color:rgb(255,255,255);text-decoration-thickness:initial;text-decoration-style:initial;text-decoration-color:initial;&quot;&gt; &lt;span&gt;把上面两条路合起来，进 recovery 一共有三个入口：&lt;/span&gt;&lt;/p&gt; 
 &lt;table style=&quot;color:rgb(17,17,17);font-family:'-apple-system', 'PingFang SC', 'Microsoft YaHei', 'Noto Sans SC', sans-serif;font-style:normal;font-weight:400;letter-spacing:normal;text-transform:none;white-space:normal;word-spacing:0px;background-color:rgb(255,255,255);text-decoration-thickness:initial;text-decoration-style:initial;text-decoration-color:initial;border-collapse:collapse;width:720px;font-size:13.5px;margin:10px 0px;border:1px solid rgb(229,231,235);&quot;&gt;
  &lt;tbody&gt;
   &lt;tr style=&quot;background:rgb(249,250,251);&quot;&gt;
    &lt;th style=&quot;border:1px solid rgb(229,231,235);padding:8px 10px;text-align:left;&quot;&gt; &lt;span&gt;方式&lt;/span&gt;&lt;/th&gt; 
    &lt;th style=&quot;border:1px solid rgb(229,231,235);padding:8px 10px;text-align:left;&quot;&gt; &lt;span&gt;触发条件&lt;/span&gt;&lt;/th&gt; 
    &lt;th style=&quot;border:1px solid rgb(229,231,235);padding:8px 10px;text-align:left;&quot;&gt; &lt;span&gt;代码位置&lt;/span&gt;&lt;/th&gt; 
    &lt;th style=&quot;border:1px solid rgb(229,231,235);padding:8px 10px;text-align:left;&quot;&gt; &lt;span&gt;串口特征&lt;/span&gt;&lt;/th&gt; 
   &lt;/tr&gt;
   &lt;tr&gt;
    &lt;td style=&quot;border:1px solid rgb(229,231,235);padding:8px 10px;text-align:left;&quot;&gt; &lt;span&gt;misc 命令&lt;/span&gt;&lt;/td&gt; 
    &lt;td style=&quot;border:1px solid rgb(229,231,235);padding:8px 10px;text-align:left;&quot;&gt; &lt;span&gt;command 字段是 boot-recovery&lt;/span&gt;&lt;/td&gt; 
    &lt;td style=&quot;border:1px solid rgb(229,231,235);padding:8px 10px;text-align:left;&quot;&gt; &lt;span&gt;misc_require_recovery()&lt;/span&gt;&lt;/td&gt; 
    &lt;td style=&quot;border:1px solid rgb(229,231,235);padding:8px 10px;text-align:left;&quot;&gt; &lt;span&gt;boot mode: recovery (misc)&lt;/span&gt;&lt;/td&gt; 
   &lt;/tr&gt;
   &lt;tr&gt;
    &lt;td style=&quot;border:1px solid rgb(229,231,235);padding:8px 10px;text-align:left;&quot;&gt; &lt;span&gt;热键&lt;/span&gt;&lt;/td&gt; 
    &lt;td style=&quot;border:1px solid rgb(229,231,235);padding:8px 10px;text-align:left;&quot;&gt; &lt;span&gt;按住 VOLUMEUP 上电且未插 USB&lt;/span&gt;&lt;/td&gt; 
    &lt;td style=&quot;border:1px solid rgb(229,231,235);padding:8px 10px;text-align:left;&quot;&gt; &lt;span&gt;setup_download_mode()&lt;/span&gt;&lt;/td&gt; 
    &lt;td style=&quot;border:1px solid rgb(229,231,235);padding:8px 10px;text-align:left;&quot;&gt; &lt;span&gt;entering recovery mode!&lt;/span&gt;&lt;/td&gt; 
   &lt;/tr&gt;
   &lt;tr&gt;
    &lt;td style=&quot;border:1px solid rgb(229,231,235);padding:8px 10px;text-align:left;&quot;&gt; &lt;span&gt;命令&lt;/span&gt;&lt;/td&gt; 
    &lt;td style=&quot;border:1px solid rgb(229,231,235);padding:8px 10px;text-align:left;&quot;&gt; &lt;span&gt;reboot recovery&lt;/span&gt;&lt;/td&gt; 
    &lt;td style=&quot;border:1px solid rgb(229,231,235);padding:8px 10px;text-align:left;&quot;&gt; &lt;span&gt;boot_mode 寄存器&lt;/span&gt;&lt;/td&gt; 
    &lt;td style=&quot;border:1px solid rgb(229,231,235);padding:8px 10px;text-align:left;&quot;&gt; &lt;span&gt;boot mode: recovery (cmd)&lt;/span&gt;&lt;/td&gt; 
   &lt;/tr&gt;
  &lt;/tbody&gt;
 &lt;/table&gt;
 &lt;p style=&quot;color:rgb(17,17,17);font-family:'-apple-system', 'PingFang SC', 'Microsoft YaHei', 'Noto Sans SC', sans-serif;font-size:medium;font-style:normal;font-weight:400;letter-spacing:normal;text-indent:0px;text-transform:none;white-space:normal;word-spacing:0px;background-color:rgb(255,255,255);text-decoration-thickness:initial;text-decoration-style:initial;text-decoration-color:initial;&quot;&gt; &lt;span&gt;对应到实际使用场景：&lt;/span&gt;&lt;/p&gt; 
 &lt;ul class=&quot;list-paddingleft-1&quot; style=&quot;color:rgb(17,17,17);font-family:'-apple-system', 'PingFang SC', 'Microsoft YaHei', 'Noto Sans SC', sans-serif;font-size:medium;font-style:normal;font-weight:400;letter-spacing:normal;text-indent:0px;text-transform:none;white-space:normal;word-spacing:0px;background-color:rgb(255,255,255);text-decoration-thickness:initial;text-decoration-style:initial;text-decoration-color:initial;margin:6px 0px 6px 22px;padding-left:0px;&quot;&gt;
  &lt;li&gt; &lt;b&gt;&lt;span&gt;升级&lt;/span&gt;&lt;/b&gt; &lt;span&gt;走第一种——Normal 系统写 misc，重启&lt;/span&gt;&lt;/li&gt; 
  &lt;li&gt; &lt;b&gt;&lt;span&gt;救砖/裸片升级&lt;/span&gt;&lt;/b&gt; &lt;span&gt;走第二种——不依赖任何已有系统&lt;/span&gt;&lt;/li&gt; 
  &lt;li&gt; &lt;b&gt;&lt;span&gt;调试&lt;/span&gt;&lt;/b&gt; &lt;span&gt;走第三种——reboot recovery 一条命令&lt;/span&gt;&lt;/li&gt; 
 &lt;/ul&gt;
 &lt;p style=&quot;color:rgb(17,17,17);font-family:'-apple-system', 'PingFang SC', 'Microsoft YaHei', 'Noto Sans SC', sans-serif;font-size:medium;font-style:normal;font-weight:400;letter-spacing:normal;text-indent:0px;text-transform:none;white-space:normal;word-spacing:0px;background-color:rgb(255,255,255);text-decoration-thickness:initial;text-decoration-style:initial;text-decoration-color:initial;&quot;&gt; &lt;span&gt;三条路最后都汇到同一个 BOOT_MODE_RECOVERY，但&lt;/span&gt;&lt;b&gt;&lt;span&gt;只有第一条依赖 misc 分区完好&lt;/span&gt;&lt;/b&gt;&lt;span&gt;。这也是为什么误刷 misc 不会让设备变砖：按住键上电照样能进 recovery。&lt;/span&gt;&lt;/p&gt; 
 &lt;h2 style=&quot;color:rgb(17,17,17);font-family:'-apple-system', 'PingFang SC', 'Microsoft YaHei', 'Noto Sans SC', sans-serif;font-style:normal;letter-spacing:normal;text-indent:0px;text-transform:none;white-space:normal;word-spacing:0px;background-color:rgb(255,255,255);text-decoration-thickness:initial;text-decoration-style:initial;text-decoration-color:initial;font-size:20px;border-left:4px solid rgb(17,17,17);padding-left:10px;margin:34px 0px 12px;&quot;&gt; &lt;span&gt;六、BCB 偏移量上有个隐患&lt;/span&gt;&lt;/h2&gt; 
 &lt;p style=&quot;color:rgb(17,17,17);font-family:'-apple-system', 'PingFang SC', 'Microsoft YaHei', 'Noto Sans SC', sans-serif;font-size:medium;font-style:normal;font-weight:400;letter-spacing:normal;text-indent:0px;text-transform:none;white-space:normal;word-spacing:0px;background-color:rgb(255,255,255);text-decoration-thickness:initial;text-decoration-style:initial;text-decoration-color:initial;&quot;&gt; &lt;span&gt;回到第二节那个偏移。&lt;/span&gt;&lt;b&gt;&lt;span&gt;SPL 和 U-Boot proper 读 misc 用的偏移&lt;u&gt;算法&lt;/u&gt;不一样&lt;/span&gt;&lt;/b&gt;&lt;span&gt;：SPL 那边是写死的 BCB_MESSAGE_BLK_OFFSET（32 扇区 = 16 KiB），U-Boot proper 这边走下面这个函数：&lt;/span&gt;&lt;/p&gt; 
 &lt;ul class=&quot;code-snippet__line-index code-snippet__js&quot;&gt;
  &lt;li&gt; &lt;/li&gt; 
  &lt;li&gt; &lt;/li&gt; 
  &lt;li&gt; &lt;/li&gt; 
  &lt;li&gt; &lt;/li&gt; 
  &lt;li&gt; &lt;/li&gt; 
  &lt;li&gt; &lt;/li&gt; 
  &lt;li&gt; &lt;/li&gt; 
  &lt;li&gt; &lt;/li&gt; 
  &lt;li&gt; &lt;/li&gt; 
  &lt;li&gt; &lt;/li&gt; 
  &lt;li&gt; &lt;/li&gt; 
  &lt;li&gt; &lt;/li&gt; 
  &lt;li&gt; &lt;/li&gt; 
  &lt;li&gt; &lt;/li&gt; 
  &lt;li&gt; &lt;/li&gt; 
  &lt;li&gt; &lt;/li&gt; 
  &lt;li&gt; &lt;/li&gt; 
 &lt;/ul&gt;
 &lt;pre class=&quot;code-snippet__js&quot;&gt;
&lt;code&gt;&lt;span&gt;// u-boot/common/image-android.c&lt;/span&gt;&lt;/code&gt;&lt;code&gt;&lt;span&gt;u32 android_bcb_msg_sector_offset(void)&lt;/span&gt;&lt;/code&gt;&lt;code&gt;&lt;span&gt;{&lt;/span&gt;&lt;/code&gt;&lt;code&gt;&lt;span&gt;static int android_version = -1;&lt;/span&gt;&lt;/code&gt;
&lt;code&gt;&lt;span&gt;/*&lt;/span&gt;&lt;/code&gt;&lt;code&gt;&lt;span&gt; * There are two types of misc.img:&lt;/span&gt;&lt;/code&gt;&lt;code&gt;&lt;span&gt; *Rockchip platforms defines BCB message at the 16KB offset of&lt;/span&gt;&lt;/code&gt;&lt;code&gt;&lt;span&gt; *misc.img except for the Android version &amp;gt;= 10. Because Google&lt;/span&gt;&lt;/code&gt;&lt;code&gt;&lt;span&gt; *defines it at 0x00 offset, and from Android-10 it becoms mandary&lt;/span&gt;&lt;/code&gt;&lt;code&gt;&lt;span&gt; *on Google VTS.&lt;/span&gt;&lt;/code&gt;&lt;code&gt;&lt;span&gt; */&lt;/span&gt;&lt;/code&gt;&lt;code&gt;&lt;span&gt;if (android_version &amp;lt; 0)&lt;/span&gt;&lt;/code&gt;&lt;code&gt;&lt;span&gt;android_version = android_version_init();&lt;/span&gt;&lt;/code&gt;
&lt;code&gt;&lt;span&gt;return (android_version &amp;gt;= 10) ? 0x00 : 0x20;&lt;/span&gt;&lt;/code&gt;&lt;code&gt;&lt;span&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt; 
 &lt;p style=&quot;color:rgb(17,17,17);font-family:'-apple-system', 'PingFang SC', 'Microsoft YaHei', 'Noto Sans SC', sans-serif;font-size:medium;font-style:normal;font-weight:400;letter-spacing:normal;text-indent:0px;text-transform:none;white-space:normal;word-spacing:0px;background-color:rgb(255,255,255);text-decoration-thickness:initial;text-decoration-style:initial;text-decoration-color:initial;&quot;&gt; &lt;span&gt;android_version 是从 boot 分区里的 Android boot image header 的 os_version 读出来的。&lt;/span&gt;&lt;b&gt;&lt;span&gt;两份代码的偏移量来源不同&lt;/span&gt;&lt;/b&gt;&lt;span&gt;：SPL 定死 16 KiB，U-Boot proper 会随 boot image 的版本在 0x00 和 0x20（=16 KiB）之间切换。&lt;/span&gt;&lt;/p&gt; 
 &lt;p style=&quot;color:rgb(17,17,17);font-family:'-apple-system', 'PingFang SC', 'Microsoft YaHei', 'Noto Sans SC', sans-serif;font-size:medium;font-style:normal;font-weight:400;letter-spacing:normal;text-indent:0px;text-transform:none;white-space:normal;word-spacing:0px;background-color:rgb(255,255,255);text-decoration-thickness:initial;text-decoration-style:initial;text-decoration-color:initial;&quot;&gt; &lt;span&gt;在这份 &lt;u&gt;Linux&lt;/u&gt; SDK 上两者是&lt;/span&gt;&lt;b&gt;&lt;span&gt;一致&lt;/span&gt;&lt;/b&gt;&lt;span&gt;的——因为 boot.img 是 FIT 镜像而不是 Android boot image，android_version_init() 走不到有效值，android_version 保持 -1，-1 &amp;gt;= 10 为假，返回 0x20，正好是 16 KiB。&lt;/span&gt;&lt;/p&gt; 
 &lt;p style=&quot;color:rgb(17,17,17);font-family:'-apple-system', 'PingFang SC', 'Microsoft YaHei', 'Noto Sans SC', sans-serif;font-size:medium;font-style:normal;font-weight:400;letter-spacing:normal;text-indent:0px;text-transform:none;white-space:normal;word-spacing:0px;background-color:rgb(255,255,255);text-decoration-thickness:initial;text-decoration-style:initial;text-decoration-color:initial;&quot;&gt; &lt;span&gt;但这个一致性是有条件的：&lt;/span&gt;&lt;/p&gt; 
 &lt;table style=&quot;color:rgb(17,17,17);font-family:'-apple-system', 'PingFang SC', 'Microsoft YaHei', 'Noto Sans SC', sans-serif;font-style:normal;font-weight:400;letter-spacing:normal;text-transform:none;white-space:normal;word-spacing:0px;background-color:rgb(255,255,255);text-decoration-thickness:initial;text-decoration-style:initial;text-decoration-color:initial;border-collapse:collapse;width:720px;font-size:13.5px;margin:10px 0px;border:1px solid rgb(229,231,235);&quot;&gt;
  &lt;tbody&gt;
   &lt;tr style=&quot;background:rgb(249,250,251);&quot;&gt;
    &lt;th style=&quot;border:1px solid rgb(229,231,235);padding:8px 10px;text-align:left;&quot;&gt; &lt;span&gt;场景&lt;/span&gt;&lt;/th&gt; 
    &lt;th style=&quot;border:1px solid rgb(229,231,235);padding:8px 10px;text-align:left;&quot;&gt; &lt;span&gt;U-Boot proper 读&lt;/span&gt;&lt;/th&gt; 
    &lt;th style=&quot;border:1px solid rgb(229,231,235);padding:8px 10px;text-align:left;&quot;&gt; &lt;span&gt;SPL 读&lt;/span&gt;&lt;/th&gt; 
    &lt;th style=&quot;border:1px solid rgb(229,231,235);padding:8px 10px;text-align:left;&quot;&gt; &lt;span&gt;一致？&lt;/span&gt;&lt;/th&gt; 
   &lt;/tr&gt;
   &lt;tr&gt;
    &lt;td style=&quot;border:1px solid rgb(229,231,235);padding:8px 10px;text-align:left;&quot;&gt; &lt;span&gt;当前 Linux SDK（FIT boot.img）&lt;/span&gt;&lt;/td&gt; 
    &lt;td style=&quot;border:1px solid rgb(229,231,235);padding:8px 10px;text-align:left;&quot;&gt; &lt;span&gt;16 KiB&lt;/span&gt;&lt;/td&gt; 
    &lt;td style=&quot;border:1px solid rgb(229,231,235);padding:8px 10px;text-align:left;&quot;&gt; &lt;span&gt;16 KiB&lt;/span&gt;&lt;/td&gt; 
    &lt;td style=&quot;border:1px solid rgb(229,231,235);padding:8px 10px;text-align:left;&quot;&gt; &lt;/td&gt; 
   &lt;/tr&gt;
   &lt;tr&gt;
    &lt;td style=&quot;border:1px solid rgb(229,231,235);padding:8px 10px;text-align:left;&quot;&gt; &lt;span&gt;换成 Android 10+ 风格的 boot.img&lt;/span&gt;&lt;/td&gt; 
    &lt;td style=&quot;border:1px solid rgb(229,231,235);padding:8px 10px;text-align:left;&quot;&gt; &lt;b&gt;&lt;span&gt;0 KiB&lt;/span&gt;&lt;/b&gt;&lt;/td&gt; 
    &lt;td style=&quot;border:1px solid rgb(229,231,235);padding:8px 10px;text-align:left;&quot;&gt; &lt;span&gt;16 KiB&lt;/span&gt;&lt;/td&gt; 
    &lt;td style=&quot;border:1px solid rgb(229,231,235);padding:8px 10px;text-align:left;&quot;&gt; &lt;/td&gt; 
   &lt;/tr&gt;
  &lt;/tbody&gt;
 &lt;/table&gt;
 &lt;p style=&quot;color:rgb(17,17,17);font-family:'-apple-system', 'PingFang SC', 'Microsoft YaHei', 'Noto Sans SC', sans-serif;font-size:medium;font-style:normal;font-weight:400;letter-spacing:normal;text-indent:0px;text-transform:none;white-space:normal;word-spacing:0px;background-color:rgb(255,255,255);text-decoration-thickness:initial;text-decoration-style:initial;text-decoration-color:initial;&quot;&gt; &lt;span&gt;如果不一致会怎样：Normal 系统把 boot-recovery 写在 16 KiB，U-Boot proper 去 0 字节处找，找不到 → 认为不该进 recovery → 但 SPL 已经根据 16 KiB 处的内容加载了 recovery 分区。结果就是&quot;内核是 recovery 的，但 U-Boot 按正常系统配参数&quot;，行为会很怪。&lt;/span&gt;&lt;/p&gt; 
 &lt;p style=&quot;color:rgb(17,17,17);font-family:'-apple-system', 'PingFang SC', 'Microsoft YaHei', 'Noto Sans SC', sans-serif;font-size:medium;font-style:normal;font-weight:400;letter-spacing:normal;text-indent:0px;text-transform:none;white-space:normal;word-spacing:0px;background-color:rgb(255,255,255);text-decoration-thickness:initial;text-decoration-style:initial;text-decoration-color:initial;&quot;&gt; &lt;b&gt;&lt;span&gt;如果你的板子是从 Android 方案改过来的，或者自定义过 boot image，务必确认这两个偏移量目前落在同一格。&lt;/span&gt;&lt;/b&gt;&lt;span&gt;排查方法很简单：updateEngine --misc=display 看 16 KiB 处有没有意料之外的内容。&lt;/span&gt;&lt;/p&gt; 
 &lt;h2 style=&quot;color:rgb(17,17,17);font-family:'-apple-system', 'PingFang SC', 'Microsoft YaHei', 'Noto Sans SC', sans-serif;font-style:normal;letter-spacing:normal;text-indent:0px;text-transform:none;white-space:normal;word-spacing:0px;background-color:rgb(255,255,255);text-decoration-thickness:initial;text-decoration-style:initial;text-decoration-color:initial;font-size:20px;border-left:4px solid rgb(17,17,17);padding-left:10px;margin:34px 0px 12px;&quot;&gt; &lt;span&gt;七、还有一条隐藏路径&lt;/span&gt;&lt;/h2&gt; 
 &lt;p style=&quot;color:rgb(17,17,17);font-family:'-apple-system', 'PingFang SC', 'Microsoft YaHei', 'Noto Sans SC', sans-serif;font-size:medium;font-style:normal;font-weight:400;letter-spacing:normal;text-indent:0px;text-transform:none;white-space:normal;word-spacing:0px;background-color:rgb(255,255,255);text-decoration-thickness:initial;text-decoration-style:initial;text-decoration-color:initial;&quot;&gt; &lt;span&gt;boot_rkimg.c 里还有个函数，一般在升级流程里见不到：&lt;/span&gt;&lt;/p&gt; 
 &lt;ul class=&quot;code-snippet__line-index code-snippet__js&quot;&gt;
  &lt;li&gt; &lt;/li&gt; 
  &lt;li&gt; &lt;/li&gt; 
  &lt;li&gt; &lt;/li&gt; 
  &lt;li&gt; &lt;/li&gt; 
  &lt;li&gt; &lt;/li&gt; 
  &lt;li&gt; &lt;/li&gt; 
  &lt;li&gt; &lt;/li&gt; 
  &lt;li&gt; &lt;/li&gt; 
  &lt;li&gt; &lt;/li&gt; 
  &lt;li&gt; &lt;/li&gt; 
  &lt;li&gt; &lt;/li&gt; 
  &lt;li&gt; &lt;/li&gt; 
  &lt;li&gt; &lt;/li&gt; 
  &lt;li&gt; &lt;/li&gt; 
 &lt;/ul&gt;
 &lt;pre class=&quot;code-snippet__js&quot;&gt;
&lt;code&gt;&lt;span&gt;// u-boot/arch/arm/mach-rockchip/boot_rkimg.c&lt;/span&gt;&lt;/code&gt;&lt;code&gt;&lt;span&gt;void board_run_recovery_wipe_data(void)&lt;/span&gt;&lt;/code&gt;&lt;code&gt;&lt;span&gt;{&lt;/span&gt;&lt;/code&gt;&lt;code&gt;&lt;span&gt; ...&lt;/span&gt;&lt;/code&gt;&lt;code&gt;&lt;span&gt; &lt;u&gt;mems&lt;/u&gt;et((char *)&amp;amp;bmsg, 0, sizeof(struct bootloader_message));&lt;/span&gt;&lt;/code&gt;&lt;code&gt;&lt;span&gt; strcpy(bmsg.command, &quot;boot-recovery&quot;);&lt;/span&gt;&lt;/code&gt;&lt;code&gt;&lt;span&gt; strcpy(bmsg.recovery, &quot;recoveryn--wipe_data&quot;);&lt;/span&gt;&lt;/code&gt;&lt;code&gt;&lt;span&gt; bmsg.status[0] = 0;&lt;/span&gt;&lt;/code&gt;&lt;code&gt;&lt;span&gt; ...&lt;/span&gt;&lt;/code&gt;&lt;code&gt;&lt;span&gt; blk_dwrite(dev_desc, part_info.start + bcb_offset, cnt, &amp;amp;bmsg);&lt;/span&gt;&lt;/code&gt;&lt;code&gt;&lt;span&gt; ...&lt;/span&gt;&lt;/code&gt;&lt;code&gt;&lt;span&gt; env_set(&quot;reboot_mode&quot;, &quot;recovery&quot;);&lt;/span&gt;&lt;/code&gt;&lt;code&gt;&lt;span&gt; run_command(&quot;run bootcmd&quot;, 0);&lt;/span&gt;&lt;/code&gt;&lt;code&gt;&lt;span&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt; 
 &lt;p style=&quot;color:rgb(17,17,17);font-family:'-apple-system', 'PingFang SC', 'Microsoft YaHei', 'Noto Sans SC', sans-serif;font-size:medium;font-style:normal;font-weight:400;letter-spacing:normal;text-indent:0px;text-transform:none;white-space:normal;word-spacing:0px;background-color:rgb(255,255,255);text-decoration-thickness:initial;text-decoration-style:initial;text-decoration-color:initial;&quot;&gt; &lt;span&gt;它&lt;/span&gt;&lt;b&gt;&lt;span&gt;在 U-Boot 里直接构造 BCB 并重启&lt;/span&gt;&lt;/b&gt;&lt;span&gt;，等价于让设备自己把命令写进 misc 然后进 recovery。&lt;/span&gt;&lt;/p&gt; 
 &lt;p style=&quot;color:rgb(17,17,17);font-family:'-apple-system', 'PingFang SC', 'Microsoft YaHei', 'Noto Sans SC', sans-serif;font-size:medium;font-style:normal;font-weight:400;letter-spacing:normal;text-indent:0px;text-transform:none;white-space:normal;word-spacing:0px;background-color:rgb(255,255,255);text-decoration-thickness:initial;text-decoration-style:initial;text-decoration-color:initial;&quot;&gt; &lt;span&gt;它的唯一调用点在 fastboot 的 oem unlock_accept 流程里（f_fastboot.c 的解锁确认分支）。&lt;/span&gt;&lt;b&gt;&lt;span&gt;但这条路径在本 SDK 上默认是关闭的&lt;/span&gt;&lt;/b&gt;&lt;span&gt;：&lt;/span&gt;&lt;/p&gt; 
 &lt;ul class=&quot;code-snippet__line-index code-snippet__js&quot;&gt;
  &lt;li&gt; &lt;/li&gt; 
  &lt;li&gt; &lt;/li&gt; 
 &lt;/ul&gt;
 &lt;pre class=&quot;code-snippet__js&quot;&gt;
&lt;code&gt;&lt;span&gt;# u-boot/.config&lt;/span&gt;&lt;/code&gt;&lt;code&gt;&lt;span&gt;# CONFIG_FASTBOOT_OEM_UNLOCK is not set&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt; 
 &lt;p style=&quot;color:rgb(17,17,17);font-family:'-apple-system', 'PingFang SC', 'Microsoft YaHei', 'Noto Sans SC', sans-serif;font-size:medium;font-style:normal;font-weight:400;letter-spacing:normal;text-indent:0px;text-transform:none;white-space:normal;word-spacing:0px;background-color:rgb(255,255,255);text-decoration-thickness:initial;text-decoration-style:initial;text-decoration-color:initial;&quot;&gt; &lt;span&gt;这个开关没开，整个 oem unlock 分支（包括后面的确认步骤）都会落到#else返回 FAILnot implemented，所以实际走不到。留在这里是为了完整性——如果你以后要开 oem unlock，就会碰到它。&lt;/span&gt;&lt;/p&gt; 
 &lt;p style=&quot;color:rgb(17,17,17);font-family:'-apple-system', 'PingFang SC', 'Microsoft YaHei', 'Noto Sans SC', sans-serif;font-size:medium;font-style:normal;font-weight:400;letter-spacing:normal;text-indent:0px;text-transform:none;white-space:normal;word-spacing:0px;background-color:rgb(255,255,255);text-decoration-thickness:initial;text-decoration-style:initial;text-decoration-color:initial;&quot;&gt; &lt;span&gt;顺带澄清一个容易混淆的地方：fastboot 里还有个 reboot-recovery 子命令，它会调 android_bcb_write(&quot;boot-recovery&quot;) 写 BCB。&lt;/span&gt;&lt;b&gt;&lt;span&gt;那个函数不是这里的调用者&lt;/span&gt;&lt;/b&gt;&lt;span&gt;——它只写个 BCB 然后重启，不带 --wipe_data，和 board_run_recovery_wipe_data() 是两码事。&lt;/span&gt;&lt;/p&gt; 
 &lt;p style=&quot;color:rgb(17,17,17);font-family:'-apple-system', 'PingFang SC', 'Microsoft YaHei', 'Noto Sans SC', sans-serif;font-size:medium;font-style:normal;font-weight:400;letter-spacing:normal;text-indent:0px;text-transform:none;white-space:normal;word-spacing:0px;background-color:rgb(255,255,255);text-decoration-thickness:initial;text-decoration-style:initial;text-decoration-color:initial;&quot;&gt; &lt;span&gt;注意它写的是命令是 --wipe_data，不是 --wipe_all。两者在代码里&lt;/span&gt;&lt;b&gt;&lt;span&gt;效果实际是一样的&lt;/span&gt;&lt;/b&gt;&lt;span&gt;（04 篇核对过：都只擦 /userdata），但写在 misc 里的字符串不同——对照 --misc=display 的输出判断&quot;这次到底是谁触发的&quot;，靠的就是这个差别。&lt;/span&gt;&lt;/p&gt; 
 &lt;h2 style=&quot;color:rgb(17,17,17);font-family:'-apple-system', 'PingFang SC', 'Microsoft YaHei', 'Noto Sans SC', sans-serif;font-style:normal;letter-spacing:normal;text-indent:0px;text-transform:none;white-space:normal;word-spacing:0px;background-color:rgb(255,255,255);text-decoration-thickness:initial;text-decoration-style:initial;text-decoration-color:initial;font-size:20px;border-left:4px solid rgb(17,17,17);padding-left:10px;margin:34px 0px 12px;&quot;&gt; &lt;span&gt;小结&lt;/span&gt;&lt;/h2&gt; 
 &lt;table style=&quot;color:rgb(17,17,17);font-family:'-apple-system', 'PingFang SC', 'Microsoft YaHei', 'Noto Sans SC', sans-serif;font-style:normal;font-weight:400;letter-spacing:normal;text-transform:none;white-space:normal;word-spacing:0px;background-color:rgb(255,255,255);text-decoration-thickness:initial;text-decoration-style:initial;text-decoration-color:initial;border-collapse:collapse;width:720px;font-size:13.5px;margin:10px 0px;border:1px solid rgb(229,231,235);&quot;&gt;
  &lt;tbody&gt;
   &lt;tr style=&quot;background:rgb(249,250,251);&quot;&gt;
    &lt;th style=&quot;border:1px solid rgb(229,231,235);padding:8px 10px;text-align:left;&quot;&gt; &lt;span&gt;阶段&lt;/span&gt;&lt;/th&gt; 
    &lt;th style=&quot;border:1px solid rgb(229,231,235);padding:8px 10px;text-align:left;&quot;&gt; &lt;span&gt;代码&lt;/span&gt;&lt;/th&gt; 
    &lt;th style=&quot;border:1px solid rgb(229,231,235);padding:8px 10px;text-align:left;&quot;&gt; &lt;span&gt;判断依据&lt;/span&gt;&lt;/th&gt; 
    &lt;th style=&quot;border:1px solid rgb(229,231,235);padding:8px 10px;text-align:left;&quot;&gt; &lt;span&gt;串口输出&lt;/span&gt;&lt;/th&gt; 
   &lt;/tr&gt;
   &lt;tr&gt;
    &lt;td style=&quot;border:1px solid rgb(229,231,235);padding:8px 10px;text-align:left;&quot;&gt; &lt;span&gt;SPL（&lt;/span&gt;&lt;b&gt;&lt;span&gt;本 SDK 未启用&lt;/span&gt;&lt;/b&gt;&lt;span&gt;）&lt;/span&gt;&lt;/td&gt; 
    &lt;td style=&quot;border:1px solid rgb(229,231,235);padding:8px 10px;text-align:left;&quot;&gt; &lt;span&gt;spl_kernel_partition()&lt;/span&gt;&lt;/td&gt; 
    &lt;td style=&quot;border:1px solid rgb(229,231,235);padding:8px 10px;text-align:left;&quot;&gt; &lt;span&gt;misc 16K 处 command == &quot;boot-recovery&quot;&lt;/span&gt;&lt;/td&gt; 
    &lt;td style=&quot;border:1px solid rgb(229,231,235);padding:8px 10px;text-align:left;&quot;&gt; &lt;span&gt;—&lt;/span&gt;&lt;/td&gt; 
   &lt;/tr&gt;
   &lt;tr&gt;
    &lt;td style=&quot;border:1px solid rgb(229,231,235);padding:8px 10px;text-align:left;&quot;&gt; &lt;span&gt;热键&lt;/span&gt;&lt;/td&gt; 
    &lt;td style=&quot;border:1px solid rgb(229,231,235);padding:8px 10px;text-align:left;&quot;&gt; &lt;span&gt;setup_download_mode()&lt;/span&gt;&lt;/td&gt; 
    &lt;td style=&quot;border:1px solid rgb(229,231,235);padding:8px 10px;text-align:left;&quot;&gt; &lt;span&gt;VOLUMEUP + 无 USB&lt;/span&gt;&lt;/td&gt; 
    &lt;td style=&quot;border:1px solid rgb(229,231,235);padding:8px 10px;text-align:left;&quot;&gt; &lt;span&gt;entering recovery mode!&lt;/span&gt;&lt;/td&gt; 
   &lt;/tr&gt;
   &lt;tr&gt;
    &lt;td style=&quot;border:1px solid rgb(229,231,235);padding:8px 10px;text-align:left;&quot;&gt; &lt;span&gt;U-Boot&lt;/span&gt;&lt;/td&gt; 
    &lt;td style=&quot;border:1px solid rgb(229,231,235);padding:8px 10px;text-align:left;&quot;&gt; &lt;span&gt;rockchip_get_boot_mode()&lt;/span&gt;&lt;/td&gt; 
    &lt;td style=&quot;border:1px solid rgb(229,231,235);padding:8px 10px;text-align:left;&quot;&gt; &lt;span&gt;env → 寄存器 → misc&lt;/span&gt;&lt;/td&gt; 
    &lt;td style=&quot;border:1px solid rgb(229,231,235);padding:8px 10px;text-align:left;&quot;&gt; &lt;span&gt;boot mode: recovery (misc)&lt;/span&gt;&lt;/td&gt; 
   &lt;/tr&gt;
   &lt;tr&gt;
    &lt;td style=&quot;border:1px solid rgb(229,231,235);padding:8px 10px;text-align:left;&quot;&gt; &lt;span&gt;fastboot&lt;/span&gt;&lt;/td&gt; 
    &lt;td style=&quot;border:1px solid rgb(229,231,235);padding:8px 10px;text-align:left;&quot;&gt; &lt;span&gt;board_run_recovery_wipe_data()&lt;/span&gt;&lt;/td&gt; 
    &lt;td style=&quot;border:1px solid rgb(229,231,235);padding:8px 10px;text-align:left;&quot;&gt; &lt;span&gt;oem unlock&lt;/span&gt;&lt;/td&gt; 
    &lt;td style=&quot;border:1px solid rgb(229,231,235);padding:8px 10px;text-align:left;&quot;&gt; &lt;span&gt;Rebooting into recovery to do wipe_data&lt;/span&gt;&lt;/td&gt; 
   &lt;/tr&gt;
  &lt;/tbody&gt;
 &lt;/table&gt;
 &lt;p style=&quot;color:rgb(17,17,17);font-family:'-apple-system', 'PingFang SC', 'Microsoft YaHei', 'Noto Sans SC', sans-serif;font-style:normal;font-weight:400;letter-spacing:normal;text-indent:0px;text-transform:none;white-space:normal;word-spacing:0px;text-decoration-thickness:initial;text-decoration-style:initial;text-decoration-color:initial;background:rgb(240,247,255);border:1px solid rgb(188,217,245);padding:10px 14px;font-size:14px;margin:12px 0px;&quot;&gt; &lt;span&gt;上表第一行&lt;/span&gt;&lt;b&gt;&lt;span&gt;在本 SDK 里不生效&lt;/span&gt;&lt;/b&gt;&lt;span&gt;：spl_kernel_partition() 被 CONFIG_SPL_KERNEL_BOOT 挡着（第一节核实过），只有 Thunder Boot 配置下才会编进去。当前配置下真正生效的是中间两行——热键和 U-Boot proper。&lt;/span&gt;&lt;/p&gt; 
 &lt;p style=&quot;color:rgb(17,17,17);font-family:'-apple-system', 'PingFang SC', 'Microsoft YaHei', 'Noto Sans SC', sans-serif;font-size:medium;font-style:normal;font-weight:400;letter-spacing:normal;text-indent:0px;text-transform:none;white-space:normal;word-spacing:0px;background-color:rgb(255,255,255);text-decoration-thickness:initial;text-decoration-style:initial;text-decoration-color:initial;&quot;&gt; &lt;span&gt;优先级从高到低是：&lt;/span&gt;&lt;b&gt;&lt;span&gt;热键/环境变量 &amp;gt; 下载模式（寄存器）&amp;gt; misc 命令 &amp;gt; 其它 reboot 参数。&lt;/span&gt;&lt;/b&gt;&lt;/p&gt; 
 &lt;p style=&quot;color:rgb(17,17,17);font-family:'-apple-system', 'PingFang SC', 'Microsoft YaHei', 'Noto Sans SC', sans-serif;font-size:medium;font-style:normal;font-weight:400;letter-spacing:normal;text-indent:0px;text-transform:none;white-space:normal;word-spacing:0px;background-color:rgb(255,255,255);text-decoration-thickness:initial;text-decoration-style:initial;text-decoration-color:initial;&quot;&gt; &lt;b&gt;&lt;span&gt;注意环境变量排在最前面&lt;/span&gt;&lt;/b&gt;&lt;span&gt;——rockchip_get_boot_mode() 一进来就查 reboot_mode，匹配上就直接 return，连寄存器都不读。所以按住键上电这条路能盖过一切，包括下载模式。&lt;/span&gt;&lt;/p&gt; 
 &lt;p&gt; &lt;/p&gt; 
&lt;/p&gt;</description><pubDate>Tue, 13 Oct 2026 06:22:04 +0800</pubDate></item><item><title>阿童木荣膺 ISO 三体系认证丨以国际标准护航品质与可持续发展</title><link>https://www.dihkvq.cn/yueyuan/2732.html</link><description>&lt;h3 style=&quot;margin-left:0px;&quot;&gt;&lt;strong&gt;质量 · 环境 · 职业健康安全 — 三位一体，实力再鉴&lt;/strong&gt;&lt;/h3&gt;
&lt;p style=&quot;margin-left:0px;&quot;&gt;近日，阿童木（广州）智能科技有限公司顺利通过ISO 9001质量管理体系、ISO 14001环境管理体系、ISO 45001职业健康安全管理体系三项国际权威&lt;u&gt;认证&lt;/u&gt;，成功斩获三项体系认证证书。此次三体系同步落地，标志着阿童木在品质管控、绿色生产、员工职业健康安全三大维度全面接轨国际标准，企业规范化、标准化、系统化综合管理水平迈上新台阶。&lt;/p&gt;
&lt;img src=&quot;https://file1.elecfans.com/web3/M00/7E/5B/wKgZO2rMg1aAXojEAAIaWbCDdxM153.jpg&quot; alt=&quot;ISO.jpg&quot; class=&quot;aligncenter&quot;&gt;
&lt;h2 style=&quot;margin-left:0px;&quot;&gt;&lt;strong&gt;一、三证齐发，管理体系获国际权威认可&lt;/strong&gt;&lt;/h2&gt;
&lt;p style=&quot;margin-left:0px;&quot;&gt;本次认证全面覆盖阿童木金属双张检测器的设计、制造、销售及相关配套管理活动全业务流程。经过多维度严格审核，公司各项运营管理指标均完全符合国际标准规范，顺利一次性通过三项体系认证，实现企业管理体系全方位标准化升级。&lt;/p&gt;
&lt;p style=&quot;margin-left:0px;&quot;&gt;&lt;strong&gt;Q｜ISO 9001:2015 质量管理体系（GB/T 19001-2016）&lt;/strong&gt;&lt;/p&gt;
&lt;p style=&quot;margin-left:0px;&quot;&gt;以客户为&lt;u&gt;中心&lt;/u&gt;，搭建全流程品质管控机制，持续迭代优化产品与服务质量，稳定输出高品质工业检测产品。&lt;/p&gt;
&lt;p style=&quot;margin-left:0px;&quot;&gt;&lt;strong&gt;E｜ISO 14001:2015 环境管理体系（GB/T 24001-2016）&lt;/strong&gt;&lt;/p&gt;
&lt;p style=&quot;margin-left:0px;&quot;&gt;践行绿色制造理念，严控生产环节环境影响，降低能耗与污染排放，推动企业及行业可持续绿色发展。&lt;/p&gt;
&lt;p style=&quot;margin-left:0px;&quot;&gt;&lt;strong&gt;S｜ISO 45001:2018 职业健康安全管理体系（GB/T 45001-2020）&lt;/strong&gt;&lt;/p&gt;
&lt;p style=&quot;margin-left:0px;&quot;&gt;秉持以人为本理念，搭建标准化、常态化安全管理体系，打造安全健康作业环境，全方位保障员工职业健康与合法权益。&lt;/p&gt;
&lt;h2 style=&quot;margin-left:0px;&quot;&gt;&lt;strong&gt;二、以质立身，严守产品品质核心生命线&lt;/strong&gt;&lt;/h2&gt;
&lt;p style=&quot;margin-left:0px;&quot;&gt;作为深耕工业检测&lt;u&gt;传感器&lt;/u&gt;赛道的高新技术企业，阿童木始终将产品质量视为企业核心竞争力与发展根基。ISO 9001质量管理体系的成功落地，让公司研发设计、原材料采购、生产制造、成品检验到售后服务的全业务链条，实现标准化、规范化、精细化管控。&lt;/p&gt;
&lt;p style=&quot;margin-left:0px;&quot;&gt;目前，阿童木金属双张检测器系列产品已广泛应用于汽车、锂电、家电五金、&lt;u&gt;PCB&lt;/u&gt;、食品药业等主流工业领域，服务客户遍布全国。依托成熟完善的质量管理体系，公司产品全生命周期质量保障能力持续强化，可为各行各业客户提供更稳定、精准、可靠的工业检测整体解决方案。&lt;/p&gt;
&lt;h2 style=&quot;margin-left:0px;&quot;&gt;&lt;strong&gt;三、绿色智造，践行双碳可持续发展战略&lt;/strong&gt;&lt;/h2&gt;
&lt;p style=&quot;margin-left:0px;&quot;&gt;紧跟全球制造业绿色低碳转型浪潮，积极响应国家“双碳”战略号召，阿童木将绿色环保、低碳生产理念深度融入企业日常经营与生产研发全流程。通过ISO 14001环境管理体系认证，公司建立起成熟完善的节能降耗、废弃物规范化管理、清洁生产的系统化环境管控机制。&lt;/p&gt;
&lt;p style=&quot;margin-left:0px;&quot;&gt;未来，阿童木将持续深耕绿色智造赛道，稳步推进绿色工厂建设，持续优化生产工艺、改良生产流程，有效降低生产能耗与碳排放，主动践行企业社会责任，以实际行动助力制造业绿色转型升级。&lt;/p&gt;
&lt;h2 style=&quot;margin-left:0px;&quot;&gt;&lt;strong&gt;四、以人为本，落实全员健康安全保障&lt;/strong&gt;&lt;/h2&gt;
&lt;p style=&quot;margin-left:0px;&quot;&gt;员工是企业发展的核心力量，阿童木始终把员工的健康与安全放在经营管理的重要位置。本次顺利通过ISO 45001职业健康安全管理体系认证，意味着公司在风险识别、隐患防控、应急处置、安全培训等方面，都建立了完整、可落地的管理机制。&lt;/p&gt;
&lt;p style=&quot;margin-left:0px;&quot;&gt;接下来，公司将持续完善安全管理制度，定期组织安全培训和应急演练，让安全管理融入日常生产的每一个环节，营造安全、规范、安心的作业环境，切实保障全体员工的职业健康与作业安全。&lt;/p&gt;
&lt;h3 style=&quot;margin-left:0px;&quot;&gt;&lt;strong&gt;三体系认证核心价值&lt;/strong&gt;&lt;/h3&gt;
&lt;p style=&quot;margin-left:0px;&quot;&gt;&lt;strong&gt;品质有保障&lt;/strong&gt;：从研发、生产到出货全流程标准化管控，细化各环节品控标准，让产品交付质量更稳定、更靠谱&lt;/p&gt;
&lt;p style=&quot;margin-left:0px;&quot;&gt;&lt;strong&gt;管理更规范&lt;/strong&gt;：企业运营全流程有据可依、有章可循，彻底实现标准化运营，大幅提升综合管理效能&lt;/p&gt;
&lt;p style=&quot;margin-left:0px;&quot;&gt;&lt;strong&gt;绿色可持续&lt;/strong&gt;：常态化优化环境绩效，严控生产污染与能耗，助力上下游产业链低碳绿色转型&lt;/p&gt;
&lt;p style=&quot;margin-left:0px;&quot;&gt;&lt;strong&gt;安全有底气&lt;/strong&gt;：职业健康安全体系常态化、规范化运行，从制度到落地全方位保障员工权益&lt;/p&gt;
&lt;p style=&quot;margin-left:0px;&quot;&gt;&lt;strong&gt;合作更放心&lt;/strong&gt;：国际权威三体系认证硬核背书，企业综合实力再升级，极大增强客户合作信心&lt;/p&gt;
&lt;h2 style=&quot;margin-left:0px;&quot;&gt;&lt;strong&gt;五、砥砺深耕，以国际标准迈向全新高度&lt;/strong&gt;&lt;/h2&gt;
&lt;p style=&quot;margin-left:0px;&quot;&gt;此次三项国际体系认证的圆满斩获，是阿童木规范化发展的重要里程碑，更是企业高质量发展的全新起点。未来，阿童木将严格对标三大国际体系标准，持续优化内部管理流程、打磨产品品质、升级服务体系，实现企业管理、产品质量、绿色生产、安全运营全方位提质增效。&lt;/p&gt;
&lt;p style=&quot;margin-left:0px;&quot;&gt;未来，阿童木将始终秉持“以检测守护品质，以创新驱动发展”的理念，深耕工业检测传感器细分领域，以高品质产品、专业化解决方案、全方位贴心服务，回馈广大客户与合作伙伴的信任与支持，持续为中国制造品质升级、智能制造高质量发展贡献阿童木力量。&lt;/p&gt;</description><pubDate>Tue, 13 Oct 2026 06:21:34 +0800</pubDate></item><item><title>网口记录仪通信故障排查：TCP长连接超时断线问题深度剖析</title><link>https://www.dihkvq.cn/yueyuan/2731.html</link><description>&lt;p&gt; &lt;strong&gt;副标题：网口温湿度记录仪IP&lt;u&gt;通信&lt;/u&gt;踩坑：TCP长连接断线排查与优化&lt;/strong&gt;&lt;/p&gt; 
&lt;p&gt; &lt;/p&gt;&lt;p&gt; &lt;/p&gt; 
&lt;p&gt; &lt;u&gt;物联网&lt;/u&gt; · 盛世宏博 · TCP长连接 · 断线排查 · 心跳保活 · 自动重连&lt;/p&gt; 
&lt;p&gt; &lt;img src=&quot;https://file1.elecfans.com//web3/M00/7E/44/wKgZO2rMP4KABZhgAAaGNeB81m4013.png&quot; alt=&quot;wKgZO2rMP4KABZhgAAaGNeB81m4013.png&quot; class=&quot;aligncenter&quot;&gt;&lt;/p&gt; 
&lt;p&gt; 添加描述&lt;/p&gt; 
&lt;p&gt; &lt;strong&gt;关键词&lt;/strong&gt;：网口温湿度记录仪、TCP长连接、连接中断、心跳保活、SO_KEEPALIVE、自动重连、socket超时、通信优化 &lt;strong&gt;&lt;u&gt;标签&lt;/u&gt;&lt;/strong&gt;：#物联网 #Modbus #TCP/IP #UDP #&lt;u&gt;POE&lt;/u&gt;供电 #腾讯云 #Wireshark #&lt;u&gt;Python&lt;/u&gt; #InfluxDB #&lt;u&gt;以太网&lt;/u&gt;温&lt;u&gt;湿度传感器&lt;/u&gt; #网口温湿度&lt;u&gt;变送器&lt;/u&gt; #机房监控&lt;/p&gt; 
&lt;p&gt; &lt;strong&gt;一、故障背景&lt;/strong&gt;&lt;/p&gt; 
&lt;p&gt; 某电力调度机房部署了16台网口温湿度记录仪，采集平台采用&lt;strong&gt;TCP长连接方式&lt;/strong&gt;（每台设备保持一个持久连接，周期性发送Modbus功能码03读取&lt;u&gt;寄存器&lt;/u&gt;）。上线首周运行平稳，但从第二周开始，运维陆续反馈：&lt;strong&gt;部分设备数据间歇性中断，持续30秒~5分钟不等后自动恢复&lt;/strong&gt;，平台日志中反复出现 Connec&lt;u&gt;ti&lt;/u&gt;onRese&lt;u&gt;tE&lt;/u&gt;rror 和 Broken&lt;u&gt;Pi&lt;/u&gt;peError。&lt;/p&gt; 
&lt;p&gt; 这不是网络抖动——ping延迟稳定在1~2ms，丢包率0%。问题出在&lt;strong&gt;TCP长连接本身的生命周期管理&lt;/strong&gt;上。&lt;/p&gt; 
&lt;p&gt; &lt;/p&gt; 
&lt;p&gt; POE供电以太网温湿度传感器&lt;/p&gt; 
&lt;p&gt; &lt;/p&gt;&lt;p&gt; &lt;/p&gt; 
&lt;p&gt; &lt;strong&gt;二、TCP长连接断线的典型表现&lt;/strong&gt;&lt;/p&gt; 
&lt;p&gt; &lt;/p&gt;&lt;p&gt; &lt;/p&gt; 
&lt;table style=&quot;background-color:rgb(255,255,255);&quot;&gt;
 &lt;tbody&gt;
  &lt;tr&gt;
   &lt;th style=&quot;background-color:rgb(235,236,237);border-bottom:1px solid rgb(196,199,206);border-left:1px solid rgb(196,199,206);border-right:1px solid rgb(196,199,206);border-top:1px solid rgb(196,199,206);height:24px;padding:0px;&quot;&gt; 现象&lt;/th&gt; 
   &lt;th style=&quot;background-color:rgb(235,236,237);border-bottom:1px solid rgb(196,199,206);border-left:1px solid rgb(196,199,206);border-right:1px solid rgb(196,199,206);border-top:1px solid rgb(196,199,206);height:24px;padding:0px;&quot;&gt; 对应错误&lt;/th&gt; 
   &lt;th style=&quot;background-color:rgb(235,236,237);border-bottom:1px solid rgb(196,199,206);border-left:1px solid rgb(196,199,206);border-right:1px solid rgb(196,199,206);border-top:1px solid rgb(196,199,206);height:24px;padding:0px;&quot;&gt; 发生频率&lt;/th&gt; 
  &lt;/tr&gt;
  &lt;tr&gt;
   &lt;th style=&quot;border-bottom:1px solid rgb(196,199,206);border-left:1px solid rgb(196,199,206);border-right:1px solid rgb(196,199,206);border-top:1px solid rgb(196,199,206);height:24px;padding:0px;&quot;&gt; 读取数据时突然抛异常&lt;/th&gt; 
   &lt;th style=&quot;border-bottom:1px solid rgb(196,199,206);border-left:1px solid rgb(196,199,206);border-right:1px solid rgb(196,199,206);border-top:1px solid rgb(196,199,206);height:24px;padding:0px;&quot;&gt; ConnectionResetError: [Errno 104] Connection reset by peer&lt;/th&gt; 
   &lt;th style=&quot;border-bottom:1px solid rgb(196,199,206);border-left:1px solid rgb(196,199,206);border-right:1px solid rgb(196,199,206);border-top:1px solid rgb(196,199,206);height:24px;padding:0px;&quot;&gt; 每天2~3次/台&lt;/th&gt; 
  &lt;/tr&gt;
  &lt;tr&gt;
   &lt;th style=&quot;border-bottom:1px solid rgb(196,199,206);border-left:1px solid rgb(196,199,206);border-right:1px solid rgb(196,199,206);border-top:1px solid rgb(196,199,206);height:24px;padding:0px;&quot;&gt; 写入时管道断裂&lt;/th&gt; 
   &lt;th style=&quot;border-bottom:1px solid rgb(196,199,206);border-left:1px solid rgb(196,199,206);border-right:1px solid rgb(196,199,206);border-top:1px solid rgb(196,199,206);height:24px;padding:0px;&quot;&gt; BrokenPipeError: [Errno 32] Broken pipe&lt;/th&gt; 
   &lt;th style=&quot;border-bottom:1px solid rgb(196,199,206);border-left:1px solid rgb(196,199,206);border-right:1px solid rgb(196,199,206);border-top:1px solid rgb(196,199,206);height:24px;padding:0px;&quot;&gt; 伴随Reset出现&lt;/th&gt; 
  &lt;/tr&gt;
  &lt;tr&gt;
   &lt;th style=&quot;border-bottom:1px solid rgb(196,199,206);border-left:1px solid rgb(196,199,206);border-right:1px solid rgb(196,199,206);border-top:1px solid rgb(196,199,206);height:24px;padding:0px;&quot;&gt; 连接卡死无响应&lt;/th&gt; 
   &lt;th style=&quot;border-bottom:1px solid rgb(196,199,206);border-left:1px solid rgb(196,199,206);border-right:1px solid rgb(196,199,206);border-top:1px solid rgb(196,199,206);height:24px;padding:0px;&quot;&gt; 无异常但recv()永远阻塞&lt;/th&gt; 
   &lt;th style=&quot;border-bottom:1px solid rgb(196,199,206);border-left:1px solid rgb(196,199,206);border-right:1px solid rgb(196,199,206);border-top:1px solid rgb(196,199,206);height:24px;padding:0px;&quot;&gt; 偶尔（最隐蔽）&lt;/th&gt; 
  &lt;/tr&gt;
  &lt;tr&gt;
   &lt;th style=&quot;border-bottom:1px solid rgb(196,199,206);border-left:1px solid rgb(196,199,206);border-right:1px solid rgb(196,199,206);border-top:1px solid rgb(196,199,206);height:24px;padding:0px;&quot;&gt; 恢复后数据正常&lt;/th&gt; 
   &lt;th style=&quot;border-bottom:1px solid rgb(196,199,206);border-left:1px solid rgb(196,199,206);border-right:1px solid rgb(196,199,206);border-top:1px solid rgb(196,199,206);height:24px;padding:0px;&quot;&gt; 重连成功，读数正常&lt;/th&gt; 
   &lt;th style=&quot;border-bottom:1px solid rgb(196,199,206);border-left:1px solid rgb(196,199,206);border-right:1px solid rgb(196,199,206);border-top:1px solid rgb(196,199,206);height:24px;padding:0px;&quot;&gt; 自动恢复&lt;/th&gt; 
  &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt; &lt;/p&gt;&lt;p&gt; &lt;/p&gt; 
&lt;p&gt; &lt;strong&gt;关键特征&lt;/strong&gt;：不是&quot;连不上&quot;，而是&quot;连上了但中途断了&quot;，且断线后socket对象并未自动关闭，应用层浑然不知。&lt;/p&gt; 
&lt;p&gt; &lt;/p&gt;&lt;p&gt; &lt;/p&gt; 
&lt;p&gt; &lt;/p&gt;&lt;p&gt; &lt;/p&gt; 
&lt;p&gt; &lt;strong&gt;三、断线根因分析&lt;/strong&gt;&lt;/p&gt; 
&lt;p&gt; &lt;strong&gt;3.1 四大根因&lt;/strong&gt;&lt;/p&gt; 
&lt;p&gt; 根因1：中间设备空闲断连 &lt;u&gt;交换机&lt;/u&gt;/防火墙/NAT设备对空闲TCP连接有超时机制 典型值：15分钟~2小时（思科ASA默认1小时，华为防火墙默认30分钟） 连接空闲超过阈值 → 中间设备悄悄丢弃会话表项 结果：客户端发送数据时，对端无响应或&lt;u&gt;RS&lt;/u&gt;T 根因2：&lt;u&gt;传感器&lt;/u&gt;端资源限制 网口记录仪&lt;u&gt;MCU&lt;/u&gt;资源有限（&lt;u&gt;RAM&lt;/u&gt;通常256KB~1MB） 最大TCP连接数限制（常见4~8个） 旧连接未正确关闭（FIN未发送或被丢弃）→ 连接数耗尽 → 新请求被RST 根因3：应用层未处理半关闭 对端已关闭写端（FIN），本地仍尝试写入 → BrokenPipeError 或：对端已RST，本地仍尝试读取 → ConnectionResetError 根因4：网络路径MTU/分片问题 某些交换机对大包进行分片或丢弃 Modbus TCP报文通常很小（&amp;lt;100字节），但某些记录仪固件bug会发送异常长度响应 → TCP窗口卡死 复制&lt;/p&gt; 
&lt;p&gt; &lt;strong&gt;3.2 Wireshark抓包验证&lt;/strong&gt;&lt;/p&gt; 
&lt;p&gt; # 过滤条件：tcp and ip.&lt;u&gt;ad&lt;/u&gt;dr == 192.168.10.50 # 正常通信序列： # [SYN] → [SYN, &lt;u&gt;AC&lt;/u&gt;K] → [ACK] (三次握手) # [PSH, ACK] (请求) → [ACK] # [PSH, ACK] (响应) → [ACK] # ... 持续循环 ... # 断线时的抓包： # 场景A：中间设备丢弃 # [PSH, ACK] (请求) → 无响应 → 重传3次 → [RST] (来自中间设备) # 场景B：传感器RST # [PSH, ACK] (请求) → [RST, ACK] (传感器主动拒绝) # 场景C：半关闭 # 传感器发送 [FIN, ACK] → 平台未处理 → 继续发送 [PSH, ACK] → [RST] 复制&lt;/p&gt; 
&lt;p&gt; &lt;/p&gt;&lt;p&gt; &lt;/p&gt; 
&lt;p&gt; &lt;/p&gt;&lt;p&gt; &lt;/p&gt; 
&lt;p&gt; &lt;strong&gt;四、解决方案&lt;/strong&gt;&lt;/p&gt; 
&lt;p&gt; &lt;strong&gt;4.1 方案一：心跳保活（推荐）&lt;/strong&gt;&lt;/p&gt; 
&lt;p&gt; # tcp_keepalive_client.py - 带心跳保活的长连接客户端 import socket import struct import time import thre&lt;u&gt;adi&lt;/u&gt;ng from enum import Enum, auto class ConnectionState(Enum): DISCONNECTED = auto() CONNECTING = auto() CONNECTED = auto() FAI&lt;u&gt;LED&lt;/u&gt; = auto() class KeepAliveTCPClient: def __init__(self, host, port, keepalive_interval=15, connect_timeout=5, read_timeout=3, max_retries=3): self.host = host self.port = port self.keepalive_interval = keepalive_interval self.connect_timeout = connect_timeout self.read_timeout = read_timeout self.max_retries = max_retries self.sock = None self.state = ConnectionState.DISCONNECTED self._running = False self._last_recv_time = 0 self._send_lock = threading.Lock() def connect(self): &quot;&quot;&quot;建立连接并开启TCP KEEPALIVE&quot;&quot;&quot; self.state = ConnectionState.CONNECTING try: self.sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) self.sock.settimeout(self.connect_timeout) # 开启TCP KEEPALIVE self.sock.setsockopt(socket.SOL_SOCKET, socket.SO_KEEPALIVE, 1) # &lt;u&gt;Linux&lt;/u&gt;下设置保活参数 try: self.sock.setsockopt(socket.IPPROTO_TCP, socket.TCP_KEEPIDLE, 30) # 30秒空闲后开始探测 self.sock.setsockopt(socket.IPPROTO_TCP, socket.TCP_KEEPINTVL, 10) # 每10秒探测一次 self.sock.setsockopt(socket.IPPROTO_TCP, socket.TCP_KEEPCNT, 3) # 3次失败判定断线 except AttributeError: pass # Windows/Mac不支持这些选项 self.sock.connect((self.host, self.port)) self.sock.settimeout(self.read_timeout) self.state = ConnectionState.CONNECTED self._last_recv_time = time.time() return True except Exception as e: print(f&quot;[TCP] 连接失败 {self.host}:{self.port} - {e}&quot;) self.state = ConnectionState.FAILED return False def send_modbus_read(self, slave_id, reg_addr, reg_count): &quot;&quot;&quot;发送Modbus TCP读请求（带自动重连）&quot;&quot;&quot; req = self._build_modbus_request(slave_id, reg_addr, reg_count) for attempt in range(self.max_retries): try: with self._send_lock: if self.state != ConnectionState.CONNECTED: self._reconnect() self.sock.sendall(req) resp = self.sock.recv(1024) if len(resp) &amp;lt; 9: raise ValueError(&quot;响应过短&quot;) self._last_recv_time = time.time() return self._parse_modbus_response(resp) except (socket.timeout, socket.error, ConnectionResetError, BrokenPipeError) as e: print(f&quot;[TCP] 通信异常 (尝试{attempt+1}/{self.max_retries}): {e}&quot;) self.state = ConnectionState.DISCONNECTED if attempt &amp;lt; self.max_retries - 1: time.sleep(2 ** attempt) # 指数退避 self._reconnect() return None def _reconnect(self): &quot;&quot;&quot;断开重连&quot;&quot;&quot; print(f&quot;[TCP] 尝试重连 {self.host}:{self.port}...&quot;) if self.sock: try: self.sock.close() except: pass time.sleep(1) self.connect() def start_heartbeat(self): &quot;&quot;&quot;启动应用层心跳线程&quot;&quot;&quot; self._running = True t = threading.Thread(target=self._heartbeat_loop, daemon=True) t.start() def _heartbeat_loop(self): &quot;&quot;&quot;应用层心跳：发送Modbus空读请求保持连接活跃&quot;&quot;&quot; while self._running: time.sleep(self.keepalive_interval) if self.state == ConnectionState.CONNECTED: try: # 发送一个轻量Modbus读请求作为心跳 self.send_modbus_read(slave_id=1, reg_addr=0x0001, reg_count=1) except: pass # 心跳失败由自动重连机制处理 def _build_modbus_request(self, slave_id, reg_addr, reg_count): tid = int(time.time() * 1000) % 65535 return struct.pack('&amp;gt;HHHBH', tid, 0, 6, slave_id, 0x03, reg_addr, reg_count) def _parse_modbus_response(self, resp): byte_count = resp[8] data = resp[9:9+byte_count] values = struct.unpack(f'&amp;gt;{byte_count//2}H', data) return [v / 10.0 if i == 0 else v for i, v in enumerate(values)] def close(self): self._running = False if self.sock: self.sock.close() self.state = ConnectionState.DISCONNECTED 复制&lt;/p&gt; 
&lt;p&gt; &lt;strong&gt;4.2 方案二：短连接模式（备选）&lt;/strong&gt;&lt;/p&gt; 
&lt;p&gt; 对于不支持长连接保活的低端记录仪，改用&lt;strong&gt;短连接&lt;/strong&gt;（每次读写后关闭连接）：&lt;/p&gt; 
&lt;p&gt; # short_conn_client.py - 短连接模式（每次请求新建连接） import socket import struct import time class ShortConnClient: def __init__(self, host, port, timeout=3): self.host = host self.port = port self.timeout = timeout def read_once(self, slave_id, reg_addr, reg_count): &quot;&quot;&quot;每次读取新建连接，读完即关&quot;&quot;&quot; sock = None try: sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) sock.settimeout(self.timeout) sock.connect((self.host, self.port)) tid = int(time.time() * 1000) % 65535 req = struct.pack('&amp;gt;HHHBH', tid, 0, 6, slave_id, 0x03, reg_addr, reg_count) sock.sendall(req) resp = sock.recv(1024) return resp except Exception as e: print(f&quot;[ShortConn] 读取失败: {e}&quot;) return None finally: if sock: try: sock.close() except: pass # 使用： # client = ShortConnClient(&quot;192.168.10.50&quot;, 502) # resp = client.read_once(1, 0x0003, 2) 复制&lt;/p&gt; 
&lt;p&gt; &lt;strong&gt;长连接 vs 短连接对比&lt;/strong&gt;：&lt;/p&gt; 
&lt;p&gt; &lt;/p&gt;&lt;p&gt; &lt;/p&gt; 
&lt;table style=&quot;background-color:rgb(255,255,255);&quot;&gt;
 &lt;tbody&gt;
  &lt;tr&gt;
   &lt;th style=&quot;background-color:rgb(235,236,237);border-bottom:1px solid rgb(196,199,206);border-left:1px solid rgb(196,199,206);border-right:1px solid rgb(196,199,206);border-top:1px solid rgb(196,199,206);height:24px;padding:0px;&quot;&gt; 维度&lt;/th&gt; 
   &lt;th style=&quot;background-color:rgb(235,236,237);border-bottom:1px solid rgb(196,199,206);border-left:1px solid rgb(196,199,206);border-right:1px solid rgb(196,199,206);border-top:1px solid rgb(196,199,206);height:24px;padding:0px;&quot;&gt; 长连接+心跳&lt;/th&gt; 
   &lt;th style=&quot;background-color:rgb(235,236,237);border-bottom:1px solid rgb(196,199,206);border-left:1px solid rgb(196,199,206);border-right:1px solid rgb(196,199,206);border-top:1px solid rgb(196,199,206);height:24px;padding:0px;&quot;&gt; 短连接&lt;/th&gt; 
  &lt;/tr&gt;
  &lt;tr&gt;
   &lt;th style=&quot;border-bottom:1px solid rgb(196,199,206);border-left:1px solid rgb(196,199,206);border-right:1px solid rgb(196,199,206);border-top:1px solid rgb(196,199,206);height:24px;padding:0px;&quot;&gt; 延迟&lt;/th&gt; 
   &lt;th style=&quot;border-bottom:1px solid rgb(196,199,206);border-left:1px solid rgb(196,199,206);border-right:1px solid rgb(196,199,206);border-top:1px solid rgb(196,199,206);height:24px;padding:0px;&quot;&gt; 低（复用连接）&lt;/th&gt; 
   &lt;th style=&quot;border-bottom:1px solid rgb(196,199,206);border-left:1px solid rgb(196,199,206);border-right:1px solid rgb(196,199,206);border-top:1px solid rgb(196,199,206);height:24px;padding:0px;&quot;&gt; 高（每次三次握手）&lt;/th&gt; 
  &lt;/tr&gt;
  &lt;tr&gt;
   &lt;th style=&quot;border-bottom:1px solid rgb(196,199,206);border-left:1px solid rgb(196,199,206);border-right:1px solid rgb(196,199,206);border-top:1px solid rgb(196,199,206);height:24px;padding:0px;&quot;&gt; 资源消耗&lt;/th&gt; 
   &lt;th style=&quot;border-bottom:1px solid rgb(196,199,206);border-left:1px solid rgb(196,199,206);border-right:1px solid rgb(196,199,206);border-top:1px solid rgb(196,199,206);height:24px;padding:0px;&quot;&gt; 低（连接数固定）&lt;/th&gt; 
   &lt;th style=&quot;border-bottom:1px solid rgb(196,199,206);border-left:1px solid rgb(196,199,206);border-right:1px solid rgb(196,199,206);border-top:1px solid rgb(196,199,206);height:24px;padding:0px;&quot;&gt; 高（频繁创建/销毁）&lt;/th&gt; 
  &lt;/tr&gt;
  &lt;tr&gt;
   &lt;th style=&quot;border-bottom:1px solid rgb(196,199,206);border-left:1px solid rgb(196,199,206);border-right:1px solid rgb(196,199,206);border-top:1px solid rgb(196,199,206);height:24px;padding:0px;&quot;&gt; 断线风险&lt;/th&gt; 
   &lt;th style=&quot;border-bottom:1px solid rgb(196,199,206);border-left:1px solid rgb(196,199,206);border-right:1px solid rgb(196,199,206);border-top:1px solid rgb(196,199,206);height:24px;padding:0px;&quot;&gt; 需处理保活&lt;/th&gt; 
   &lt;th style=&quot;border-bottom:1px solid rgb(196,199,206);border-left:1px solid rgb(196,199,206);border-right:1px solid rgb(196,199,206);border-top:1px solid rgb(196,199,206);height:24px;padding:0px;&quot;&gt; 无长连接断线问题&lt;/th&gt; 
  &lt;/tr&gt;
  &lt;tr&gt;
   &lt;th style=&quot;border-bottom:1px solid rgb(196,199,206);border-left:1px solid rgb(196,199,206);border-right:1px solid rgb(196,199,206);border-top:1px solid rgb(196,199,206);height:24px;padding:0px;&quot;&gt; 适用场景&lt;/th&gt; 
   &lt;th style=&quot;border-bottom:1px solid rgb(196,199,206);border-left:1px solid rgb(196,199,206);border-right:1px solid rgb(196,199,206);border-top:1px solid rgb(196,199,206);height:24px;padding:0px;&quot;&gt; 传感器响应快、网络稳定&lt;/th&gt; 
   &lt;th style=&quot;border-bottom:1px solid rgb(196,199,206);border-left:1px solid rgb(196,199,206);border-right:1px solid rgb(196,199,206);border-top:1px solid rgb(196,199,206);height:24px;padding:0px;&quot;&gt; 低端设备、网络不可靠&lt;/th&gt; 
  &lt;/tr&gt;
  &lt;tr&gt;
   &lt;th style=&quot;border-bottom:1px solid rgb(196,199,206);border-left:1px solid rgb(196,199,206);border-right:1px solid rgb(196,199,206);border-top:1px solid rgb(196,199,206);height:24px;padding:0px;&quot;&gt; 推荐指数&lt;/th&gt; 
   &lt;th style=&quot;border-bottom:1px solid rgb(196,199,206);border-left:1px solid rgb(196,199,206);border-right:1px solid rgb(196,199,206);border-top:1px solid rgb(196,199,206);height:24px;padding:0px;&quot;&gt; ⭐⭐⭐⭐⭐&lt;/th&gt; 
   &lt;th style=&quot;border-bottom:1px solid rgb(196,199,206);border-left:1px solid rgb(196,199,206);border-right:1px solid rgb(196,199,206);border-top:1px solid rgb(196,199,206);height:24px;padding:0px;&quot;&gt; ⭐⭐⭐&lt;/th&gt; 
  &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt; &lt;/p&gt;&lt;p&gt; &lt;/p&gt; 
&lt;p&gt; &lt;strong&gt;4.3 方案三：连接池（大规模部署）&lt;/strong&gt;&lt;/p&gt; 
&lt;p&gt; # connection_pool.py - TCP连接池 from queue import Queue, Empty import threading import time class TCPConnectionPool: def __init__(self, host, port, pool_size=3, max_idle=300): self.host = host self.port = port self.pool_size = pool_size self.max_idle = max_idle self._pool = Queue(maxsize=pool_size) self._lock = threading.Lock() self._created = 0 def _create_connection(self): import socket sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) sock.settimeout(5) sock.connect((self.host, self.port)) sock.settimeout(3) self._created += 1 return sock def get(self, timeout=5): try: sock, create_time = self._pool.get_now&lt;u&gt;ai&lt;/u&gt;t() # 检查空闲超时 if time.time() - create_time &amp;gt; self.max_idle: sock.close() sock = self._create_connection() return sock except Empty: if self._created &amp;lt; self.pool_size: return self._create_connection() # 等待可用连接 try: sock, create_time = self._pool.get(timeout=timeout) return sock except Empty: raise TimeoutError(&quot;连接池耗尽&quot;) def put(self, sock): try: self._pool.put_nowait((sock, time.time())) except: sock.close() self._created -= 1 def close_all(self): while not self._pool.empty(): try: sock, _ = self._pool.get_nowait() sock.close() except: pass self._created = 0 复制&lt;/p&gt; 
&lt;p&gt; &lt;/p&gt;&lt;p&gt; &lt;/p&gt; 
&lt;p&gt; &lt;/p&gt;&lt;p&gt; &lt;/p&gt; 
&lt;p&gt; &lt;strong&gt;五、传感器端配置优化&lt;/strong&gt;&lt;/p&gt; 
&lt;p&gt; &lt;strong&gt;5.1 常见记录仪参数调优&lt;/strong&gt;&lt;/p&gt; 
&lt;p&gt; &lt;/p&gt;&lt;p&gt; &lt;/p&gt; 
&lt;table style=&quot;background-color:rgb(255,255,255);&quot;&gt;
 &lt;tbody&gt;
  &lt;tr&gt;
   &lt;th style=&quot;background-color:rgb(235,236,237);border-bottom:1px solid rgb(196,199,206);border-left:1px solid rgb(196,199,206);border-right:1px solid rgb(196,199,206);border-top:1px solid rgb(196,199,206);height:24px;padding:0px;&quot;&gt; 参数&lt;/th&gt; 
   &lt;th style=&quot;background-color:rgb(235,236,237);border-bottom:1px solid rgb(196,199,206);border-left:1px solid rgb(196,199,206);border-right:1px solid rgb(196,199,206);border-top:1px solid rgb(196,199,206);height:24px;padding:0px;&quot;&gt; 默认值&lt;/th&gt; 
   &lt;th style=&quot;background-color:rgb(235,236,237);border-bottom:1px solid rgb(196,199,206);border-left:1px solid rgb(196,199,206);border-right:1px solid rgb(196,199,206);border-top:1px solid rgb(196,199,206);height:24px;padding:0px;&quot;&gt; 推荐值&lt;/th&gt; 
   &lt;th style=&quot;background-color:rgb(235,236,237);border-bottom:1px solid rgb(196,199,206);border-left:1px solid rgb(196,199,206);border-right:1px solid rgb(196,199,206);border-top:1px solid rgb(196,199,206);height:24px;padding:0px;&quot;&gt; 说明&lt;/th&gt; 
  &lt;/tr&gt;
  &lt;tr&gt;
   &lt;th style=&quot;border-bottom:1px solid rgb(196,199,206);border-left:1px solid rgb(196,199,206);border-right:1px solid rgb(196,199,206);border-top:1px solid rgb(196,199,206);height:24px;padding:0px;&quot;&gt; TCP超时断开&lt;/th&gt; 
   &lt;th style=&quot;border-bottom:1px solid rgb(196,199,206);border-left:1px solid rgb(196,199,206);border-right:1px solid rgb(196,199,206);border-top:1px solid rgb(196,199,206);height:24px;padding:0px;&quot;&gt; 300秒&lt;/th&gt; 
   &lt;th style=&quot;border-bottom:1px solid rgb(196,199,206);border-left:1px solid rgb(196,199,206);border-right:1px solid rgb(196,199,206);border-top:1px solid rgb(196,199,206);height:24px;padding:0px;&quot;&gt; 600秒&lt;/th&gt; 
   &lt;th style=&quot;border-bottom:1px solid rgb(196,199,206);border-left:1px solid rgb(196,199,206);border-right:1px solid rgb(196,199,206);border-top:1px solid rgb(196,199,206);height:24px;padding:0px;&quot;&gt; 空闲多久后设备主动断开&lt;/th&gt; 
  &lt;/tr&gt;
  &lt;tr&gt;
   &lt;th style=&quot;border-bottom:1px solid rgb(196,199,206);border-left:1px solid rgb(196,199,206);border-right:1px solid rgb(196,199,206);border-top:1px solid rgb(196,199,206);height:24px;padding:0px;&quot;&gt; 最大连接数&lt;/th&gt; 
   &lt;th style=&quot;border-bottom:1px solid rgb(196,199,206);border-left:1px solid rgb(196,199,206);border-right:1px solid rgb(196,199,206);border-top:1px solid rgb(196,199,206);height:24px;padding:0px;&quot;&gt; 4&lt;/th&gt; 
   &lt;th style=&quot;border-bottom:1px solid rgb(196,199,206);border-left:1px solid rgb(196,199,206);border-right:1px solid rgb(196,199,206);border-top:1px solid rgb(196,199,206);height:24px;padding:0px;&quot;&gt; 8&lt;/th&gt; 
   &lt;th style=&quot;border-bottom:1px solid rgb(196,199,206);border-left:1px solid rgb(196,199,206);border-right:1px solid rgb(196,199,206);border-top:1px solid rgb(196,199,206);height:24px;padding:0px;&quot;&gt; 允许并发连接数&lt;/th&gt; 
  &lt;/tr&gt;
  &lt;tr&gt;
   &lt;th style=&quot;border-bottom:1px solid rgb(196,199,206);border-left:1px solid rgb(196,199,206);border-right:1px solid rgb(196,199,206);border-top:1px solid rgb(196,199,206);height:24px;padding:0px;&quot;&gt; 心跳间隔&lt;/th&gt; 
   &lt;th style=&quot;border-bottom:1px solid rgb(196,199,206);border-left:1px solid rgb(196,199,206);border-right:1px solid rgb(196,199,206);border-top:1px solid rgb(196,199,206);height:24px;padding:0px;&quot;&gt; 无&lt;/th&gt; 
   &lt;th style=&quot;border-bottom:1px solid rgb(196,199,206);border-left:1px solid rgb(196,199,206);border-right:1px solid rgb(196,199,206);border-top:1px solid rgb(196,199,206);height:24px;padding:0px;&quot;&gt; 30秒&lt;/th&gt; 
   &lt;th style=&quot;border-bottom:1px solid rgb(196,199,206);border-left:1px solid rgb(196,199,206);border-right:1px solid rgb(196,199,206);border-top:1px solid rgb(196,199,206);height:24px;padding:0px;&quot;&gt; 部分高端记录仪支持&lt;/th&gt; 
  &lt;/tr&gt;
  &lt;tr&gt;
   &lt;th style=&quot;border-bottom:1px solid rgb(196,199,206);border-left:1px solid rgb(196,199,206);border-right:1px solid rgb(196,199,206);border-top:1px solid rgb(196,199,206);height:24px;padding:0px;&quot;&gt; 重连等待&lt;/th&gt; 
   &lt;th style=&quot;border-bottom:1px solid rgb(196,199,206);border-left:1px solid rgb(196,199,206);border-right:1px solid rgb(196,199,206);border-top:1px solid rgb(196,199,206);height:24px;padding:0px;&quot;&gt; 10秒&lt;/th&gt; 
   &lt;th style=&quot;border-bottom:1px solid rgb(196,199,206);border-left:1px solid rgb(196,199,206);border-right:1px solid rgb(196,199,206);border-top:1px solid rgb(196,199,206);height:24px;padding:0px;&quot;&gt; 5秒&lt;/th&gt; 
   &lt;th style=&quot;border-bottom:1px solid rgb(196,199,206);border-left:1px solid rgb(196,199,206);border-right:1px solid rgb(196,199,206);border-top:1px solid rgb(196,199,206);height:24px;padding:0px;&quot;&gt; 断开后多久允许重连&lt;/th&gt; 
  &lt;/tr&gt;
  &lt;tr&gt;
   &lt;th style=&quot;border-bottom:1px solid rgb(196,199,206);border-left:1px solid rgb(196,199,206);border-right:1px solid rgb(196,199,206);border-top:1px solid rgb(196,199,206);height:24px;padding:0px;&quot;&gt; TCP KeepAlive&lt;/th&gt; 
   &lt;th style=&quot;border-bottom:1px solid rgb(196,199,206);border-left:1px solid rgb(196,199,206);border-right:1px solid rgb(196,199,206);border-top:1px solid rgb(196,199,206);height:24px;padding:0px;&quot;&gt; 关闭&lt;/th&gt; 
   &lt;th style=&quot;border-bottom:1px solid rgb(196,199,206);border-left:1px solid rgb(196,199,206);border-right:1px solid rgb(196,199,206);border-top:1px solid rgb(196,199,206);height:24px;padding:0px;&quot;&gt; 开启&lt;/th&gt; 
   &lt;th style=&quot;border-bottom:1px solid rgb(196,199,206);border-left:1px solid rgb(196,199,206);border-right:1px solid rgb(196,199,206);border-top:1px solid rgb(196,199,206);height:24px;padding:0px;&quot;&gt; 启用协议层保活&lt;/th&gt; 
  &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt; &lt;/p&gt;&lt;p&gt; &lt;/p&gt; 
&lt;p&gt; &lt;strong&gt;5.2 固件层面的常见bug&lt;/strong&gt;&lt;/p&gt; 
&lt;p&gt; 已知问题清单： 1. FIN_WAIT超时过短：设备发送FIN后等待ACK仅2秒，超时即RST → 规避：平台端收到FIN后立即close() 2. 半关闭不处理：平台发送FIN后设备仍尝试推送数据 → 规避：平台不主动关闭写端，用全关闭 3. 连接数耗尽不释放：异常断开的连接不进入TIME_WAIT → 规避：平台端确保每次异常都调用close() 4. 大端/小端混淆：某些国产记录仪寄存器字节序反了 → 规避：软件层做字节序转换 复制&lt;/p&gt; 
&lt;p&gt; &lt;/p&gt;&lt;p&gt; &lt;/p&gt; 
&lt;p&gt; &lt;/p&gt;&lt;p&gt; &lt;/p&gt; 
&lt;p&gt; &lt;strong&gt;六、系统化监控与告警&lt;/strong&gt;&lt;/p&gt; 
&lt;p&gt; &lt;strong&gt;6.1 连接状态监控指标&lt;/strong&gt;&lt;/p&gt; 
&lt;p&gt; # conn_monitor.py - 连接健康监控 import time from collections import deque class ConnectionMonitor: def __init__(self, window_size=100): self.window_size = window_size self.latencies = deque(maxlen=window_size) self.errors = deque(maxlen=window_size) self.reconnects = 0 self.last_reconnect_time = 0 def record_success(self, latency_ms): self.latencies.append(latency_ms) self.errors.append(0) def record_error(self, error_type): self.errors.append(1) if error_type == 'reconnect': self.reconnects += 1 self.last_reconnect_time = time.time() def health_score(self): &quot;&quot;&quot;计算连接健康分（0~100）&quot;&quot;&quot; if not self.errors: return 100 error_rate = sum(self.errors) / len(self.errors) if error_rate &amp;gt; 0.5: return 0 score = int((1 - error_rate) * 100) # 重连频率惩罚 if self.reconnects &amp;gt; 10: score = max(0, score - 30) return score def should_alert(self): &quot;&quot;&quot;判断是否需要告警&quot;&quot;&quot; if self.reconnects &amp;gt;= 5: return True if self.health_score() &amp;lt; 50: return True return False 复制&lt;/p&gt; 
&lt;p&gt; &lt;strong&gt;6.2 监控面板关键指标&lt;/strong&gt;&lt;/p&gt; 
&lt;p&gt; &lt;/p&gt;&lt;p&gt; &lt;/p&gt; 
&lt;table style=&quot;background-color:rgb(255,255,255);&quot;&gt;
 &lt;tbody&gt;
  &lt;tr&gt;
   &lt;th style=&quot;background-color:rgb(235,236,237);border-bottom:1px solid rgb(196,199,206);border-left:1px solid rgb(196,199,206);border-right:1px solid rgb(196,199,206);border-top:1px solid rgb(196,199,206);height:24px;padding:0px;&quot;&gt; 指标&lt;/th&gt; 
   &lt;th style=&quot;background-color:rgb(235,236,237);border-bottom:1px solid rgb(196,199,206);border-left:1px solid rgb(196,199,206);border-right:1px solid rgb(196,199,206);border-top:1px solid rgb(196,199,206);height:24px;padding:0px;&quot;&gt; 正常范围&lt;/th&gt; 
   &lt;th style=&quot;background-color:rgb(235,236,237);border-bottom:1px solid rgb(196,199,206);border-left:1px solid rgb(196,199,206);border-right:1px solid rgb(196,199,206);border-top:1px solid rgb(196,199,206);height:24px;padding:0px;&quot;&gt; 告警阈值&lt;/th&gt; 
  &lt;/tr&gt;
  &lt;tr&gt;
   &lt;th style=&quot;border-bottom:1px solid rgb(196,199,206);border-left:1px solid rgb(196,199,206);border-right:1px solid rgb(196,199,206);border-top:1px solid rgb(196,199,206);height:24px;padding:0px;&quot;&gt; 连接存活时间&lt;/th&gt; 
   &lt;th style=&quot;border-bottom:1px solid rgb(196,199,206);border-left:1px solid rgb(196,199,206);border-right:1px solid rgb(196,199,206);border-top:1px solid rgb(196,199,206);height:24px;padding:0px;&quot;&gt; &amp;gt;24小时&lt;/th&gt; 
   &lt;th style=&quot;border-bottom:1px solid rgb(196,199,206);border-left:1px solid rgb(196,199,206);border-right:1px solid rgb(196,199,206);border-top:1px solid rgb(196,199,206);height:24px;padding:0px;&quot;&gt; &amp;lt;1小时&lt;/th&gt; 
  &lt;/tr&gt;
  &lt;tr&gt;
   &lt;th style=&quot;border-bottom:1px solid rgb(196,199,206);border-left:1px solid rgb(196,199,206);border-right:1px solid rgb(196,199,206);border-top:1px solid rgb(196,199,206);height:24px;padding:0px;&quot;&gt; 重连次数/小时&lt;/th&gt; 
   &lt;th style=&quot;border-bottom:1px solid rgb(196,199,206);border-left:1px solid rgb(196,199,206);border-right:1px solid rgb(196,199,206);border-top:1px solid rgb(196,199,206);height:24px;padding:0px;&quot;&gt; 0~1&lt;/th&gt; 
   &lt;th style=&quot;border-bottom:1px solid rgb(196,199,206);border-left:1px solid rgb(196,199,206);border-right:1px solid rgb(196,199,206);border-top:1px solid rgb(196,199,206);height:24px;padding:0px;&quot;&gt; &amp;gt;5&lt;/th&gt; 
  &lt;/tr&gt;
  &lt;tr&gt;
   &lt;th style=&quot;border-bottom:1px solid rgb(196,199,206);border-left:1px solid rgb(196,199,206);border-right:1px solid rgb(196,199,206);border-top:1px solid rgb(196,199,206);height:24px;padding:0px;&quot;&gt; 平均响应延迟&lt;/th&gt; 
   &lt;th style=&quot;border-bottom:1px solid rgb(196,199,206);border-left:1px solid rgb(196,199,206);border-right:1px solid rgb(196,199,206);border-top:1px solid rgb(196,199,206);height:24px;padding:0px;&quot;&gt; &amp;lt;50ms&lt;/th&gt; 
   &lt;th style=&quot;border-bottom:1px solid rgb(196,199,206);border-left:1px solid rgb(196,199,206);border-right:1px solid rgb(196,199,206);border-top:1px solid rgb(196,199,206);height:24px;padding:0px;&quot;&gt; &amp;gt;200ms&lt;/th&gt; 
  &lt;/tr&gt;
  &lt;tr&gt;
   &lt;th style=&quot;border-bottom:1px solid rgb(196,199,206);border-left:1px solid rgb(196,199,206);border-right:1px solid rgb(196,199,206);border-top:1px solid rgb(196,199,206);height:24px;padding:0px;&quot;&gt; 错误率&lt;/th&gt; 
   &lt;th style=&quot;border-bottom:1px solid rgb(196,199,206);border-left:1px solid rgb(196,199,206);border-right:1px solid rgb(196,199,206);border-top:1px solid rgb(196,199,206);height:24px;padding:0px;&quot;&gt; &amp;lt;1%&lt;/th&gt; 
   &lt;th style=&quot;border-bottom:1px solid rgb(196,199,206);border-left:1px solid rgb(196,199,206);border-right:1px solid rgb(196,199,206);border-top:1px solid rgb(196,199,206);height:24px;padding:0px;&quot;&gt; &amp;gt;5%&lt;/th&gt; 
  &lt;/tr&gt;
  &lt;tr&gt;
   &lt;th style=&quot;border-bottom:1px solid rgb(196,199,206);border-left:1px solid rgb(196,199,206);border-right:1px solid rgb(196,199,206);border-top:1px solid rgb(196,199,206);height:24px;padding:0px;&quot;&gt; 心跳成功率&lt;/th&gt; 
   &lt;th style=&quot;border-bottom:1px solid rgb(196,199,206);border-left:1px solid rgb(196,199,206);border-right:1px solid rgb(196,199,206);border-top:1px solid rgb(196,199,206);height:24px;padding:0px;&quot;&gt; 100%&lt;/th&gt; 
   &lt;th style=&quot;border-bottom:1px solid rgb(196,199,206);border-left:1px solid rgb(196,199,206);border-right:1px solid rgb(196,199,206);border-top:1px solid rgb(196,199,206);height:24px;padding:0px;&quot;&gt; &amp;lt;95%&lt;/th&gt; 
  &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt; &lt;/p&gt;&lt;p&gt; &lt;/p&gt; 
&lt;p&gt; &lt;/p&gt;&lt;p&gt; &lt;/p&gt; 
&lt;p&gt; &lt;/p&gt;&lt;p&gt; &lt;/p&gt; 
&lt;p&gt; &lt;strong&gt;七、典型坑&lt;/strong&gt;&lt;/p&gt; 
&lt;p&gt; &lt;strong&gt;未设置SO_KEEPALIVE&lt;/strong&gt;：连接空闲超过防火墙超时即被悄悄丢弃，应用层无感知。解决：开启TCP KeepAlive或应用层心跳。&lt;/p&gt; 
&lt;p&gt; &lt;strong&gt;心跳间隔大于防火墙超时&lt;/strong&gt;：心跳每60秒发一次，但防火墙30分钟就丢会话。解决：心跳间隔 &amp;lt; 防火墙超时的一半。&lt;/p&gt; 
&lt;p&gt; &lt;strong&gt;异常后未close()直接重连&lt;/strong&gt;：旧socket未关闭，文件描述符泄漏。解决：异常捕获中确保close()。&lt;/p&gt; 
&lt;p&gt; &lt;strong&gt;多线程共享同一socket无锁&lt;/strong&gt;：并发写入导致报文交错。解决：加锁或使用连接池。&lt;/p&gt; 
&lt;p&gt; &lt;strong&gt;传感器端连接数耗尽&lt;/strong&gt;：平台重连频繁但传感器旧连接未释放。解决：重连前等待传感器超时，或联系厂商增大连接数。&lt;/p&gt; 
&lt;p&gt; &lt;strong&gt;recv()无超时导致永久阻塞&lt;/strong&gt;：socket默认阻塞模式，对端静默断线后recv永远等。解决：设置socket超时。&lt;/p&gt; 
&lt;p&gt; &lt;strong&gt;TCP_NODELAY未开启&lt;/strong&gt;：小包被Nagle&lt;u&gt;算法&lt;/u&gt;合并，延迟增加。解决：sock.setsockopt(socket.IPPROTO_TCP, socket.TCP_NODELAY, 1)。&lt;/p&gt; 
&lt;p&gt; &lt;strong&gt;忽略TIME_WAIT堆积&lt;/strong&gt;：频繁短连接导致&lt;u&gt;端口&lt;/u&gt;耗尽。解决：启用SO_REUSEADDR或改用长连接。&lt;/p&gt; 
&lt;p&gt; &lt;strong&gt;未处理SIGPIPE&lt;u&gt;信号&lt;/u&gt;&lt;/strong&gt;：向已关闭连接写入触发SIGPIPE导致进程退出。解决：Python中已自动处理，但C/&lt;u&gt;C++&lt;/u&gt;需signal(SIGPIPE, SIG_IGN)。&lt;/p&gt; 
&lt;p&gt; &lt;strong&gt;跨网段TCP断线难排查&lt;/strong&gt;：中间经过多个交换机/路由器，不知道哪一层丢会话。解决：逐跳抓包定位，或改用UDP模式规避。&lt;/p&gt; 
&lt;p&gt; &lt;/p&gt;&lt;p&gt; &lt;/p&gt; 
&lt;p&gt; &lt;/p&gt;&lt;p&gt; &lt;/p&gt; 
&lt;p&gt; &lt;strong&gt;八、小结&lt;/strong&gt;&lt;/p&gt; 
&lt;p&gt; 网口温湿度记录仪的TCP长连接断线，根因可以归纳为三类：&lt;strong&gt;中间设备空闲超时、传感器端资源限制、应用层未正确处理连接生命周期&lt;/strong&gt;。解决方案的核心思路是&quot;&lt;strong&gt;保活+检测+恢复&lt;/strong&gt;&quot;三位一体：协议层开启TCP KeepAlive、应用层实现心跳保活、异常时自动重连并带指数退避。对于低端设备，短连接模式是更稳妥的替代方案。大规模部署时引入连接池平衡资源消耗和响应延迟。最终目标不是&quot;不断线&quot;，而是&quot;断线后秒级自愈，用户无感知&quot;。&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt; 审核编辑 黄宇&lt;/p&gt;</description><pubDate>Tue, 13 Oct 2026 06:20:47 +0800</pubDate></item><item><title>湖北省第十七届运动会在孝感开幕</title><link>https://www.dihkvq.cn/yueyuan/2730.html</link><description>&lt;p&gt;　　中新网孝感10月11日电(李林)湖北省第十七届运动会10日晚在孝感奥体中心体育场开幕，来自全省17个市州的运动员代表以及万余名观众汇聚一堂，共赴这场体育与文化盛宴。&lt;/p&gt;  
&lt;img style=&quot;display: block; margin: auto; cursor: pointer;&quot; src=&quot;https://i2.chinanews.com.cn/simg/ypt/2026/261011/ba55e4f7-aa23-4b9a-94b2-3161a3bf8db3_zsite.JPG&quot; class=&quot;aligncenter&quot;&gt;   10月10日晚，湖北省第十七届运动会在孝感开幕。吴垠 摄  
&lt;p&gt;　　开幕式现场，湖北省运动会会旗、湖北省第十七届运动会会旗相继入场，裁判员代表方阵以及武汉市等25个代表团先后亮相。显示屏上，全省17个市州的地域名称与特色风物剪影依次铺展。&lt;/p&gt;   湖北省第十七届运动会开幕式现场。吕湘 摄  
&lt;p&gt;　　开幕式上举行了“知音湖北 逐梦孝感”文体展演，演出以荆楚文化、孝文化为主线，运用数字科技和声光电手段，展现了湖北厚重的历史文化底蕴。演出结束后，5名火炬手完成了接力传递，由孝爱之火、法源之火、革命之火汇聚而成的圣火，在主火炬熊熊燃起，绚烂焰火腾空而起。&lt;/p&gt;   湖北省第十七届运动会开幕式现场。冯捷 摄</description><pubDate>Mon, 12 Oct 2026 08:24:01 +0800</pubDate></item><item><title>回望“宜昌大撤退”壮举 专家学者解读卢作孚爱国企业家精神的当下意义</title><link>https://www.dihkvq.cn/yueyuan/2729.html</link><description>&lt;p&gt;　　中新网重庆10月11日电 题：回望“宜昌大撤退”壮举 专家学者解读卢作孚爱国企业家精神的当下意义&lt;/p&gt; 
&lt;p&gt;　　中新网记者 钟旖&lt;/p&gt; 
&lt;p&gt;　　四十天、一条江、一个民族的工业命脉……1938年，中国近代著名爱国实业家、民生公司创始人卢作孚指挥坐镇，在宜昌码头上演了一场生死竞速，史称“宜昌大撤退”；88年后的今天，这段惊世壮举被搬上舞台，并首次回到卢作孚的故乡重庆，再现烽火年代实业报国的家国史诗。&lt;/p&gt; 
&lt;p&gt;　　10月11日至12日，由中国东方演艺集团联合北京紫韵星文化科技有限公司、中国外文局文化传播中心、重庆市合川区人民政府、重庆市北碚区人民政府联合出品的原创音乐剧《四十天》将在重庆大剧院拉开大幕，历史以另一种方式与今天的观众见面。&lt;/p&gt;  
&lt;img style=&quot;display: block; margin: auto; cursor: pointer;&quot; src=&quot;https://i2.chinanews.com.cn/simg/ypt/2026/261011/eb3afcd5-3097-4543-bc68-976dbf2e8451_zsite.jpg&quot; class=&quot;aligncenter&quot;&gt;   图为音乐剧《四十天》剧照。　中国东方演艺集团 供图  
&lt;p&gt;　　那是1938年的秋天，武汉沦陷。进川门户宜昌拥塞着3万以上人员和9万吨以上军、工物资急需抢运至大后方重庆。川江险急，背后是日军步步紧逼，眼前是长江仅有不到40天就进入枯水期的倒计时。&lt;/p&gt; 
&lt;p&gt;　　按民生公司的日常运力，完成转移至少需要一年时间。危难关头，卢作孚亲赴宜昌，决策制定最佳运输方案。24艘轮船(其中22艘属于民生公司)冒着敌机轰炸投入抢运，白天航行，夜间装卸，分秒不停。仅用40天时间，将拥塞在宜昌的3万多人员全部运走，9万多吨设备、器材运走了三分之二。这次撤退也被誉为“中国实业上的敦刻尔克”。&lt;/p&gt; 
&lt;p&gt;　　舞台之上是历史的重现，舞台之下是精神的追问。&lt;/p&gt; 
&lt;p&gt;　　中新网记者11日了解到，近期，在卢作孚的故里——重庆市合川区、北碚区，“作孚爱国精神与新时代青年担当”青年主题对话沙龙、“诚以践路，行见本心——回望卢作孚的毕生实践”文化沙龙等活动陆续上演，人们回顾卢作孚波澜壮阔的一生，体悟他赤忱报国、尽瘁桑梓的情怀，接续传承其留下的精神财富。&lt;/p&gt; 
&lt;p&gt;　　我们为何仍要反复讲述卢作孚？他的企业家精神，对当下究竟意味着什么？多位专家学者展开解读。&lt;/p&gt; 
&lt;p&gt;　　“卢作孚留给当今中国企业家最宝贵的精神遗产，是爱国主义精神。”中国历史文献学家、西南大学卢作孚研究中心教授刘重来指出，“爱国”是卢作孚一生的主旋律，是卢作孚精神和民生精神的最强音，“宜昌大撤退”是其中最精彩的篇章。“作为一位爱国者，他时时刻刻把国家的兴衰、民族的命运、人民的疾苦放在心上；作为一位爱国企业家，他一生都在探索救国和开拓创新之路。”&lt;/p&gt; 
&lt;p&gt;　　谈及卢作孚爱国企业家精神的内核，一个引起业界高度共鸣的概括是——“九死未悔”的爱国情怀、“我将无我”的为民情怀、“佑启乡邦”的济世情怀。重庆市合川区工商联副主席、重庆市合川区卢作孚研究会指导专家彭开冬认为，卢作孚一生展现出胸怀家国的事业担当，逆势求生的发展智慧，攻坚克难的斗争韧性，创新求实的治企方略，多业融通的产业思维，开放共建的宏大格局……这些企业家精神特质，在当下仍有现实意义。“沉浸式感悟作孚精神、深入化学习作孚智慧，将为个人的人生成长、学习进步、事业发展增添无穷无尽的动能。”&lt;/p&gt; 
&lt;p&gt;　　“‘宜昌大撤退’的胜利，是以爱国精神为核心、以科学方法论为指导、以众志成城为保障的结果，为我们提供了宝贵的精神财富。”重庆市合川区委党校专职副书记、合川区卢作孚研究会副会长罗驰称，卢作孚先生一生办教育、创民生、建北碚、保工业，多项事业功绩卓著，却一生清贫。在民族危亡的紧要关头，他手握航运资源、身负重任，本可以选择明哲保身，甚至坐拥巨额财富，但他毅然挺身而出，为国担当、鞠躬尽瘁。归根到底，在于他从小立下救国救民的远大志向。“正是这份纯粹的爱国志向，支撑他百折不挠、砥砺前行，扛起救国兴邦的时代重任；不慕荣华、不图私利，坚守无私奉献的家国情怀。”罗驰说。&lt;/p&gt; 
&lt;p&gt;　　在专家学者看来，把“宜昌大撤退”搬上舞台，是打通历史与当下的一条路径。&lt;/p&gt; 
&lt;p&gt;　　“文艺作品最大的价值，就是把书本里抽象的‘爱国、实干、奉献’，转化成可看、可感、可共情的故事。”重庆市合川区文化和旅游发展委员会党委委员、区申遗事务中心主任付兆南说，过去大家了解卢作孚，更多是读历史资料；现在通过音乐剧、纪录片，更多人愿意主动走近这段历史，就实现了精神的有效传播。&lt;/p&gt; 
&lt;p&gt;　　付兆南介绍，合川区已形成话剧《民族脊梁》、大型纪录片《卢作孚》、卢作孚主题连环画、美术作品展等多元创作矩阵，下一步还将把文艺作品嵌入纪念馆、研学线路中，让爱国实业家精神成为城市鲜明的文化标识，真正让先贤精神活在当下、浸润城市血脉。&lt;/p&gt; 
&lt;p&gt;　　大幕将启。长江浪涛、船工呐喊、炮火轰鸣即将化作舞台交响，将烽火岁月中实业家、船工、普通民众共赴国难的群像呈现在观众面前。人们走进剧场，看的不仅是一场戏，更是一个从三江之畔走出的中国人，和他那颗始终向着国家的赤子之心。(完)&lt;/p&gt; 
&lt;table border=&quot;0&quot; cellspacing=&quot;0&quot; cellpadding=&quot;0&quot;&gt; 
 &lt;tbody&gt; 
  &lt;tr&gt; 
   &lt;td&gt;    &lt;/td&gt; 
  &lt;/tr&gt; 
 &lt;/tbody&gt; 
&lt;/table&gt;    
&lt;span&gt;【编辑:胡寒笑】 &lt;/span&gt;</description><pubDate>Mon, 12 Oct 2026 07:04:36 +0800</pubDate></item><item><title>中共中央、国务院印发《关于发展新质生产力的意见》</title><link>https://www.dihkvq.cn/yueyuan/2728.html</link><description>&lt;img style=&quot;border:0px solid #000000&quot; src=&quot;https://i2.chinanews.com.cn/simg/cmshd/2026/10/09/7311750d27ea460a9c532479d90d66f7.jpg&quot; class=&quot;aligncenter&quot;&gt;  
&lt;p&gt;　　发展新质生产力是推动高质量发展的内在要求和重要着力点。为加快发展新质生产力，中共中央、国务院印发《关于发展新质生产力的意见》。&lt;/p&gt; 
&lt;p&gt;　　意见部署19项重点举措，涉及大力推进科技创新、推动科技创新和产业创新深度融合、着力推进发展方式创新、扎实推进体制机制创新、深化人才工作机制创新5个方面。&lt;/p&gt; 
&lt;p&gt;　　意见明确，坚持创新主导、改革为要、因地制宜、先立后破，坚持高技术、高效能、高质量，统筹处理好政府和市场、质态和业态、改革和发展、自主和开放的关系，统筹发展和安全，以科技创新为引领，以全要素生产率大幅提升为核心标志，推动技术革命性突破、生产要素创新性配置、产业深度转型升级，推动劳动者、劳动资料、劳动对象优化组合和更新跃升，全方位推进科技创新、产业创新、发展方式创新、体制机制创新、人才工作机制创新，加快形成同新质生产力更相适应的生产关系，营造有利于科技创新和产业创新深度融合的良好发展生态，更好支撑高质量发展。&lt;/p&gt; 
&lt;p&gt;　　记者：魏玉坤&lt;/p&gt; 
&lt;p&gt;　　海报制作：吴彬尔&lt;/p&gt; 
&lt;p&gt;　　新华社国内部出品&lt;/p&gt; 
&lt;table border=&quot;0&quot; cellspacing=&quot;0&quot; cellpadding=&quot;0&quot;&gt; 
 &lt;tbody&gt; 
  &lt;tr&gt; 
   &lt;td&gt;    &lt;/td&gt; 
  &lt;/tr&gt; 
 &lt;/tbody&gt; 
&lt;/table&gt;    
&lt;span&gt;【编辑:胡寒笑】 &lt;/span&gt;</description><pubDate>Sun, 11 Oct 2026 07:04:12 +0800</pubDate></item><item><title>频谱分析仪测量幅度不准、底噪抬升的常见原因与校准前自检清单</title><link>https://www.dihkvq.cn/yueyuan/2727.html</link><description>&lt;p&gt; 频谱分析仪测量幅度不准或底噪异常抬升，是射频&lt;u&gt;工程师&lt;/u&gt;在日常测试中最常遇到的问题之一。这类故障往往不是突然发生的，而是逐渐劣化的结果。在将仪器送修或送校准之前，一份系统的自检清单可以帮助你快速定位问题，避免不必要的&lt;u&gt;维修&lt;/u&gt;支出。&lt;/p&gt; 
&lt;p&gt; &lt;img src=&quot;https://file1.elecfans.com/web3/M00/7D/BF/wKgZPGrItTOAOSSJAAHuMK0MLmU077.png&quot; alt=&quot;wKgZPGrItTOAOSSJAAHuMK0MLmU077.png&quot; class=&quot;aligncenter&quot;&gt;&lt;/p&gt; 
&lt;p&gt; 幅度不准的常见原因&lt;/p&gt; 
&lt;p&gt; 幅度测量偏差通常表现为：已知&lt;u&gt;信号&lt;/u&gt;源输出-10dBm，仪器却显示-13dBm或-7dBm。偏差超过±1dB时，就需要引起重视。&lt;/p&gt; 
&lt;p&gt; 第一类原因是衰减器损坏。频谱分析仪的输入衰减器是关键前端器件，长期承受大功率信号或静电冲击后，衰减量会发生变化。如果仪器在小信号时准确、大信号时偏差明显，衰减器嫌疑最大。部分型号的衰减器可以单独更换，成本远低于整块前端组件。&lt;/p&gt; 
&lt;p&gt; 第二类原因是混频器老化。混频器是频谱分析仪的核心器件，负责将高频信号搬移至中频。混频器老化会导致转换损耗增加，表现为全频段幅度偏低。混频器损坏通常与输入过载有关，比如误输入超过最大安全功率的信号。&lt;/p&gt; 
&lt;p&gt; 第三类原因是参考电平校准偏移。参考电平是幅度测量的基准，如果校准数据丢失或偏移，所有幅度读数都会系统性偏差。这种情况通常可以通过重新校准解决，不需要更换硬件。&lt;/p&gt; 
&lt;p&gt; 第四类原因是中频增益异常。中频放大电路增益变化会导致幅度读数漂移。与混频器老化不同，中频增益异常往往表现为特定分辨率带宽下的偏差，而非全频段偏差。&lt;/p&gt; 
&lt;p&gt; 底噪抬升的常见原因&lt;/p&gt; 
&lt;p&gt; 底噪抬升是指仪器在无输入信号时显示的本底噪声明显高于正常水平。正常频谱分析仪的底噪通常接近理论热噪声，底噪抬升意味着仪器内部产生了额外的噪声或干扰。&lt;/p&gt; 
&lt;p&gt; 前置&lt;u&gt;放大器&lt;/u&gt;故障是常见原因之一。如果仪器配有内部前置放大器，放大器自激或增益异常会直接抬高底噪。判断方法是关闭前置放大器后观察底噪是否恢复正常。&lt;/p&gt; 
&lt;p&gt; &lt;u&gt;电源&lt;/u&gt;纹波增大也会导致底噪抬升。&lt;u&gt;电源模块&lt;/u&gt;老化后输出纹波增加，噪声通过供电网络&lt;u&gt;耦合&lt;/u&gt;到&lt;u&gt;射频&lt;/u&gt;通道。这类故障往往伴随其他异常，如相位噪声恶化、杂散增多。&lt;/p&gt; 
&lt;p&gt; 本振泄漏或屏蔽失效同样会引起底噪异常。仪器内部屏蔽罩松动、&lt;u&gt;连接器&lt;/u&gt;接触不良，会导致本振信号泄漏到中频通道，表现为特定频点的底噪抬升或杂散。&lt;/p&gt; 
&lt;p&gt; 校准前自检清单&lt;/p&gt; 
&lt;p&gt; 在送校准或送修之前，建议按以下清单逐项自检：&lt;/p&gt; 
&lt;p&gt; 检查输入连接器： 确认N型或SMA连接器无松动、无氧化、无&lt;u&gt;机械&lt;/u&gt;损伤。连接器接触不良会直接导致幅度偏差。&lt;/p&gt; 
&lt;p&gt; 确认校准信号源正常： 使用已知准确的信号源输出标准信号，排除信号源本身的问题。&lt;/p&gt; 
&lt;p&gt; 检查衰减器设置： 确认衰减器设置与信号电平匹配，避免因设置错误导致读数异常。&lt;/p&gt; 
&lt;p&gt; 观察底噪形态： 在不同分辨率带宽和参考电平下观察底噪，判断是宽带噪声还是窄带杂散。&lt;/p&gt; 
&lt;p&gt; 检查参考&lt;u&gt;时钟&lt;/u&gt;： 内部参考时钟失锁会导致频率和幅度同时异常。观察仪器是否有参考时钟报警。&lt;/p&gt; 
&lt;p&gt; 执行自校准： 多数信号分析仪内置自校准功能，运行自校准后观察幅度和底噪是否恢复正常。&lt;/p&gt; 
&lt;p&gt; 对比已知良好设备： 如有条件，用同型号正常仪器对比测量同一信号，快速判断是仪器问题还是测试环境问题。&lt;/p&gt; 
&lt;p&gt; 何时需要专业维修&lt;/p&gt; 
&lt;p&gt; 如果自检后确认仪器存在硬件故障，比如衰减器损坏、混频器老化或电源纹波异常，就需要专业维修介入。&lt;/p&gt; 
&lt;p&gt; 我们提供频谱分析仪的免费故障检测服务。工程师会使用专业测试设备对仪器进行全面检测，包括幅度精度、底噪、相位噪声、杂散等关键指标，出具详细检测报告。检测免费，维修后提供3个月质保。&lt;/p&gt; 
&lt;p&gt; 需要强调的是，频谱分析仪的维修和校准是两回事。维修解决硬件故障，校准恢复测量精度。安泰维修建议在维修完成后，根据仪器使用频率和精度要求，决定是否需要送计量机构校准。我们提供免费技术咨询，帮助判断维修后是否需要校准https://www.agi&lt;u&gt;te&lt;/u&gt;kservice.com/#ele20261009。&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt; 审核编辑 黄宇&lt;/p&gt;</description><pubDate>Sat, 10 Oct 2026 06:21:55 +0800</pubDate></item><item><title>OPPO Find X10系列新品首发搭载天马第二代天工屏</title><link>https://www.dihkvq.cn/yueyuan/2726.html</link><description>&lt;p style=&quot;text-indent:2em;&quot;&gt; 2026年9月22日，OPPO Find X10系列新品正式发布，Find X10 Pro Max、Find X10 Pro首发搭载天马第二代天工屏。作为天马高端&lt;u&gt;OLED&lt;/u&gt;技术品牌的重磅迭代产品，第二代天工屏依托底层发光材料革新，实现护眼能力、通透画质、器件可靠性全方位升级，以一系列前沿显示技术，全面升级用户视觉体验。&lt;/p&gt; 
&lt;p style=&quot;text-indent:2em;&quot;&gt; 01硬核实力拉满&lt;/p&gt; 
&lt;p style=&quot;text-indent:2em;&quot;&gt; 第二代天工屏赋能旗舰全场景体验&lt;/p&gt; 
&lt;p style=&quot;text-indent:2em;&quot;&gt; 本次OPPO Find X10系列搭载的天马第二代天工屏，是专为旗舰&lt;u&gt;手机&lt;/u&gt;打造的新一代高端OLED显示方案，硬件规格全面升级，综合显示实力大幅跃升。OPPO Find X10采用6.59英寸1.5K分辨率超通透钻石屏，Pro Max版本则为6.78英寸2K屏，依托天马全新N1原色光谱发光材料，将有害蓝光（415-455nm）占比从6%降至3.7%，行业首创将650-670nm有益深红光占比从2.1%提升至5.5%，久看也舒适；同时硬件原生支持行业最高95% BT.2020超广色域，达到专业色准等级。新品实现&quot;护眼&quot;与&quot;画质&quot;的双重突破，成为2026年旗舰屏幕的重要标杆。&lt;/p&gt; 
&lt;p style=&quot;text-indent:2em;&quot;&gt; 边界再突破，0.99mm极窄四等边&lt;/p&gt; 
&lt;p style=&quot;text-indent:2em;&quot;&gt; 在视觉形态上，第二代天工屏同样向极窄边框持续突破。OPPO Find X10标准版通过全新芯片级封装技术，实现0.99mm极窄四等边，是Find系列首次将边框压至1mm以内。极窄与四边等宽兼顾，进一步弱化屏幕边界感，让画面更自然地向四周延伸，为影音、游戏及日常浏览带来更开阔、更沉浸的视觉体验。&lt;/p&gt; 
&lt;p style=&quot;text-indent:2em;&quot;&gt; 明暗皆舒适，打造全场景护眼体验&lt;/p&gt; 
&lt;p style=&quot;text-indent:2em;&quot;&gt; 调光方面，新机搭载3840Hz超高频PWM调光，并延续全场景1nit超低亮度显示，配合暗光&lt;u&gt;算法&lt;/u&gt;与均一性调优，夜间追剧、暗光阅读也舒适；搭配天马&lt;u&gt;TF&lt;/u&gt;T纳米背板工艺优化与&lt;u&gt;AI&lt;/u&gt; Demura智控算法，有效提升屏幕像素均一性，屏幕器件寿命同步提升30%，兼顾旗舰画质、长时间使用可靠性，覆盖强光户外、夜间暗光、室内日常等全场景使用。&lt;/p&gt; 
&lt;p style=&quot;text-indent:2em;&quot;&gt; 02底层材料革新&lt;/p&gt; 
&lt;p style=&quot;text-indent:2em;&quot;&gt; 重塑护眼、通透、耐用三重体验&lt;/p&gt; 
&lt;p style=&quot;text-indent:2em;&quot;&gt; 天马第二代天工屏跳出传统屏幕依靠算法调校的思路，从发光基材底层构建“原生护眼体系”，攻克OLED领域护眼、色彩、寿命难以兼顾的技术难题。&lt;/p&gt; 
&lt;p style=&quot;text-indent:2em;&quot;&gt; 在护眼维度，天马推出全新N1原色光谱发光材料，融合NFB新荧光蓝、PSF敏化荧光绿、DRT深红光三大技术，完成光谱架构全面革新。通过分子级光谱优化，将硬件级有害蓝光占比降至3.7%，同时提升650-670nm有益红光占比至5.5%，从光源源头提升用眼舒适度。天工屏通过了SGS、德国莱茵、中国质量&lt;u&gt;认证&lt;/u&gt;&lt;u&gt;中心&lt;/u&gt;多项权威护眼认证，护眼实力获得官方权威认可。&lt;/p&gt; 
&lt;p style=&quot;text-indent:2em;&quot;&gt; 为实现科学护眼，天马联合中国标准化研究院开展健康显示人因研究，业内首次系统研究屏幕参数与柔和观感的关联，创新性搭建包含层次、频谱、色彩、亮度、频闪、视角、均一七大维度的评估体系，打造行业专属“柔光度”量化标准，将人眼主观舒适观感转化为精准可控的工程技术指标，让护眼不止于参数，更贴合真实用眼体验。&lt;/p&gt; 
&lt;p style=&quot;text-indent:2em;&quot;&gt; 在通透画质维度，依托N1原色光谱三基色同步升级，第二代天工屏可实现原生95% BT.2020超广色域覆盖，带来更纯净通透的色彩表现，细节层次饱满立体；配合最高3600nits巅峰亮度，强光户外依旧清晰通透、观感舒适。基于天马全链路显示优化策略，从发光材料、光谱重构、器件协同、驱动调校到环境智能适配多维升级，真正实现护眼不牺牲画质，高清更兼顾舒适。&lt;/p&gt; 
&lt;p style=&quot;text-indent:2em;&quot;&gt; 03两代旗舰首发&lt;/p&gt; 
&lt;p style=&quot;text-indent:2em;&quot;&gt; 持续定义高端显示新标准&lt;/p&gt; 
&lt;p style=&quot;text-indent:2em;&quot;&gt; 天马第二代天工屏在OPPO Find X10系列新品迎来终端首发，是天马与OPPO长期联合研发战略的延续。去年天工屏首次亮相即落地OPPO Find X9系列，首发搭载1nit明眸护眼屏，并获得央视“五星好屏”认证；随着技术迭代，第二代天工屏再度在OPPO Find X10系列首发，双方持续践行深度共研模式，从材料选型、器件开发、画质调校、护眼算法到终端量产验证全链路协同，再次刷新旗舰手机屏幕体验。从Find X9的初代天工屏U9和U9 Pro护眼基材，到Find X10系列搭载的天工屏N系列原色光谱显示方案，双方持续迭代健康显示技术，联合成立绿色健康实验室，共同推进护眼显示技术研究，以持续技术迭代引领高端手机显示赛道创新。&lt;/p&gt; 
&lt;p style=&quot;text-indent:2em;&quot;&gt; 天工屏的持续迭代落地，标志着天马正全速推进从“技术型供应商”向“高端自主显示品牌”的战略升级。在高端手机OLED领域持续突破的同时，天马也在积极布局天轩车载显示、IT显示、专业显示等多技术矩阵，构建全场景高端显示版图。借助本次OPPO Find X10系列新品发布的传播窗口期，天工屏原生好光、护眼通透的核心产品优势全面面向大众市场释放。未来，天马将持续深耕底层材料、器件工艺与智能算法创新，携手多家终端伙伴持续共创突破，为全球用户带来更卓越的视觉体验。&lt;/p&gt; 
&lt;p style=&quot;text-indent:2em;&quot;&gt; &lt;img src=&quot;https://file1.elecfans.com/web3/M00/78/BA/wKgZO2qnlJyAQ5vaAAAAvrUxf-s764.png&quot; alt=&quot;4dde4100-b67f-11f1-90a1-92fbcf53809c.png&quot; class=&quot;aligncenter&quot;&gt;&lt;/p&gt;</description><pubDate>Sat, 10 Oct 2026 06:21:08 +0800</pubDate></item><item><title>交流电子负载与传统电阻负载箱的本质差异</title><link>https://www.dihkvq.cn/yueyuan/2725.html</link><description>&lt;p&gt; &lt;u&gt;逆变器&lt;/u&gt;、UPS、储能PCS等交流设备测试中，不少产线仍在用传统&lt;u&gt;电阻&lt;/u&gt;负载箱做老化。很多人误以为两者都是耗能带载设备、可以通用替换，实则&lt;strong&gt;交流电子负载与电阻负载箱存在本质区别&lt;/strong&gt;。二者在测试原理、工况&lt;u&gt;模拟&lt;/u&gt;、精度、可靠性筛查能力上差距极大，混用会导致产品测试假性合格、现场故障率高。常州鼎辰电子精简&lt;u&gt;拆解&lt;/u&gt;核心差异与适用场景。&lt;/p&gt; 
&lt;p&gt; 一、原理差异：被动耗能 vs 主动智能模拟&lt;/p&gt; 
&lt;p&gt; &lt;strong&gt;传统电阻负载箱&lt;/strong&gt;：属于被动固定式负载，依靠纯电阻发热消耗电能，无调节、无智能控制，工况完全固定，仅能实现基础通电带载。&lt;/p&gt; 
&lt;p&gt; &lt;strong&gt;可&lt;u&gt;编程&lt;/u&gt;交流电子负载&lt;/strong&gt;：属于主动可控式测试仪器，依托&lt;u&gt;电力电子&lt;/u&gt;架构与&lt;u&gt;DSP&lt;/u&gt;&lt;u&gt;算法&lt;/u&gt;，可精准调控&lt;u&gt;电流&lt;/u&gt;、相位与功率特性，按需模拟各类复杂负载工况，并非简单耗能设备。&lt;/p&gt; 
&lt;p&gt; 二、负载性质：单一阻性 vs 阻/感/容全工况&lt;/p&gt; 
&lt;p&gt; 这是最核心的实测差距，直接决定测试有效性。&lt;/p&gt; 
&lt;p&gt; &lt;strong&gt;电阻负载箱&lt;/strong&gt;：仅纯阻性带载，&lt;u&gt;功率因数&lt;/u&gt;固定为1，无无功、无相位差，只能模拟发热类设备，完全贴合不了工业、民用真实用电环境。&lt;/p&gt; 
&lt;p&gt; &lt;strong&gt;交流电子负载&lt;/strong&gt;：支持阻性、感性、容性自由切换，正负功率因数连续可调。可精准模拟电机、水泵、&lt;u&gt;开关电源&lt;/u&gt;集群等常见负载，还原真实电网无功损耗、相位偏移工况。&lt;/p&gt; 
&lt;p&gt; 简单总结：电阻箱做&lt;strong&gt;理想宽松测试&lt;/strong&gt;，电子负载做&lt;strong&gt;真实严苛测试&lt;/strong&gt;。&lt;/p&gt; 
&lt;p&gt; 三、波形工况：单一正弦波 vs 复杂极限工况&lt;/p&gt; 
&lt;p&gt; &lt;strong&gt;电阻负载箱&lt;/strong&gt;：输出波形纯净标准、无畸变、无波动，工况极度单一，无法模拟电网干扰、负载突变等恶劣场景，隐性缺陷完全筛查不出。&lt;/p&gt; 
&lt;p&gt; &lt;strong&gt;交流电子负载&lt;/strong&gt;：支持THD谐波叠加、动态阶跃冲击、三相不平衡带载、瞬态负载切换。可复现电网畸变、重载冲击、低压不稳等极限工况，有效排查稳压漂移、波形失真、抗干扰弱等隐性故障。&lt;/p&gt; 
&lt;p&gt; &lt;img src=&quot;https://file1.elecfans.com/web3/M00/73/7C/wKgZPGqL_MKAMx7ZAASuM6NRSRQ366.png&quot; alt=&quot;wKgZPGqL_MKAMx7ZAASuM6NRSRQ366.png&quot; class=&quot;aligncenter&quot;&gt;&lt;/p&gt; 
&lt;p&gt; 四、测试能力：无数据粗放老化 vs &lt;u&gt;高精度&lt;/u&gt;可溯源测试&lt;/p&gt; 
&lt;p&gt; &lt;strong&gt;电阻负载箱&lt;/strong&gt;：无高精度采样模块，无法精准读取电压、功率、效率、PF等参数，无数据记录、无可追溯性，仅适合粗放式通电老化，不满足研发与&lt;u&gt;认证&lt;/u&gt;标准。&lt;/p&gt; 
&lt;p&gt; &lt;strong&gt;交流电子负载&lt;/strong&gt;：搭载高精度采样系统，实时采集、计算、存储全维度&lt;u&gt;电气&lt;/u&gt;数据，支持自动化程控、数据导出、曲线记录。测试数据精准合规，适配研发调试、性能标定、质检归档、并网认证。&lt;/p&gt; 
&lt;p&gt; 五、能耗与运维：高耗低效 vs 节能稳定&lt;/p&gt; 
&lt;p&gt; &lt;strong&gt;电阻负载箱&lt;/strong&gt;：100%电能转化为热量浪费，长期老化电费成本高；整机高温发热，环境温升大，无智能保护，长期运行安全性、稳定性差。&lt;/p&gt; 
&lt;p&gt; &lt;strong&gt;交流电子负载&lt;/strong&gt;：整机能耗低、发热量小，回馈式机型可电能回输电网，大幅节约用电成本；自带OVP、OCP、OTP多重保护，支持7×24小时无人值守长期挂机，运维成本更低。&lt;/p&gt; 
&lt;p&gt; 六、场景精准区分&lt;/p&gt; 
&lt;p&gt; &lt;strong&gt;传统电阻负载箱适用&lt;/strong&gt;：低端产品简易通电、纯阻性基础老化、无精度、无可靠性要求的粗放测试场景。&lt;/p&gt; 
&lt;p&gt; &lt;strong&gt;交流电子负载适用&lt;/strong&gt;：逆变器、UPS、储能PCS、变频&lt;u&gt;电源&lt;/u&gt;的研发调试、可靠性验证、极限工况测试、量产精密老化、并网认证检测。&lt;/p&gt; 
&lt;p&gt; 总结&lt;/p&gt; 
&lt;p&gt; 电阻负载箱本质是&lt;strong&gt;发热耗能设备&lt;/strong&gt;，仅能完成基础通电测试，工况单一、测试宽松、漏检率高；交流电子负载本质是&lt;strong&gt;智能精密测试仪器&lt;/strong&gt;，可全覆盖真实复杂负载工况、精准量化数据、筛查隐性故障。想要提升产品可靠性、满足行业认证标准，必须采用可编程交流电子负载完成标准化测试。&lt;/p&gt; 
&lt;p&gt; 常州鼎辰电子专注于自主研发可编程直流电子负载、交流电子负载、交直流电子负载、直流电源、大功率电子负载等测试仪器 ，面向开关电源、&lt;u&gt;充电桩&lt;/u&gt;、储能电池、车载电源行业提供高精度测试仪器，以专业细致技术服务，一站式解决各类电源性能测试难题。&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt; 审核编辑 黄宇&lt;/p&gt;</description><pubDate>Sat, 10 Oct 2026 06:20:56 +0800</pubDate></item></channel></rss>