17483|12

103

帖子

0

TA的资源

一粒金砂(中级)

楼主
 

【RT-Thread读书笔记】7-10章读书笔记 [复制链接]

 
   前面第6章实现的线程的定义与线程切换的实现没有支持多优先级,只支持两个线程的互相切换,下面给大家介绍实现线程优先级的功能,在RT-Thread中,数字优先级越小,逻辑优先级越高。RT-Thread是一个根据优先级来调度的抢占式实时操作系统,即每个系统周期到来时,调度器都会扫面就绪列表,选取优先级最高的线程去执行。
   在介绍实现优先级之前,先给大家介绍几个概念,第一个是临界段的保护,临界段用一句话概括就是一段在执行的时候不能被中断的代码段。在RT-Thread里面,这个临界段最常出现的就是对全局变量的操作,全局变量就好像是一个枪靶子,谁都可以对他开枪,但是我开枪的时候,你就不能开枪,否则就不知道是谁中了靶子,为了保护临界段,我们要实现关中断函数,开中断函数。如临界段代码的应用在进入临界段之前,我们会把中断关闭,退出临界段时再把中断打开。第二个是对象容器的实现。在RT-Thread中,所有的数据结构都称为对象。如:线程,信号量、互斥量、事件、邮箱、消息队列、内存堆、内存池、设备和定时器等。在RT-Thread中,为了方便管理这些对象,专门定义了一个对象类型数据结构,代表了数据类型。在RT-Thread中,每个对象都会有对应的一个结构体,这个结构体叫做该对象的控制块。如线程会有一个线程控制块。在控制块的开头放置的是对象结构体的成员,具体的见书里面。什么是容器,在RT-Thread中,每当用户创建一个对象,如线程,就会将这个对象放在一个叫做容器的地方,这样做的目的是为了方便管理,通过扫描容器的内核对象来获取各个内核对象的状态,然后输出调试信息。容器的接口实现方式:容器在定义的时候,大小被固定了,但容器里面的成员是否初始化就不一定了,从容器里获取指定类型的对象函数会遍历整个容器对象,如果对象的类型等于我们指定的类型,那么就返回该容器成员的地址。每创建一个对象,都需要先将其初始化,主要分成两个部分的工作,首先将对象控制块里面与对象相关的成员初始化,然后将该对象插入到对象容器中,对象初始化函数在线程初始化函数里面被调用。第三个比较重要的概念是空闲线程与阻塞延时的实现。当线程需要延时,进入阻塞状态,需要cpu执行空闲线程。
   如在下一个系统周期来临时,调度器需要选取优先级最高的线程去执行,在程序里我们用一个32位的数表示线程的优先级。我们规定在这个32位的数中,位数越低,优先级越高,如第一个置1的位是位1,即表示此时就绪的线程当中,优先级最高的是线程1,然后调度器从线程优先级表的索引1下取出线程的线程控制块,从而切换到线程1。但是,单片机没有眼睛,并不能跟人一样一眼就从线程就绪优先级组中看到那个第一个置1的位,怎么办?专门写了一个函数,通过查表的方法获得最高优先级的线程。我们通过线程优先级组获得最高的优先级线程。然后根据线程优先级表即就绪列表,我们可以理解为就绪列表就是线程优先级表。线程优先级表是全局数组。线程优先级的数据类型是rt_list,每个索引号对应线程的优先级,该索引下维护着一条双向链表,当线程就绪时,线程就会根据优先级插入到对应索引的链表,同一个优先级的线程都会被插入到同一条链表中。最后我们将线程插入到线程优先级表和移除分别用rt_schedule_insert_thread()和rt_schedule_remove_thread()这两个函数实现。通过就绪优先级组和线程优先级表就可以实现多优先级的线程了。然后根据优先级来决定第一个运行的线程。而系统调度函数也通过线程的优先级进行切换。根据优先级切换的原理如下:首先获取就绪的最高优先级,然后获取就绪的最高优先级对应的线程控制块,如果目标线程不是当前线程就要进行线程切换。修改阻塞延时函数rt_thread_delay()的实现原理:将线程的状态改为挂起,接下来将进入延时,暂时放弃CPU的使用权。然后根据优先级将线程就绪优先级组中对应的位清零。还有一些函数才能最终实现线程的优先级,今天实在太饿了,没有精力完成了。


此内容由EEWORLD论坛网友沈婷婷原创,如需转载或用于商业用途需征得作者同意并注明出处

最新回复

mark                           详情 回复 发表于 2019-10-16 09:11

赞赏

3

查看全部赞赏

点赞 关注(1)
个人签名坚持自己的坚持,终究会有拨开云雾的一天

回复
举报

3

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
值得好好学习

点评

是啊!书中讲的挺好!  详情 回复 发表于 2019-5-13 09:01
 
 

回复

103

帖子

0

TA的资源

一粒金砂(中级)

板凳
 

是啊!书中讲的挺好!
 
个人签名坚持自己的坚持,终究会有拨开云雾的一天
 
 

回复

80

帖子

1

TA的资源

一粒金砂(中级)

4
 

支持楼主,支持RT-Thread

点评

谢谢你的认可啊!  详情 回复 发表于 2019-7-9 10:45
 
 
 

回复

291

帖子

0

TA的资源

一粒金砂(高级)

5
 

感谢分享,支持一下,学习了。还有楼主看看你的资料字体不一致你看看,看着别扭

点评

不太熟悉,什么样的字体好看啊?  详情 回复 发表于 2019-7-9 10:45
 
 
 

回复

103

帖子

0

TA的资源

一粒金砂(中级)

6
 
generalcircuits 发表于 2019-6-24 13:23 感谢分享,支持一下,学习了。还有楼主看看你的资料字体不一致你看看,看着别扭

不太熟悉,什么样的字体好看啊?

点评

哈,我是说你的这篇资料,一段话有两种不同的字体  详情 回复 发表于 2019-7-9 11:00
 
个人签名坚持自己的坚持,终究会有拨开云雾的一天
 
 

回复

103

帖子

0

TA的资源

一粒金砂(中级)

7
 
Fillmore 发表于 2019-6-21 16:21 支持楼主,支持RT-Thread

谢谢你的认可啊!

 
个人签名坚持自己的坚持,终究会有拨开云雾的一天
 
 

回复

291

帖子

0

TA的资源

一粒金砂(高级)

8
 
沈婷婷 发表于 2019-7-9 10:45 不太熟悉,什么样的字体好看啊?

哈,我是说你的这篇资料,一段话有两种不同的字体

点评

好像字体大小不一样。不是一气呵成写成的笔记,对不起啊!  详情 回复 发表于 2019-7-9 11:30
 
 
 

回复

103

帖子

0

TA的资源

一粒金砂(中级)

9
 
generalcircuits 发表于 2019-7-9 11:00 哈,我是说你的这篇资料,一段话有两种不同的字体

好像字体大小不一样。不是一气呵成写成的笔记,对不起啊!

点评

没事没事,我只是提醒你一下,没别的意思  详情 回复 发表于 2019-7-9 14:11
 
个人签名坚持自己的坚持,终究会有拨开云雾的一天
 
 

回复

291

帖子

0

TA的资源

一粒金砂(高级)

10
 
沈婷婷 发表于 2019-7-9 11:30 好像字体大小不一样。不是一气呵成写成的笔记,对不起啊!

没事没事,我只是提醒你一下,没别的意思

点评

谢谢提醒呢  详情 回复 发表于 2019-9-23 09:17
 
 
 

回复

103

帖子

0

TA的资源

一粒金砂(中级)

11
 
generalcircuits 发表于 2019-7-9 14:11 没事没事,我只是提醒你一下,没别的意思

谢谢提醒呢

 
个人签名坚持自己的坚持,终究会有拨开云雾的一天
 
 

回复

247

帖子

3

TA的资源

一粒金砂(中级)

12
 

mark

                     

 

点评

啥意思  详情 回复 发表于 2019-12-3 16:04
 
 
 

回复

103

帖子

0

TA的资源

一粒金砂(中级)

13
 
SensorYoung 发表于 2019-10-16 09:11 mark                        

啥意思

 
个人签名坚持自己的坚持,终究会有拨开云雾的一天
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/8 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表