亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

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

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

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

星座| 辽宁省| 晋州市| 阜南县| 卢湾区| 赤峰市| 沙田区| 海阳市| 河东区| 南靖县| 共和县| 突泉县| 长垣县| 临夏市| 河西区| 榆社县| 东海县| 五莲县| 桃源县| 老河口市| 西宁市| 莫力| 鄂温| 舟曲县| 长寿区| 敦煌市| 镇宁| 营山县| 通江县| 广东省| 长子县| 罗平县| 齐齐哈尔市| 隆林| 兴国县| 尚志市| 彭州市| 邢台市| 祁阳县| 凤翔县| 红桥区|