RT-Thread I/O设备模型

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 设备的操作方法的映射关系下图所示:

 

 

 

 

 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/429574.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

如何使用易我数据恢复向导恢复数码相机删除的图片

1 使用"易我数据恢复向导"的高级恢复(务必将数码相机的存储卡取出单独插入SD卡槽,而不是直接用数据线连接到电脑上,这样存储卡才能以磁盘方式显示) 2 选中对应磁盘,点击下一步 3 如果出现"分区参数不正确"提示,直接取消即可开始搜索 4 搜索完…

RT-Thread对GPIO操作两种方式的区别:1)通过设备操作接口2)直接通过通用GPIO设备驱动

在学习RT-Thread设备驱动框架时,看到潘多拉开发板的RT-Thread例程资料中的文档《AN0002-RT-Thread-通用 GPIO 设备应用笔记》有如下描述,因此产生使用文档中未使用的方式1)通过设备操作接口 方法实现GPIO操作的想法! 使用潘多拉开…

清华大学-曾鸣-《ARM微控制器与嵌入式系统》I2C总线(一)

I2C是一种双向2线制同步串行通讯接口,是一类非常经典的串行总线通讯,理解好I2C通讯会帮助理解USB通讯、以太网通讯中的握手、数据帧等环节。 I2C的发展历史: SPI串行通讯主要是由MOTOROLA公司提出的,MOTOROLA公司的半导体部门独立…

清华大学-曾鸣-《ARM微控制器与嵌入式系统》I2C总线(二)

I2C(Inter IC Bus)的通讯数据帧: SCL线无方向区分,SDA线上有数据的流动方向。上图中灰色的代表的是主机向从机发送数据,此时SDA线的电平控制权由主机掌控,从机只能监听该线上的电平状态。白色代表的是从机向…

RT-Thread I2C设备驱动框架的对接使用

I2C和SPI是MCU和板载芯片之间最常用的通讯方式,现在先介绍下I2C总线。I2C的基本原理也很简单,只需要两根线(时钟线SCL和信号线SDA)即可实现挂载在I2C总线上设备之间的相互通讯。I2C协议并未规定I2C总线上哪个是主机?哪…

RT-Thread 简介及架构

RT-Thread,全称是 Real Time-Thread,顾名思义,它是一个嵌入式实时多线程操作系统,基本属性之一是支持多任务,允许多个任务同时运行并不意味着处理器在同一时刻真地执行了多个任务。事实上,一个处理器核心在…

iOS HTML标签字符实体,转译字符串归类大全 【转载】

为什么要用转义字符串&#xff1f; HTML中<&#xff0c;>&#xff0c;&等有特殊含义&#xff08;<&#xff0c;>&#xff0c;用于链接签&#xff0c;&用于转义&#xff09;&#xff0c;不能直接使用。这些符号是不显示在我们最终看到的网页里的&#xff0c…

RT-Thread在github上的教程中图片显示不出来问题的解决方法

在github上查看RT-Thread STM32系列BSP制作教程时发现教程中所有的图片都加载不出来&#xff0c;非常影响教程的阅读使用。 使用记事本打开文件&#xff1a; C:\Windows\System32\drivers\etc\hosts 将如下内容复制粘贴到hosts文件末尾&#xff1a; # GitHub Start 140.82.11…

在STM32CubeMX生成的MDK5工程上添加RT-Thread Nano后双击工程名无法打开.map文件的解决方法

当我们基于STM32CubeMx完成芯片的基础配置&#xff0c;再将RT-Thread Nano添加到工程编译完成之后。双击工程名称发现无法打开工程的.map文件&#xff0c;.map文件是STM32开发中非常重要的一个文件&#xff0c;map文件中详细描述了各个函数在ROM中的存储地址和大小&#xff0c;…

STM32实现USB虚拟串口原理(下)

中断传输应用如主机定期间隔送鼠标读取当前的输入信息&#xff0c;或键盘的输入键值 同步传输应用于音视频等对延迟有严格要求的场合 大容量传输对实时性没有太高要求&#xff0c;对延迟有较大的容忍&#xff0c;且在协议层面并未规定最大的容忍延迟时间&#xff0c;但能从协议…

RT-Thread中堆和栈内存的分配

在嵌入式软件开发中&#xff0c;我们经常会提到堆和栈&#xff0c;实际上堆和栈都是RAM上的物理内存空间&#xff0c;只是使用方式不同而已。栈和堆都是单片机RAM中一段连续的存储空间&#xff0c;该段空间一般在启动文件或链接脚本中指定&#xff0c;最后在C库的_main函数中进…

RT-Thread Nano版本和RT-Thread Master版本的关系

RT-Thread Nano版本和RT-Thread Master版本的关系&#xff1a; RT-Thread Master版本不仅仅是一个实时内核&#xff0c;还包含了丰富的中间层组件。 RT-Thread Nano是RT-Thread Master之上进行剪裁后形成的精简版&#xff0c;去掉了一些组件和各种开发板的BSP&#xff0c;仅保…

VSCODE修改文字编码格式为GB2312和TAB键为2个空格(MDK5和VSCODE联合开发STM32程序)

在MDK5中&#xff0c;代码、变量等的高亮显示或代码自动补全做的不是很好&#xff0c;经常会出现在A函数中有变量的高亮功能&#xff0c;在B函数中就没有了。特别是在RT-Thread创建的多个线程中&#xff0c;发现同一文件中的其它函数中的变量都有同一变量高亮&#xff0c;在RT-…

IP选路

一、IP层工作流程 &#xfffc; 二、 简单路由表 输入netstate -rn&#xff0c;得到如下&#xfffc; 其中flag的标志如下 U 该路由可以使用G 该路由是到一个网管&#xff08;路由器&#xff09;&#xff0c;否则&#xff0c;说明目的地是直接相连的 该标志区分了间接路由和…

[转]微信小程序安全浅析

本文转自&#xff1a;http://blog.csdn.net/baize_security/article/details/54582854 引言 近期微信小程序重磅发布&#xff0c;在互联网界掀起不小的波澜&#xff0c;已有许多公司发布了自己的小程序&#xff0c;涉及不同的行业领域。大家在体验小程序用完即走便利的同时&…

STM32 MDK编译后生成的 .map文件深入分析

.map文件是STM32开发中非常重要的一个文件&#xff0c;在该文件中可以详细的查看单个文件、函数及用户定义的全局变量等的占用RAM和ROM&#xff08;一般为片内FLASH&#xff09;的空间大小&#xff0c;通过了解这些信息可以很方便的进行代码的优化。 在MDK5中&#xff0c;生成…

C#程序的组织结构

C#程序的组织结构&#xff1a; namespace&#xff08;命名空间&#xff09;&#xff1a; C#程序中的一种代码组织形式&#xff0c;主要用来标识类的可见范围。一个namespace中包含了一系列的类&#xff0c;一般一个文件中会使用多个using语句引入多个命名空间。 语法&#xff…

hihocoder1477 闰秒

地址&#xff1a;http://hihocoder.com/problemset/problem/1477 题目&#xff1a; 闰秒 时间限制:10000ms单点时限:1000ms内存限制:256MB描述 计算机系统中使用的UTC时间基于原子钟&#xff0c;这种计时方式同“地球自转一周是24小时”的计时方式有微小的偏差。为了弥补这种偏…

C#命名空间namespace中不能直接包含字段(变量)或方法(函数)之类的成员

C#命名空间即namespace中不能直接包含字段&#xff08;变量&#xff09;或方法&#xff08;函数&#xff09;之类的成员&#xff0c;须将字段或方法放到类class中&#xff0c;否则编译器会报错。 C#命名空间中不能直接定义字段&#xff08;变量&#xff09;&#xff1a; 将val…

Lucene实战之初体验

前言 最早做非结构化数据搜索时用的还是lucene.net&#xff0c;一直说在学习java的同时把lucene这块搞一搞&#xff0c;这拖了2年多了&#xff0c;终于开始搞这块了。 开发环境 idea2016、lucene6.0、jdk1.8 使用lucene准备条件 1、pom.xml 2、测试数据。 我从博客园首页拿了几…