当前位置: 首页 > news >正文

总结-esp-idf 接口与抽象层设计

疑惑

esp-idf中 lcd、io、bus 像是 spi_bus 和 spi_io 不都是配套出现的吗?那为啥还要分层呢...

总结

抽象分层

核心思想:分层不是为了拆分,是为了抽象 + 可组合

ESP-IDF 的 esp_lcd 框架分为三个层级:

  • BUS 层(硬件接口)
    • SPI / I2C / 8080 / RGB / MIPI DSI
    • 负责 怎么把数据按该总线的规则发出去
  • IO 层(屏幕指令接口)
    • st7789_spi、ili9341_spi、st7789_8080 等
    • 负责 怎么向某个屏幕型号发送命令/数据
  • Panel 层
    • st7789、ili9341
    • 负责 分辨率、初始化序列、偏移、MADCTL、坐标翻转等逻辑

代码写的多的话会发现不同 io 所用的 SPI 总线基本一致,唯一不同的是如何对 SPI 做 IO 操作。不管如此,其他外设也会使用到 SPI 总线,如 SD 卡、Flash...
之所以分这些层,就是因为提高复用增加可组合性

接口

接口 = 稳定的抽象边界

之前学习 js 就有接触 class,但是权当 class 作为一种组织代码的方式,接口也从来没怎么用过,完全没 get 到接口的精髓。
现在接触了嵌入式,面对纷杂庞大的环境,第一次体会到 接口设计 的好处,接口的目的不仅仅是封装功能,而是隔离变化
就拿屏幕来说,不同屏幕有不同驱动芯片,相同芯片也可能会使用到不同总线。只有一套配置的话,代码写在一起也还可以,这样反而更轻松。但是如果要给上面所有情况各写一套代码,那简直是 灾难😣

来看一个具体的示例:

esp_lcd_panel_io_handle_t lcd_io = NULL;
esp_lcd_new_panel_io_spi(SPI2_HOST, &io_config, &lcd_io);// 初始化 panel
esp_lcd_panel_handle_t lcd_panel = NULL;
const esp_lcd_panel_dev_config_t panel_config = {...};esp_lcd_new_panel_st7789(lcd_io, &panel_config, &lcd_panel);

新建一个 st7789_panel 只需要一个 panel_config 和 提供 io 操作的 lcd_io 句柄。
虽然 lcd_io 是一个底层由 spi 驱动的 io,但是不同总线最终都会返回一个 拥有相同操纵 ioesp_lcd_panel_io_handle_t 句柄。

esp_lcd_panel_io_t 的具体 io 操作:

/*** @brief LCD panel IO interface*/
struct esp_lcd_panel_io_t {/*** @brief Transmit LCD command and receive corresponding parameters*/esp_err_t (*rx_param)(esp_lcd_panel_io_t *io, int lcd_cmd, void *param, size_t param_size);/*** @brief Transmit LCD command and corresponding parameters*/esp_err_t (*tx_param)(esp_lcd_panel_io_t *io, int lcd_cmd, const void *param, size_t param_size);/*** @brief Transmit LCD RGB data*/esp_err_t (*tx_color)(esp_lcd_panel_io_t *io, int lcd_cmd, const void *color, size_t color_size);/*** @brief Destroy LCD panel IO handle (deinitialize all and free resource)*/esp_err_t (*del)(esp_lcd_panel_io_t *io);/*** @brief Register LCD panel IO callbacks*/esp_err_t (*register_event_callbacks)(esp_lcd_panel_io_t *io, const esp_lcd_panel_io_callbacks_t *cbs, void *user_ctx);
};

这样的话,即使更换底层总线驱动,也只需要更改新的 io 就行,向上暴露的方法都是一样的,也就是 隔离了变化

http://icebutterfly214.com/news/63549/

相关文章:

  • 高性能AI股票预测分析报告 - 2025年11月24日 - 20:46:52
  • 开题报告模板详解:手把手教你写出完美开题报告
  • 「张张讲AI」AI资讯公众号:联动深圳人才集团,讲师输出资讯+授课,助力AI落地
  • 使用frp实现内网穿透
  • 2025年11月GEO服务商推荐评测报告:从稳定性到AI能力解决方案剖析
  • macOS怎么关闭指定软件的开机自启
  • 2025.11.24 - A
  • 一个复数可以被表示为另一个复数的平方
  • 2025热流道厂家选哪家好?热流道厂家排名实力榜单
  • 106_尚硅谷_continue课堂练习
  • 2025气动接头生产厂家推荐,优质气动接头厂家精选
  • 2025电动车连接器厂家优选,靠谱锂电池连接器厂家推荐测评
  • 2025矿山机厂家推荐,精选矿山开采设备厂家推荐
  • 动态=静态(转化思想,类似扫描线)
  • 抖音投流健康领域领航者——苏州诊途赋能品牌全域增长 - langchain
  • MATLAB/Simulink水箱水位控制系统实现
  • 视觉外观缺陷检测系统公司推荐及行业应用解析
  • Minimind-一个开源LLM项目的代码分析2:模型训练
  • 2025医疗器械第三方测试机构推荐:靠谱选择 + 核心资质全解析!
  • 推歌/个人歌单 - Gon
  • 2025年11月暗黑游戏推荐:权威榜单与选择指南
  • 【C++】完美转发(转载)
  • 深入解析:大数据:python药材数据可视化分析系统 中药数据分析 医药数据分析 Django框架 Echarts可视化 requests爬虫 ✅
  • 哪个医疗器械第三方公司好?资质齐全口碑佳医疗器械公司推荐!
  • 租房管理系统软件哪个好用?租房管理系统软件排名TO5排行榜
  • 使用 keepalived 实现 tendis 高可用
  • BT-1001:全能粉体特性测试标杆,连续两届斩获 “国产好仪器” 殊荣
  • 2025 年 11 月门窗厂家权威推荐榜:窗纱一体/断桥铝/内开内倒/外平开/外开下悬,匠心工艺与高密封性设计精选
  • 2025 年 11 月气体检测仪厂家实力推荐榜:臭氧/甲醛/氢气/VOC/氮氧化物/二氧化硫/硫化氢检测仪及氧气分析仪专业品牌精选
  • 构建高可用、高性能系统的关键技术方案总结