于杰
摘要
隨著汽車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.