RTT设备驱动框架学习(CAN设备)

2024-04-22 14:36
文章标签 学习 驱动 框架 设备 rtt

本文主要是介绍RTT设备驱动框架学习(CAN设备),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

RTT设备框架属于组件和服务层,是基于RTT内核之上的上层软件。
设备框架是针对某一类外设,抽象出来的一套统一的操作方法及接入标准,可以屏蔽硬件差异,为应用层提供统一的操作方法。

RTT设备框架分为三层:设备驱动层、设备驱动框架层、I/O设备管理层。
其中设备驱动层直接对接底层硬件设备;I/O设备管理层向应用层提供了rt_device_find、open、read、write、close、register等访问设备的统一标准接口。而设备驱动框架层就是将同类型硬件设备的共同特征抽象出来,并且还预留了接口,可以添加不同设备的独有特性。

其中的设备模型被认为是一类对象,每个设备对象都是由基对象派生的,每个设备都可以继承其父类对象的属性,并派生私有属性。

正是这样的框架,使得RTT设备框架中各模块高内聚低耦合,对于已有的设备类型,只是将底层硬件的驱动对接到设备驱动层。就可以在应用程序中,调用统一的标准接口,使用不同厂家不同类型的硬件设备。

实例分析

设备对象在rtdef.h中的具体定义

struct rt_device
{struct rt_object parent;enum rt_device_class_type type;rt_uint16_t flag;rt_uint16_t open_flag;rt_uint8_t ref_count;rt_uint8_t device_id;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_OPSconst 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_DEVIOconst struct dfs_file_ops *fops;struct rt_wqueue wait_queue;
#endif /* RT_USING_POSIX_DEVIO */void                     *user_data;                /**< device private data */
};
}

然后从struct rt_device中派生出新的CAN设备类型struct rt_can_device,其中依据CAN类型设备共有的特性新增了一些结构体成员,位于rt-thread\components\drivers\include\drivers\can.h中

struct rt_can_device
{struct rt_device parent;const struct rt_can_ops *ops;struct can_configure config;struct rt_can_status status;rt_uint32_t timerinitflag;struct rt_timer timer;struct rt_can_status_ind_type status_indicate;
#ifdef RT_CAN_USING_HDRstruct rt_can_hdr *hdr;
#endif
#ifdef RT_CAN_USING_BUS_HOOKrt_can_bus_hook bus_hook;
#endif /*RT_CAN_USING_BUS_HOOK*/struct rt_mutex lock;void *can_rx;void *can_tx;
}

在stm32的CAN设备驱动中,又从struct rt_can_device中派生了新的CAN设备模型struct stm32_can,其中添加了这个设备类型的私有数据,便于底层驱动的对接:

struct stm32_can
{char *name;CAN_HandleTypeDef CanHandle;CAN_FilterTypeDef FilterConfig;struct rt_can_device;
};

可以看出,RTT通过结构体和函数指针使用C语言实现了一些面向对象编程的特性,如封装和继承等,这样面向对象、模块化的思维框架,有助于实现各模块之间高内聚低耦合,提高开发效率。

操作方法

在struct rt_can_device中可以看到针对CAN设备有以下操作方法,这些操作方法是需要我们在设备驱动层去针对不同的硬件设备进行对接实现的。对于一些特殊的设备类型,可以不用对接其所有的操作方法。

struct rt_can_ops{    rt_err_t (*configure)(struct rt_can_device *can, struct can_configure *cfg);    rt_err_t (*control)(struct rt_can_device *can, int cmd, void *arg);    int (*sendmsg)(struct rt_can_device *can, const void *buf, rt_uint32_t boxno);    int (*recvmsg)(struct rt_can_device *can, void *buf, rt_uint32_t boxno);
};

在drv_can.c中,就实现了所有CAN设备的操作方法,并赋值给对应的函数指针,可以直接调用。并且通过static const修饰符,使结构体变量的内容是固定的,提高了代码的安全性和可维护性。然后通过rt_hw_can_register注册。

static const struct rt_can_ops _can_ops = 
{_can_config,_can_control,_can_sendmsg,_can_recvmsg,
};
rt_err_t rt_hw_can_register(struct rt_can_device *can, const char *name, const struct rt_can_ops *ops, void *data);
rt_hw_can_register(&drv_can1.device, drv_can1.name, &_can_ops, &_can_ops, &drv_can1);

其中最后一个参数为void类型指针,在注册同类型的不同设备时,就可以通过最后一个参数,在注册时传入其特有的私有数据。例如STM32的drv_can中传入的就是stm32_can结构体类型,其中就包含了stm_can的私有数据域,在对接底层硬件驱动的时候就会方便很多。

这篇关于RTT设备驱动框架学习(CAN设备)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/926046

相关文章

Python Dash框架在数据可视化仪表板中的应用与实践记录

《PythonDash框架在数据可视化仪表板中的应用与实践记录》Python的PlotlyDash库提供了一种简便且强大的方式来构建和展示互动式数据仪表板,本篇文章将深入探讨如何使用Dash设计一... 目录python Dash框架在数据可视化仪表板中的应用与实践1. 什么是Plotly Dash?1.1

基于Flask框架添加多个AI模型的API并进行交互

《基于Flask框架添加多个AI模型的API并进行交互》:本文主要介绍如何基于Flask框架开发AI模型API管理系统,允许用户添加、删除不同AI模型的API密钥,感兴趣的可以了解下... 目录1. 概述2. 后端代码说明2.1 依赖库导入2.2 应用初始化2.3 API 存储字典2.4 路由函数2.5 应

Python GUI框架中的PyQt详解

《PythonGUI框架中的PyQt详解》PyQt是Python语言中最强大且广泛应用的GUI框架之一,基于Qt库的Python绑定实现,本文将深入解析PyQt的核心模块,并通过代码示例展示其应用场... 目录一、PyQt核心模块概览二、核心模块详解与示例1. QtCore - 核心基础模块2. QtWid

最新Spring Security实战教程之Spring Security安全框架指南

《最新SpringSecurity实战教程之SpringSecurity安全框架指南》SpringSecurity是Spring生态系统中的核心组件,提供认证、授权和防护机制,以保护应用免受各种安... 目录前言什么是Spring Security?同类框架对比Spring Security典型应用场景传统

Java进阶学习之如何开启远程调式

《Java进阶学习之如何开启远程调式》Java开发中的远程调试是一项至关重要的技能,特别是在处理生产环境的问题或者协作开发时,:本文主要介绍Java进阶学习之如何开启远程调式的相关资料,需要的朋友... 目录概述Java远程调试的开启与底层原理开启Java远程调试底层原理JVM参数总结&nbsMbKKXJx

Python结合Flask框架构建一个简易的远程控制系统

《Python结合Flask框架构建一个简易的远程控制系统》这篇文章主要为大家详细介绍了如何使用Python与Flask框架构建一个简易的远程控制系统,能够远程执行操作命令(如关机、重启、锁屏等),还... 目录1.概述2.功能使用系统命令执行实时屏幕监控3. BUG修复过程1. Authorization

SpringBoot集成图片验证码框架easy-captcha的详细过程

《SpringBoot集成图片验证码框架easy-captcha的详细过程》本文介绍了如何将Easy-Captcha框架集成到SpringBoot项目中,实现图片验证码功能,Easy-Captcha是... 目录SpringBoot集成图片验证码框架easy-captcha一、引言二、依赖三、代码1. Ea

Gin框架中的GET和POST表单处理的实现

《Gin框架中的GET和POST表单处理的实现》Gin框架提供了简单而强大的机制来处理GET和POST表单提交的数据,通过c.Query、c.PostForm、c.Bind和c.Request.For... 目录一、GET表单处理二、POST表单处理1. 使用c.PostForm获取表单字段:2. 绑定到结

如何通过海康威视设备网络SDK进行Java二次开发摄像头车牌识别详解

《如何通过海康威视设备网络SDK进行Java二次开发摄像头车牌识别详解》:本文主要介绍如何通过海康威视设备网络SDK进行Java二次开发摄像头车牌识别的相关资料,描述了如何使用海康威视设备网络SD... 目录前言开发流程问题和解决方案dll库加载不到的问题老旧版本sdk不兼容的问题关键实现流程总结前言作为

Java深度学习库DJL实现Python的NumPy方式

《Java深度学习库DJL实现Python的NumPy方式》本文介绍了DJL库的背景和基本功能,包括NDArray的创建、数学运算、数据获取和设置等,同时,还展示了如何使用NDArray进行数据预处理... 目录1 NDArray 的背景介绍1.1 架构2 JavaDJL使用2.1 安装DJL2.2 基本操