您好, 登录| 注册|
论坛导航
您好, 登录| 注册|
子站:
论坛首页    单片机MCU/嵌入式
  •  发帖
  • 收藏

【RT-thread学习记】:object对象管理机制
阅读: 655 |  回复: 15 楼层直达

2018/10/31 12:22:24
1
s453208[版主]
电源币:810 | 积分:103 主题帖:43 | 回复帖:114
LV7
旅长

QQ截图20160321155901  玩大发了! 英飞凌最新无人机套件LARIX免费试用 招募中

QQ截图20160321155901  想学你就来!DSP学习板免费试用 限时申请


说实话,如何讲明白object机制,对我来讲还是有点难,不是不能将RTT这部分机制的原理细节给罗列出来,难的是怎么讲才能真的有意义,让大家看后会跟看RTT编程手册有一种不同的感悟呢,考虑了很久,决定以一个实施框架的项目作为开题,从实现细节和应用细节上来局部展开讲,希望带给大家不同的感受,尤其是那些习惯了main.c中while(1)的筒子们,改变思想很难,看后也许你会讲,居然还有这种脱裤子放屁的玩法,那我的目的也就达到了。

下面先来看第一个不常用的选手(链表童鞋)


XXX类型   xxx链表

{

   XXX链表*  xxx...

}

这到底是个啥,难道是递归嘛???

标签 STM32 MCU

电源网-璐璐在2018-12-04打赏该贴 +10 电源币 打赏理由:加油加油~

2018/10/31 13:04:27
2
紫蝶
电源币:177 | 积分:3 主题帖:25 | 回复帖:661
LV8
师长
这个不错,等待更新。
2018/12/03 14:58:10
3
s453208[版主]
电源币:810 | 积分:103 主题帖:43 | 回复帖:114
LV7
旅长

这是来自某大神的代码框架,感谢某大神的贡献,让我再编程的道路上,又感悟了不少,这是一个实战想的应用项目,所以只能截取片段给大家分享:

上述这个结构体,我们称之为链表或者节点,具体怎么叫看你吧,实际上他只是一个节点的类型,但是拥有它,你可以找到这个节点所在链表上的任何一个其它的节点。

这就是他的强大之处。

先来说说看不懂的地方,首先这部分代码是一个list_head的结构体宏定义,没毛病,但是有毛病的是结构体的成员居然是list_head指针类型,这货连自己是谁都没看清,就开始引用自己

那谁能解释清楚这货到底是个什么类型呢。有点像是递归,没有终点,但实际上并不是这么理解的,多年后才转过弯来。

首先来看两个点,struct list_head 和struct list_head*,这俩对于编译器意味着什么呢。

其实这俩对于编译器来讲区别太大了,前者是一个不确定类型,内部成员你定义好后,编译器才知道该给他分配多大空间。

后者是一个指针,其实char* 和 struct list_head* 都是一样的,对于32位机来讲,都是一个四字节的指针,占用空间是相同,唯一不同的是指针类型不同,这个是在编译的时候确认的,所以采用上述方式定义一个链表类型变量是没毛病的。

2018/12/03 15:57:33
4
s453208[版主]
电源币:810 | 积分:103 主题帖:43 | 回复帖:114
LV7
旅长

为什么要引入链表的机制,这里还是要讲一下,在传统的编程中,其实主要用到就两类,数据和函数,但函数本身也是一种数据,在存储方面,函数名本身就是一个占四个字节的指针变量,你可以定义一个函数指针类型的变量,然后将不同的函数指针赋值给该函数指针,那么接下来就是神奇的发生了,通过一个函数指针可以加载不同的函数在程序中执行,那这一刻,函数和数据之间的界限也就不那么清晰明了了,函数本身也是一种数据,引入操作系统的功能之一就是对于线程切换的控制,线程功能的本身就是一个函数功能,切换线程也就是切换函数,一个软件中又不会只有一个线程,而是一堆的线程,如何管理的问题就只能交给链表来做了,方便快捷。

前面定义了链表或者说一个节点,这个我也不知道该怎么说明吧,下面看看针对链表需要实现的功能。

2018/12/03 16:08:23
5
s453208[版主]
电源币:810 | 积分:103 主题帖:43 | 回复帖:114
LV7
旅长

链表的基本操作(我在代码中加了很多的注释,方便理解,就不手动翻译了,感觉应该看得懂):

创建链表:

2018/12/03 16:11:38
6
s453208[版主]
电源币:810 | 积分:103 主题帖:43 | 回复帖:114
LV7
旅长

添加节点(代码并不完美,但是还有可参考之处):


2018/12/03 16:16:44
7
s453208[版主]
电源币:810 | 积分:103 主题帖:43 | 回复帖:114
LV7
旅长

删除节点:

2018/12/03 16:20:24
8
s453208[版主]
电源币:810 | 积分:103 主题帖:43 | 回复帖:114
LV7
旅长

在某节点处插入一个节点操作:

2018/12/04 08:36:22
9
s453208[版主]
电源币:810 | 积分:103 主题帖:43 | 回复帖:114
LV7
旅长

前面讲了一下链表的内容和基本操作,实际单纯的链表功能对于os来讲是毫无意义的,就像是轮子对车子而言才有意义,单纯只有轮子然而没什么用处,这里实现一种最简单的线程管理机制,定时开启某个线程,至于线程执行过程中的一些操作像线程阻塞机制都未实现,说白了这个只是个os的框架只具备其神,真正的os内核实现要比这复杂的多,再介绍具体的实现操作以前,先引入object的概念吧,这也是这篇帖子的核心,拖到这才讲,object(一切以对象为基本单位),程序中的基本单位就是对象,不是变量,常量,函数,但是它们都可以被看做是对象,原有的知识构架中,变量+函数就能实现软件功能,但未考虑过是否可以把二者集合,这样会产生另一种神奇现象,以对象的概念理解软件远比散落一堆的数据加函数的处理上要简单的多。下面看一下真正应用中如何实现的把。

类比C++,struct 类似class   timer_value就是一个类的概念了,用timer_value可以定义一个对象的实例,实际应用中操作的也是这个对象,利用对象你可以轻松操作内部的数据和函数,这样就完美的把原本无关联的相关的内容关联起来,软件从这里开始会变得有趣。

2018/12/04 09:46:36
10
s453208[版主]
电源币:810 | 积分:103 主题帖:43 | 回复帖:114
LV7
旅长

接下来将定时处理与链表关联起来的问题。

2018/12/04 09:48:08
11
s453208[版主]
电源币:810 | 积分:103 主题帖:43 | 回复帖:114
LV7
旅长

更新时遇到一些问题,先暂停更新了。

2018/12/04 10:38:18
12
电源网-璐璐
电源币:1090 | 积分:69 主题帖:209 | 回复帖:1435
LV10
司令
期待下次更新~
2018/12/04 11:40:33
13
s453208[版主]
电源币:810 | 积分:103 主题帖:43 | 回复帖:114
LV7
旅长

 快快打赏,璐大爷儿

2018/12/04 14:48:18
14
电源网-璐璐
电源币:1090 | 积分:69 主题帖:209 | 回复帖:1435
LV10
司令
好贴必须打赏,放心吧,大飞飞
2018/12/04 17:34:27
15
雅兄
电源币:71 | 积分:21 主题帖:13 | 回复帖:41
LV4
连长
搭个顺风车好好学习学习。
2018/12/05 10:46:07
16
kfjy2
电源币:309 | 积分:0 主题帖:1 | 回复帖:48
LV4
连长
强势占楼
客服热线
服务时间:周一至周五9:00-18:00
微信关注
免费技术研讨会
获取一手干货分享

互联网违法不良信息举报

Reporting Internet Illegal and Bad Information
editor@netbroad.com
022-58392381