【MSC】规范精讲[9]: 发出去的包不是泼出去的水——HCI 缓冲区与流控的记账全流程
上一篇讲省电,这一篇讲省钱——省的是内存。蓝牙规范开篇一句话就把主题定了调:Buffer management is very important for resource limited devices.资源受限设备,说的就是手表、耳机这类几毛钱内存都要抠着用的产品。Host 和 Controller 之间隔着一层 HCI 接口,Host 往下发的每一个数据包,都要在 Controller 的缓冲区里排队等空口调度。如果 Host 不管不顾地往下灌,Controller 的缓冲区撑爆了怎么办?数据丢了算谁的?答案是记账。Controller 的缓冲区容量在初始化时就亮给 Host 看,Host 每发一包就扣一次额度,Controller 每真正送出一包就向上回执一次、把额度还回去。发出去的包不是泼出去的水,每一笔都有回执。这套机制分两个方向:Host 到 Controller 的流控是必选项,Controller 到 Host 的流控是可选项。规范用了两张流程图分别讲这两条路。目录一、Host 到 Controller:必须记账的方向1.1 开局先对账本1.2 实测:这个记账本长什么样二、Controller 到 Host:可选的反向记账2.1 反方向的同样问题2.2 实测:通话中的双缓冲并行三、把两本账放一起看四、测验一、Host 到Controller:必须记账的方向1.1 开局先对账本流程图第一条消息就是关键:Step 1 的流程:1.HCI_Read_Buffer_Size:Host 初始化时问 Controller——你那边能存多少?2.H