一、多路IO
红黑树(Red-Black Tree)是一种自平衡二叉搜索树(BST) ,通过5 条颜色性质 将树高控制在 O(log n) 量级,保证查找、插入、删除的时间复杂度稳定为 O(log n) 。相比 AVL 树,它平衡要求更宽松 ,插入 / 删除时旋转次数更少。

(内核链表核心)
内核
list_head链表节点只存前后指针,不包含业务数据。要通过链表节点指针找回整个结构体指针
- 已知
s2.list是struct stu里的list成员指针- 用
&s1.list - &s1 = 24得到偏移量- 那么
(struct stu *)((char *)&s2.list - 24)就能得到&s2,即从链表节点指针反推出父结构体指针
二、I²C:串行通信总线

cs
IOMUXC_SetPinMux(IOMUXC_UART4_RX_DATA_I2C1_SDA, 1);
IOMUXC_SetPinMux(IOMUXC_UART4_TX_DATA_I2C1_SCL, 1);
IOMUXC_SetPinConfig(IOMUXC_UART4_RX_DATA_I2C1_SDA, 0x98b0);
IOMUXC_SetPinConfig(IOMUXC_UART4_TX_DATA_I2C1_SCL, 0x98b0);
- 你把 SDA 设为输入 / 释放后,
GPIO_DR里的值永远是1(你写的),完全反映不了从机拉低的 0 电平。- 只有
GPIO_PSR会实时采样引脚的物理电压 :
- 从机拉低 SDA → PSR 读到
0- 从机释放 SDA → PSR 读到
1
| 特性 | 开漏输出 (Open-Drain) | 推挽输出 (Push-Pull) |
|---|---|---|
| 输出结构 | 仅 N-MOS 下拉 | N-MOS 下拉 + P-MOS 上拉 |
| 高电平 | 需外部上拉电阻 | 内部 P-MOS 主动拉高 |
| 低电平 | 内部 N-MOS 主动拉低 | 内部 N-MOS 主动拉低 |
| 高阻态 | MOS 管关断时为高阻 | 无高阻态(始终输出高 / 低) |
| 总线共享 | 支持 "线与",多设备并联安全 | 不支持,易短路冲突 |
| 电平兼容 | 可通过上拉电源实现电平转换 | 电平固定为 GPIO 电源电压 |

空闲时总线保持高电平
- SCL(Serial Clock):串行时钟线,由主机驱动,同步所有设备的通信节奏。
- SDA(Serial Data) :串行数据线,双向传输数据与地址,采用开漏输出设计,支持多设备共享。
不需要像UART那样通信时接地,一般情况已经共地了

ACK/NACK 的完整机制
I²C 通信中,发送方 在每发送完 8 位数据后,会主动检测第 9 位的 ACK/NCK 信号;接收方则在第 9 个时钟周期驱动 SDA 来发出应答。
时序:空闲时总线保持高电平起始信号:SCL为高时,SDA由高到低
数据发送期间:SCL为低时,SDA可以跳变,SCL为高时,SDA保持不变(每次传输以8bit为
基本单位)
数据发送完成后,由接收方发出应答信号(1bit的低电平),如果没有应答,通信强制停止。
停止信号:SCL为高时,SDA由低到高。
1.通信只能由主机发起。
2.时钟线永远由主机控制。
3.数据线传输数据时由发送方控制,应答信号由接收方控制
------主机写数据控制数据位,从机控制应答
------主机读从机控制数据位,主机控制应答
4.主机第一次发送的数据永远是7位从机地址+1位的读写标志(0写 1读)。
IIC典型时钟频率:100K ; 400K ;3.4M (指的上限)
IIC从机访问:
向从机写数据:
1.向总线发送从机地址+写标志
2.向总线发送从机内寄存器地址(从机内寄存器首地址)
3.向总线发送需要写入的数据(可以循环写入多个数据,该地址为从机接收数据后存储的地址)
4.通信结束
向从机读取数据:
1.向总线发送从机地址+写标志
2.向总线发送从机内寄存器地址(从机内寄存器首地址,该地址为从机向主机发送数据的地址)
3.主机重新发起通信,向总线写从机地址+读标志
4.主机读取数据(可循环读取)----最后一个字节接收完成后应该发送一个NCK信号
5.通信停止


必须先等待stop信号,然后读数据。
需要先产生stop信号再读数据,如果先goto的话读不到最后一个字节。