于杰
摘要
隨著汽車LED前燈的功能越來越豐富,集成度越來越高,對(duì)于LED前燈控制器的實(shí)現(xiàn)加入軟件模塊已成為必然,但隨著軟件復(fù)雜程度的提高往往伴隨著系統(tǒng)缺陷數(shù)量的增長。與面向過程編程相比,面向?qū)ο缶幊痰姆庋b、多態(tài)和繼承特性降低了軟件開發(fā)復(fù)雜度,提升了軟件的可靠性、穩(wěn)定性和擴(kuò)展性。為了降低前燈軟件的復(fù)雜度,可以在資源有限的單片機(jī)中利用C語言實(shí)現(xiàn)面向?qū)ο缶幊?,以降低開發(fā)難度,提升軟件質(zhì)量
【關(guān)鍵詞】汽車 LED C語言 面向?qū)ο?單片機(jī)
1 引言
車燈作為汽車的外部關(guān)鍵部件,近些年發(fā)展十分迅速,LED車燈應(yīng)用越來越廣泛,功能越來越豐富。因?yàn)槌杀镜脑?,在汽車LED前燈中往往使用價(jià)格低廉,資源有限的微控制器,在這類控制器中,一般只能使用面向過程的C語言進(jìn)行編程。而與面向過程編程相比,面向?qū)ο缶幊叹哂蟹庋b、多態(tài)和繼承特性,更加容易維護(hù)、復(fù)用和擴(kuò)展。如果能使用面向?qū)ο髮?shí)現(xiàn)LED前燈的軟件系統(tǒng),可以提高整個(gè)系統(tǒng)的可靠性、穩(wěn)定性、可擴(kuò)展性。
本文分析了面向?qū)ο蟮闹饕攸c(diǎn),給出了使用C語言實(shí)現(xiàn)面向?qū)ο蟮姆椒ā?/p>
2 面向?qū)ο蟮闹饕攸c(diǎn)及C語言實(shí)現(xiàn)
2.1 封裝
類是面向?qū)ο缶幊汤镒钪匾囊粋€(gè)概念,它是對(duì)現(xiàn)實(shí)世界中具有共同屬性的一類對(duì)象的抽象。類的概念中包含兩部分內(nèi)容:屬性和行為。屬性是對(duì)象擁有的性質(zhì)和狀態(tài),行為是定義在對(duì)象上的一組操作。一個(gè)好的封裝設(shè)計(jì)可以降低軟件設(shè)計(jì)的復(fù)雜性,提升軟件產(chǎn)品質(zhì)量。
C++語言通過關(guān)鍵詞class定義一個(gè)類,實(shí)現(xiàn)對(duì)一個(gè)對(duì)象屬性和方法的封裝,類的概念相當(dāng)于定義了一個(gè)新的數(shù)據(jù)類型。在C語言中,雖然沒有類的概念和class關(guān)鍵字,但是可以使用相似的struct來模擬一個(gè)類,對(duì)于屬性依然使用變量來定義,對(duì)于方法可以使用函數(shù)指針來定義。
typedef struct_led
{
void(*Led0n)(struct_pwm_led*this);
void(*LedOff)(struct_pwm_led*this);
}CLed;
對(duì)于定義的函數(shù)指針必須進(jìn)行初始化,指向具體的函數(shù)之后才能使用,這里提供一個(gè)宏來實(shí)現(xiàn)對(duì)內(nèi)部變量和函數(shù)指針進(jìn)行初始化,其中Led_SetDuty、Led_On均是定義完整的函數(shù)
#define LED GENERATE{\
Led_On,\
Led_Off\
}
CLed led=LED_GENERATE;
led.LedOn(&led);//由于C語言編譯器中不會(huì)為函數(shù)提供this指針,因此這里手工添加
2.2 繼承
汽車LED前燈中,不同型號(hào)的產(chǎn)品間有許多相同或相似的功能,即使是同一產(chǎn)品也會(huì)因?yàn)榻党杀净騼?yōu)化,在不改變功能的情況下更改硬件設(shè)計(jì),因此在汽車LED前燈的軟件產(chǎn)品中,軟件的復(fù)用性就顯得更加重要。在面向?qū)ο缶幊讨校^承是復(fù)用己存在代碼元素的一項(xiàng)重要特性。
在面向?qū)ο缶幊讨?,繼承是復(fù)用己存在代碼元素的一項(xiàng)重要特性,通過定義一個(gè)繼承自基類的派生類,在不編寫一行代碼的情況下,即可擁有基類的全部特性,在派生類中編寫代碼即可實(shí)現(xiàn)對(duì)己有功能進(jìn)行擴(kuò)展。在C語言的結(jié)構(gòu)體中并沒有提供繼承的方法,這里我們使用包含的關(guān)系來模擬面向?qū)ο笾械睦^承,在模擬的派生類中包含基類的對(duì)象,并將其作為模擬派生類的第一個(gè)元素(為了方便使用基類指針訪問派生類對(duì)象),即可擁有與繼承相同的特性:
//CLed為己定義的結(jié)構(gòu)體
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 多態(tài)
汽車LED前燈往往需要在不同的外界條件或點(diǎn)亮?xí)r機(jī)有不同的點(diǎn)亮行為,使用面向過程的方法,則需要針對(duì)每一種點(diǎn)亮模式定義不同的接口函數(shù),在應(yīng)用中在根據(jù)當(dāng)前條件進(jìn)行調(diào)用,當(dāng)點(diǎn)亮模式改變或增加新的模式時(shí),我們就需要對(duì)接口函數(shù)和調(diào)用進(jìn)行刪減更改,這無形中降低了軟件的可擴(kuò)展性,在每次修改中更容易引入新的bug。
在面向?qū)ο蟮脑O(shè)計(jì)中,多態(tài)是指一組相關(guān)的類對(duì)象具有相同的函數(shù)原型,但具有不同的函數(shù)行為。C++語言中使用虛函數(shù)實(shí)現(xiàn)多態(tài)的功能,但C語言中雖然沒有虛函數(shù)這樣的特性,但可以利用函數(shù)指針實(shí)現(xiàn)多態(tài)的功能。首先通過定義函數(shù)指針抽象出統(tǒng)一的函數(shù)接口,在將函數(shù)指針指向不同的函數(shù)實(shí)現(xiàn),這樣當(dāng)調(diào)用函數(shù)指針時(shí)就會(huì)表現(xiàn)出不同的行為:
//CLed為己定義的結(jié)構(gòu)體
typedefstruct_bin_led
{
CLed led;
}CB1nLed;
//通過宏對(duì)基類中的函數(shù)指針進(jìn)行重新定義
#define BLNLED_GENERATE{\
{B1nLed_On}\
}
CB1nLed bln_led=BLNLED_GENERATE;
CLed*pLed=(CLed*)(&bln_led);
pLed->LedOn(pLed);
3 結(jié)論
通過使用C語言模擬出面向?qū)ο笳Z言的特點(diǎn),使得軟件系統(tǒng)的模塊化設(shè)計(jì)更加容易的實(shí)現(xiàn)。高內(nèi)聚低耦合的模塊設(shè)計(jì)提高軟件系統(tǒng)代碼的重復(fù)利用率,方便了軟件系統(tǒng)的維護(hù)和修改,便于調(diào)試排錯(cuò),易于擴(kuò)展,進(jìn)一步降低了軟件復(fù)雜度,提高了系統(tǒng)的健壯性、靈活性、可靠性。在獲得面向?qū)ο缶幊痰膬?yōu)點(diǎn)的同時(shí),依然保留著C語言高效的特點(diǎn),適合在資源有限的單片機(jī)中應(yīng)用。
參考文獻(xiàn)
[1]譚浩強(qiáng).C語言程序設(shè)計(jì)[M].北京:電子工業(yè)出版社,2005.
[2]錢能.C++程序設(shè)計(jì)教程[M].北京:清華大學(xué)出版社,1999.
[3]章遠(yuǎn)陽,楊芙清,邵維中.C++語言的面向?qū)ο筇匦苑治鯷J].計(jì)算機(jī)工程與應(yīng)用,1992(09).
[4]劉宇,王煒,張見威.C++語言面向?qū)ο髾C(jī)制的底層實(shí)現(xiàn)[J].華南師范大學(xué)學(xué)報(bào),1998(04).
[5]陳飛,陳啟安.面向?qū)ο蟮那度胧较到y(tǒng)開發(fā)技術(shù)[J].單片機(jī)與嵌入式系統(tǒng)應(yīng)用,2005.