RT-Thread有多种内核对象,其中设备device就是其中一种。git
内核继承关系图以下:github
设备继承关系图以下:微信
device对象对应的结构体以下:框架
其中,设备类型type有以下几类:函数
设备的操做方法结构体:线程
RT-Thread 提供了一套简单的 I/O 设备模型框架 :3d
应用程序经过 I/O 设备管理接口得到正确的设备驱动,而后经过这个设备驱动与底层 I/O 硬件设备进行数据(或控制)交互。code
I/O 设备管理层:实现了对设备驱动程序的封装。 设备驱动程序的升级、更替不会对上层应用产生影响, 从而下降了代码的耦合性、复杂性,提升了系统的可靠性。component
设备驱动框架层: 对同类硬件设备驱动的抽象, 将不一样厂家的同类硬件设备驱动中相同的部分抽取出来。对象
设备驱动层: 是一组驱使硬件设备工做的程序,实现访问硬件设备的功能。 这一层是与硬件有关的,不一样的芯片的同种外设驱动是不一样的,STM32的GPIO驱动与NXP的GPIO驱动是不一样的。这一层负责建立与注册I/O设备,对于操做逻辑简单的设备,能够不通过设备驱动框架层。
一、 对于操做逻辑简单的设备,能够不通过设备驱动框架层,直接将设备注册到 I/O 设备管理器中:
二、 对于另外一些设备,如看门狗等,则会将建立的设备实例先注册到对应的设备驱动框架中,再由设备驱动框架向 I/O 设备管理器进行注册 :
一、建立及注册I/O设备
设备建立:
设备注册:
二、访问I/O设备
应用程序经过 I/O 设备管理接口来访问硬件设备,当设备驱动实现后,应用程序就能够访问该硬件。
I/O 设备管理接口与 I/O 设备的操做方法的映射关系下图所示:
查找设备:
初始化设备:
打开和关闭设备:
控制设备:
读写设备:
数据收发回调:
上面说的设备驱动层有两种注册设备的方式,对应的应用程序也有两种访问设备的方式。一种是经过设备操做接口访问,另外一种是经过通用的设备驱动来访问。这里咱们使用通用的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.c
与pin.c
属于RT-Thread的范畴,drv_gpio.c
与具体的硬件有关,这个文件里操控的就是与硬件有关的东西,如:
程序中用到的rt_pin_mode
及rt_pin_write
等都是PIN设备管理接口。PIN设备管理有以下几个接口:
设置引脚模式:
RT-Thread 提供的引脚编号须要和芯片的引脚号区分开来,它们并非同一个概念,引脚编号由 PIN设备驱动程序定义,和具体的芯片相关。
设置引脚电平:
读取引脚电平:
绑定引脚中断回调函数:
使能引脚中断:
脱离引脚中断回调函数:
以上就是本次的笔记,若有错误,欢迎指出。
个人我的博客:https://zhengnianli.github.io/
个人微信公众号:嵌入式大杂烩