【RT-Thread】 设备和驱动

RT-Thread 设备和驱动

一、RT-Thread IO设备模型框架

RT-Thread 提供了一套简单的 I/O 设备模型框架,如下图所示,它位于硬件和应用程序之间,共分成三层,从上到下分别是 I/O 设备管理层、设备驱动框架层、设备驱动层。

I/O 设备模型框架

image-20240728225818581

详细介绍请查看:官方手册

二、框架是如何对接的

简单 I/O 设备使用序列图

我们可以看上图,一开始的时候设备驱动会创建设备,并向IO设备管理器进行注册设备。

这一过程是在哪里完成的呢?

可以查看我的这一篇文章:RT-Thread驱动流程

1.Pin

以Pin设备为例子

image-20240728231000372

可以看到他在板极初始化的时候就被自动注册到io设备上。

image-20240728231103638

_stm32_pin_ops是stm32控制io的一些操作。

image-20240728231151890

image-20240728231140225

这些函数都有bsp工程师,帮我们想对应的封装好了。

image-20240728231306622

此时我们去调用rt_pin_write

image-20240728231355457

就会调用ops中的写函数,实际上就是_stm32_pin_ops的写函数。

image-20240728231518405

image-20240728231536629

2.iic

我们使用menuconfig使能iic总线

可以看到rtconfig.h

image-20240728232406341

image-20240728232419539

image-20240728232510743

rt_i2c_bit_ops就是把ii2相同的特性提前出来,而不同的特性data来调用

image-20240728232741136

image-20240728232806811

image-20240728232839882

可以看到最后的设备层操作函数也是调用设备驱动层的

ps:用文章的形式不好讲清楚,推荐大佬的b站视频:

Hello!RT-Thread
.bilibili.com/video/BV1SU4y197j7?vd_source=8c1bf9924f2718d7b70c1876a083a32e)

### RT-Thread 中的 RTC 驱动开发 在嵌入式系统中,RTC (Real-Time Clock) 是一种用于维持时间信息的硬件模块。对于基于 RT-Thread 的项目而言,实现一个可靠的 RTC 驱动能极大地提升系统的实用性用户体验。 #### RTC 设备注册与初始化过程 为了使 RTC 功能正常工作,在 RT-Thread 下需先完成设备对象创建并将其挂载到系统中去。这通常通过调用 `rt_device_register` 函数来达成[^1]: ```c static struct rt_device rtc_dev; /* 初始化函数 */ int drv_rtc_init(void){ /* ...省略具体初始化代码... */ /* 注册为字符型设备 */ rtc_dev.type = RT_Device_Class_Char; /* 设置读写控制方法 */ rtc_dev.read = rtc_read; rtc_dev.write = NULL; // 不支持直接写操作 rtc_dev.open = rtc_open; rtc_dev.close = rtc_close; rtc_dev.control = rtc_control; /* 将此设备加入系统 */ rt_device_register(&rtc_dev, "rtc", RT_DEVICE_FLAG_RDWR); return RT_EOK; } ``` 上述代码片段展示了如何定义一个新的 RTC 设备实例以及设置其基本属性回调接口,并最终利用 `rt_device_register()` 方法向内核报告该新成员的存在[^2]。 #### 实现具体的读取/设置时间获取状态功能 针对不同的 MCU 或者 SoC 平台,开发者可能需要编写特定于平台的时间戳解析逻辑。下面给出了一组简化版的操作 API 定义方式作为参考[^3]: ```c #include <rtthread.h> #include <drv_cfg.h> #define DRV_DEBUG #ifdef DRV_DEBUG #define DBG printf #else #define DBG #endif // 获取当前时间 static rt_size_t rtc_read(struct rt_device *dev, rt_off_t pos, void *buffer, rt_size_t count) { struct tm timeinfo; HAL_RTC_GetTime(&hrtc, &timeinfo, RTC_FORMAT_BIN); memcpy(buffer, &timeinfo, sizeof(timeinfo)); return sizeof(timeinfo); } // 控制命令处理程序 static int rtc_ioctl(struct rt_device *device, int cmd, void *args) { switch(cmd){ case RTC_CMD_GET_TIME: { struct tm* p_time = args; HAL_RTC_GetTime(&hrtc, p_time, RTC_FORMAT_BIN); } break; case RTC_CMD_SET_TIME: { const struct tm* new_time = args; HAL_RTC_SetTime(&hrtc, (RTC_TimeTypeDef*)new_time, RTC_FORMAT_BIN); } break; default: return -RT_ERROR; } return RT_EOK; } ``` 这段 C 语言源码实现了两个重要的功能——从 RTC 芯片读取当前日期时间(`read`) 响应来自应用程序层面对 RTC 进行配置调整请求 (`ioctl`) 。这里假设底层已经存在了一个可以工作的 HAL 库来进行实际寄存器级别的交互[^4]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值