您好,登錄后才能下訂單哦!
這篇文章主要講解了“C++設備模板怎么聲明和定義”,文中的講解內容簡單清晰,易于學習與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學習“C++設備模板怎么聲明和定義”吧!
將片上外設進行封裝,可以使用如下三種技術:
使用類定義外設,然后創建對象。
POD類實現
普通的類
靜態模板(所有的成員都是靜態的)
這兩種模板共同的特點是不需要動態分配內存,區別在于一個是靜態訪問成員,一個是對象方法訪問,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++設備模板怎么聲明和定義這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是億速云,小編將為大家推送更多相關知識點的文章,歡迎關注!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。