![](https://img-blog.csdnimg.cn/20190918135101160.png?x-oss-process=image/resize,m_fixed,h_224,w_224)
rt-thread
文章平均质量分 80
rt-thread RTOS学习
云会宾
云无心
展开
-
rtt面向对象oopc——3.对官方IO设备模型框架图的补充绘图
本篇主要给rtt官方文档《IO设备模型》的IO设备框架图进行重绘以具体化理解该文档,因为该文档框架图没有点名各层所在c文件,不够具体化。rtt官方文档链接——《IO设备模型》1.官方IO设备框架图2.我重绘的具体设备框架图...原创 2022-03-05 12:50:08 · 1985 阅读 · 0 评论 -
rtt学习记录、面向对象oopc等分享
RTT学习记录分享原创 2019-11-09 20:49:57 · 484 阅读 · 1 评论 -
rtt面向对象oopc——0.类、对象及派生
rtt的基本操作单位是对象,任何对象都实质是个结构体。但任何对象都是对内核对象的继承,所有的对象都是内核对象的子孙,像树的结构一样。rtt的各对象都有各自的对象控制块。对象控制块是对象的载体和体现。也可以说对象指的就是对象控制块。所有的对象都有一个祖宗:内核对象基类(struct rt_object)。都是内核对象基类派生出来的。有的都派生的好几代。参照树结构。目前知道的对象控制块或者说对象...原创 2019-10-18 08:11:17 · 596 阅读 · 0 评论 -
RTT常用API
RTT常用API2018年12月29日10:491.线程apirt_thread_init 静态线程创建rt_thread_detach 静态线程脱离rt_thread_create 动态线程创建rt_thread_delete 动态线程删除rt_thread_startup 动/静态线程启动2.进入临界资源所用api,2种方式,一种开关调度器实现,不关中断,此时来了中断还会...原创 2019-10-18 07:56:04 · 1174 阅读 · 2 评论 -
从RT-Thread RTOS接触到的3个算法
——基于[野火®]《RT-Thread 内核实现与应用开发实战—基于STM32》第一部分的学习,6-12章,是为mdk仿真,了解了RT-Thread的基础。感谢野火。可能理解有不对的地方请大神指教。1.给出结构体的成员,反推结构体的起始地址。这个算法是把数字0强制转换成这个结构体类型,然后取出这个结构体成员,这就是这个结构体成员的在结构体中偏移量。有了这个偏移量再根据这个成员的地址,就算出...原创 2018-11-20 09:29:47 · 1417 阅读 · 0 评论 -
rtthread官方路径
rtt官方文档https://www.rt-thread.org/document/site/#/rt-thread-version/rt-thread-standard/programming-manual/device/devicertt官方论坛https://club.rt-thread.org/u/8f33aaa06916b99b/article.htmlrtt官网https://www.rt-thread.org/原创 2024-04-10 10:15:41 · 251 阅读 · 0 评论 -
rtt的io设备框架面向对象学习-内部调用流程
rt_device_open做的事是把rt_device_find找到的指针转成设备基类的指针,然后调用设备基类规定的open方法——这个是设备驱动框架层的各个类重写的方法,每个类不一样,然后设备驱动层的各类重写的这个open函数里又会调用它们各自对子类定义的方法,这些方法是设备驱动层(各bsp)实现的方法,这些方法不同bsp实现不同。反正注册时注册的函数在io设备管理接口最上层的接口调用会层层的从设备驱动框架层到设备驱动层注册的父类方法。再加上各个设备特有使用方法。参见官方文档查看各个设备的是使用方法。原创 2024-03-24 16:51:00 · 272 阅读 · 0 评论 -
rtt的IO设备框架面向对象学习-oopc实现特点
其构造函数的实质,是对结构体进行初始化,在C中没有面向对象语言层面的机制,只能采用结构体套用结构体来模拟,这样原先定义好的结构体以及其对象构造函数对新扩展的(包含它的)结构体是解耦的,你新增一个新扩展(包含它的)新结构体,初始化它(面向对象叫父类)时只需要调用它对应的构造函数即可,对于新结构体来说原先的结构体是固定不变的,解耦了。所以这个方式的初始化不像那种把结构体成员挨个赋值这么繁琐,因为rtt规定了这些结构体以及封装了其初始化函数(在c++面向对象中叫构造函数),只需调用即可。原创 2024-03-23 21:59:01 · 559 阅读 · 0 评论 -
rtt的io设备框架面向对象学习-硬件定时器设备
不想再一个个设备类的往里套了,它们都是遵循相同的套路——rtt抽象出该设备的设备驱动框架层的类,然后由各个BSP实现其驱动层的类以及其构造函数,在驱动层的类构造函数里调用父类构造函数——设备驱动层的基类构造函数,然后它再调用父类构造函数——IO设备管理层的设备基类的构造函数——然后将对象放入到对象容器里去管理。所谓的面向对象也是采用oopc写法,结构体套结构体,然后每个结构体都是模拟的一类,自然每个结构体都要给它一个初始化函数——模拟构造函数。就这样所有设备对象都抽象统一到同样的使用接口了,参见。原创 2024-03-22 06:07:16 · 169 阅读 · 0 评论 -
rtt自动初始化机制学习
通过以下两篇文章基本能搞懂rtt的自动初始化机制,从此你也可以借鉴写自己的自动初始化字段。原创 2024-03-19 17:13:50 · 475 阅读 · 0 评论 -
rtt的io设备框架面向对象学习-电阻屏LCD设备
从上面代码可以知道它是调用在/ components / drivers / core /device.c中设备基类的构造函数rt_device_register,将电阻屏LCD设备对象放到对象容器里管理。至于i2c和spi通信的电阻屏LCD是怎么操作的,通过查找,是没有新的对象的,都是直接对i2c总线和spi设备关联,直接包装发送数据即可,没有上面8080通信口那样子的新的设备框架对象。并在构造函数drv_lcd_hw_init中赋给了设备基类的user_data 成员。然后实例化了该设备类。原创 2024-03-04 22:26:10 · 1066 阅读 · 0 评论 -
rtt的io设备框架面向对象学习-io设备管理层
目录1.设备基类2.rtt基类2.1 rtt基类定义2.2 对象容器定义2.3 rtt基类构造函数3.io设备管理接口4.总结这层我的理解就是rtt基类和设备基类所在,所以抽离出来好点,不然每个设备类都要重复它。1.设备基类/include/rtdef.h中定义了设备基类struct rt_device。在/ components / drivers / core 下的device.c中实现了设备基类的构造函数rt_device_register。rt_err_t rt_device_regis原创 2024-03-04 00:00:26 · 1074 阅读 · 0 评论 -
rtt的io设备框架面向对象学习-触摸设备
整个设备对象的构造/初始化流程其实是对具体设备对象也就是结构体进行初始化赋值——它这个结构体是包含一个个的结构体——模拟的是面向对象的继承机制。跟套娃似的,层层进行初始化。这样的好处是什么?每层有每层的初始化(构造)函数,就模拟了面向对象的构造函数——按照先调用子类构造/初始化函数,再调用父类的构造/初始化函数方式——其实也是子类构造/初始化函数调用父类构造/初始化函数的流程,来完成设备对象的初始化/构造。最终放到对象容器里来管理。原创 2024-02-29 16:43:13 · 482 阅读 · 0 评论 -
rtt的io设备框架面向对象学习-软件模拟rtc设备
整个设备对象的构造/初始化流程其实是对具体设备对象也就是结构体进行初始化赋值——它这个结构体是包含一个个的结构体——模拟的是面向对象的继承机制。跟套娃似的,层层进行初始化。这样的好处是什么?每层有每层的初始化(构造)函数,就模拟了面向对象的构造函数——按照先调用子类构造/初始化函数,再调用父类的构造/初始化函数方式——其实也是子类构造/初始化函数调用父类构造/初始化函数的流程,来完成设备对象的初始化/构造。最终放到对象容器里来管理。原创 2024-02-17 08:57:58 · 1073 阅读 · 0 评论 -
rtt的io设备框架面向对象学习-硬件rtc设备
整个设备对象的构造/初始化流程其实是对具体设备对象也就是结构体进行初始化赋值——它这个结构体是包含一个个的结构体——模拟的是面向对象的继承机制。跟套娃似的,层层进行初始化。这样的好处是什么?每层有每层的初始化(构造)函数,就模拟了面向对象的构造函数——按照先调用子类构造/初始化函数,再调用父类的构造/初始化函数方式——其实也是子类构造/初始化函数调用父类构造/初始化函数的流程,来完成设备对象的初始化/构造。最终放到对象容器里来管理。原创 2024-02-16 02:24:27 · 1068 阅读 · 0 评论 -
rtt的io设备框架面向对象学习-串口设备
整个设备对象的构造/初始化流程其实是对具体设备对象也就是结构体进行初始化赋值,按照先调用子类构造/初始化函数,再调用父类的构造/初始化函数方式——其实也是子类构造/初始化函数调用父类构造/初始化函数的流程,来完成设备对象的初始化/构造。最终放到对象容器里来管理。其实每个类的注册函数都是其构造函数。原创 2024-02-15 13:30:22 · 735 阅读 · 0 评论 -
rtt的io设备框架面向对象学习-输入捕捉设备
整个设备对象的构造/初始化流程其实是对具体设备对象也就是结构体进行初始化赋值,按照先调用子类构造/初始化函数,再调用父类的构造/初始化函数方式——其实也是子类构造/初始化函数调用父类构造/初始化函数的流程,来完成设备对象的初始化/构造。最终放到对象容器里来管理。原创 2024-02-14 07:32:30 · 856 阅读 · 0 评论 -
rtt的io设备框架面向对象学习-脉冲编码器设备
整个设备对象的构造/初始化流程其实是对具体设备对象也就是结构体进行初始化赋值,按照先调用子类构造/初始化函数,再调用父类的构造/初始化函数方式——其实也是子类构造/初始化函数调用父类构造/初始化函数的流程,来完成设备对象的初始化/构造。最终放到对象容器里来管理。原创 2024-02-13 21:19:06 · 929 阅读 · 0 评论 -
rtt的io设备框架面向对象学习-pwm设备
整个设备对象的构造/初始化流程其实是对具体设备对象也就是结构体进行初始化赋值,按照先调用子类构造/初始化函数,再调用父类的构造/初始化函数方式——其实也是子类构造/初始化函数调用父类构造/初始化函数的流程,来完成设备对象的初始化/构造。最终放到对象容器里来管理。原创 2024-02-13 19:13:00 · 973 阅读 · 0 评论 -
rtt的io设备框架面向对象学习-dac设备
整个设备对象的构造/初始化流程其实是对具体设备对象也就是结构体进行初始化赋值,按照先调用子类构造/初始化函数,再调用父类的构造/初始化函数方式——其实也是子类构造/初始化函数调用父类构造/初始化函数的流程,来完成设备对象的初始化/构造。最终放到对象容器里来管理。原创 2024-02-13 15:11:25 · 917 阅读 · 0 评论 -
rtt的io设备框架面向对象学习-adc设备
整个设备对象的构造/初始化流程其实是对具体设备对象也就是结构体进行初始化赋值,按照先调用子类构造/初始化函数,再调用父类的构造/初始化函数方式——其实也是子类构造/初始化函数调用父类构造/初始化函数的流程,来完成设备对象的初始化/构造。最终放到对象容器里来管理。原创 2024-02-13 09:49:57 · 943 阅读 · 0 评论 -
rtt的io设备框架面向对象学习-pin设备
整个设备对象的构造/初始化流程其实是对具体设备对象也就是结构体进行初始化赋值,按照先调用子类构造/初始化函数,再调用父类的构造/初始化函数方式——其实也是子类构造/初始化函数调用父类构造/初始化函数的流程,来完成设备对象的初始化/构造。最终放到对象容器里来管理。原创 2024-02-12 10:07:49 · 945 阅读 · 0 评论 -
rtt的io设备框架面向对象学习-看门狗设备
整个stm32设备对象的构造/初始化流程就是按照先调用子类构造/初始化函数,再调用父类的构造/初始化函数。其实也是子类构造/初始化函数调用父类构造/初始化函数的流程,来完成设备对象的初始化/构造。最终放到对象容器里来管理。原创 2024-02-11 21:39:23 · 1091 阅读 · 0 评论 -
rtt的io设备框架面向对象学习-i2c总线
本来想着i2c和spi是一样的,标题都想抄袭成《rtt设备驱动框架学习-i2c总线和设备》,然后看过源码发现,i2c没有分开总线和设备,我想着正常它和spi一样有总线和设备,设备存在竞争,现在看来使用i2c时需要用户自己注意多线程下同一个i2c总线要分时复用哦。原创 2024-02-07 10:44:52 · 1017 阅读 · 0 评论 -
rtt的io设备框架面向对象学习-spi总线和设备
这个抽象出的方法作为软件spi总线类rt_spi_bit_obj的成员,为何还要再抽象?,这是spi设备对象指针,为何在spi总线里加个spi设备的指针成员,且还叫owner(字面意思:spi总线持有者或霸占者或拥有者)?对于软件spi,差异点就是要用gpio模拟硬件spi的4线或3线通信,那么软件gpio除了实现上面共同点ops操作方法外,还得抽象软件spi通信。因为有共同点所以得例程rt_spi_bus类,它的差异点抽象出了rt_spi_bit_ops操作方法实现gpio模拟spi通信。原创 2024-02-05 16:07:01 · 555 阅读 · 0 评论 -
rtt的io设备框架面向对象学习-框架总括
rt_device类是属于抽象类,所有子类得实现其特定的方法,这是对子类的约束,比如rt_serial,rt_spi_bus,等等,给图,调用rt_decice_register,然后设备驱动框架层的类也各有自己的方法,需要继承者(子类)来实现。看它们都调用设备基类的这个函数来注册。两个图,官方图和补充图。原创 2024-02-04 16:33:34 · 439 阅读 · 0 评论 -
rtt面向对象oopc——5.IO设备管理之快速查看设备父类调用设备子类的方法
如果说不想了解rtt的模型框架,就想快速查看某类设备的使用流程(即调用链),有没有捷径呢?有一个,只需定位到rtt的设备注册接口和rt_device_find查找它的地方即可。注册接口是骨架,顺流而上可以看到各类方法。查找它的地方是调用它的入口,和注册的方向相反。步骤参考方法:(1)去源码根目录下的components/drivers下,有各类设备,你想看某个设备就进去找rt_xxx_register接口(比如rt_hw_serial_register),就是带“register”名字的接口。找到了就找原创 2022-04-04 19:22:19 · 326 阅读 · 0 评论 -
rtt面向对象oopc——4.IO设备管理之父类调用子类方法
每类的管理接口实现访问该类的方法、实现该类注册、反注册、销毁等接口。原创 2022-04-03 07:31:58 · 482 阅读 · 0 评论 -
rtt面向对象oopc——2.对象容器理解和rtt类的联系
1.rtt对象容器rtt的对象容器就是一个数组,数组有多大?根据大类来的,每类占用数组的一个元素,有多少大类数组就有多大。每个元素维护该类的链表,如下官方图:rtt中所有类创建的对象把其基类调用rtt源码src / object.c中的rt_object_init挂到对象容器对应的链表中去。2.rtt对象容器作用rtt对象容器就是一个图书馆,你根据名字就能找到对应的对象的地址,就能使用它了。各个类创建一个对象就挂到对象容器的对应链表中去。对象容器可不就是个图书馆,各类创建对象相当于图书馆得到了原创 2022-03-02 11:29:21 · 734 阅读 · 0 评论 -
rtt面向对象oopc——1.rtt定义的这些类有什么用?
如原创 2022-03-01 19:37:03 · 423 阅读 · 0 评论 -
RTT——串口驱动分析(以stm32为例)
RTT——串口驱动分析(以stm32为例)原创 2019-11-09 20:43:17 · 594 阅读 · 0 评论 -
RTT实时操作系统概念
要拥有:1.高优先级线程立即获得处理器并得到执行2.在就绪列表中查找下一个最高优先级的速度要非常快,优先级查找算法(时间复杂度 O(1),即与就绪线程的多少无关)RTT的查找链表数组中最高优先级的算法:基于位图的优先级算法(时间复杂度 O(1),即与就绪线程的多少无关)时间片轮转:分时调度。...原创 2019-10-18 08:12:02 · 1672 阅读 · 0 评论 -
RTT的内存管理篇——为什么要进行内存管理?
因为变量的本体是内存,内存是变量的实质、生命。操作变量其实质就是操作内存。所以管理内存其实质就是管理变量的创建和删除,即变量的声明周期(诞生和死亡)。高效的管理内存机制对程序的运行起到高效率的促进。程序使处理数据的,数据就是变量就是内存。...原创 2019-10-18 07:55:02 · 836 阅读 · 0 评论 -
RTT的内存管理篇——野火RTT讲解
野火RTT第24章内存管理2018年12月29日10:48操作系统只给出内存管理函数原型,也就是函数声明。但是具体如何实现它是不管的。可靠性要求高的采用静态内存,内存使用效率低,而一般的也许使用动态内存可以提高内存使用效率。没有内存管理会出现内存碎片问题。内存碎片问题:不断分配和释放时导致内存对齐不同,就会出现很多小块的内存且地址是不连续的,在某个时刻系统会因为没有连续地址比较大的内存...原创 2019-10-18 07:54:04 · 1202 阅读 · 0 评论 -
RTT的栈
栈的生长方向2018年12月29日10:39向下生长:递减方式,即栈顶是栈的最后一个地址,数组的最后一个元素。向上生长:递增方式,即栈顶是栈的首个元素的地址,数组首个元素。RTT的线程栈是向下生长的栈是单片机RAM中一片连续的内存空间2018年12月29日10:39线程就是一个独立的、无限循环的且不可返回的函数2018年12月29日...原创 2019-10-18 07:52:33 · 306 阅读 · 0 评论 -
RTT的线程同步篇——异常管理
野火RTT第25章异常2018年12月29日10:47一、中断中使用RRT的IPC通信机制。异常分为同步异常和异步异常。中断属于异步异常。RTT建议在中断中采用信号量、消息、事件来标记。中断相关的硬件:外设、中断控制器、CPU。中断过程:外设产生中断,中断控制器设置优先级等并向CPU发送中断信号,CPU执行执行中断。二、中断号:和外设相绑定、指示哪个外设。中断向量:中断程序服...原创 2019-10-18 07:47:53 · 316 阅读 · 0 评论 -
RTT的线程同步篇——事件
野火RTT第21章事件2018年12月29日10:47事件也是线程间通信,仅用于实现线程间同步,而不能传输数据。可以在中断中发送事件。一对多:一个线程等待多个事件触发:多个事件中的任意一个发生就能唤醒线程这也叫独立型同步(逻辑或),也可以多个事件发生后才能唤醒线程,也叫关联型同步(逻辑与)。也就是:多个事件只是针对这一个线程,这多个事件只和某个线程绑定,这么多事件的触发只对一个线程有效,只...原创 2019-10-18 07:43:49 · 725 阅读 · 0 评论 -
RTT的线程同步篇——总结
一、信号量和互斥量的区别2018年12月29日10:47信号量强调做事的步骤,有先后。信号量可以在任何任务、中断里释放信号量,释放了你才能做下一步。信号量可能发生优先级翻转。信号量不能递归获取,否则会把自己给挂起来的互斥量强调所有权。独霸天下,我用的时候谁都不能用。互斥量可以自己重复获取互斥量,递归的获取而不会被挂起,这就是所有权独霸权。互斥量具有防止优先级反转的机制:优先级继承...原创 2019-10-18 07:45:26 · 562 阅读 · 0 评论 -
RTT的线程同步篇——互斥量
野火RTT第20章互斥量2018年12月29日10:47互斥量不能在中断服务程序中使用。互斥量是特殊的二值信号量,其“特殊”在哪呢?互斥量不同于二值信号量的地方在于:互斥量具有独占性(所有权)、递归性、优先级继承机制。二值信号量不能防止优先级翻转。为啥要有互斥量,二值信号量不就够了?后来一想,这是互斥量的特殊性,也为了方便管理,还是从信号量里面独立出来吧。这样的话函数好调用、也简单化了...原创 2019-10-16 21:54:22 · 985 阅读 · 0 评论 -
RTT的线程同步篇——信号量
野火RTT 19章信号量2018年12月29日10:46相当于裸机中的标志信号量:实现线程间的通信,实现线程间的同步货临界资源的互斥访问。多线程系统中,线程间需要同步或互斥实现临界资源保护。二值信号量:用于线程间、线程与中断间的同步。其他线程获取,信号量为0,释放信号量为1。二值信号量最大计数值为1。也就是信号量的个数最大为1。是计数型信号量的特殊情况(计数最大值为1)。例子:比如某...原创 2019-10-16 21:53:51 · 1304 阅读 · 0 评论