RTT内核对象——设备

RT-Thread有多种内核对象,其中设备device就是其中一种。

内核继承关系图如下:

设备继承关系图如下:

device对象对应的结构体如下:

其中,设备类型type有如下几类:

设备的操作方法结构体:

I/O设备模型框架

RT-Thread 提供了一套简单的 I/O 设备模型框架 :

应用程序通过 I/O 设备管理接口获得正确的设备驱动,然后通过这个设备驱动与底层 I/O 硬件设备进行数据(或控制)交互。

I/O 设备管理层:实现了对设备驱动程序的封装。 设备驱动程序的升级、更替不会对上层应用产生影响, 从而降低了代码的耦合性、复杂性,提高了系统的可靠性。

设备驱动框架层: 对同类硬件设备驱动的抽象, 将不同厂家的同类硬件设备驱动中相同的部分抽取出来。

设备驱动层: 是一组驱使硬件设备工作的程序,实现访问硬件设备的功能。 这一层是与硬件有关的,不同的芯片的同种外设驱动是不同的,STM32的GPIO驱动与NXP的GPIO驱动是不同的。这一层负责创建与注册I/O设备,对于操作逻辑简单的设备,可以不经过设备驱动框架层。

设备的两种注册方式

1、 对于操作逻辑简单的设备,可以不经过设备驱动框架层,直接将设备注册到 I/O 设备管理器中:

2、 对于另一些设备,如看门狗等,则会将创建的设备实例先注册到对应的设备驱动框架中,再由设备驱动框架向 I/O 设备管理器进行注册 :

I/O设备接口

1、创建及注册I/O设备

设备创建:

设备注册:

2、访问I/O设备

应用程序通过 I/O 设备管理接口来访问硬件设备,当设备驱动实现后,应用程序就可以访问该硬件。

I/O 设备管理接口与 I/O 设备的操作方法的映射关系下图所示:

查找设备:

初始化设备:

打开和关闭设备:

控制设备:

读写设备:

数据收发回调:

GPIO(PIN)设备模型

上面说的设备驱动层有两种注册设备的方式,对应的应用程序也有两种访问设备的方式。一种是通过设备操作接口访问,另一种是通过通用的设备驱动来访问。这里我们使用通用的GPIO设备驱动(对应源码:pin.c)来访问GPIO设备。其中通用的设备驱动在RT-Thread代码中作为一个组件,对应的路径为:

rt-thread\components\drivers

这个文件夹下有很多驱动框架:

我们用的GPIO(PIN)设备驱动pin.c存在于文件夹misc下。

GPIO输入输出实验(按键点灯):

创建一个pin线程:

按键按下LED被点亮,按键松开LED熄灭。

static void pin_thread_entry(void *parameter)
{
unsigned int count = 1; /* 设置LED引脚为输出模式 */
rt_pin_mode(PIN_LED_R, PIN_MODE_OUTPUT); /* 设置KEY0引脚为输入模式 */
rt_pin_mode(PIN_KEY0, PIN_MODE_INPUT); while (count > 0)
{
/* 读取KEY0引脚状态 */
if (rt_pin_read(PIN_KEY0) == PIN_LOW)
{
rt_thread_mdelay(50);
if (rt_pin_read(PIN_KEY0) == PIN_LOW)
{
count++;
rt_kprintf("KEY0 pressed! LED ON! count = %d\n", count);
rt_pin_write(PIN_LED_R, PIN_LOW);
}
}
else
{
rt_pin_write(PIN_LED_R, PIN_HIGH);
}
rt_thread_mdelay(10);
}
} int main(void)
{
/* 线程句柄定义 */
rt_thread_t tid; /* 创建动态pin线程 :优先级 25 ,时间片 5个系统滴答,线程栈512字节 */
tid = rt_thread_create("pin_thread",
pin_thread_entry,
RT_NULL,
STACK_SIZE,
THREAD_PRIORITY,
TIMESLICE); /* 创建成功则启动动态线程 */
if (tid != RT_NULL)
{
rt_thread_startup(tid);
} return 0;
}

下载程序,在终端输入list_device命令:

可以看到device是pin,类型是Miscellaneous Device,说明我们正在使用通用的GPIO设备驱动。这个实验中有三个文件值得关注,分别是

device.c:设备管理层
pin.c:设备驱动框架层
drv_gpio.c:设备驱动层

其中device.cpin.c属于RT-Thread的范畴,drv_gpio.c与具体的硬件有关,这个文件里操控的就是与硬件有关的东西,如:

程序中用到的rt_pin_modert_pin_write等都是PIN设备管理接口。PIN设备管理有如下几个接口:

设置引脚模式:

RT-Thread 提供的引脚编号需要和芯片的引脚号区分开来,它们并不是同一个概念,引脚编号由 PIN设备驱动程序定义,和具体的芯片相关。

设置引脚电平:

读取引脚电平:

绑定引脚中断回调函数:

使能引脚中断:

脱离引脚中断回调函数:

以上就是本次的笔记,如有错误,欢迎指出。


我的个人博客:https://zhengnianli.github.io/

我的微信公众号:嵌入式大杂烩

【RT-Thread笔记】IO设备模型及GPIO设备的更多相关文章

  1. Linux设备模型(3)_Uevent

    转自:http://www.wowotech.net/linux_kenrel/uevent.html 1. Uevent的功能 Uevent是Kobject的一部分,用于在Kobject状态发生改变 ...

  2. 字符设备驱动、平台设备驱动、设备驱动模型、sysfs的比较和关联

    转载自:http://www.kancloud.cn/yueqian_scut/emlinux/106829 学习Linux设备驱动开发的过程中自然会遇到字符设备驱动.平台设备驱动.设备驱动模型和sy ...

  3. Linux 设备模型浅析之 uevent 篇(2)

    Linux 设备模型浅析之 uevent 篇 本文属本人原创,欢迎转载,转载请注明出处.由于个人的见识和能力有限,不可能面 面俱到,也可能存在谬误,敬请网友指出,本人的邮箱是 yzq.seen@gma ...

  4. linux设备模型:扩展篇

    Linux设备模型组件:总线  一.定义:总线是不同IC器件之间相互通讯的通道;在计算机中,一个总线就是处理器与一个或多个不同外设之间的通讯通道;为了设备模型的目的,所有的设备都通过总线相互连接,甚至 ...

  5. Linux内核(7) - 设备模型(上)

    对于驱动开发来说,设备模型的理解是根本,毫不夸张得说,理解了设备模型,再去看那些五花八门的驱动程序,你会发现自己站在了另一个高度,从而有了一种俯视的感觉,就像凤姐俯视知音和故事会,韩峰同志俯视女下属. ...

  6. [kernel]字符设备驱动、平台设备驱动、设备驱动模型、sysfs几者之间的比较和关联

    转自:http://www.2cto.com/kf/201510/444943.html Linux驱动开发经验总结,绝对干货! 学习Linux设备驱动开发的过程中自然会遇到字符设备驱动.平台设备驱动 ...

  7. Linux设备模型(3)_Uevent【转】

    转自:http://www.wowotech.net/device_model/uevent.html 1. Uevent的功能 Uevent是Kobject的一部分,用于在Kobject状态发生改变 ...

  8. Linux 设备模型

    在 2.5 开发循环中一个声明的目标是为内核创建一个统一的设备模型. 之前的内核没有单一的数据结 构, 使它们可以来获取关于系统如何整合的信息. 尽管缺乏信息, 有时事情也进行的不错. 新系统, 带 ...

  9. 【原创】linux设备模型之kset/kobj/ktype分析

    背 景 Read the fucking source code! --By 鲁迅 A picture is worth a thousand words. --By 高尔基 说明: Kernel版本 ...

随机推荐

  1. 13. 罗马数字转整数(C#)

    看到这道题,存在键值对,所以先建个泛型字典,把键值填进去. 由于这道题存在两个字符表示一个数字的情况,所以在for循环的时候判断一下,看看当前字符串中循环到的字符是否和下一个字符能够组成存在在字典里的 ...

  2. 这可能最简单的一种PS图片特效,零基础小白教程

    不少小伙伴都想学习PS,可是又觉得PS很难,学了一段时间却还是做不出什么惊艳的效果,没关系!小编今天就来教大家做一个超级简单的图片特效,就算是小白也能轻松学会!我们先来看看图片效果~ 想知道怎么做吗? ...

  3. C++ 自增、自减运算符的重载和性能分析

    01 ++.--运算符重载函数的格式 自增运算符和自减运算符是有前置和后置之分的,如: a++ // 后置自增运算符 ++a // 前置自增运算符 b-- // 后置自减运算符 --b // 前置自减 ...

  4. 【C#】学习笔记(1) Delegates,Events,Lambda Expressions

    C#是跟着杨老师的教程走的,在这里感谢一下老师的无私奉献,他的cnblog地址:>cgzl,他的B站地址:>solenovex. 进入正题: Delegate表示委托,委托是一种数据结构, ...

  5. QT信号槽连接语法总结

    信号槽是 Qt 框架引以为豪的机制之一. 所谓信号槽,实际就是观察者模式.当某个事件发生之后,比如,按钮检测到自己被点击了一下,它就会发出一个信号(signal).这种触发是没有目的的,类似广播.如果 ...

  6. Kali linux-信息收集-dmitry

    信息收集-dmitry DMitry(Deepmagic Information Gathering Tools 深度信息收集工具)是一个kali linux下用C语言写的工具.主要功能为端口扫描,w ...

  7. PL/SQL编写的SQL语句插入SqlPlus时,报错 PLS-00302

    最近刚开始用PL/SQL,然后发现写SQL语句时,运行的时候,会对表中的字段报错. 好像是对字段的使用有问题 原来写的错误代码大概像这样 DECLARE xuehao XSB.id% TYPE; BE ...

  8. gyp编译工具

    最近用到了 node-gyp 这个工具, 是node 社区对 google gyp 编译工具的一个封装, 使用 node-gyp 工具可以用C++为node 项目编写 addon. 了解了一下 goo ...

  9. BayaiM__oracle切换归档模式步骤:

    BayaiM__oracle切换归档模式(步骤): ------------------oracle11g设置归档模式和非归档模式--------------------------[root@tes ...

  10. CodeForces - 1244D (思维+暴力)

    题意 https://vjudge.net/problem/CodeForces-1244D 有一棵树,有3种颜色,第i个节点染成第j种颜色的代价是c(i,j),现在要你求出一种染色方案,使得总代价最 ...