I/O设备指的是嵌入式系统中的一些Input输入/Output输出设备,输入输出设备是嵌入式系统重要的组成部分。输入和输出设备可以看做是计算机系统和外界进行沟通的桥梁,因此在计算机组成原理中输入输出设备是重要的组成部分。

计算机组成原理中的5大组成部分:

  1. 控制器(Control):控制和协调计算机系统中各外设的工作和内存的访问,对程序、数据、地址进行控制访问
  2. 运算器(Datapath):对数据进行算数运算和逻辑运算
  3. 存储器(Memory):存储程序、程序运行时的临时数据等(RAM+ROM)
  4. 输入设备(Input System):将外部的字符、控制指令、或者采集到的原始数据输入到计算机系统中进行处理的设备,常见的有鼠标、键盘等
  5. 输出设备(Output System):将计算机系统中的计算结果、各种字符、控制信号等对外输出的设备,常见的有显示器、打印机等
  • I/O设备模型框架

RT-Thread程序可以分为三层,即上图中三种颜色框出的部分,红色部分为应用程序层,绿色部分为驱动层,蓝色为硬件层。

【应用程序层】应用层只需关心业务逻辑,而不需要关心底层硬件

【驱动层】给应用程序层提供接口使其可以间接的使用硬件,从而搭建起了应用层和硬件层之间的桥梁,驱动层未实现的硬件驱动应用层无法调用

【硬件层】具体的硬件,可配置其内部的寄存器实现硬件功能的定制

  1. 应用程序通过 I/O 设备管理接口获得正确的设备驱动,然后通过这个设备驱动与底层 I/O 硬件设备进行数据(或控制)交互。
  2. I/O 设备管理层实现了对设备驱动程序的封装。应用程序通过 I/O 设备层提供的标准接口访问底层设备,设备驱动程序的升级、更替不会对上层应用产生影响。这种方式使得设备的硬件操作相关的代码能够独立于应用程序而存在,双方只需关注各自的功能实现,从而降低了代码的耦合性、复杂性,提高了系统的可靠性。
  3. 设备驱动框架层是对同类硬件设备驱动的抽象,将不同厂家的同类硬件设备驱动中相同的部分抽取出来,将不同部分留出接口,由驱动程序实现。
  4. 设备驱动层是一组驱使硬件设备工作的程序,实现访问硬件设备的功能。它负责创建和注册 I/O 设备,对于操作逻辑简单的设备,可以不经过设备驱动框架层,直接将设备注册到 I/O 设备管理器中

应用程序层只负责用户业务逻辑的实现,通过对驱动层统一接口的调用实现对硬件层的实际操作。因此当硬件层有所改动时,只需要更改驱动层的具体实现(驱动层修改时需保证给应用程序层提供的调用接口不能变),驱动程序的升级更改不会对上层应用程序层产生影响。

程序分层的原因及好处:

不对程序进行分层也可以实现功能,实际上在小型的项目中往往是不分驱动层、应用层的,如写一个芯片的驱动程序这些可能都是放在一个.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设备模型相关推荐

  1. xpt 2046的触摸屏 rt thread设备驱动框架

    1 基于rtt 开发触摸屏驱动 准备使用rtt 框架 , 驱动xpt 2046的触摸屏, 翻阅大量资料发现, 大部分文章强调的是时序图, 而且很多代码要么直接操作寄存器, 要么是io 口模拟, 只能用 ...

  2. 使用RT Thread设备框架封装一个I2C设备——DS3231

    使用RT Thread设备框架封装一个I2C设备--DS3231 前言 ENV配置 I2C测试 将ds3231封装成一个字符设备 结语 前言 学习rt thread的I2C的时候,恰巧手上的板子留了d ...

  3. 基于GD32F103C8T6添加RT Thread nano设备框架并添加串口设备(以控制台console( uart0 )为例)

    最近没事琢磨了一下使用设备框架的问题.因为将串口注册到设备框架可以应用十分丰富的软件包. 于是就整理了一下手上的工程,重新将工程梳理了一遍. 像这样是十分清爽了,其中RTOS是操作系统源代码 并且学习 ...

  4. rtt面向对象oopc——3.对官方IO设备模型框架图的补充绘图

    该补充图有幸得到rt thread官方认可,gitee上已提交PR,且通过了官方评审,已被合并到<IO设备模型>章节末尾的<补充说明>小节里了rt-thread官方文档gite ...

  5. linux设备模型:devtmpfs虚拟文件系统分析

    devtmpfs是一个设备文件系统,它将其所有文件保存在虚拟内存中. devtmpfs中的所有内容都是临时的,因为不会在您的硬盘驱动器上创建任何文件.如果卸载devtmpfs实例,其中存储的所有内容都 ...

  6. rt thread studio使用QBOOT和片外flash实现OTA升级

    我们这里要使用单片机外部flash作为OTA的下载分区,外部flash硬件连接关系 PB3-->SPI3_CLK PB4-->SPI3_MISO PB5-->SPI3_MOSI PE ...

  7. Linux设备模型——设备驱动模型和sysfs文件系统解读笔记

    Linux设备模型--设备驱动模型和sysfs文件系统解读笔记 原文:https://blog.csdn.net/yj4231/article/details/7799245 将对Linux系统中的s ...

  8. Yeelink平台使用——远程控制 RT Thread + LwIP+ STM32

    1.前言     [2014年4月重写该博文]     经过若干时间的努力终于搞定了STM32+LwIP和yeelink平台的数据互通,在学习的过程中大部分时间花在以太网协议栈学习上,但是在RT Th ...

  9. RT Thread之 Uart2 操作

    官网连接:https://docs.rt-thread.org/#/rt-thread-version/rt-thread-standard/programming-manual/device/uar ...

  10. stm32f407单片机rt thread 片外spi flash OTA升级配置示例

    参考地址https://www.rt-thread.org/document/site/application-note/system/rtboot/an0028-rtboot/ 第一步,生成Boot ...

最新文章

  1. JS中避免命名冲突的三个方法
  2. 嵌入式操作系统 NuttX 5.0 发布
  3. 手机界面常见的的九宫格
  4. HCIE-Security Day1:防火墙概述、实验环境搭建、三种方式管理防火墙
  5. 易语言 word类excel类 的 源码和模块
  6. 图书馆座位预约系统管理/基于微信小程序的图书馆座位预约系统
  7. 如何通过局域网共享本机网页
  8. 虚拟化搭建云服务器,服务器虚拟化系统平台搭建
  9. 图片的合成(个人练习,不喜勿喷!)
  10. 北大c语言百度云资源,北大C语言讲义.pdf
  11. 震惊:德国零售巨头麦德龙支付系统中断,原因竟然是....
  12. printf格式输出数字,位数不够前面补0,适用与输出编号
  13. [备忘]autorun专杀工具
  14. 高等数学——常用结论(2)
  15. Starling第一篇
  16. 对于5G时代的出现IT行业的前景怎么样!
  17. 前端工程师地基 深入理解闭包 作用域 立即执行函数
  18. java 接口开发时 后台无法获取前端传过来的参数值
  19. Java使用for循环:打印直角三角形/倒直角三角形/正三角形/倒正三角形/矩形/平行四边形/菱形的规律
  20. 舰r经验计算机,战舰少女R新版经验计算攻略

热门文章

  1. Linux|CentOS下配置Maven环境
  2. Centos安装JDK(java环境)
  3. 拦截器、过滤器、@Aspect 区别
  4. Android 6.0及以上版本动态申请权限,11权限
  5. 小程序 自定义遮照 mask 禁止上下滑动
  6. mongoose Topology was destroyed 处理
  7. VS2010 C++编译报错LINK : fatal error LNK1123: 转换到 COFF 期间失败: 文件无效或损坏
  8. mysql复制安全性_从MySQL复制功能中得到一举三得实惠
  9. 计算机win10启动慢,Win10 开机慢/Win10启动慢的常见原因
  10. PHP opencv Dlib,Face_Recognition