RT-Thread I/O设备模型
I/O設備指的是嵌入式系統中的一些Input輸入/Output輸出設備,輸入輸出設備是嵌入式系統重要的組成部分。輸入和輸出設備可以看做是計算機系統和外界進行溝通的橋梁,因此在計算機組成原理中輸入輸出設備是重要的組成部分。
計算機組成原理中的5大組成部分:
- I/O設備模型框架
RT-Thread程序可以分為三層,即上圖中三種顏色框出的部分,紅色部分為應用程序層,綠色部分為驅動層,藍色為硬件層。
【應用程序層】應用層只需關心業務邏輯,而不需要關心底層硬件
【驅動層】給應用程序層提供接口使其可以間接的使用硬件,從而搭建起了應用層和硬件層之間的橋梁,驅動層未實現的硬件驅動應用層無法調用
【硬件層】具體的硬件,可配置其內部的寄存器實現硬件功能的定制
應用程序層只負責用戶業務邏輯的實現,通過對驅動層統一接口的調用實現對硬件層的實際操作。因此當硬件層有所改動時,只需要更改驅動層的具體實現(驅動層修改時需保證給應用程序層提供的調用接口不能變),驅動程序的升級更改不會對上層應用程序層產生影響。
程序分層的原因及好處:
不對程序進行分層也可以實現功能,實際上在小型的項目中往往是不分驅動層、應用層的,如寫一個芯片的驅動程序這些可能都是放在一個.c文件中完成的。但是當項目變大后,可能使用到的芯片有幾十種,那么針對這幾十種芯片寫驅動程序的話重復工作很多,代碼也很難復用,提供給用戶調用的接口也不同。因此就會考慮是否可以將這些芯片對接到統一的框架中,通過框架給用戶提供統一接口,這樣不管是什么芯片對于應用戶程序來說沒區別。應用層通過驅動層實現對硬件層設備的訪問,驅動層程序的升級更改并不會影響應用層大程序。以此可以實現驅動層程序和應用層程序的低耦合,可獨立進行開發。可以這樣去理解,【硬件層】是一堆原材料,【驅動層】是一個工匠,他可以將這些原材料打造成各種各樣的工具,【應用層】是人,他只能使用工匠打造好的工具而不能直接去使用原材料。
RT-Thread中的I/O設備模型框架處于應用程序層和硬件層之間,總共有三層組成,即I/O設備管理層、設備驅動框架層(簡單的設備可以不需要這一層)、設備驅動層。
- I/O設備模型
RT-Thread中的設備都是基于基類rt_object之上再添加自身特有的參數所構成的,設備是一類對象,因此被納入對象管理器進行統一的管理。每種設備都是由基類派生而來,因此每種設備都可以繼承父類對象的屬性,并派生出自身的私有屬性。
設備對象定義的結構體如下所示:
struct rt_device {struct rt_object parent; /* 內 核 對 象 基 類 */enum rt_device_class_type type; /* 設 備 類 型 */rt_uint16_t flag; /* 設 備 參 數 */rt_uint16_t open_flag; /* 設 備 打 開 標 志 */rt_uint8_t ref_count; /* 設 備 被 引 用 次 數 */rt_uint8_t device_id; /* 設 備 ID,0 - 255 *//* 數 據 收 發 回 調 函 數 */rt_err_t (*rx_indicate)(rt_device_t dev, rt_size_t size);rt_err_t (*tx_complete)(rt_device_t dev, void *buffer);const struct rt_device_ops *ops; /* 設 備 操 作 方 法 *//* 設 備 的 私 有 數 據 */void *user_data; }; typedef struct rt_device *rt_device_t;重點需要注意數據收發回調函數和設備操作方法。
1、設備的創建
可以調用rt_device_t rt_device_create(int type, int attach_size); 創建設備,設備創建后需要實現其訪問硬件的操作方法,即需要實現ops設備操作方法
/*** operations set for device object*/ struct rt_device_ops {/* common device interface */rt_err_t (*init) (rt_device_t dev);rt_err_t (*open) (rt_device_t dev, rt_uint16_t oflag);rt_err_t (*close) (rt_device_t dev);rt_size_t (*read) (rt_device_t dev, rt_off_t pos, void *buffer, rt_size_t size);rt_size_t (*write) (rt_device_t dev, rt_off_t pos, const void *buffer, rt_size_t size);rt_err_t (*control)(rt_device_t dev, int cmd, void *args); };ops中各個函數的說明如下,可以根據設備具體功能選擇實現全部或部分接口
2、設備的注冊
設備被創建后,還需要將其注冊到I/O設備管理器中,這樣才能進行統一管理,應用程序才能夠訪問的到,可以使用rt_err_t rt_device_register(rt_device_t dev, const char* name, rt_uint8_t flags); 進行設備的注冊。注冊就相當于是在系統中上戶口一樣,只有注冊了才能找到相關信息。
3、設備的訪問
應用程序通過 I/O 設備管理接口來訪問硬件設備,當設備驅動實現后,應用程序就可以訪問該硬件。 I/O 設備管理接口與 I/O 設備的操作方法的映射關系下圖所示:?
?
?
?
?
?
創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎總結
以上是生活随笔為你收集整理的RT-Thread I/O设备模型的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: matlab读取npy文件
- 下一篇: 什么是IOC容器