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

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

3天内不再提示

RT-Thread操作系统的调度设计原理

RTThread物联网操作系统 来源:RT-Thread 作者:RT-Thread 2020-09-02 14:14 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

要想使用好RTOS,做出更加稳定可靠的产品,必须非常清楚底层的调度原理。由于RTOS的实时性与可控性,所以只有了解了其核心部分的设计思想,才能用起来得心应手,游刃有余。本文从RT-Thread的调度器设计的运行方式上解释一下调度器的行为,从而更加深刻的理解RT-Thread操作系统的调度时机。

1.调度是什么?

调度一般就是合理的安排、协调资源,统一指挥去完成一件事,而在操作系统中,线程调度就是有多个就绪优先级的任务,找到最高优先级任务,交给CPU去运行。

RT-Thread调度器就是起到判决线程当前的优先级,然后选择当前系统中最高优先级的就绪态的线程交给CPU去管理。

调度又可以细分为两种。可打断调度:关键防止优先级倒置;不可打断调度:先来先服务,不可中断。RT-Thread 属于实时操作系统,所以其调度器实现的是可打断的调度,当有更高优先级的线程或者更重要的任务就行,则可以打断当前任务的执行状态,去执行优先级更高的任务。那么此时,调度的时机就非常的关键了。

2.调度怎么实现?

RT-Thread在创建任务的时候,会指定任务的优先级,一般来说,每个任务都有自己特定的唯一的优先级。所以内核线程对象中有不同的优先级的任务列表。

如果最大指定为32个优先级,那么可以用32位数据类型表示,每一个bit表示一个优先级就绪的状态。使用位图的优点就是速度快,而且内存占用小。

一般来说,调度去找到最高优先级的任务时,就需要去做判断。如何去找到最高优先级的任务。一般来说,有两种办法:

软件计算

硬件计算

这两种的差别仅仅在于计算效率的问题,本质目的并无差别。

而用软件计算方法寻找最高优先级有两种实现的策略:

1.遍历就绪的队列,找到最小的优先级就绪的队列,寻找的时间不确定,时间复杂度O(n)。

2.采用空间换时间的办法,事先做好一个bitmap

例如系统中最大有8个优先级,那么bitmap如下:

 1constrt_uint8_t__lowest_bit_bitmap[]=
 2{
 3/*00*/0,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,
 4/*10*/4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,
 5/*20*/5,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,
 6/*30*/4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,
 7/*40*/6,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,
 8/*50*/4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,
 9/*60*/5,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,
10/*70*/4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,
11/*80*/7,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,
12/*90*/4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,
13/*A0*/5,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,
14/*B0*/4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,
15/*C0*/6,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,
16/*D0*/4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,
17/*E0*/5,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,
18/*F0*/4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0
19};
一般每一位代表一个就绪的状态,所以__rt_ffs程序的设计如下
 1int__rt_ffs(intvalue)
 2{
 3if(value==0)return0;
 4
 5if(value&0xff)
 6return__lowest_bit_bitmap[value&0xff]+1;
 7
 8if(value&0xff00)
 9return__lowest_bit_bitmap[(value&0xff00)>>8]+9;
10
11if(value&0xff0000)
12return__lowest_bit_bitmap[(value&0xff0000)>>16]+17;
13
14return__lowest_bit_bitmap[(value&0xff000000)>>24]+25;
15}

如果当前系统的线程状态为0b0110 0000,那么转换成十六进制就是0x60,根据表中的状态此时的最高优先级是5+1=6。所以可以得出系统的优先级,此时计算的复杂度为O(1)。

虽然RT-Thread 是支持同等优先级的,但是在具体的业务逻辑的设计中,在使用RTOS常用的设计方法中,一般都是要求程序的运行逻辑是可预测的,就是在程序执行的过程中,可以预测到程序下一步的动作。所以rtos中同等优先级,按照时间片轮训的这种方式设计业务逻辑的情况并不多。使用相同优先级会增加系统的业务逻辑的复杂性。

3.什么时候系统做调度?

RT-Thread 是抢占式的系统调用,所以系统什么时候去做的调度非常的关键。系统调度行为具体又分为主动调度和被动调度两种。

3.1 任务主动block

当A线程在正常运行时,主动放弃CPU的使用权,比如去执行rt_thread_delay或者等待一个IPC消息时,当前线程会主动放弃CPU资源,此时去系统中寻找已经就绪的最高优先级的线程进行调度。

这种方式应用的场景比较丰富,比如当前线程没有获取到资源时,需让出CPU的使用权,或者事情做完了,主动让出CPU的使用权,这就是系统做调度的时机。

A线程的优先级要高于B线程的优先级,所以在A放弃CPU使用权后,已经就绪的最高优先级线程B就开始执行了。

3.2 被更高优先级的任务唤醒

这种方式就是当比当前运行线程的优先级高的线程处于就绪态时,高优先级的就绪态线程会被唤醒,低优先级线程将暂停运行,此时会调度到比当前线程更高的优先级线程中去。

按照理解A线程是正在运行的线程,此时更高任务优先级的线程C就绪处于就绪状态了。比如创建了一个比A优先级更高的C进程,并startup C线程,此时会执行rt_schedule()将线程切换到优先级更高的C线程。此时A线程运行状态以及处理器寄存器状态压栈,更高优先级的C线程的状态以及处理器寄存器状态出栈,并且开始运行C线程。

3.3 yield放弃cpu使用

首先理解一下什么是yield,解释成让出,放弃比较合理。该出让只针对于同等优先级的线程。

这种情况只适用于A线程的优先级等于B线程的优先级的情况。因为RTT支持同等优先级的方式创建线程,相同的优先级的切换是靠时间片轮询来进行的。所以,当A线程正常运行的时候,如果执行了yield函数,那么只相当于将A线程的时间片消耗完,此时同等优先级的D线程开始运行。 由于在RTOS中,需要的是完成任务的确定性与可靠性,同等优先级的情况比较有限,所以这一块应用的不多。

3.4 中断中执行调度

以上的三种属于主动进行调度的过程,其系统的执行流程都是可以预测的,但是中断去执行调度却是比较特殊。是被动调度。

这种方式是在中断中执行调度的,当A线程正常运行时,此时来了一个中断,由于中断的优先级是高于线程的。所以,中断处理事情,如果在中断中执行了调度函数,那么在中断退出后,将直接切换到当前系统中更高优先级的线程去运行。如果如果当前系统的最高优先级还是A,那么中断退出后,执行的最高优先级线程依然是A。若存在线程E线程优先级高于A并且处于就绪状态,此时,中断退出后,切换到E线程去执行。

4.调度做了哪些事情?

系统进行调度的时候做了哪些事情?

第一步:查找当前系统中当前以及就绪的最高优先级的线程,若有高于当前运行系统运行的线程栈则执行线程切换

第二步:关闭中断,将系统当前运行状态以及处理器的寄存器压入栈空间

第三步:找到需要运行的线程的PC指针,并找到栈起始处弹出栈空间中的寄存器状态

第四部:打开中断,执行异常ret,让系统恢复执行

此时,就切换到已经就绪的更高优先级的线程去运行了。

5.总结

RT-Thread 线程的调度器是整个系统的灵魂,整个操作系统在运行过程中何时切换线程、什么情况下去处理任务,以及做更高效的业务逻辑的应用都离不开系统调度。掌握了调度器运行的规律,并且合理的使用线程调度时机,可以设计出更加稳定可靠的产品。通过阅读代码,就能预测程序下一步的执行动作。真正的做到手中有粮,心中不慌。

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

    关注

    68

    文章

    11216

    浏览量

    222914
  • 操作系统
    +关注

    关注

    37

    文章

    7328

    浏览量

    128623
  • 实时操作系统

    关注

    1

    文章

    206

    浏览量

    31793
  • RT-Thread
    +关注

    关注

    32

    文章

    1540

    浏览量

    44273
  • 调度器
    +关注

    关注

    0

    文章

    99

    浏览量

    5637

原文标题:​RT-Thread的线程调度与管理分析

文章出处:【微信号:RTThread,微信公众号:RTThread物联网操作系统】欢迎添加关注!文章转载请注明出处。

收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    【好书推荐】RT-Thread第22本相关书籍!《嵌入式实时操作系统开发实践》| 技术集结

    随着物联网、智能家居与工业控制等领域的快速发展,嵌入式实时操作系统的应用愈发广泛。RT-Thread作为国产开源RTOS的代表,凭借其出色的实时性、组件化设计和强大的生态体系,已成为众多工程师和高校
    的头像 发表于 10-16 18:46 368次阅读
    【好书推荐】<b class='flag-5'>RT-Thread</b>第22本相关书籍!《嵌入式实时<b class='flag-5'>操作系统</b>开发实践》| 技术集结

    RT-Thread睿赛德荣获工博会“CIIF信息技术奖”,“1+X+N”战略推动国产操作系统体系化发展 | 新闻速递

    在第二十五届中国国际工业博览会(工博会)上,国产嵌入式操作系统领军企业RT-Thread睿赛德凭借其在嵌入式操作系统领域的持续创新与产业贡献,荣获2025年“CIIF信息技术奖”。此次获奖
    的头像 发表于 10-10 10:05 762次阅读
    <b class='flag-5'>RT-Thread</b>睿赛德荣获工博会“CIIF信息技术奖”,“1+X+N”战略推动国产<b class='flag-5'>操作系统</b>体系化发展 | 新闻速递

    学习强国深度报道 RT-Thread“1+X+N”战略,国产操作系统赋能高端制造引关注|媒体视角

    近日,国产嵌入式操作系统领军企业RT-Thread睿赛德在工博会发布的“1+X+N”战略体系,获得了国家级权威媒体平台“学习强国”的重点报道。该报道从产业高度深入剖析了RT-Thread睿赛德以自主
    的头像 发表于 09-29 17:37 903次阅读
    学习强国深度报道 <b class='flag-5'>RT-Thread</b>“1+X+N”战略,国产<b class='flag-5'>操作系统</b>赋能高端制造引关注|媒体视角

    【好书推荐】RT-Thread第20本相关书籍!《嵌入式实时操作系统RT-Thread原理与应用》| 技术集结

    01内容简介ContentSummary本书为读者提供了一个全面、系统RT-Thread学习指南,旨在帮助初学者及有经验的开发者掌握RT-Thread实时操作系统和STM32嵌入式微
    的头像 发表于 08-24 10:05 685次阅读
    【好书推荐】<b class='flag-5'>RT-Thread</b>第20本相关书籍!《嵌入式实时<b class='flag-5'>操作系统</b><b class='flag-5'>RT-Thread</b>原理与应用》| 技术集结

    经济日报:国产嵌入式操作系统领军企业RT-Thread正在持续把新思想、新技术留给上海|媒体视角

    经济日报报道RT-Thread睿赛德2025世界人工智能大会落下帷幕,一系列亮眼成果为上海AI产业注入动力。作为国产嵌入式操作系统领军企业,RT-Thread睿赛德在大会中展现创新活力,成为聚焦亮点
    的头像 发表于 08-05 21:02 948次阅读
    经济日报:国产嵌入式<b class='flag-5'>操作系统</b>领军企业<b class='flag-5'>RT-Thread</b>正在持续把新思想、新技术留给上海|媒体视角

    RT-Thread 遇上 Rust:安全内核 RusT-Thread 的诞生

    大家好,我们是中国科学技术大学操作系统原理与设计(H)课oooooS小组。这个项目是我们的课程大作业:参考RT-Thread架构,使用Rust搭建一个原生的嵌入式操作系统内核。初识Rust是因为xk
    的头像 发表于 08-02 11:03 3206次阅读
    <b class='flag-5'>RT-Thread</b> 遇上 Rust:安全内核 RusT-<b class='flag-5'>Thread</b> 的诞生

    权威认证!RT-Thread操作系统100%国产自主可控,铸就睿擎工业平台安全基石​ !

    在工业自动化、电力控制、轨道交通等高端装备领域,操作系统的安全可靠与自主可控是关乎产业命脉的核心诉求。作为国产嵌入式实时操作系统(RTOS)的领军者,RT-Thread始终将代码的透明性与自主性置于
    的头像 发表于 07-11 17:05 2731次阅读
    权威认证!<b class='flag-5'>RT-Thread</b><b class='flag-5'>操作系统</b>100%国产自主可控,铸就睿擎工业平台安全基石​ !

    RT-Thread荣获2025优秀开源项目 | 新闻速递

    6月底,RT-Thread睿赛德受邀参与由上海开源信息技术协会主办的2025上海开源创新精英荟。上海市商委副主任张杰出席会议并致辞。RT-Thread嵌入式操作系统项目凭借其卓越的技术创新与开源生态
    的头像 发表于 07-04 09:04 2421次阅读
    <b class='flag-5'>RT-Thread</b>荣获2025优秀开源项目 | 新闻速递

    深度剖析 RT-Thread 线程调度流程

    RT-Thread调度第一个线程的主要流程分如下:rtthread_startup:RTT的启动函数,主要负责板级驱动,调度器,系统线程初始化,启动
    的头像 发表于 06-25 18:24 1437次阅读
    深度剖析 <b class='flag-5'>RT-Thread</b> 线程<b class='flag-5'>调度</b>流程

    玄铁加入RT-Thread 高级会员合作伙伴 | 战略新篇

    今天起,玄铁XuanTie正式成为RT-Thread高级会员合作伙伴。此次合作标志着双方将在嵌入式操作系统创新、RISC-V生态构建及行业应用落地等领域展开深度协同,加速推动开源技术的产业化进程
    的头像 发表于 06-23 20:22 869次阅读
    玄铁加入<b class='flag-5'>RT-Thread</b> 高级会员合作伙伴 | 战略新篇

    【直播预告】《实时操作系统应用技术—基于RT-Thread与ARM的编程实践》教学脉络及资源简介

    直播预告直播主题:《实时操作系统应用技术—基于RT-Thread与ARM的编程实践》教学脉络及资源简介开放时间:2025年5月29日(周四)20:00主讲老师:王宜怀课程类型:视频直播观看平台
    的头像 发表于 05-26 17:50 1095次阅读
    【直播预告】《实时<b class='flag-5'>操作系统</b>应用技术—基于<b class='flag-5'>RT-Thread</b>与ARM的编程实践》教学脉络及资源简介

    RT-Thread审核团招募: 深度参与开源RTOS社区治理与演进

    的开源实时操作系统,正持续优化社区协作流程,现面向全球开发者招募审核团(ReviewTeam)成员,共同维护代码质量,推动RT-Thread生态繁荣发展!什么是RT
    的头像 发表于 05-21 18:02 1065次阅读
    <b class='flag-5'>RT-Thread</b>审核团招募: 深度参与开源RTOS社区治理与演进

    RT-Thread嵌入式操作系统专业培训班-深圳站重磅开启!

    RT-Thread官方将在深圳举办为期三天的嵌入式操作系统专业培训班!本次培训将深入讲解RT-Thread嵌入式实时操作系统的核心技术与实战应用,助力开发者快速掌握RTOS开发精髓。无
    的头像 发表于 04-11 18:18 645次阅读
    <b class='flag-5'>RT-Thread</b>嵌入式<b class='flag-5'>操作系统</b>专业培训班-深圳站重磅开启!

    RT-Thread嵌入式操作系统专业培训班来上海啦!

    RT-Thread官方将在上海(RT-Thread大本营)发起为期三天的嵌入式操作系统专业培训班!本次培训将会深入讲解RT-Thread嵌入式实时
    的头像 发表于 02-27 17:27 824次阅读
    <b class='flag-5'>RT-Thread</b>嵌入式<b class='flag-5'>操作系统</b>专业培训班来上海啦!

    RT-Thread嵌入式操作系统专业培训班登陆郑州!

    RT-Thread官方将在河南-郑州发起为期三天的嵌入式操作系统专业培训班!本次培训将深入讲解RT-Thread嵌入式实时操作系统的核心概念、实战技巧和应用场景。无论您是刚接触嵌入式开
    的头像 发表于 02-12 18:28 717次阅读
    <b class='flag-5'>RT-Thread</b>嵌入式<b class='flag-5'>操作系统</b>专业培训班登陆郑州!