用C语言实现面向对象思想编写驱动层--以驱动LED为例
一、摘要
在求职过程中,经常会看到招聘JD里边有“要求会使用面向对象思想编写代码“类似的关键词。因此本文将讲解如何使用C语言去实现面向对象。面向对象编程(OOP)是一种通过封装数据与函数形成独立对象来处理问题的编程思想,其核心特征包含封装、继承、多态和抽象。在C语言中,可利用结构体封装数据变量与函数指针模拟OOP的封装特性:通过结构体变量统一访问内部数据与方法,对上层暴露标准化接口,同时隐藏底层硬件细节。这种设计显著提升代码的可移植性与可维护性。本文将以LED驱动开发为例,探讨如何应用C语言实现面向对象编程,构建高复用、低耦合的硬件驱动层。
二、常见LED驱动代码
在学习STM32标准库时,常见的LED灯的驱动代码如下所示:
从上述代码可以看到,当配置一个IO口驱动LED时,需要先开IO口的时钟,配置输出方式、速度及初始化IO口等。但如果此时需要换另外一个IO口,如PC14来驱动LED,那么就需要去检查这个函数的每行代码并进行相应的更改,及其麻烦,且易导致出现更改错误的问题。
此外,当你想驱动的LED灯不是一个,而是10个、100个时,需要不断的去对led_Init()函数进行添加,工作量巨大且难以维护。因此,更好的办法是采用面向对象思想来编写LED驱动函数,这样的好处是当你想要更改IO口时,只需要针对接口传入相应的参数即可,而不需要去关心底层的实现细节,增强了维护性和可移植性。接下来以新LED驱动代码来进行说明。
首先,需要将LED所用到的数据(端口和引脚)封装成结构体,将这个封装写在led.h头文件中,代码如下所示:
接下来编写led.c文件,先编写LED_Init()函数,代码如下所示:
接下来是LED的亮灭函数,代码如下所示:
编写好LED的驱动文件之后,来看如何使用,依然用代码来做讲解,代码如下:
可以看到,无论有多少个LED灯,只要IO口充足,就仅需要更改结构体数组light的大小即可,就可以完成对N个LED的初始化操作,不需要去增加任何一行LED的驱动函数代码;并且想换IO口时,也不需要去更改LED的底层驱动文件,只需要更改LED_Init()函数的参数即可。这就做到了对上层提供接口,同时隐藏底层硬件实现细节。极大方便了代码的维护和移植。
总结
在做项目过程中,使用面向对象思想去编写驱动层是经常用到的软件设计方法。本文探讨了如何运用C语言实现面向对象编程思想构建LED驱动层,通过结构体封装技术将LED设备的硬件参数(如GPIO端口、引脚号)与操作函数(初始化、点亮、熄灭)整合为独立对象,实现了面向对象的封装特性,有效隔离硬件细节,使上层应用只需调用接口即可控制不同LED设备。显著提升了代码的可移植性、可维护性和可扩展性。