0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

模仿RT_Thread的设备驱动模型,使用C++实现

冬至子 来源:哈喽你好啊 作者:哈喽你好啊 2023-10-24 14:47 次阅读

现状

由于目前本人就职的公司不允许自由使用操作系统开发,且公司一般为C/C++混合开发的模式,驱动的开发也十分的草率,驱动代码与应用代码杂糅在一起,十分的不清晰。个人又十分喜爱RT_Thread这个系统,也翻阅过一些内核源码,学习到了非常多的有用的开发技能。

于是我想到,为何不能自己建立一套驱动管理机制来进行统一?于是萌发了使用C++来构建RT_Thread的设备驱动框架的想法。当然,我并没有做到完全一致,而是加入了自己的一些想法,并且也是基于了目前的开发现状来进行了一定的修改(不允许贴源码只能截图哈)。

实现过程说明

RT_Thread的内核对象分为很多种类别,线程、信号量、互斥量、设备、定时器…由于借鉴了RT_Thread的源码,故进行了删减,只保留设备部分,且去除了对象类型和动态申请内存使用的size变量(RT_Thread的源码这一部分代码就不贴了),如图:

1.jpg

内核对象类:

1.jpg

RT_Thread是把rt_object这个结构体作为双向链表的元素,这里的话是把CObject这个类作为双向链表的对象(C++的类其实和结构体是一样的)。

对象的操作只保留了object_find、object_init、object_detach,修改了register和unregister的操作。type、name、usr_data保留,其中type(设备的类型)根据实际应用做了一些修改(部分定义):

1.jpg

链表的插入删除操作原封不动“抄”了RT_Thread的源码,如图:

1.jpg

新增驱动的控制与循环

因为删除了open和close,且考虑到有些驱动需要调用循环实现一定的功能,故新增一个驱动控制类CObjCtrl:

1.jpg

该类非常简单,如果驱动未使能则循环退出,且循环的主体(ObjProcess())需要该类被继承后进行虚函数的重写。

新建注册类(基本抽象类)

注册类的作用主要就是继承了CObjCtrl,且替代RT_Thread的register函数和unregister函数,将对象接入双向链表。该类的实现如下:

1.jpg

需要注意的是,不在需要手动调用register和unregister这两个注册卸载函数了,因为在驱动类构造函数执行的时候回自动调用(见构造函数和析构函数)。GetType()和GetName()函数比较常规。构造函数需要传入驱动的类型、名字和私有数据(私有数据的作用下面会有说明)。

因为继承了CObjCtrl类,故需要重写虚函数ObjProcess(),重写的ObjProcess()函数由调用了本类的AbsLayerProcess()纯虚函数,故本注册类依然需要被继承后重写该纯虚函数AbsLayerProcess()。

驱动抽象类

该类主要就是继承了上述注册类,且存在常规的read、write、control接口(虚函数)。

RT_Thread的驱动初始化是在open函数调用的时候被调用的,我去除了open和close,所以驱动的初始化放在find函数内部,通过变量b_IsInitOK来记录是否已经进行过初始化,也可以手动调用函数DriverInitial()来进行驱动的初始化。查看构造函数可以发现,私有数据记录了本驱动抽象类的地址(因为传入了this指针)。

又重写了注册类的AbsLayerProcess()函数,该函数调用的真正需要驱动实现的循环函数DriverProcess()。

1.jpg

至此,设备驱动框架部分代码全部开发完毕。

使用示例

以flash芯片AT45DB为例:

1.jpg

需要实现驱动的read、write、control、init函数(因为该驱动不需要循环,所以不需要重写DriverProcess()循环函数)。构造函数传入SPI相关信息(自己实现的代码,不深究)和驱动类型及名字。

实例化驱动类,自动将“对象”注册至链表内:

1.jpg

使用如下:

1.jpg

至此,基本的设备驱动框架已经形成,当然后面又做了一定的拓展和优化,这里不再赘述。RT_Thread实在是一个宝藏系统!

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 驱动器
    +关注

    关注

    51

    文章

    7308

    浏览量

    142943
  • 控制器
    +关注

    关注

    112

    文章

    15223

    浏览量

    171189
  • SPI接口
    +关注

    关注

    0

    文章

    251

    浏览量

    33934
  • C++语言
    +关注

    关注

    0

    文章

    146

    浏览量

    6878
  • RT-Thread
    +关注

    关注

    31

    文章

    1148

    浏览量

    38872
收藏 人收藏

    评论

    相关推荐

    通用MCU RT_Thread设备注册应用笔记

    本文档主要描述 N32G45x 系列、N32G4FR 系列、N32WB452 系列、N32G43x 系列、N32L40x 系列、N32L43x 系列 MCU 的 RT_Thread 设备注册,便于使用者快速熟悉 RT_Thread
    发表于 11-02 07:53

    国民技术N32G4FR通用MCU RT_Thread设备注册应用笔记

    、N32L43x 系列 MCU 的 RT_Thread 设备注册, 便于使用者快速熟悉 RT_Thread 设备驱动
    发表于 11-07 14:53 3次下载

    N32WB452系列通用MCU RT_Thread设备注册应用笔记

    N32WB452系列通用MCU RT_Thread设备注册应用笔记
    发表于 11-10 19:51 0次下载
    N32WB452系列通用MCU <b class='flag-5'>RT_Thread</b><b class='flag-5'>设备</b>注册应用笔记

    N32G4FR系列通用MCU RT_Thread设备注册应用笔记

    N32G4FR系列通用MCU RT_Thread设备注册应用笔记
    发表于 11-10 19:51 1次下载
    N32G4FR系列通用MCU <b class='flag-5'>RT_Thread</b><b class='flag-5'>设备</b>注册应用笔记

    N32G457系列通用MCU RT_Thread设备注册应用笔记

    N32G457系列通用MCU RT_Thread设备注册应用笔记
    发表于 11-10 19:51 3次下载
    N32G457系列通用MCU <b class='flag-5'>RT_Thread</b><b class='flag-5'>设备</b>注册应用笔记

    N32G455系列通用MCU RT_Thread设备注册应用笔记

    N32G455系列通用MCU RT_Thread设备注册应用笔记
    发表于 11-10 19:51 0次下载
    N32G455系列通用MCU <b class='flag-5'>RT_Thread</b><b class='flag-5'>设备</b>注册应用笔记

    N32G452系列通用MCU RT_Thread设备注册应用笔记

    N32G452系列通用MCU RT_Thread设备注册应用笔记
    发表于 11-10 19:51 0次下载
    N32G452系列通用MCU <b class='flag-5'>RT_Thread</b><b class='flag-5'>设备</b>注册应用笔记

    N32G435系列通用MCU RT_Thread设备注册应用笔记

    N32G435系列通用MCU RT_Thread设备注册应用笔记
    发表于 11-10 19:51 1次下载
    N32G435系列通用MCU <b class='flag-5'>RT_Thread</b><b class='flag-5'>设备</b>注册应用笔记

    N32G432系列通用MCU RT_Thread设备注册应用笔记

    N32G432系列通用MCU RT_Thread设备注册应用笔记
    发表于 11-10 19:51 3次下载
    N32G432系列通用MCU <b class='flag-5'>RT_Thread</b><b class='flag-5'>设备</b>注册应用笔记

    N32L43x系列通用MCU RT_Thread设备注册应用笔记

    N32L43x系列通用MCU RT_Thread设备注册应用笔记
    发表于 11-10 19:51 0次下载
    N32L43x系列通用MCU <b class='flag-5'>RT_Thread</b><b class='flag-5'>设备</b>注册应用笔记

    N32L40x系列通用MCU RT_Thread设备注册应用笔记

    N32L40x系列通用MCU RT_Thread设备注册应用笔记
    发表于 11-10 19:51 0次下载
    N32L40x系列通用MCU <b class='flag-5'>RT_Thread</b><b class='flag-5'>设备</b>注册应用笔记

    N32G4FR系列通用MCU RT_Thread使用指南

    N32G4FR系列通用MCU RT_Thread使用指南
    发表于 11-11 21:50 2次下载
    N32G4FR系列通用MCU <b class='flag-5'>RT_Thread</b>使用指南

    N32G457系列通用MCU RT_Thread使用指南

    N32G457系列通用MCU RT_Thread使用指南
    发表于 11-11 21:50 0次下载
    N32G457系列通用MCU <b class='flag-5'>RT_Thread</b>使用指南

    N32G455系列通用MCU RT_Thread使用指南

    N32G455系列通用MCU RT_Thread使用指南
    发表于 11-11 21:50 1次下载
    N32G455系列通用MCU <b class='flag-5'>RT_Thread</b>使用指南

    N32G452系列通用MCU RT_Thread使用指南

    N32G452系列通用MCU RT_Thread使用指南
    发表于 11-11 21:50 3次下载
    N32G452系列通用MCU <b class='flag-5'>RT_Thread</b>使用指南