您好,登錄后才能下訂單哦!
這篇文章主要講解了“C++設(shè)備模板怎么聲明和定義”,文中的講解內(nèi)容簡單清晰,易于學(xué)習(xí)與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學(xué)習(xí)“C++設(shè)備模板怎么聲明和定義”吧!
將片上外設(shè)進(jìn)行封裝,可以使用如下三種技術(shù):
使用類定義外設(shè),然后創(chuàng)建對象。
POD類實現(xiàn)
普通的類
靜態(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)注!
免責(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)容。