<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/">
  <channel>
    <title>软件架构 on 栈外随记</title>
    <link>https://btio.cn/tags/%E8%BD%AF%E4%BB%B6%E6%9E%B6%E6%9E%84/</link>
    <description>Recent content in 软件架构 on 栈外随记</description>
    <image>
      <title>栈外随记</title>
      <url>https://btio.cn/images/logo-arong.svg</url>
      <link>https://btio.cn/images/logo-arong.svg</link>
    </image>
    <generator>Hugo</generator>
    <language>zh-CN</language><lastBuildDate>Fri, 31 Jul 2026 18:32:50 +0800</lastBuildDate>
    <atom:link href="https://btio.cn/tags/%E8%BD%AF%E4%BB%B6%E6%9E%B6%E6%9E%84/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>一副 TWS 耳机里，有哪些软件模块</title>
      <link>https://btio.cn/posts/2026/07/31/%E4%B8%80%E5%89%AF-tws-%E8%80%B3%E6%9C%BA%E9%87%8C%E6%9C%89%E5%93%AA%E4%BA%9B%E8%BD%AF%E4%BB%B6%E6%A8%A1%E5%9D%97/</link>
      <pubDate>Fri, 31 Jul 2026 18:32:50 +0800</pubDate>
      <guid>https://btio.cn/posts/2026/07/31/%E4%B8%80%E5%89%AF-tws-%E8%80%B3%E6%9C%BA%E9%87%8C%E6%9C%89%E5%93%AA%E4%BA%9B%E8%BD%AF%E4%BB%B6%E6%A8%A1%E5%9D%97/</guid>
      <description>&lt;h2 id=&#34;section-1&#34;&gt;一、先看整体&lt;/h2&gt;
&lt;p&gt;如果暂时不考虑具体芯片平台，TWS 耳机的软件大致可以分成下面几个部分：&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;TWS 耳机软件模块组成&#34; loading=&#34;lazy&#34; src=&#34;https://btio.cn/images/csdn/163373023/software-modules.svg&#34;&gt;&lt;/p&gt;
&lt;p&gt;这不是严格的分层架构。实际 SDK 中，各部分往往会互相调用，甚至放在同一个模块里。这样划分主要是为了看清楚：一个耳机功能背后，通常有哪些软件在配合。&lt;/p&gt;
&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;软件模块&lt;/th&gt;
					&lt;th&gt;主要负责什么&lt;/th&gt;
					&lt;th&gt;常见内容&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;系统与 RTOS&lt;/td&gt;
					&lt;td&gt;让程序和多个任务运行起来&lt;/td&gt;
					&lt;td&gt;任务、消息、定时器、内存、看门狗&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;驱动与电源&lt;/td&gt;
					&lt;td&gt;与耳机硬件交互&lt;/td&gt;
					&lt;td&gt;GPIO、ADC、I2C、I2S、充电、休眠、唤醒&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;蓝牙连接&lt;/td&gt;
					&lt;td&gt;与手机建立和维护蓝牙业务&lt;/td&gt;
					&lt;td&gt;配对、回连、A2DP、AVRCP、HFP、BLE&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;双耳协同&lt;/td&gt;
					&lt;td&gt;让左右耳保持一致&lt;/td&gt;
					&lt;td&gt;双耳组对、角色、状态同步、音频协同&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;音频系统&lt;/td&gt;
					&lt;td&gt;管理声音输入和输出&lt;/td&gt;
					&lt;td&gt;编解码、播放、录音、提示音、ANC、ENC&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;产品应用&lt;/td&gt;
					&lt;td&gt;决定耳机具体怎样工作&lt;/td&gt;
					&lt;td&gt;按键、LED、佩戴检测、状态机、功能优先级&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;数据与升级&lt;/td&gt;
					&lt;td&gt;保存配置并更新固件&lt;/td&gt;
					&lt;td&gt;配对记录、用户设置、OTA、版本管理&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;调试与测试&lt;/td&gt;
					&lt;td&gt;帮助发现和定位问题&lt;/td&gt;
					&lt;td&gt;日志、异常信息、测试模式、量产支持&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id=&#34;section-2&#34;&gt;二、系统与 RTOS&lt;/h2&gt;
&lt;p&gt;TWS 耳机一般不是从上到下只执行一条固定流程。蓝牙事件、按键、音频、充电和定时任务可能在不同时间发生，因此软件需要同时管理多种事情。&lt;/p&gt;
&lt;p&gt;这一部分通常包括：&lt;/p&gt;
&lt;ul&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;p&gt;应用层开发中经常接触到的，并不是 RTOS 调度器本身，而是平台提供的任务、消息和回调接口。&lt;/p&gt;
&lt;p&gt;例如，按键驱动检测到一次双击后，不一定会直接执行“切换降噪模式”。它可能先产生按键事件，再把事件投递给应用任务，最后由应用代码根据当前状态决定是否执行这个功能。&lt;/p&gt;
&lt;p&gt;所以，当我们阅读一个新 SDK 时，找到事件入口和消息流转路径很重要。&lt;/p&gt;
&lt;h2 id=&#34;section-3&#34;&gt;三、硬件驱动与电源管理&lt;/h2&gt;
&lt;p&gt;耳机虽然体积不大，但里面仍然有不少硬件。软件需要通过不同接口读取状态或者控制这些器件。&lt;/p&gt;
&lt;p&gt;常见内容包括：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;GPIO：NTC供电、LED、使能信号&lt;/li&gt;
&lt;li&gt;ADC：按键电压、其他模拟量&lt;/li&gt;
&lt;li&gt;UART：日志输出、机盒&lt;/li&gt;
&lt;li&gt;充电与盒仓检测：识别 DC、入盒、出盒、开盖、关盖、充电和满电等状态&lt;/li&gt;
&lt;li&gt;佩戴检测：红外、触摸或其他传感器&lt;/li&gt;
&lt;li&gt;I2C、SPI：传感器、外部芯片或存储器&lt;/li&gt;
&lt;li&gt;I2S、PCM：数字音频数据传输&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;驱动层负责把硬件状态转换成软件可以识别的数据或事件，应用层再决定怎样处理。&lt;/p&gt;
&lt;p&gt;“耳机入盒”背后涉及盒仓状态检测、TWS 对耳同步、按键禁用、ANC 和音乐处理、DAC 控制及主从切换；关盖后还要关闭蓝牙并进入 &lt;code&gt;FUNC_IDLE&lt;/code&gt;或 charge等其他模式。处理不完整，可能导致左右耳状态不一致、盒内仍播放声音或关盖后仍连接手机。&lt;/p&gt;</description>
    </item>
  </channel>
</rss>
