RT-Thread I/O设备模型框架

news2024/11/18 23:47:09

I/O 设备模型框架

RT-Thread提供了一套简单的I/O设备模型框架,如图所示,它位于硬件和应用程序之间,共分成三层,从上到下分别是I/O设备管理层、设备驱动框架层、设备驱动层。

在这里插入图片描述
应用程序通过I/O设备管理接口获得正确的设备驱动,然后通过这个设备驱动与底层I/O硬件设备进行数据交互。

I/O设备管理层实现了对设备驱动程序的封装。应用程序通过图中的“I/O设备管理层”提供的标准接口访问底层设备,设备驱动程序的升级,更替不会对上层应用产生影响。
这种方式使得设备的硬件操作相关的代码能够独立于应用程序而存在,双方只需关注各自的功能实现,从而降低了代码的耦合性、复杂性,提高了系统的可靠性。

设备驱动框架层是对同类硬件设备驱动的抽象,将不同厂家的同类硬件设备驱动中相同的部分抽取出来,将不同部分留出接口,由驱动程序实现。

设备驱动层是一组驱使硬件设备工作的程序,实现访问硬件设备的功能。它负责创建和注册I/O设备,对于操作逻辑简单的设备,可以不经过设备驱动框架层,直接将设备注册到I/O设备管理器中。

在这里插入图片描述

  1. 设备驱动根据设备模型定义,创建出具备硬件访问能力的设备实例,将该设备通过rt_device_register()接口注册到I/O设备管理器中。
  2. 应用程序通过rt_device_find()接口查找到设备,然后使用I/O设备管理接口来访问硬件。

在这里插入图片描述
对于另一些设备,如看门狗等,则会将创建的设备实例先注册到对应的设备驱动框架中,再由设备驱动框架向I/O设备管理器进行注册,主要有以下几点:

  1. 看门狗设备驱动程序根据看门狗设备模型定义,创建出具备硬件访问能力的看门狗设备实例,并将该看门狗设备通过rt_hw_watchdog_register()接口注册到看门狗设备驱动框架中。
  2. 看门狗设备驱动框架通过rt_device_register()接口将看门狗设备注册到I/O设备管理器中。
  3. 应用程序通过I/O设备管理接口来访问看门狗设备硬件。

I/O设备模型

在这里插入图片描述
RT-Thread的设备模型是建立在内核对象模型基础之上的,设备被认为是一类对象,被纳入对象管理器的范畴。
每个设备对象都是由基对象派生而来,每个具体设备都可以继承其父类对象的属性,并派生出私有属性。

在这里插入图片描述

/**
 * Device structure
 */
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

    /* device call back */
    rt_err_t (*rx_indicate)(rt_device_t dev, rt_size_t size);
    rt_err_t (*tx_complete)(rt_device_t dev, void *buffer);

#ifdef RT_USING_DEVICE_OPS
    const struct rt_device_ops *ops;
#else
    /* 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);
#endif

#if defined(RT_USING_POSIX)
    const struct dfs_file_ops *fops;
    struct rt_wqueue wait_queue;
#endif

    void                     *user_data;                //设备私有数据
};

I/O设备类型

/**
 * device (I/O) class type
 */
enum rt_device_class_type
{
    RT_Device_Class_Char = 0,                           /**< character device */
    RT_Device_Class_Block,                              /**< block device */
    RT_Device_Class_NetIf,                              /**< net interface */
    RT_Device_Class_MTD,                                /**< memory device */
    RT_Device_Class_CAN,                                /**< CAN device */
    RT_Device_Class_RTC,                                /**< RTC device */
    RT_Device_Class_Sound,                              /**< Sound device */
    RT_Device_Class_Graphic,                            /**< Graphic device */
    RT_Device_Class_I2CBUS,                             /**< I2C bus device */
    RT_Device_Class_USBDevice,                          /**< USB slave device */
    RT_Device_Class_USBHost,                            /**< USB host bus */
    RT_Device_Class_SPIBUS,                             /**< SPI bus device */
    RT_Device_Class_SPIDevice,                          /**< SPI device */
    RT_Device_Class_SDIO,                               /**< SDIO bus device */
    RT_Device_Class_PM,                                 /**< PM pseudo device */
    RT_Device_Class_Pipe,                               /**< Pipe device */
    RT_Device_Class_Portal,                             /**< Portal device */
    RT_Device_Class_Timer,                              /**< Timer device */
    RT_Device_Class_Miscellaneous,                      /**< Miscellaneous device */
    RT_Device_Class_Sensor,                             /**< Sensor device */
    RT_Device_Class_Touch,                              /**< Touch device */
    RT_Device_Class_Unknown                             /**< unknown device */
};

其中字符设备、块设备是常用的设备类型,它们的分类依据是设备数据与系统之间的传输处理方式。

字符模式设备允许非结构的数据传输,即通常数据传输采用串行的形式,每次一个字节。字符设备通常是一些简单设备,如串口、按键。

块设备每次传输一个数据块,例如每次传输512个字节数据。这个数据块是硬件强制性的,数据块可能使用某类数据接口或某些强制性的传输协议,否则就可能发生错误。
因此,有时块设备驱动程序对读或写操作必须执行附加的工作,如下图所示:
在这里插入图片描述
当系统服务于一个具有大量数据的写操作时,设备驱动程序必须首先将数据划分为多个包,每个包采用设备指定的数据尺寸。而在实际过程中,最后一部分数据尺寸有可能小于正常的设备块尺寸。

每个块使用单独的写请求写入到设备中,头三个直接进行写操作。但最后一个数据块尺寸小于设备块尺寸,设备驱动程序必须使用不同于前3个块的方式处理最后的数据块。

设备驱动程序首先执行相对应的设备块的读操作,然后把写入数据覆盖到读出数据上,然后再把这个“合成”的数据块作为一整个块写回到设备中。

驱动程序需要先把块3所对应的设备块读出来,然后将需要写入的数据覆盖至从设备块读出的数据上,使其合并成一个新的块,最后再写回到块设备中。

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

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

相关文章

【AI视野·今日CV 计算机视觉论文速览 第249期】Tue, 19 Sep 202

AI视野今日CS.CV 计算机视觉论文速览 Tue, 19 Sep 2023 (showing first 100 of 152 entries) Totally 152 papers &#x1f449;上期速览✈更多精彩请移步主页 Daily Computer Vision Papers GEDepth: Ground Embedding for Monocular Depth Estimation Authors Xiaodong Yang…

【vue3页面展示代码】展示代码codemirror插件

技术版本&#xff1a; vue 3.2.40、codemirror 6.0.1、less 4.1.3、vue-codemirror 6.1.1、 codemirror/lang-vue 0.1.2、codemirror/theme-one-dark 6.1.2 效果图&#xff1a; 1.安装插件 yarn add codemirror vue-codemirror codemirror/lang-vue codemirror/theme-one-dar…

ChatGpt介绍和国产ChatGpt对比

1.ChatGPT是美国OpenAI研发的聊天机器人程序&#xff0c;2022年11月30日发布。ChatGPT是人工智能技术驱动的自然语言处理工具&#xff0c;它能够通过理解和学习人类的语言来进行对话。 2.ChatGPT是一种基于自然语言处理的聊天机器人程序。它使用深度学习技术&#xff0c;通过对…

A+CLUB管理人支持计划第八期 | 量创投资

免责声明 本文内容仅对合格投资者开放&#xff01; 私募基金的合格投资者是指具备相应风险识别能力和风险承担能力&#xff0c;投资于单只私募基金的金额不低于100 万元且符合下列相关标准的单位和个人&#xff1a; &#xff08;一&#xff09;净资产不低于1000 万元的单位&…

抖 X-Bongus 参数逆向 python案例实战

前言 嗨喽~大家好呀&#xff0c;这里是魔王呐 ❤ ~! python更多源码/资料/解答/教程等 点击此处跳转文末名片免费获取 知识点&#xff1a; 动态数据抓包 requests发送请求 X-Bogus 参数逆向 开发环境: python 3.8 运行代码 pycharm 2022.3 辅助敲代码 requests pip ins…

python从入门到精通(一)

自己也有三四年的码龄了&#xff0c;目前&#xff0c;重拾起自己的博客&#xff0c;记录自己的学习笔记&#xff0c;为大家提供优质内容&#xff0c;也来巩固自己的学习内容。 很开心也成功成为了一名研究生&#xff0c;张张的研究方向是图像处理和计算机视觉这一块&#xff0c…

k8s手动下载镜像、通过容器创建镜像方法

手动下载镜像 1、首先pull镜像到本地 docker pull <镜像名称>:<标签>2、转储镜像 docker save -o /path/to/save/image.tar 3、解压 tar -xvf /path/to/save/image.tar补充 1、如果要将tar还原成镜像 docker load -i /path/to/save/image.tar或者用输入重定向…

Win10专业版开启远程桌面

Win10专业版开启远程桌面 方法一&#xff1a; 一、按“Win R”键&#xff0c;然后输入“sysdm.cpl”并按下回车键打开系统属性。 二、选择“远程”选项卡&#xff0c;在远程桌面中勾选“允许远程连接到此计算机”就可以开启远程桌面&#xff1b; 方法二&#xff1a; 一、打…

融云受邀参加 Web3.0 顶级峰会「Meta Era Summit 2023」

本周四 19:00-20:00&#xff0c;融云直播课 社交泛娱乐出海最短变现路径如何快速实现一款 1V1 视频应用&#xff1f; 欢迎点击上方小程序报名~ 9 月 12 日&#xff0c;由中国香港 Web3.0 媒体 Meta Era 主办的“Meta Era Summit 2023”在新加坡收官&#xff0c;融云作为战略合作…

Window11专业版安装Java环境

目录 一、首先准备好一个Java的环境包 二、在Windows11上双击运行此环境包 三、根据提示安装完成后&#xff0c;在此电脑上属性中搜索环境变量 四、配置环境变量、并验证 一、首先准备好一个Java的环境包 二、在Windows11上双击运行此环境包 按着要求进行下一步操作&#…

数据丢失防护工具

什么是数据丢失防护 数据丢失防护 &#xff08;DLP&#xff09; 涉及系统地识别、定位和评估具有内容和上下文感知的数据和用户活动&#xff0c;以应用策略或主动响应来防止数据丢失。静态、使用和动态数据必须受到持续监控&#xff0c;以发现企业数据存储、使用或共享方式的偏…

Docker-如何获取docker官网x86、ARM、AMD等不同架构下的镜像资源

文章目录 一、概要二、资源准备三、环境准备1、环境安装2、服务器设置代理3、注册docker账号4、配置docker源 四、查找资源1、服务器设置代理2、配置拉取账号3、查找对应的镜像4、查找不同版本镜像拉取 小结 一、概要 开发过程中经常会使用到一些开源的资源&#xff0c;比如经…

股票量化系统QTYX开启全自动实盘之路——第一弹easytrader库搭建本地自动交易环境...

搭建全自动化量化系统 股票量化交易系统QTYX最终形态是一款全自动化的量化交易系统。 接下来我们通过一个系列逐步把QTYX升级为全自动的系统。当前为第一篇&#xff1a;使用easytrader库搭建本地自动交易环境 股票的自动化交易接口在2015年之后就被管制了&#xff0c;于是对于普…

黑马JVM总结(十七)

&#xff08;1&#xff09;G1_简介 下面介绍一种Grabage one的垃圾回收器&#xff0c;在jdk9的时候称为默认的回收器&#xff0c;废除了之前的CMS垃圾回收器&#xff0c;它的内部也是并发的垃圾回收器 我们可以想到堆内存过大&#xff0c;肯定会导致回收速度变慢&#xff0c;因…

游戏开发玩法设计的重要性

玩法设计在游戏开发中非常重要&#xff0c;因为它直接影响着玩家的游戏体验和游戏的吸引力。一个精心设计的玩法可以使游戏更具趣味性、挑战性和可玩性&#xff0c;从而吸引更多的玩家并提高游戏的成功度。以下是玩法设计的重要性&#xff1a; 吸引力和沉浸感&#xff1a; 精心…

2023_Spark_实验九:Scala函数式编程部分演示

需求&#xff1a; 1、做某个文件的词频统计//某个单词在这个文件出现次数 步骤&#xff1a; 1、文件单词规律&#xff08;空格分开&#xff09; 2、单词切分 3、单词的统计 &#xff08;k,v&#xff09;->(k:单词&#xff0c;V&#xff1a;数量&#xff09; 4、打印 框…

手游模拟器长时间运行后,游戏掉帧且不恢复

1&#xff09;手游模拟器长时间运行后&#xff0c;游戏掉帧且不恢复 2&#xff09;FrameBuffer Fetch无论哪种模式在确定支持的手机上显示全紫 3&#xff09;协程中yield return CoFunction()和yield return StartCoroutine(CoFunction())的区别 这是第353篇UWA技术知识分享的推…

山石网科国产化入侵防御系统,打造全生命周期的安全防护

随着互联网的普及和网络安全的威胁日益增加&#xff0c;botnet感染成为了企业面临的重要问题之一。botnet是一种由分散的客户端&#xff08;或肉鸡&#xff09;组成的网络&#xff0c;这些客户端被植入了bot程序&#xff0c;受控于攻击者。攻击者通过这些客户端的bot程序&#…

win10 查看已连接过的wifi的密码

1 打开管理员模式的CMD 2 输入命令查看WIFI名称 netsh wlan show profiles 上面的列表右边&#xff0c;就是wifi名称 3 输入指令&#xff0c;查看wifi密码 netsh wlan show profile name"WIFI名称" keyclear

淘宝商品详情数据采集

淘宝商品详情数据采集的方法如下&#xff1a; 确定采集目标&#xff1a;明确要采集的商品信息&#xff0c;如商品标题、价格、销量、评论、图片等。选择采集工具&#xff1a;可以选择Scrapy框架、Java的WebMagic框架等。编写爬虫程序&#xff1a;进入目标文件夹&#xff0c;输…