ID:嵌入式云IOT技术圈

作者:杨源鑫

传送门:【架构篇】嵌入式编程中如何给代码的结构分层

废话不多说,理论讲太多没啥感觉,这些条条框框本质就是基于面对对象的设计模式相关的一些理论,设计模式就是前人实践多了发现一些规律然后总结出来的那么一套好用的框架,所以咱们直接出干货,硬肝!以小熊派上的SPI OLED驱动为例,将原来开发包里的LCD驱动做一些简单的改造,然后我们根据需求设计如下的驱动模型框架,分为模型、驱动、设备三个部分,我们先不考虑太细节的东西,也不会把这个东西一开始就做得特别复杂,这样不利于理解,于是我们构建如下的框架思维导图:

1、LCD驱动框架数据结构

框架提供一些什么能力呢?我是这么来做的,非常简单:

这里提供了将驱动框架与驱动进行对接的能力,&lcd_driver拿到的是定义在驱动文件里的一个已经赋值了的结构体lcd_driver,这样,当我在别的地方定义一个LCD_Driver_Model的变量,就可以将这个变量与驱动结构体进行对接,这样就可以通过这个变量来操作驱动结构体里的接口了。

2、LCD驱动数据结构

LCD驱动这个数据结构要做的事情就是提供操作LCD驱动能力的接口,这个接口的设计与硬件无关。

前面1小节说过,驱动框架依赖于驱动接口,这样的话我们需要实现驱动接口里的方法,在对应的方法里,我们要去调用LCD设备相关的接口,进而去操作LCD设备,以下是接口对应的实现:

3、LCD设备数据结构

LCD设备所需要做的事情就是将这个数据结构里的功能函数与真实的LCD驱动接口进行对接。比如我们看LCD_Init这个接口的实现,这个就是真实调用LCD的真实硬件操作了:

4、使用方法

int main(void)
{/* USER CODE BEGIN 1 */LCD_Driver_Model  lcd_model ;LCD_Ascii_Show_Para ascii_para[] ={{80, 100, 240-80, "RED", BLACK, RED, 32},{80, 100, 240-80, "GREEN", BLACK, GREEN, 32},{80, 100, 240-80, "BLUE", BLACK, BLUE, 32},};LCD_Fill_Para fill_para[] = {{ascii_para[0].x,ascii_para[0].max_width,ascii_para[0].y,ascii_para[0].y+32},{ascii_para[1].x,ascii_para[1].max_width,ascii_para[1].y,ascii_para[1].y+32},{ascii_para[2].x,ascii_para[2].max_width,ascii_para[2].y,ascii_para[2].y+32},} ;/* USER CODE END 1 *//* MCU Configuration--------------------------------------------------------*//* Reset of all peripherals, Initializes the Flash interface and the Systick. */HAL_Init();/* USER CODE BEGIN Init *//* USER CODE END Init *//* Configure the system clock */SystemClock_Config();/* USER CODE BEGIN SysInit *//* USER CODE END SysInit *//* Initialize all configured peripherals */MX_GPIO_Init();MX_I2C1_Init();MX_USART1_UART_Init();MX_SPI2_Init();/* USER CODE BEGIN 2 *//*串口初始化后加这个延时,防止后面的printf打印乱码*/HAL_Delay(200);/*注册驱动模型*/Register_Driver_Model(&lcd_model);/*调用LCD初始化*/lcd_model.lcd_driver->lcd_init();/*调用LCD显示ASCII码字符串*/lcd_model.lcd_driver->lcd_show_ascii_str(ascii_para[0]);/* USER CODE END 2 *//* Infinite loop *//* USER CODE BEGIN WHILE */while (1){/* USER CODE END WHILE *//* USER CODE BEGIN 3 *//*循环调用LCD显示ASCII码字符串*/for(int i = 0 ; i < 3 ; i++){lcd_model.lcd_driver->lcd_fill(fill_para[i]);lcd_model.lcd_driver->lcd_show_ascii_str(ascii_para[i]);HAL_Delay(100);}}/* USER CODE END 3 */
}

这样我们就完成了LCD驱动最简单的分层设计了,当然我们的软件框架后续还需要不断的把它做得更健壮,这样以后随便一个LCD,我们都可以设计一套类似这样的固定模板,根据实际的业务需求,定义设计合适的接口,以后但凡换一个项目还是用同一个LCD的话就非常简单了!

5、思考

前面我开源了一个基于TencentOS tiny的气体探测仪项目,你是否能在那个项目上继续进行优化改善呢?

本节代码已同步到码云的代码仓库中,获取方法如下:

1、新建一个文件夹

2、使用git clone远程获取小熊派例程存放的代码仓库

项目开源仓库:

https://gitee.com/morixinguan/bear-pi.git

推荐阅读:

嵌入式编程专辑Linux 学习专辑C/C++编程专辑
Qt进阶学习专辑关注微信公众号『技术让梦想更伟大』,后台回复“m”查看更多内容;扫描下方微信,加作者微信进技术交流群,请先自我介绍喔。

【实战篇】模块化编程之LCD驱动框架详解相关推荐

  1. MTK平台LCD驱动框架详解(一)

    许多学习嵌入式的进入MTK开发平台,很多东西都会感到很陌生.在MTK平台上你可以简简单单几分钟就点亮一块屏.加上MTK快速开发的节奏,也很少有时间自己整理学习.如果不思进取,不加班加点学习.很容易就慢 ...

  2. 基于sqlite的android数据库编程,Android编程之SQLite数据库操作方法详解

    Android编程之SQLite数据库操作方法详解 发布时间:2020-09-07 12:33:04 来源:脚本之家 阅读:85 作者:低调小一 本文实例讲述了Android SQLite数据库操作方 ...

  3. linux内核的块设备驱动框架详解

    1.块设备和字符设备的差异 (1)块设备只能以块为单位接受输入和返回输出,而字符设备则以字节为单位.大多数设备是字符设备,因为它们不需要缓冲而且不以固定块大小进行操作; (2)块设备对于 I/O 请求 ...

  4. Linux下LCD驱动的详解

    看了不少人写的LCD驱动解释,看之前很懵逼,看之后还是很懵逼.都是放一大堆内核代码,我当时就想吐槽,能写就写,写不明白放一大堆代码是啥意思.后来,实在没办法,只能去看内核代码,结果,真香,原来别人放一 ...

  5. Java并发编程之LinkedTransferQueue阻塞队列详解

    简介 LinkedTransferQueue是一个由链表结构组成的无界阻塞TransferQueue队列.相对于其他阻塞队列,LinkedTransferQueue多了tryTransfer和tran ...

  6. 树莓派模块化编程之TM1637驱动四位数码管

    一.驱动TM1637的时序图 二.代码实现 #encoding:utf-8 import RPi.GPIO as GPIO import time GPIO.setwarnings(False) GP ...

  7. tft lcd驱动参数详解_LED拼接屏和LCD拼接屏的区别

    LED屏幕和LCD屏幕是每个人都经常听到的两个屏幕,但是每个人之间的区别尚不清楚.不认识的人可能会认为两者之间没有区别.让我们谈谈LED和LCD屏幕之间的区别: 首先,什么是LED? LED是发光二极 ...

  8. TCP/IP编程之getsockopt/setsockopt函数详解

    前述: 有很多方法来获取和设置影响套接字的选项: · getsockopt和setsockopt函数 · fcntl函数,是把套接字设置为非阻塞式I/O型或者信号驱动式I/O型以及设置套接字属主的PO ...

  9. Java并发编程之CountDownLatch(闭锁)使用详解

    package com.zhangxueliang.day_20191108;import java.util.concurrent.CountDownLatch;/*** 计算多线程的运行时间* @ ...

最新文章

  1. SunPower光伏组件出货量提高
  2. Linux模块机制浅析
  3. linux fedora14 u盘运行,Win7下Fedora 14 硬盘或U盘安装指南
  4. OpenCASCADE:调试工具和提示
  5. UTF-8和BOM的一些说明
  6. 硬解析优化_72最近一次现场生产系统优化的成果与开发建议
  7. es中的search_type简单理解
  8. 哈工大-基于内核栈切换的进程切换
  9. kafka的消费顺序_Kafka原理和实践云平台技术栈13
  10. 电脑、手机上那些让人用后欲罢不能的神器(附百度云链接)
  11. 从技术走向管理——李元芳履职记
  12. P2P组内通信与节电模式
  13. 图神经网络 GNN GAT GCN(一)
  14. 歌单详情内容-播放列表 (音乐app项目-第8步)
  15. 高德 面积计算公式 js版
  16. 13.集合框架ListSet
  17. 女神节快乐!Apache Pulsar 愿大家拥抱机遇、享受开源
  18. 基于数学形态学的道路裂缝病害检测
  19. 莫烦Python Python基础教程 文字版 持续更新中
  20. Java字符串分割的三种方法

热门文章

  1. 苹果手机进和平精英显示无法连接到服务器,和平精英WIFI登录不了 数据流量可以进入原因解答...
  2. 嵌入式开发--XW09A触摸芯片的使用
  3. 不要再到处使用 === 了
  4. ArcGIS和COORD软件进行坐标七参数转换的方法
  5. Python批量爬取游戏卡牌信息
  6. JAVA:基本案例 春夏秋冬
  7. golang协程goroutine简介
  8. C语言编程题: 编程计算1*2*3+3*4*5+...+99*100*101的值
  9. 【Spring】之 SpringAOP 切点指示符详解
  10. 我SB了,深感懊恼和自责,希望看到本文的朋友,不要再上当受骗了