溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

C++設(shè)備模板怎么聲明和定義

發(fā)布時間:2021-11-30 16:30:39 來源:億速云 閱讀:133 作者:iii 欄目:互聯(lián)網(wǎng)科技

這篇文章主要講解了“C++設(shè)備模板怎么聲明和定義”,文中的講解內(nèi)容簡單清晰,易于學(xué)習(xí)與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學(xué)習(xí)“C++設(shè)備模板怎么聲明和定義”吧!

將片上外設(shè)進(jìn)行封裝,可以使用如下三種技術(shù):

  1. 使用類定義外設(shè),然后創(chuàng)建對象。

    1. POD類實現(xiàn)

    2. 普通的類

  2. 靜態(tài)模板(所有的成員都是靜態(tài)的)

這兩種模板共同的特點是不需要動態(tài)分配內(nèi)存,區(qū)別在于一個是靜態(tài)訪問成員,一個是對象方法訪問,POD類型無法添加自定義的數(shù)據(jù)成員。

將一個MCU的全部寄存器聲明好以后,如果是簡單的mcu,那么就可以直接使用了,例如:PORTA.DDR.v |= 0x01 或者USART0.UCSRC.UPM = 0x00;但是總有一些重復(fù)步驟和相關(guān)的代碼,我們就可以將其封裝起來,例如異步計數(shù)器的配置步驟就是可以復(fù)用的。C++可以使用對象封裝這些操作,但遺憾的是,像avr編譯器并不支持對象的生成和刪除,定義好類之后,是不能用的,因為未定義delete操作符和其他基礎(chǔ)的類庫,這時可以自定義或者引用一些第三方的類庫來解決這些問題,如果不想引用第三方類庫的話,那么使用靜態(tài)類模板也是一個不錯的選擇。如下所示:

template<typename U, volatile U* u, bool base = false>
class USART {
public:
    struct SerialConfig {
        word baud = 115200;
        byte data = USART_DATABIT_8;
        byte stop = USART_STOP_1;
        byte parity = USART_PARITY_DISABLE;
    };
    __f__ void init(const SerialConfig& conf) {
        ...
    }
    __f__ hword calUBRR(const word baud) {
        ...
    }
    ... // 其他操作
private:
};

使用模板參數(shù)傳遞寄存器是為了提高代碼效率,base是為了復(fù)用模板,__f__是一個宏,他將函數(shù)成員定義成靜態(tài)的。在定義完基本模板后,可以對其進(jìn)行功能擴展或者功能的特化。例如,在初始化時,除了對USART功能寄存器進(jìn)行設(shè)置之外,還要設(shè)置rx,tx管腳,這時,可以利用模板的特化技術(shù)來實現(xiàn):

template<>
void u0::init(const SerialConfig& conf) {
    rx::init(INPUT);
    tx::init(OUTPUT);
    u0_base::init((u0_base::SerialConfig&) conf);
}

template<>
void u1::init(const SerialConfig& conf) {
    ...
}

// 其實可以再次簡化,在模板參數(shù)總增加管腳定義。

usart0h和usart1的初始化函數(shù)可以加進(jìn)對管腳的初始化,u0_base就是復(fù)用模板,我不用在寫一遍USART的基本的初始化代碼了。使用方法如下:

using u0 = USART<USART0_t, &USART0>;

u0::SerialConfig sc;
sc.baud = 115200;
sc.data = USART_DATABIT_8;
sc.parity = USART_PARITY_DISABLE;
sc.stop = USART_STOP_1;
u0::init(sc);
u0::start();

感謝各位的閱讀,以上就是“C++設(shè)備模板怎么聲明和定義”的內(nèi)容了,經(jīng)過本文的學(xué)習(xí)后,相信大家對C++設(shè)備模板怎么聲明和定義這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是億速云,小編將為大家推送更多相關(guān)知識點的文章,歡迎關(guān)注!

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

c++
AI