當前位置:首頁 > 嵌入式 > 嵌入式軟件
[導讀]感受面向對象編程的魅力(uCosII C++類封裝篇)

    OO思想已經出現(xiàn)了20多年,各種成功的實踐告訴我們它是軟件開發(fā)的必然趨勢。面向對象編程(OOP)的一個關鍵原則之一就是封裝(encapsulation),把暴露的數據封裝起來,盡可能的讓對象管理它們自己的狀態(tài),因為過多的依存性會造就緊耦合(highly coupled)系統(tǒng),使得任何一點小小改動都可能造成許多無法預料的結果。而數據隱藏/封裝機制是一個控制對象數據和狀態(tài)強而有力的方法,它對外部世界隱藏其內部細節(jié),這就意味著每一個對象都應該盡可能少的了解系統(tǒng)的其他部分或者被其他部分所了解,這樣一來一旦發(fā)生了變化,需要了解這一個變化的對象會比較少,因此變化也就相對容易地進行。

    C++之父Bjarne Stroustrup也曾說過:“你使用一個語言特征是因為你需要它,而不是因為它存在”。設計ucClass(uCosII封裝類)的初衷是由于過去很多的實現(xiàn)都是在C++中完成,深切感受到面向對象分析、設計乃至編程的獨特魅力?;叵胛④浀腗FC1為win32程序設計所帶來的便利、DriverWork2在PC硬件的驅動開發(fā)的高效,促使完成ucClass的設計(這里頭沒有什么高深的學問),其實更重要的一點是它能改進現(xiàn)有的設計模式,能讓今后的uCosII相關開發(fā)及維護變得更加輕松和高效!

    對于OO我也就幾年的開發(fā)經驗,沒有做過什么“巨項”,對于ARM也是接觸時間不長,不過有一個概念一直影響著我,“ARM不就是復雜一點的單片機嗎”,我想也不應該難到那里去。于是有空就玩玩,對于很多做這行做開發(fā)的對C++這樣的面向對象編程語言大多不甚了解,要想用OO思想來武裝自己又談何容易啊,這就是一種挑戰(zhàn)習慣、挑戰(zhàn)思維方式的行為,等于放棄過去曾經為你有效解決難題完成工作的開發(fā)模式。在此我也沒有什么靈丹妙藥可改變這些處境,唯一的建議就是堅持及不斷實踐、只有這樣的思想基礎才能提高成功的機會。

    下面簡單設計一個ucClass的demo程序(當然會可能隱藏了一些bug or error),目標板使用的是菲利普LPC2100芯片(周立功的EasyARM 2100開發(fā)板),有些頭文件這里就不貼了,旨在看看主程序的結構及設計過程,就讓一些軟件的大蝦們見笑了。

    若有機會的我還準備寫幾個基于OO之上的在嵌入式開發(fā)的應用demo……

設計需求:
使用ucClass設計一個demo程序完成下列任務:

任務編號    任務指責和功能描述    物理資源占用
1    每間隔1秒蜂鳴器短促發(fā)聲兩次,每10秒間隔使用信號量通知任務2,隨后自身進入掛起等待狀態(tài)。    蜂鳴器及IO端口
2    無限等待由任務1觸發(fā)的信號量,當有信號時引發(fā)1秒蜂鳴器長鳴,其后恢復任務1,自身再次進入信號量的無限等待狀態(tài)中。    蜂鳴器及IO端口
3    孤立任務,簡單的一秒間隔led1閃爍。    Led1及IO端口
4    孤立任務,通過檢查key1按鍵狀態(tài)控制led4的二值狀態(tài)(亮/滅)。    key1,led4及IO端口

// main.cpp文件,ucClass測試主程序
// exdata 2004-8-18

#include "config.h"            // 一些硬件相關的聲明
#include "GPIO.H"            // GPIO類頭文件
#include "ucClass.H"        // uCosII的收集類庫頭文件
/*
// 在瀏覽demo程序時要注意以下幾點:
// 1,帶參數的對象構造
// 2,靜態(tài)函數調用
// 3,帶參數的派生類構造
// 4,虛擬函數重載
// 5,特別注意一些頭文件(不在此文檔中)包含寫法及原有C函數聲明方法,關注extern "C"
// 6,不拘泥于傳統(tǒng)的設計思想(模式)
// 7,比較不使用class時候又是如何處理的?分析每個對象背后隱藏了什么?
*/

/************************** 全局變量 *****************************/

// 定義幾個task對象,這是實例化對象,隱藏并實現(xiàn)了任務棧的構造
CTask     t1(128);        // 參數是任務堆棧分配大小(在ARM中以32bit為單位)
CTask     t2(64);
CTask     t3(64);

CSem      t2WaitEvent;        // 定義一個信號量對象用于任務t1、t2通信
CGPIO     buzz("P0.7",1);    // 定義一個GPIO對象,輸出模式,用于控制蜂鳴器
/*
// 前置聲明幾個任務運行函數,這個與C模式下沒有什么區(qū)別。
// 還保留這種處理方法僅僅為求兼顧一些使用uCosII習慣,建議參考CMyTask的
// 設計及t4的定義,使用子類設計實現(xiàn)具體任務的處理方法要比C模式的的全局
// 孤立啟動函數更具有設計上及維護上的優(yōu)點,當做一個中大型項目時候效果尤
// 為明顯。
*/
void t1Run(void *p);
void t2Run(void *p);
void t3Run(void *p);

/*******************************************************************/

/*
// t1任務運行函數。
// 功能:每間隔1秒蜂鳴器短促發(fā)聲兩次,每10秒間隔使用信號量t2WaitEvent通
// 知任務t2,隨后自身進入掛起等待狀態(tài)。
*/
void t1Run(void *p)
{
    TargetInit();        // 初始化硬件目標板
    
    INT32U i = 0;
    
    while(1)
    {
        CuCos::TimeDlyHMSM(0,0,1,0);
        
        if(++i == 10)
        {
            i = 0;
            t2WaitEvent.Post();
            t1.Suspend();
        }
        
        // 蜂鳴器短促發(fā)聲兩次
        buzz.Clear();
        CuCos::TimeDlyHMSM(0,0,0,50);
        buzz.Set();
        CuCos::TimeDlyHMSM(0,0,0,50);
        buzz.Clear();
        CuCos::TimeDlyHMSM(0,0,0,50);
        buzz.Set();
    }
    
    p = p;
}
/*
// t2任務運行函數。
// 功能:無限等待信號量t2WaitEvent,當有信號時引發(fā)1秒蜂鳴器長鳴,其后恢
// 復t1任務,任務t2再次自身進入信號量t2WaitEvent的無限等待狀態(tài)。
*/
void t2Run(void *p)
{
    INT8U err = 0;
    
    while(1)
    {
        t2WaitEvent.Pend(0,&err);

        buzz.Clear();
        CuCos::TimeDlyHMSM(0,0,1,0);
        buzz.Set();
        
        CuCos::TimeDlyHMSM(0,0,0,50);
        
        t1.Resume();
    }
    
    p = p;
}
/*
// t3任務運行函數。
// 功能:簡單的一秒間隔led1閃爍。
*/
void t3Run(void *p)
{
    static CGPIO led1("P0.22",1);
    
    while(1)
    {
        led1.Set();
        CuCos::TimeDlyHMSM(0,0,1,0);
        led1.Clear();
        CuCos::TimeDlyHMSM(0,0,1,0);
    }
    
    p = p;
}

/*
// 為求原汁原味體現(xiàn)一個task對象的封裝,下面設計一個子類實現(xiàn)一個特定任務
// 的處理,在此我們可以認為一個任務就是一個子系統(tǒng),通過一個子類表現(xiàn)一個
// 特有任務的具體屬性和行為,注意這種設計方法與傳統(tǒng)的面向對象編程模式是
// 有區(qū)別的。子系統(tǒng)是一個有自主能力主體,例如在MyTask子系統(tǒng)中我們有兩
// 個IO資源m_key1和m_led4分別對應著電路板上的按鍵Key1和發(fā)光二極管Led4,
// 通過檢查key1按鍵狀態(tài)控制led4的二值狀態(tài)(亮/滅)。重載基類了Run函數為
// 求體現(xiàn)類的封裝特性及表現(xiàn)一個任務的內聚能力,它是一個強制的運行接口,
// 當任務啟動時便能自動地從重載的Run函數開始運行(具體調用的中轉過程在
// 基類中已經實現(xiàn))。
*/
class CMyTask : public CTask    // 注意這里的派生關系?。?!
{
public:
CMyTask(INT32U StkSize) : CTask(StkSize),m_key1("P0.16",0),m_led4("P0.25",1,0)
    {
        // 注意帶參數的構造處理方法?。?!
    }
    
protected:
    virtual void Run(void *p);    // 需要重載Run()函數實現(xiàn)任務執(zhí)行
    
private:
// 這是任務用到的一些資源定義,當然添加子系統(tǒng)的其他的屬性和方法也是允許的
    CGPIO m_key1;
    CGPIO m_led4;
};
/*
// t4任務運行函數。
// 通過函數重載實現(xiàn)重寫Run函數,該函數也就是任務運行函數。
// 功能:通過檢查key1按鍵狀態(tài)控制led4的二值狀態(tài)(亮/滅)。
*/
void CMyTask::Run(void *p)                    // Run函數將會被uCosII系統(tǒng)自動運行!
{
    while(1)
    {
        if(m_key1.GetStatus() == 0)            // 判斷按鍵是否按下
        {
            if(m_led4.GetStatus() == 0)
            {
                m_led4.Set();
            }
            else
            {
                m_led4.Clear();
            }
            
            while(m_key1.GetStatus() == 0)
            {
                CuCos::TimeDly(20);            // 等待按鍵釋放
            }
            
        }
        else
        {
            CuCos::TimeDly(10);
        }
    }
    
    p = p;
}
/*
// 注意一般應該把上面的CMyTask定義及實現(xiàn)另行寫在其他的文件中!把它寫在
// 這里僅僅為求說明方便。
*/

/*-------------------------------------------------------------------------------------------------*/

CMyTask     t4(128);    //注意任務對象t4是由CMyTask實例化的對象

// 看看這個簡潔的main函數,這時候您想到了什么?

int main()
{
    CuCos::Init();        // uCosII的系統(tǒng)函數,用于初始化uCosII,等效于OSInit()
    
    t2WaitEvent.Create();        // 創(chuàng)建t2WaitEvent的信號量
    
    // 創(chuàng)建任務(參數指定任務函數啟動地址、任務函數參數和優(yōu)先級)
    t1.Create(t1Run,NULL,1);    
    t2.Create(t2Run,NULL,2);
    t3.Create(t3Run,NULL,3);
    
    t4.Create(NULL,4);            // 創(chuàng)建任務,注意Create函數的重載
    
    CuCos::Start();            // 等效于OSStart()
    
    return 0;
    
}



關于我……:

    我是一個不折不扣硬件的狂熱者、焊機派,自會使用圓珠筆的年齡開始就愛上了烙鐵,開始玩弄萬用表,在高考后足足整理了兩箱電路板運回老家,因為要到外地上學我這些家當父母都幫我好好的“封存”。我可以自信及自豪地對那些比我大10歲的硬件工程師說:我焊板子的時候你還不知道什么是電阻電容呢!雖然對硬件有豐富感性認識及解不開的情結,但我現(xiàn)在清楚的明白到一點,就算是天天在長江黃河里泡大的孩子也不是個個都能登上奧運游泳項目的領獎臺,近些年硬件的發(fā)展也很快,現(xiàn)在自己在硬件上的工作也相對較少,沒有什么鍛煉的機會,三人行,必有我?guī)?,現(xiàn)在身邊牛人不少,也是一個學習的機會。對于軟件開發(fā)我也不是行家(更談不上什么程序員),比起有十幾年開發(fā)經驗的老前輩還是太嫩!用老江的話說就是too simple、sometimes naive!不過有愛好就可以發(fā)燒(在低于0度的室溫下對著黑底白字的debug窗口熬上幾個夜晚通宵不是一件容易的事情……這樣一不小心就回發(fā)燒~~~)。以前做51也是從ASM開始,馬老和Franklin帶給我第一次[硬件+C]的喜悅。在大二的時候就和畢業(yè)生混在一起搞畢業(yè)設計,現(xiàn)在想起來這分明就是害了人家,不分明是一個搶手么?雖然不是求什么利益,只在乎有發(fā)揮和動手的機會,對這些鍛煉我樂此不疲,接下來的大學生活都是在項目中度過(錯失了很多陪mm花前月下的機會~~~),那時候軟硬件都做(專門有中間人聯(lián)系或者朋友介紹),就大三一年下來的開發(fā)報酬剩下來的就大于10K(對于很多工作后的人來說這也算不了什么,明顯我也不是一個揮霍的人)。那時候在學校帶領著一個學生的科技團體,為學校、組織爭得不少得榮譽,這當然也包括為自己?;叵脒^去,更值得懷念得是那些志同道合的朋友們,有師兄、有同學還有師弟和體諒我的學院和老師……,無論是技術還是生活上都不能缺少,有著開心快樂的日子……!現(xiàn)在在一家公司做開發(fā),軟件硬件也不怎么分了,自從做了一個硬件項目后就好像轉向了軟件開發(fā)(懷疑在掉價,他們都說做硬件的吃香、干得久),反正現(xiàn)開的工作性質還算開心愉快、又不怎么需要養(yǎng)家糊口的,所以生活還算輕松(就是回家后要自己做飯,嗚嗚~~~)。

    說了這么多,我只想說明的一點是我并不是寫了幾個hello world就用C++在這里大呼小叫,一些經驗一些想法都是實踐的體會,拿上來獻丑不要介意p,很多時候只想分享一下開發(fā)中的愉悅,為求拋磚引玉。

    技術從來都只是一種手段,一個好的方法可讓您少掉好幾根頭發(fā),養(yǎng)妻活兒我可不敢包,但是做一個sohu的開發(fā)人員總是可以的吧,若是自娛自樂的則有更高的境界和追求。

多掌握一門技能就就多一條出路,生活多了一把小刀,工作也就少一點磨難。知識和學問最終以經驗的形式沉淀在你的大腦中,是你終生受用!

    說多了,就此罷了。注意:如有雷同,實屬巧合,切勿對號入座。

    愿大家工作愉快!

    BTW,今天開學了,非常懷念我遠方的同學和朋友,愿他們身體健康,在生活及技術道路上一馬平川!

                                                exdata 2004-9-1
本站聲明: 本文章由作者或相關機構授權發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點,本站亦不保證或承諾內容真實性等。需要轉載請聯(lián)系該專欄作者,如若文章內容侵犯您的權益,請及時聯(lián)系本站刪除。
換一批
延伸閱讀

9月2日消息,不造車的華為或將催生出更大的獨角獸公司,隨著阿維塔和賽力斯的入局,華為引望愈發(fā)顯得引人矚目。

關鍵字: 阿維塔 塞力斯 華為

加利福尼亞州圣克拉拉縣2024年8月30日 /美通社/ -- 數字化轉型技術解決方案公司Trianz今天宣布,該公司與Amazon Web Services (AWS)簽訂了...

關鍵字: AWS AN BSP 數字化

倫敦2024年8月29日 /美通社/ -- 英國汽車技術公司SODA.Auto推出其旗艦產品SODA V,這是全球首款涵蓋汽車工程師從創(chuàng)意到認證的所有需求的工具,可用于創(chuàng)建軟件定義汽車。 SODA V工具的開發(fā)耗時1.5...

關鍵字: 汽車 人工智能 智能驅動 BSP

北京2024年8月28日 /美通社/ -- 越來越多用戶希望企業(yè)業(yè)務能7×24不間斷運行,同時企業(yè)卻面臨越來越多業(yè)務中斷的風險,如企業(yè)系統(tǒng)復雜性的增加,頻繁的功能更新和發(fā)布等。如何確保業(yè)務連續(xù)性,提升韌性,成...

關鍵字: 亞馬遜 解密 控制平面 BSP

8月30日消息,據媒體報道,騰訊和網易近期正在縮減他們對日本游戲市場的投資。

關鍵字: 騰訊 編碼器 CPU

8月28日消息,今天上午,2024中國國際大數據產業(yè)博覽會開幕式在貴陽舉行,華為董事、質量流程IT總裁陶景文發(fā)表了演講。

關鍵字: 華為 12nm EDA 半導體

8月28日消息,在2024中國國際大數據產業(yè)博覽會上,華為常務董事、華為云CEO張平安發(fā)表演講稱,數字世界的話語權最終是由生態(tài)的繁榮決定的。

關鍵字: 華為 12nm 手機 衛(wèi)星通信

要點: 有效應對環(huán)境變化,經營業(yè)績穩(wěn)中有升 落實提質增效舉措,毛利潤率延續(xù)升勢 戰(zhàn)略布局成效顯著,戰(zhàn)新業(yè)務引領增長 以科技創(chuàng)新為引領,提升企業(yè)核心競爭力 堅持高質量發(fā)展策略,塑強核心競爭優(yōu)勢...

關鍵字: 通信 BSP 電信運營商 數字經濟

北京2024年8月27日 /美通社/ -- 8月21日,由中央廣播電視總臺與中國電影電視技術學會聯(lián)合牽頭組建的NVI技術創(chuàng)新聯(lián)盟在BIRTV2024超高清全產業(yè)鏈發(fā)展研討會上宣布正式成立。 活動現(xiàn)場 NVI技術創(chuàng)新聯(lián)...

關鍵字: VI 傳輸協(xié)議 音頻 BSP

北京2024年8月27日 /美通社/ -- 在8月23日舉辦的2024年長三角生態(tài)綠色一體化發(fā)展示范區(qū)聯(lián)合招商會上,軟通動力信息技術(集團)股份有限公司(以下簡稱"軟通動力")與長三角投資(上海)有限...

關鍵字: BSP 信息技術
關閉
關閉