關(guān)于驅(qū)動最底層的硬件處理并沒有全篇展開,基于MCU打造一套驅(qū)動都需要不斷地迭代測試慢慢的變?yōu)橐惶壮墒斓尿?qū)動,你不可能看完我的長篇廢話后就能去寫出一套完美的驅(qū)動,那么我們的驅(qū)動工程師就太不值錢了,文章的目的是讓你了解驅(qū)動的機制,驅(qū)動的調(diào)用關(guān)系,框架如何完美的匹配驅(qū)動程序,了解了這些以后,剛開始可能寫的驅(qū)動有些蹩腳,但是你知知道驅(qū)動和框架的服務(wù)關(guān)系,你只要不斷地嘗試慢慢它會越來越好。
那么你對注冊機制的了解有多少呢?你想要APP ——框架——驅(qū)動完美的統(tǒng)一,就需要對注冊機制有清楚的了解,它實現(xiàn)了一套松耦合的調(diào)用關(guān)系的建立(我是這樣理解的)。
還記得我最初寫裸機程序的時候,程序內(nèi)部的藕合非常嚴重,那時候還分什么應(yīng)用程序、驅(qū)動程序、框架還有啥存在的意義?一套函數(shù)嵌套的調(diào)用關(guān)系打天下~!當然不是說邏輯不好或者是嵌套不好,不同的應(yīng)用場合作用不同,小的項目還是裸奔or實時框架更舒坦。偏題了,我們先看下應(yīng)用到驅(qū)動的調(diào)用關(guān)系,基于uart的serial層來完成框架關(guān)系的建立:
通過函數(shù)指針賦值的方式建立松耦合關(guān)系,而不是通過函數(shù)嵌套來實現(xiàn),嵌套是定死的,只能調(diào)用固定名稱的函數(shù),而函數(shù)指針的方式是通過變量的賦值來實現(xiàn)松耦合,你只需要調(diào)用函數(shù)指針,而不需要關(guān)系指針的函數(shù)名(或者這里講地址更精確):
serial層本質(zhì)是一個承上啟下的框架層,關(guān)于承上,上面的代碼說明了,APP通過device對象的相關(guān)操作就可以操控到serial層的函數(shù),那么serial層最終還要調(diào)用真實的uart驅(qū)動才能實現(xiàn):
關(guān)于serial層如何實現(xiàn)底層驅(qū)動的訪問,假如我們寫的是應(yīng)用那么它是怎么調(diào)用的呢?