文章目錄
1 設備模型框架
它位於硬件和應用程序之間,共分成三層,從上到下分別是 I/O 設備管理層、設備驅動框架層、設備驅動層。
應用程序通過 I/O 設備管理接口獲得正確的設備驅動,然後通過這個設備驅動與底層 I/O 硬件設備進行數據(或控制)交互
I/O 設備管理層實現了對設備驅動程序的封裝。應用程序通過 I/O 設備層提供的標準接口訪問底層設備,設備驅動程序的升級、更替不會對上層應用產生影響。這種方式使得設備的硬件操作相關的代碼能夠獨立於應用程序而存在,雙方只需關注各自的功能實現,從而降低了代碼的耦合性、複雜性,提高了系統的可靠性。
設備驅動框架層是對同類硬件設備驅動的抽象,將不同廠家的同類硬件設備驅動中相同的部分抽取出來,將不同部分留出接口,由驅動程序實現。
設備驅動層是一組驅使硬件設備工作的程序,實現訪問硬件設備的功能。它負責創建和註冊 I/O 設備,對於操作邏輯簡單的設備,可以不經過設備驅動框架層,直接將設備註冊到 I/O 設備管理器中
2 設備模型
RT-Thread 中各類內核對象的派生和繼承關係:
設備模型的派生關係:
3 設備結構
4 、序列示意圖
不經過設備驅動框架層,直接將設備註冊到 I/O 設備管理器的序列示意圖:
將創建的設備實例先註冊到對應的設備驅動框架中,再由設備驅動框架向 I/O 設備管理器進行註冊的序列示意圖:
5 、設備接口
5.1 設備註冊操作
驅動層負責創建設備實例,並註冊到 I/O 設備管理器中,也就是將設備對象插入對象容器的設備類型鏈表。
- 判斷設備指針是否指向空地址
- 根據傳遞的設備名稱在對象容器的設備鏈表中查找設備對象是否存在
- 將設備對象插入對象容器的設備類型鏈表
5.2 設備解除註冊操作
- 判斷設備指針是否爲空
- 判斷形參傳遞的設備對象是否爲設備類型
- 判斷設備對象是否爲系統對象(即靜態對象)
- 將設備驅動框架對象從對象容器和的設備鏈表中刪除
5.1 設備查找
應用程序根據設備名稱獲取設備句柄,進而可以操作設備。
- 如果當前線程指針不爲空,則進入臨界區,否則繼續往下執行
- 獲取對象容器當中設備對象的鏈表頭指針
- 如果鏈表指針不爲空,則遍歷鏈表,根據鏈表指針的實際地址計算出設備對象地址
- 取出設備對象的名稱與形參傳遞過來的名稱比對,如果名稱一致則返回對象指針並退出(如果當前線程指針不爲空需先退出臨界區)
5.2 設備打開
- 判斷設備指針是否爲空
- 判斷形參傳遞過來的設備對象是否爲設備類型
- 若設備對象未初始化,先對其初始化
- 若爲獨立設備且已經打開,則返回
- 若設備打開函數指針指向非空,則調用設備打開函數
- 打開成功則標誌設備已打開,並將引用計數器加1
5.3 設備讀取
- 判斷設備指針是否爲空
- 判斷形參傳遞過來的設備對象是否爲設備類型
- 如果設備引用計數器爲零,則直接返回
- 若設備讀取函數指針不爲空,則調用設備讀取函數
5.4 設備寫入
- 判斷設備指針是否爲空
- 判斷形參傳遞過來的設備對象是否爲設備類型
- 如果設備引用計數器爲零,則直接返回
- 若設備寫入函數指針不爲空,則調用設備寫入函數
5.5 設備控制
- 判斷設備指針是否爲空
- 判斷形參傳遞過來的設備對象是否爲設備類型
- 若設備控制函數指針不爲空,則調用設備控制函數。
5.6 設備關閉
- 判斷設備指針是否爲空
- 判斷形參傳遞過來的設備對象是否爲設備類型
- 若設備引用計數器不爲0則對其減1操作
- 若設備引用計數器仍不爲0則返回
- 如果設備關閉函數指針不爲空,則調用設備關閉函數。
- 標記設備已關閉。
5.7 註冊接收完成回調函數
- 判斷設備指針是否爲空
- 判斷形參傳遞過來的設備對象是否爲設備類型
- 註冊設備接收完成回調函數。
5.8 註冊發送完成回調函數
- 判斷設備指針是否爲空
- 判斷形參傳遞過來的設備對象是否爲設備類型
- 註冊設備發送完成回調函數。