rtthread 设备驱动 示例

news2024/9/20 17:28:25

添加自定义驱动效果

在这里插入图片描述

驱动

my_test_driver.c

#include <stdint.h>
#include <stdio.h>
#include <rtthread.h>
/**
 * @brief 驱动初始化设备
 * 
 * @param device 需要初始化的设备
 * @return rt_err_t 返回初始化状态
 */
rt_err_t my_test_driver_init(struct rt_device *device)
{
    rt_kprintf("Hello my_test_driver_init\n");
    return 0;
}
/**
 * @brief 驱动打开设备
 * 
 * @param device 需要打开的设备
 * @param oflag 打开标志类型
 * @return rt_err_t 返回打开状态
 */
rt_err_t my_test_driver_open(struct rt_device *device, rt_uint16_t oflag)
{
    rt_kprintf("Hello my_test_driver_open\n");
    return 0;
}
/**
 * @brief 驱动关闭设备
 * 
 * @param device 需要关闭的设备
 * @return rt_err_t 返回关闭状态
 */
rt_err_t my_test_driver_close(struct rt_device *device)
{
    rt_kprintf("Hello my_test_driver_close\n");
    return 0;
}
/**
 * @brief 驱动读取设备
 * 
 * @param device 读取设备
 * @param pos 读取数据偏移量
 * @param buffer 读取数据buffer
 * @param size 读取数据大小
 * @return rt_ssize_t 返回读到数据的实际大小
 */
rt_ssize_t my_test_driver_read(struct rt_device *device, rt_off_t pos, void *buffer, rt_size_t size)
{
    rt_kprintf("Hello my_test_driver_read\n");
    return 0;
}
/**
 * @brief 驱动写设备
 * 
 * @param device 写入的设备
 * @param pos 写入数据偏移量
 * @param buffer 写入数据buffer
 * @param size 写入数据大小
 * @return rt_ssize_t 返回写入数据的实际大小
 */
rt_ssize_t my_test_driver_write(struct rt_device *device, rt_off_t pos, const void *buffer, rt_size_t size)
{
    rt_kprintf("Hello my_test_driver_write\n");
    return 0;
}
/**
 * @brief 驱动控制控制设备
 * 
 * @param device 控制设备
 * @param cmd 命令控制字,这个参数通常与设备驱动程序相关
 * @param args 控制参数
 * @return rt_err_t 返回控制状态
 */
rt_err_t my_test_driver_control(struct rt_device *device, int cmd, void *args)
{
    rt_kprintf("Hello my_test_driver_control\n");
    return 0;
}

设备

my_tset_device.c

#include <my_test_driver.h>
struct drv_mytest_device
{
    struct rt_device parent;
};

/**
 * @brief 定义的设备
 * 
 */
static struct drv_mytest_device my_test_device;

#ifdef RT_USING_DEVICE_OPS
/**
 * @brief 驱动ops接口
 * 
 */
const static struct rt_device_ops my_test_driver_ops =
    {
        my_test_driver_init,
        my_test_driver_open,
        my_test_driver_close,
        my_test_driver_read,
        my_test_driver_write,
        my_test_driver_control};
#endif
/**
 * @brief 设备驱动注册
 * 
 * @return int 
 */
int my_test_device_hw_init(void)
{
    my_test_device.parent.type = RT_Device_Class_Char;
#ifdef RT_USING_DEVICE_OPS
    my_test_device.parent.ops = &my_test_driver_ops;
#else
    my_test_device.init = my_test_driver_init;
#endif
    rt_device_register((rt_device_t)&my_test_device, "my_test", RT_DEVICE_FLAG_RDWR);
    return 0;
}
//添加到设备初始化列表
INIT_DEVICE_EXPORT(my_test_device_hw_init);

app使用设备驱动

my_tset_device_app.c

#include <stdint.h>
#include <stdio.h>
#include <rtthread.h>
#include <my_tset_device.h>
#include <rtdef.h>

/**
 * @brief 设备指针
 * 
 */
static  rt_device_t my_test_device_p = 0;
/**
 * @brief 设备初始化接口
 * 
 */
int my_test_device_init(void)
{
    my_test_device_p = rt_device_find("my_test");
    if (my_test_device_p == 0)
    {
        rt_kprintf("error!\n");
        /* get device information failed */
        return RT_ERROR;
    }
    my_test_device_p->ops->init(my_test_device_p);
    return RT_EOK;
}
void my_test_device_open(void)
{
    my_test_device_p->ops->open(my_test_device_p,RT_DEVICE_OFLAG_RDWR );
}
void my_test_device_close(void)
{
    my_test_device_p->ops->close(my_test_device_p);
}
//添加app初始化列表
INIT_APP_EXPORT(my_test_device_init);

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1872746.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

RAID在VPS主机中的作用是什么?

您是否担心过网站的可靠性&#xff1f;有时候网站会崩溃。服务器会不稳定。 在高峰时段&#xff0c;即使最好的网站也会变得很慢&#xff0c;让人很烦。 这就是VPS主机发挥作用的地方——为您的在线网络奠定坚实的基础。 想进一步提升稳定和可扩展&#xff1f;这就是RAID…

【YOLOv8模型onnx部署详解】YOLOv8模型转onnx格式并使用onnxruntime 进行推理部署

《------往期经典推荐------》 一、AI应用软件开发实战专栏【链接】 项目名称项目名称1.【人脸识别与管理系统开发】2.【车牌识别与自动收费管理系统开发】3.【手势识别系统开发】4.【人脸面部活体检测系统开发】5.【图片风格快速迁移软件开发】6.【人脸表表情识别系统】7.【…

讲透一个强大算法模型,Transformer !!

好像一直以来都没有和大家讨论过一个贼牛的模型 – Transformer&#xff01; 首先&#xff0c;咱们先用很直白的语言描述一下&#xff1a;想象你在读一本书&#xff0c;每一页都有很多词。如果你每次只能看到一个词&#xff0c;那么理解整本书会很慢。而Transformer模型就像是…

备忘录标签怎么弄 备忘录标签设置方法

在繁忙的生活中&#xff0c;我们常常需要记录各种琐事、工作任务和灵感闪现。备忘录成了我们不可或缺的助手&#xff0c;但随着时间的推移&#xff0c;备忘录里的内容越来越多&#xff0c;如何高效地管理和查找这些信息成了一个大问题。这时&#xff0c;备忘录的标签功能就显得…

TDengine 推出新连接器,与 Wonderware Historian 无缝连接

在最新发布的TDengine 3.2.3.0 版本中&#xff0c;我们进一步更新了 TDengine 的数据接入功能&#xff0c;推出了一款新的连接器&#xff0c;旨在实现 Wonderware Historian&#xff08;现称为 AVEVA Historian&#xff09;与 TDengine 的集成。这一更新提供了更加便捷和高效的…

【新手友好】计算机SCI期刊,IF=3+,编辑负责,修改稿件认真

一、期刊名称 Journal of Communications and Networks 二、期刊简介概况 期刊类型&#xff1a;SCI 学科领域&#xff1a;计算机科学 影响因子&#xff1a;3.6 中科院分区&#xff1a;3区 三、期刊征稿范围 《通信与网络杂志》每年出版六期&#xff0c;致力于发表高质量的…

【NeRF】ExtraNeRF:基于扩散模型的NeRF可见性视角外延

项目主页&#xff1a;https://shihmengli.github.io/extranerf-website/ 来源&#xff1a;华盛顿大学&#xff0c;康奈尔大学&#xff0c;谷歌研究&#xff0c;加州大学伯克利分校 标题&#xff1a;ExtraNeRF: Visibility-Aware View Extrapolation of Neural Radiance Fields …

OurBMC运营委员会2024年上半年度例会顺利召开

6 月 27 日&#xff0c;OurBMC 社区运营委员会 2024 年上半年度例会顺利召开。本次会议采用线上线下结合的方式&#xff0c;各委员在会上听取了 2024 年上半年社区运营委员会的工作总结汇报&#xff0c;并规划了下半年运营重点工作&#xff0c;同时针对社区活动改进、运营规划开…

【系统架构设计师】七、信息安全技术基础知识(网络安全技术|网络与信息安全风险|网络安全协议)

目录 一、网络安全技术 1.1 防火墙 1.2 入侵检测系统IDS 1.3 入侵防御系统IPS 1.4 杀毒软件 1.5 蜜罐系统 二、网络与信息安全风险 三、网络安全协议 四、相关推荐 五、历年真题练习 一、网络安全技术 1.1 防火墙 防火墙是在内部网络和外部因特网之间增加的一道安全…

四川赤橙宏海商务信息咨询有限公司抖音开店靠谱吗?

在数字化浪潮席卷全球的今天&#xff0c;电商行业正以前所未有的速度发展。而在这个大潮中&#xff0c;四川赤橙宏海商务信息咨询有限公司凭借其专业的团队和前瞻性的战略眼光&#xff0c;专注于抖音电商服务&#xff0c;为广大商家提供了一站式解决方案&#xff0c;成为了行业…

开放式耳机哪个牌子好?2024热门红榜开放式耳机测评真实篇!

当你跟朋友们聊天时&#xff0c;他们经常抱怨说长时间戴耳机会令耳朵感到不适,后台也有很多人来滴滴我&#xff0c;作为一位致力于开放式耳机的测评博主&#xff0c;在对比了多款开放式耳机之后&#xff0c;你开放式耳机在保护听力方面确实有用。开放式的设计有助于减轻耳道内的…

第31讲:K8S StorageClass使用rbd-provisioner驱动与Ceph RBD块存储集成

文章目录 1.rbd-provisioner驱动介绍2.在K8S集群中部署外部的rbd-provisioner驱动2.1.将Ceph集群的认证文件和配置上传到K8S的各个节点2.2.获取外部rbd-provisioner驱动的资源编排文件2.3.在集群中部署rbd-provisioner驱动程序2.4.进入rbd-provisioner容器中查看Ceph的配置文件…

[数据结构】——七种常见排序

文章目录 前言 一.冒泡排序二.选择排序三.插入排序四.希尔排序五.堆排序六.快速排序hoare挖坑法前后指针快排递归实现&#xff1a;快排非递归实现&#xff1a; 七、归并排序归并递归实现&#xff1a;归并非递归实现&#xff1a; 八、各个排序的对比图 前言 排序&#xff1a;所谓…

CentOS停止维护,如何应对?

一、事件背景 2020年12月08日&#xff0c;CentOS官方宣布了停止维护CentOS Linux的计划&#xff0c;并推出了CentOS Stream项目。 更多信息&#xff0c;请参见CentOS官方公告。 版本变化说明CentOS 9不再支持新的软件和补丁更新CentOS 82021年12月31日停止维护服务CentOS 720…

java简易计算器(多种方法)

parseDouble() 方法属于 java.lang.Double 类。它接收一个字符串参数&#xff0c;其中包含要转换的数字表示。如果字符串表示一个有效的 double&#xff0c;它将返回一个 double 值。 应用场景 parseDouble() 方法在以下场景中非常有用&#xff1a; 从用户输入中获取数字&a…

邮箱接口代码在安全性方面有哪些考虑因素?

邮箱接口代码如何实现&#xff1f;如何编写高效的邮箱接口代码&#xff1f; 邮箱接口代码在现代网络应用中发挥着重要作用&#xff0c;尤其是在处理电子邮件的发送和接收时。确保邮箱接口代码的安全性已成为开发者和企业的首要任务。AoKSend将探讨邮箱接口代码在安全性方面的考…

Talk|CityU 助理教授马佳葳: CVPR 2024, 基于多模态理解的混合数据专家模型

本期为TechBeat人工智能社区第604期线上Talk。 北京时间6月27日(周四)20:00&#xff0c;香港城市大学助理教授—马佳葳的Talk已经准时在TechBeat人工智能社区开播&#xff01; 他与大家分享的主题是: “基于多模态理解的混合数据专家模型”&#xff0c;他向大家介绍了混合数据专…

快递大件多少算超重物品?

在快递大件物品时&#xff0c;我们经常听到“超重”这个词&#xff0c;但究竟多重才算超重呢&#xff1f;今天&#xff0c;就让我们来探讨一下快递大件的超重标准&#xff0c;以及如何更经济地快递这些超重物品。 1. 祺祺寄快递&#xff1a; “祺祺寄快递”是一个便捷的快递服…

完美解决ValueError: column index (256) not an int in range(256)的正确解决方法,亲测有效!!!

完美解决ValueError: column index (256) not an int in range(256)的正确解决方法&#xff0c;亲测有效&#xff01;&#xff01;&#xff01; 亲测有效 完美解决ValueError: column index (256) not an int in range(256)的正确解决方法&#xff0c;亲测有效&#xff01;&…

鉴源实验室·基于MQTT协议的模糊测试研究

作者 | 张渊策 上海控安可信软件创新研究院工控网络安全组 来源 | 鉴源实验室 社群 | 添加微信号“TICPShanghai”加入“上海控安51fusa安全社区” 随着物联网技术的快速发展&#xff0c;越来越多的设备加入到互联网中&#xff0c;形成了庞大的物联网系统。这些设备之间的通信…