驱动分层不是为了多写几层目录,而是让板卡变化、芯片库升级和器件替换不会一路传到业务逻辑。寄存器、时钟、DMA 和引脚复用属于最底层;温度传感器、Flash、屏幕等器件协议位于中间;上层只应看到稳定的“读取温度”“保存配置”“发送一帧”这类能力。
接口要表达业务语义和失败方式
上层调用 sensor_read()、storage_commit() 这类接口,比直接传递 HAL_I2C_HandleTypeDef 更容易理解。接口的返回值也要能区分超时、校验失败、设备不存在和暂时忙碌,不能把所有异常压成一个布尔值。这样重试、降级和告警才能由合适的层处理。
底层并不是越薄越好。DMA 缓冲区归谁管理、异步传输何时完成、复位后是否需要重新初始化,这些资源规则需要在接口处写清楚,否则“分层”只会把竞态藏得更深。
测试从上往下逐层收缩
器件驱动可以通过模拟总线读写测试寄存器序列和错误路径;服务层可用 mock 验证重试和状态转换;最后才在目标板检查时钟、电平和真实时序。板子问题和业务问题被分开后,定位速度通常比把所有代码都塞进一个 main.c 快得多。
参考:AMetal