【本帖内容】RT-thread学习之object对象管理机制
RT-thread学习之RTT 的与众不同RT-thread学习之Thread线程机制及应用
RT-thread学习之线程间的同步
RT-thread学习之设备层框架设计浅析
说实话,如何讲明白object机制,对我来讲还是有点难,不是不能将RTT这部分机制的原理细节给罗列出来,难的是怎么讲才能真的有意义,让大家看后会跟看RTT编程手册有一种不同的感悟呢,考虑了很久,决定以一个实施框架的项目作为开题,从实现细节和应用细节上来局部展开讲,希望带给大家不同的感受,尤其是那些习惯了main.c中while(1)的筒子们,改变思想很难,看后也许你会讲,居然还有这种脱裤子放屁的玩法,那我的目的也就达到了。
下面先来看第一个不常用的选手(链表童鞋)
XXX类型 xxx链表
{
XXX链表* xxx...
}
这到底是个啥,难道是递归嘛???
这是来自某大神的代码框架,感谢某大神的贡献,让我再编程的道路上,又感悟了不少,这是一个实战想的应用项目,所以只能截取片段给大家分享:
上述这个结构体,我们称之为链表或者节点,具体怎么叫看你吧,实际上他只是一个节点的类型,但是拥有它,你可以找到这个节点所在链表上的任何一个其它的节点。
这就是他的强大之处。
先来说说看不懂的地方,首先这部分代码是一个list_head的结构体宏定义,没毛病,但是有毛病的是结构体的成员居然是list_head指针类型,这货连自己是谁都没看清,就开始引用自己
那谁能解释清楚这货到底是个什么类型呢。有点像是递归,没有终点,但实际上并不是这么理解的,多年后才转过弯来。
首先来看两个点,struct list_head 和struct list_head*,这俩对于编译器意味着什么呢。
其实这俩对于编译器来讲区别太大了,前者是一个不确定类型,内部成员你定义好后,编译器才知道该给他分配多大空间。
后者是一个指针,其实char* 和 struct list_head* 都是一样的,对于32位机来讲,都是一个四字节的指针,占用空间是相同,唯一不同的是指针类型不同,这个是在编译的时候确认的,所以采用上述方式定义一个链表类型变量是没毛病的。
为什么要引入链表的机制,这里还是要讲一下,在传统的编程中,其实主要用到就两类,数据和函数,但函数本身也是一种数据,在存储方面,函数名本身就是一个占四个字节的指针变量,你可以定义一个函数指针类型的变量,然后将不同的函数指针赋值给该函数指针,那么接下来就是神奇的发生了,通过一个函数指针可以加载不同的函数在程序中执行,那这一刻,函数和数据之间的界限也就不那么清晰明了了,函数本身也是一种数据,引入操作系统的功能之一就是对于线程切换的控制,线程功能的本身就是一个函数功能,切换线程也就是切换函数,一个软件中又不会只有一个线程,而是一堆的线程,如何管理的问题就只能交给链表来做了,方便快捷。
前面定义了链表或者说一个节点,这个我也不知道该怎么说明吧,下面看看针对链表需要实现的功能。
链表的基本操作(我在代码中加了很多的注释,方便理解,就不手动翻译了,感觉应该看得懂):
创建链表:
前面讲了一下链表的内容和基本操作,实际单纯的链表功能对于os来讲是毫无意义的,就像是轮子对车子而言才有意义,单纯只有轮子然而没什么用处,这里实现一种最简单的线程管理机制,定时开启某个线程,至于线程执行过程中的一些操作像线程阻塞机制都未实现,说白了这个只是个os的框架只具备其神,真正的os内核实现要比这复杂的多,再介绍具体的实现操作以前,先引入object的概念吧,这也是这篇帖子的核心,拖到这才讲,object(一切以对象为基本单位),程序中的基本单位就是对象,不是变量,常量,函数,但是它们都可以被看做是对象,原有的知识构架中,变量+函数就能实现软件功能,但未考虑过是否可以把二者集合,这样会产生另一种神奇现象,以对象的概念理解软件远比散落一堆的数据加函数的处理上要简单的多。下面看一下真正应用中如何实现的把。
类比C++,struct 类似class timer_value就是一个类的概念了,用timer_value可以定义一个对象的实例,实际应用中操作的也是这个对象,利用对象你可以轻松操作内部的数据和函数,这样就完美的把原本无关联的相关的内容关联起来,软件从这里开始会变得有趣。
接下来将定时处理与链表关联起来的问题。
【本帖内容】RT-thread学习之object对象管理机制
RT-thread学习之RTT 的与众不同