RT-Thread 提供了一套 I/O 设备模型框架方便用户定制一些特殊的IO提供统一的设备IO通过设备创建、注册、界面定义、注销等设备管理,实现设备驱动程序的包装 I/O 设备层提供的标准接口访问底层设备,设备驱动程序的升级和更换不会影响上层应用。
RT-Thread 自定义IO存储在设备中使用的功能函数中rt-thread/src/device.c相关宏定义主要在源码文件下rt-thread/src/rtdef.h源文件中。
一、 源代码示例1,IO创建和注册设备
#include <rtthread.h> #include <rtdef.h> rt_err_t init_test(rt_device_t dev) { rt_kprintf("init_test run!\n"); return 0; } rt_err_t open_test(rt_device_t dev, rt_uint16_t oflag) { rt_kprintf("open_test run!\n"); return 0; } rt_err_t close_test(rt_device_t dev) { rt_kprintf("close_test run!\n"); return 0; } static int iodef_reg_sample(int argc, char *argv[]) { rt_device_t dev = rt_device_create(RT_Device_Class_Char,64); if(dev==RT_NULL) { rt_kprintf("rt_device_create failed!\n"); return RT_ERROR; } //I/O 设备操作方法的映射,更多参考rt_device_t结构体定义 dev->init = init_test; dev->open = open_test; dev ->close = close_test; rt_err_t ret = rt_device_register(dev,"devtest",RT_DEVICE_FLAG_RDWR); if(ret!=RT_EOK) { rt_kprintf("rt_device_register failed!\n"); return RT_ERROR; } return RT_EOK; } /* 导出到 msh 命令列表中 */ MSH_CMD_EXPORT(iodef_reg_sample, io define for user register test example);
二、源码示例2已注册IO调用设备功能接口
#include <rtthread.h> #include <rtdef.h> static int iodef_use_sample(int argc, char *argv[]) { rt_device_t dev = rt_device_find("devtest"); if(dev==RT_NULL) { rt_kprintf("rt_device_find failed!\n"); return RT_ERROR; } rt_device_init(dev); rt_device_open(dev, RT_DEVICE_FLAG_RDWR); rt_device_close(dev); return RT_EOK; } /* 导出到 msh 命令列表中 */ MSH_CMD_EXPORT(iodef_use_sample, io define for user and be used test example);
三、源代码示例3取消自定义IO设备
#include <rtthread.h> #include <rtdef.h> static int iodef_ureg_sample(int argc, char *argv[]) { rt_device_t dev = rt_device_find("devtest"); if(dev==RT_NULL) { rt_kprintf("rt_device_find failed!\n"); return RT_ERROR; } rt_err_t ret = rt_device_unregister(dev); if(ret!=RT_EOK) { rt_kprintf("rt_device_unregister failed!\n"); return RT_ERROR; } return RT_EOK; } /* 导出到 msh 命令列表中 */ MSH_CMD_EXPORT(iodef_ureg_sample, io define for user unregister test example);
四、效果显示