于杰
摘要
随着汽车LED前灯的功能越来越丰富,集成度越来越高,对于LED前灯控制器的实现加入软件模块已成为必然,但随着软件复杂程度的提高往往伴随着系统缺陷数量的增长。与面向过程编程相比,面向对象编程的封装、多态和继承特性降低了软件开发复杂度,提升了软件的可靠性、稳定性和扩展性。为了降低前灯软件的复杂度,可以在资源有限的单片机中利用C语言实现面向对象编程,以降低开发难度,提升软件质量
【关键词】汽车 LED C语言 面向对象 单片机
1 引言
车灯作为汽车的外部关键部件,近些年发展十分迅速,LED车灯应用越来越广泛,功能越来越丰富。因为成本的原因,在汽车LED前灯中往往使用价格低廉,资源有限的微控制器,在这类控制器中,一般只能使用面向过程的C语言进行编程。而与面向过程编程相比,面向对象编程具有封装、多態和继承特性,更加容易维护、复用和扩展。如果能使用面向对象实现LED前灯的软件系统,可以提高整个系统的可靠性、稳定性、可扩展性。
本文分析了面向对象的主要特点,给出了使用C语言实现面向对象的方法。
2 面向对象的主要特点及C语言实现
2.1 封装
类是面向对象编程里最重要的一个概念,它是对现实世界中具有共同属性的一类对象的抽象。类的概念中包含两部分内容:属性和行为。属性是对象拥有的性质和状态,行为是定义在对象上的一组操作。一个好的封装设计可以降低软件设计的复杂性,提升软件产品质量。
C++语言通过关键词class定义一个类,实现对一个对象属性和方法的封装,类的概念相当于定义了一个新的数据类型。在C语言中,虽然没有类的概念和class关键字,但是可以使用相似的struct来模拟一个类,对于属性依然使用变量来定义,对于方法可以使用函数指针来定义。
typedef struct_led
{
void(*Led0n)(struct_pwm_led*this);
void(*LedOff)(struct_pwm_led*this);
}CLed;
对于定义的函数指针必须进行初始化,指向具体的函数之后才能使用,这里提供一个宏来实现对内部变量和函数指针进行初始化,其中Led_SetDuty、Led_On均是定义完整的函数
#define LED GENERATE{\
Led_On,\
Led_Off\
}
CLed led=LED_GENERATE;
led.LedOn(&led);//由于C语言编译器中不会为函数提供this指针,因此这里手工添加
2.2 继承
汽车LED前灯中,不同型号的产品间有许多相同或相似的功能,即使是同一产品也会因为降成本或优化,在不改变功能的情况下更改硬件设计,因此在汽车LED前灯的软件产品中,软件的复用性就显得更加重要。在面向对象编程中,继承是复用己存在代码元素的一项重要特性。
在面向对象编程中,继承是复用己存在代码元素的一项重要特性,通过定义一个继承自基类的派生类,在不编写一行代码的情况下,即可拥有基类的全部特性,在派生类中编写代码即可实现对己有功能进行扩展。在C语言的结构体中并没有提供继承的方法,这里我们使用包含的关系来模拟面向对象中的继承,在模拟的派生类中包含基类的对象,并将其作为模拟派生类的第一个元素(为了方便使用基类指针访问派生类对象),即可拥有与继承相同的特性:
//CLed为己定义的结构体
typedef struct_pwm_led
{
CLed base;
uint32_t pwm_duty;
void(*SetDuty)(struct_pwm_led*this,uint32_t duty):
}CPwmLed;
#define PWMLED GENERATE{\
LED_GENERATE,\
0,\
LED SetDuty\
}
2.3 多态
汽车LED前灯往往需要在不同的外界条件或点亮时机有不同的点亮行为,使用面向过程的方法,则需要针对每一种点亮模式定义不同的接口函数,在应用中在根据当前条件进行调用,当点亮模式改变或增加新的模式时,我们就需要对接口函数和调用进行删减更改,这无形中降低了软件的可扩展性,在每次修改中更容易引入新的bug。
在面向对象的设计中,多态是指一组相关的类对象具有相同的函数原型,但具有不同的函数行为。C++语言中使用虚函数实现多态的功能,但C语言中虽然没有虚函数这样的特性,但可以利用函数指针实现多态的功能。首先通过定义函数指针抽象出统一的函数接口,在将函数指针指向不同的函数实现,这样当调用函数指针时就会表现出不同的行为:
//CLed为己定义的结构体
typedefstruct_bin_led
{
CLed led;
}CB1nLed;
//通过宏对基类中的函数指针进行重新定义
#define BLNLED_GENERATE{\
{B1nLed_On}\
}
CB1nLed bln_led=BLNLED_GENERATE;
CLed*pLed=(CLed*)(&bln_led);
pLed->LedOn(pLed);
3 结论
通过使用C语言模拟出面向对象语言的特点,使得软件系统的模块化设计更加容易的实现。高内聚低耦合的模块设计提高软件系统代码的重复利用率,方便了软件系统的维护和修改,便于调试排错,易于扩展,进一步降低了软件复杂度,提高了系统的健壮性、灵活性、可靠性。在获得面向对象编程的优点的同时,依然保留着C语言高效的特点,适合在资源有限的单片机中应用。
参考文献
[1]谭浩强.C语言程序设计[M].北京:电子工业出版社,2005.
[2]钱能.C++程序设计教程[M].北京:清华大学出版社,1999.
[3]章远阳,杨芙清,邵维中.C++语言的面向对象特性分析[J].计算机工程与应用,1992(09).
[4]刘宇,王炜,张见威.C++语言面向对象机制的底层实现[J].华南师范大学学报,1998(04).
[5]陈飞,陈启安.面向对象的嵌入式系统开发技术[J].单片机与嵌入式系统应用,2005.