Toggle navigation
首页
问答
文章
积分商城
专家
专区
更多专区...
文档中心
返回主站
搜索
提问
会员
中心
登录
注册
书籍
《RT-Thread设备驱动开发指南》—— 基础篇之第1章RT-Thread与设备驱动框架简介
发布于 2023-06-13 11:33:33 浏览:6578
订阅该版
[tocm] ### 感谢 感谢**架构师李肯**的赠书!!! ### RT-Thread设备驱动开发指南内容简介 RT-Thread设备驱动开发指南是由RT-Thread核心开发者撰写,专业性强。该书系统系统讲解了RT-Thread设备驱动开发方法,助力开发者快速掌握RT-Thread设备驱动开发技能。 该书内容共27章,分为三篇。 基础篇(第1~11章),对RT-Thread以及设备驱动框架进行总体介绍,再分别介绍RT-Thread中常用的设备包括PIN,I2C,SPI等,适合刚接触驱动开发的人学习。 进阶篇(第12~20章),介绍稍复杂一些的外设驱动,如SDIO、触摸、显示、传感器、加解密设备等。 高级篇(第21~27章),介绍复杂的驱动,如网络、音频、USB、CAN等,开发此类设备驱动要求开发者本身对相应的外设协议比较熟悉。 ### 基础篇 第1章 RT-Thread与设备框架简介 第2章 UART设备驱动开发 第3章 PIN设备驱动开发 第4章 I2C总线设备驱动开发 第5章 SPI/QSPI总线设备驱动开发 第6章 HWTIMER设备驱动开发 第7章 PWM设备驱动开发 第8章 RTC设备驱动开发 第9章 ADC设备驱动开发 第10章 DAC设备驱动开发 第11章 WDT设备驱动开发 #### 第1章 RT-Thread与设备框架简介 **RT-Thread的架构** ![screenshot_image.png](https://oss-club.rt-thread.org/uploads/20230613/5a7a34e525fda7fc361c1bb7ee6c8235.png.webp) RT-Thread架构具体包括以下部分: 1.硬实时内核层; 2.组件与服务层; 3.软件包层; **RT-Thread源码获取** RT-Thread源码获取有几种途径。 GitHub: https://github.com/RT-Thread/rt-thread。 Gitee: https://gitee.com/rtthread/rt-thread。 另外,读者还可通过RT-Thread Studio创建RT-Thread工程,通过IDE下载源码并将其加入工程中。 **芯片对接RT-Thread流程** ![screenshot_image.png](https://oss-club.rt-thread.org/uploads/20230613/448aed186d9cb41c16fa59076b4c0d60.png.webp) **RT-Thread I/O设备框架** “设备框架”就是针对某一类外设,抽象出来一套统一的操作方法以及接入标准。有了这一层抽象,框架上层的应用要访问具体外设(比如摄像头)时,就不用关心具体的厂家或者产地了。只要按照框架提供的操作方法,就可以控制摄像头拍照、摄像了。这套设备框架也为生产厂家提供了方便,他们不需要关心应用具体会怎么使用,只要按照设备框架提供的接入标准设计产品,生产出来就可以在市面上销售了。 在嵌入式领域,RT-Thread也提供了这样的一层抽象,用于屏蔽嵌入式上的硬件差异,为应用层提供统一的操作方法,也为底层硬件提供统一的接入标准。 RT-Thread提供了一套简单的I/O设备模型框架,简称设备框架。*RT-Thread设备框架位于硬件和应用程序之间,共分成3层,从上到下分别是I/O设备管理层、设备驱动框架层、设备驱动层*。 ![screenshot_image.png](https://oss-club.rt-thread.org/uploads/20230613/2271fe28b1a24c1e860d575f0a7550fe.png.webp) ** I/O设备管理层**实现了对设备驱动程序的封装。应用程序通过I/O设备层提供的标准接口访问底层设备,因此设备驱动程序的升级、更替不会对上层应用产生影响。I/O设备管理层所包含的I/O设备管理接口有rt_device_find、open、read、write、close、register等。 **设备驱动框架层**是对同类硬件设备驱动的抽象,将不同厂家的同类硬件设备驱动中相同的部分抽取出来,将不同部分留出接口,由驱动程序实现。 **设备驱动层**是一组驱使硬件设备工作的程序,实现了访问硬件设备的功能,它负责创建和注册I/O设备。设备驱动层注册设备有以下两种方式。 **第一种方式**,使用I/O设备管理接口直接注册,在设备驱动文件中通过rt_device_register()接口注册到I/O设备管理器中。*这种方式是针对操作逻辑简单的设备,可以不经过设备驱动框架层,直接将设备注册到I/O设备管理器中。* ![screenshot_image.png](https://oss-club.rt-thread.org/uploads/20230613/31042a1446c00f214f886329b7fae21d.png.webp) **第二种方式**,通过设备驱动框架层提供的注册函数进行注册,注册函数名一般命名为rt_hw_xxx_register(),设备驱动框架层的注册函数又调用了I/O设备管理接口的注册函数rt_device_register(),从而进行设备注册。此种注册方式是针对一些不能使用I/O设备管理接口完成操作的设备,如看门狗等。看门狗设备注册的主要步骤如下。 ![screenshot_image.png](https://oss-club.rt-thread.org/uploads/20230613/3488285a0c65e0e89b20797584bb2286.png.webp) **I/O设备模型与分类** RT-Thread的I/O设备模型(以下简称“设备模型”)是建立在内核对象模型基础之上的,设备被认为是一类对象,被纳入对象管理器的范畴。每个设备对象都是由基对象派生而来的,每个具体设备都可以继承其父类对象的属性,并派生出其私有属性。 ![screenshot_image.png](https://oss-club.rt-thread.org/uploads/20230613/d22e88879610ef4f45bf5d631286bc31.png.webp) **I/O设备管理接口** 应用程序通过I/O设备管理接口来访问硬件设备,当设备驱动实现后,应用程序就可以访问该硬件。I/O设备管理接口与I/O设备的操作方法的映射关系如图 ![screenshot_image.png](https://oss-club.rt-thread.org/uploads/20230613/886de38a6d47e1f2447aa995f6d4537e.png.webp) #### 学习效果-添加一个简单驱动 根据方式一添加一个简单驱动,过程如下。 查看结构体struct rt_device的定义。 ``` struct rt_device { struct rt_object parent; /**< inherit from rt_object */ #ifdef RT_USING_DM struct rt_driver *drv; void *dtb_node; #endif enum rt_device_class_type type; /**< device type */ rt_uint16_t flag; /**< device flag */ rt_uint16_t open_flag; /**< device open flag */ rt_uint8_t ref_count; /**< reference count */ rt_uint8_t device_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_ssize_t (*read) (rt_device_t dev, rt_off_t pos, void *buffer, rt_size_t size); rt_ssize_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 /* RT_USING_DEVICE_OPS */ #ifdef RT_USING_POSIX_DEVIO const struct dfs_file_ops *fops; struct rt_wqueue wait_queue; #endif /* RT_USING_POSIX_DEVIO */ void *user_data; /**< device private data */ }; ``` 编写测试代码: ```c #include
#include
struct rt_device devDemo;//定义设备变量 const char *name="myDriver";//设备名 rt_uint16_t flags=RT_DEVICE_FLAG_RDWR; //初始化 static rt_err_t myDriverInit(rt_device_t dev) { if(dev==RT_NULL) { return -1; } rt_kprintf("\r\n myDriverInit \r\n"); return 0; } //打开 static rt_err_t myDriverOpen(rt_device_t dev, rt_uint16_t oflag) { if(dev==RT_NULL) { return -1; } rt_kprintf("\r\n myDriverOpen \r\n"); return 0; } //读 static rt_ssize_t myDriverRead(rt_device_t dev, rt_off_t pos, void *buffer, rt_size_t size) { int i=0; char *buf=buffer; if(dev==RT_NULL || buffer==RT_NULL) { return -1; } rt_kprintf("\r\n myDriverRead \r\n"); if(size>255) { size=255; } for(i=0;i
init=myDriverInit; dev1->open=myDriverOpen; dev1->read=myDriverRead; dev1->write=myDriverWrite; dev1->control=myDriverControl; dev1->close=myDriverClose; rt_device_register(dev1,name,flags); return 0; } ``` 编写测试函数 ``` int myDriverTest(void) { int err; int i=0; char buf[]="hello world!"; rt_device_t dev_t; dev_t=rt_device_find("myDriver"); if(dev_t == RT_NULL) { rt_kprintf("not find myDriver\r\n"); } rt_device_open(dev_t,RT_DEVICE_FLAG_RDWR); rt_device_control(dev_t,RT_NULL,RT_NULL); rt_device_write(dev_t,-1,buf,sizeof(buf)); rt_device_read(dev_t,0,buf,sizeof(buf)); for(i=0;i
1
条评论
默认排序
按发布时间排序
登录
注册新账号
关于作者
YZRD
这家伙很懒,什么也没写!
文章
25
回答
224
被采纳
19
关注TA
发私信
相关文章
1
RTT 是否有英文书籍
2
玩转嵌入式多任务程序设计——RT-Thread权威指南 【试读及反馈】
3
书籍: 嵌入式实时操作系统 RT-Thread设计与实现:内容注释错误
4
最新的RT-Thread编程手册版本
5
rtthread编程手册有没有英文版
推荐文章
1
RT-Thread应用项目汇总
2
玩转RT-Thread系列教程
3
国产MCU移植系列教程汇总,欢迎查看!
4
机器人操作系统 (ROS2) 和 RT-Thread 通信
5
五分钟玩转RT-Thread新社区
6
【技术三千问】之《玩转ART-Pi》,看这篇就够了!干货汇总
7
关于STM32H7开发板上使用SDIO接口驱动SD卡挂载文件系统的问题总结
8
STM32的“GPU”——DMA2D实例详解
9
RT-Thread隐藏的宝藏之completion
10
【ART-PI】RT-Thread 开启RTC 与 Alarm组件
热门标签
RT-Thread Studio
串口
Env
LWIP
SPI
AT
Bootloader
Hardfault
CAN总线
FinSH
ART-Pi
USB
DMA
文件系统
RT-Thread
SCons
RT-Thread Nano
线程
MQTT
STM32
RTC
FAL
rt-smart
I2C_IIC
ESP8266
UART
WIZnet_W5500
ota在线升级
cubemx
PWM
flash
freemodbus
BSP
packages_软件包
潘多拉开发板_Pandora
定时器
ADC
flashDB
GD32
socket
编译报错
中断
Debug
rt_mq_消息队列_msg_queue
SFUD
msh
keil_MDK
ulog
C++_cpp
MicroPython
本月问答贡献
出出啊
1518
个答案
343
次被采纳
小小李sunny
1444
个答案
290
次被采纳
张世争
813
个答案
177
次被采纳
crystal266
547
个答案
161
次被采纳
whj467467222
1222
个答案
149
次被采纳
本月文章贡献
出出啊
1
篇文章
5
次点赞
小小李sunny
1
篇文章
1
次点赞
张世争
1
篇文章
3
次点赞
crystal266
2
篇文章
2
次点赞
whj467467222
2
篇文章
2
次点赞
回到
顶部
发布
问题
投诉
建议
回到
底部