Toggle navigation
首页
问答
文章
积分商城
专家
专区
更多专区...
文档中心
返回主站
搜索
提问
会员
中心
登录
注册
RT-Thread
内核学习
rt_device
RT-Thread 内核学习笔记 - 设备模型rt_device的理解
发布于 2021-02-24 22:23:25 浏览:2932
订阅该版
[tocm] [RT-Thread 入门学习笔记 - 目录](https://club.rt-thread.org/ask/article/3420.html) [RT-Thread 内核学习笔记 - 内核对象rt_object](https://club.rt-thread.org/ask/article/2493.html) [RT-Thread 内核学习笔记 - 内核对象管理](https://club.rt-thread.org/ask/article/2494.html) [RT-Thread 内核学习笔记 - 内核对象操作API](https://club.rt-thread.org/ask/article/2513.html) [RT-Thread 内核学习笔记 - 内核对象初始化链表组织方式](https://club.rt-thread.org/ask/article/2522.html) [RT-Thread 内核学习笔记 - 内核对象链表结构深入理解](https://club.rt-thread.org/ask/article/2549.html) [RT-Thread 内核学习笔记 - 设备模型rt_device的理解](https://club.rt-thread.org/ask/article/2570.html) [RT-Thread 内核学习笔记 - 理解defunct僵尸线程](https://club.rt-thread.org/ask/article/2580.html) ## 前言 - 最近在看内核源码,暂时避开费脑力的任务调度、内存管理等较复杂的实现方法,发现rt_device设备框架实现很简单。 - 设备管理框架rt_device(模型),提供标准的设备操作接口API,一些外设可以抽象成设备,进行统一的管理操作,如LCD、Touch、Sensor等。 ## rt_device的结构 - rt_device是内核对象派生出来的,因此有些操作就是在操作内核对象。 - 上几篇笔记研究内核对象的管理,现在发现阅读 **device.c** 的源码,很容易就能看懂。   ## rt_device的使用 - RT-Thread 的PIN、CAN、Serial、I2C、SPI、PM等,都抽象成一种设备模型,这些复合设备模型,派生于rt_device。 pin设备模型结构如下: ```c /* pin device and operations for RT-Thread */ struct rt_device_pin { struct rt_device parent; /* 派生于rt_device */ const struct rt_pin_ops *ops; /* 设备特有的操作接口,还可以根据需要增加其他成员 */ }; ``` - 用户可以派生自己想要的设备框架,增加特定设备的操作接口:ops,特定属性:结构体成员。 - 需要把具体的设备 **对象** 注册到内核容器上,调用rt_device的注册接口 `rt_device_pin_register`。 - 设备注册示例: ```c /* 使用时,需要把设备名称、操作接口等,传入 */ int rt_device_pin_register(const char *name, const struct rt_pin_ops *ops, void *user_data) { _hw_pin.parent.type = RT_Device_Class_Miscellaneous; /* 设备类型,为了区分设备种类 */ _hw_pin.parent.rx_indicate = RT_NULL; /* 接收回调,上层应用会设置 */ _hw_pin.parent.tx_complete = RT_NULL; /* 发送回调,上层应用会设置 */ #ifdef RT_USING_DEVICE_OPS _hw_pin.parent.ops = &pin_ops; #else _hw_pin.parent.init = RT_NULL; /* 以下标准的rt_device设备操作接口,根据需要实现 */ _hw_pin.parent.open = RT_NULL; _hw_pin.parent.close = RT_NULL; _hw_pin.parent.read = _pin_read; _hw_pin.parent.write = _pin_write; _hw_pin.parent.control = _pin_control; #endif _hw_pin.ops = ops; /* 设备的特有操作接口 */ _hw_pin.parent.user_data = user_data; /* 不是必要的用户数据 */ /* register a character device */ rt_device_register(&_hw_pin.parent, name, RT_DEVICE_FLAG_RDWR); /* 设备注册接口:注册为具体设备 */ return 0; } ``` - 具体设备对接设备框架 ```c /* 具体设备的OPS 实现 */ const static struct rt_pin_ops _stm32_pin_ops = { stm32_pin_mode, stm32_pin_write, stm32_pin_read, stm32_pin_attach_irq, stm32_pin_dettach_irq, stm32_pin_irq_enable, }; /* 实际设备的注册方法 */ rt_device_pin_register("pin", &_stm32_pin_ops, RT_NULL); ``` - 设备注册后,可以通过:list_device查看 ## 其他 - rt_device_read rt_device_write等操作前,需要:rt_device_open - rt_device_open rt_device_close 操作最好成对出现,原因是rt_device内部有引用计数,如你open两次,close一次,计数为1,没有真正的close。 - 一般通过rt_device_find,通过设备名称,查找设备,获取设备的操作句柄,也就是设备结构体指针,从而可以进一步进行操作设备的操作接口ops或通过设备的标准操作接口操作设备。 - RT-Thread 的设备类型很多,可以派生各种设备模型(框架),从而可以注册挂载很多设备上去,可以方便的实现读写控制等操作,如控制硬件、传感器等。 ## 总结 - 设备派生于内核对象:rt_object,熟悉内核对象,有利于熟悉rt_device的操作 - 继续研究RT-Thread内核,不断学习,收获很多。
1
条评论
默认排序
按发布时间排序
登录
注册新账号
关于作者
张世争
学以致用
文章
131
回答
813
被采纳
178
关注TA
发私信
相关文章
1
RT-THREAD在STM32H747平台上移植lwip
2
正点原子miniSTM32开发板读写sdcard
3
反馈rtt串口驱动对低功耗串口lpuart1不兼容的问题
4
Keil MDK 移植 RT-Thread Nano
5
RT1061/1052 带 RTT + LWIP和LPSPI,有什么坑要注意吗?
6
RT thread HID 如何收发数据
7
求一份基于RTT系统封装好的STM32F1系列的FLASH操作程序
8
RT-Thread修改项目名称之后不能下载
9
rt-studio编译c++
10
有木有移植rt-thread(nano)到riscv 32位MCU上
推荐文章
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
DMA
USB
文件系统
RT-Thread
SCons
RT-Thread Nano
线程
MQTT
STM32
RTC
rt-smart
FAL
I2C_IIC
ESP8266
UART
cubemx
WIZnet_W5500
ota在线升级
PWM
BSP
flash
freemodbus
packages_软件包
潘多拉开发板_Pandora
定时器
GD32
ADC
flashDB
编译报错
socket
中断
Debug
rt_mq_消息队列_msg_queue
msh
keil_MDK
ulog
SFUD
C++_cpp
at_device
本月问答贡献
出出啊
1520
个答案
343
次被采纳
小小李sunny
1444
个答案
290
次被采纳
张世争
813
个答案
178
次被采纳
crystal266
554
个答案
162
次被采纳
whj467467222
1222
个答案
149
次被采纳
本月文章贡献
出出啊
1
篇文章
1
次点赞
小小李sunny
1
篇文章
1
次点赞
张世争
1
篇文章
3
次点赞
crystal266
2
篇文章
1
次点赞
whj467467222
2
篇文章
2
次点赞
回到
顶部
发布
问题
投诉
建议
回到
底部