91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

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

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

C++設備模板怎么聲明和定義

發布時間:2021-11-30 16:30:39 來源:億速云 閱讀:135 作者:iii 欄目:互聯網科技

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

將片上外設進行封裝,可以使用如下三種技術:

  1. 使用類定義外設,然后創建對象。

    1. POD類實現

    2. 普通的類

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

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

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

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:
};

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

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) {
    ...
}

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

usart0h和usart1的初始化函數可以加進對管腳的初始化,u0_base就是復用模板,我不用在寫一遍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++設備模板怎么聲明和定義”的內容了,經過本文的學習后,相信大家對C++設備模板怎么聲明和定義這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是億速云,小編將為大家推送更多相關知識點的文章,歡迎關注!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

c++
AI

文昌市| 旌德县| 开阳县| 怀来县| 竹北市| 大足县| 东城区| 莱阳市| 镇原县| 镇沅| 新河县| 壤塘县| 巴东县| 安陆市| 平定县| 玛纳斯县| 晋城| 长宁县| 铁岭市| 晋中市| 平南县| 绥中县| 崇州市| 沁源县| 东安县| 苗栗县| 绍兴县| 卫辉市| 普兰县| 酉阳| 漳平市| 儋州市| 潮州市| 崇信县| 兰坪| 密云县| 昌平区| 惠水县| 大足县| 栖霞市| 阳曲县|