RTThread笔记IO设备模型及PIN设备
RTT内核对象设备
RTThread有多种内核对象,其中设备device就是其中一种。
内核继承关系图如下:
设备继承关系图如下:
device对象对应的结构体如下:
其中,设备类型type有如下几类:
设备的操作方法结构体:
IO设备模型框架
RTThread提供了一套简单的IO设备模型框架:
应用程序通过IO设备管理接口获得正确的设备驱动,然后通过这个设备驱动与底层IO硬件设备进行数据(或控制)交互。
IO设备管理层:实现了对设备驱动程序的封装。设备驱动程序的升级、更替不会对上层应用产生影响,从而降低了代码的耦合性、复杂性,提高了系统的可靠性。
设备驱动框架层:对同类硬件设备驱动的抽象,将不同厂家的同类硬件设备驱动中相同的部分抽取出来。
设备驱动层:是一组驱使硬件设备工作的程序,实现访问硬件设备的功能。这一层是与硬件有关的,不同的芯片的同种外设驱动是不同的,STM32的GPIO驱动与NXP的GPIO驱动是不同的。这一层负责创建与注册IO设备,对于操作逻辑简单的设备,可以不经过设备驱动框架层。设备的两种注册方式
1、对于操作逻辑简单的设备,可以不经过设备驱动框架层,直接将设备注册到IO设备管理器中:
2、对于另一些设备,如看门狗等,则会将创建的设备实例先注册到对应的设备驱动框架中,再由设备驱动框架向IO设备管理器进行注册:
IO设备接口
1、创建及注册IO设备
设备创建:
设备注册:
2、访问IO设备
应用程序通过IO设备管理接口来访问硬件设备,当设备驱动实现后,应用程序就可以访问该硬件。IO设备管理接口与IO设备的操作方法的映射关系下图所示:
查找设备:
初始化设备:
打开和关闭设备:
控制设备:
读写设备:
数据收发回调:
GPIO(PIN)设备模型
上面说的设备驱动层有两种注册设备的方式,对应的应用程序也有两种访问设备的方式。一种是通过设备操作接口访问,另一种是通过通用的设备驱动来访问。这里我们使用通用的GPIO设备驱动(对应源码:pin。c)来访问GPIO设备。其中通用的设备驱动在RTThread代码中作为一个组件,对应的路径为:rtthreadcomponentsdrivers
这个文件夹下有很多驱动框架:
我们用的GPIO(PIN)设备驱动pin。c存在于文件夹misc下。
GPIO输入输出实验(按键点灯):
创建一个pin线程:
按键按下LED被点亮,按键松开LED熄灭。staticvoidpinthreadentry(voidparameter){unsignedintcount1;设置LED引脚为输出模式rtpinmode(PINLEDR,PINMODEOUTPUT);设置KEY0引脚为输入模式rtpinmode(PINKEY0,PINMODEINPUT);while(count0){读取KEY0引脚状态if(rtpinread(PINKEY0)PINLOW){rtthreadmdelay(50);if(rtpinread(PINKEY0)PINLOW){count;rtkprintf(KEY0pressed!LEDON!countd,count);rtpinwrite(PINLEDR,PINLOW);}}else{rtpinwrite(PINLEDR,PINHIGH);}rtthreadmdelay(10);}}intmain(void){线程句柄定义rtthreadttid;创建动态pin线程:优先级25,时间片5个系统滴答,线程栈512字节tidrtthreadcreate(pinthread,pinthreadentry,RTNULL,STACKSIZE,THREADPRIORITY,TIMESLICE);创建成功则启动动态线程if(tid!RTNULL){rtthreadstartup(tid);}return0;}
下载程序,在终端输入listdevice命令:
可以看到device是pin,类型是MiscellaneousDevice,说明我们正在使用通用的GPIO设备驱动。这个实验中有三个文件值得关注,分别是device。c:设备管理层pin。c:设备驱动框架层drvgpio。c:设备驱动层
其中device。c与pin。c属于RTThread的范畴,drvgpio。c与具体的硬件有关,这个文件里操控的就是与硬件有关的东西,如:
程序中用到的rtpinmode及rtpinwrite等都是PIN设备管理接口。PIN设备管理有如下几个接口:
设置引脚模式:
RTThread提供的引脚编号需要和芯片的引脚号区分开来,它们并不是同一个概念,引脚编号由PIN设备驱动程序定义,和具体的芯片相关。
设置引脚电平:
读取引脚电平:
绑定引脚中断回调函数:
使能引脚中断:
脱离引脚中断回调函数:
以上就是本次的笔记,如有错误,欢迎指出。