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

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

3天内不再提示

无MMU抢占式操作系统的抢占工作原理介绍

strongerHuang 来源: strongerHuang 作者: strongerHuang 2020-11-03 16:07 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

线程基础原理

线程之间抢占

中断抢占线程

中断抢占中断

strongerHuang

1

运行多个线程

1.单核“单线程”

严格来说,单核处理器一次只能执行一条指令,也就是说只能“单线程”。(当然,多核处理器就不一样)

为了在单核处理器上运行多个线程,我们实际上需要定期在线程之间进行快速切换,以便用户感觉多个线程在并行运行。

比如处理器执行两个线程,处理器实际在两个线程之间来回切换,如下图:

2.处理器在线程之间切换,它是如何做到的?

我们说的单核处理器是“单线程”的,它有一组寄存器,我们就叫这组寄存器属于一个“线程”。

例如,计算两个数字的总和时:

//假设我们有两个整数:a和bint c = a + b ;

实际发生的情况如下所示(当然,它取决于的MCU类型,但总体思路是相同):

# MIPS反汇编: LW V0, -32744(GP) # "a" 的值从RAM加载到寄存器V0LW V1, -32740(GP) # 值"b" 从RAM加载到寄存器V1ADDU V0, V1, V0 # a、b值相加,结果保存到寄存器V0中SW V0, -32496(GP) # 寄存器V0的值存储在RAM中(变量c所在的位置)

你会发现上面执行了4个动作,但是抢占式操作系统可以在任何时候抢占另一个线程,包括在这4个动作之间。

假如在这过程中有其他线程抢占了,其他线程同样抢占了当前线程V0、 V1,如果不对V0、 V1进行保存,那么下次回来执行当前线程,结果就会出错。

所以,针对当前这种问题,我们就需要在切换线程之前,对V0、 V1的数值进行保存,当下次切换到当前线程,再恢复V0、 V1的数值,大致流程如下:

大概意思就是:当我们需要从一个线程切换到另一个线程时,内核获得控制权,执行必要的内务处理(至少要保存和恢复寄存器值),然后将控制权转移到下一个线程以运行。

strongerHuang

2

线程的堆栈

上面说的抢占位置,到底在哪里,每个线程保存在哪个寄存器值中?这就是线程的堆栈的内容。 在有MMU的操作系统中,(用户的)线程堆栈可以按需动态增长:线程需要的堆栈空间越多,线程堆栈就越多(如果内核允许)。 但是,我们一般的MCU却没有MMU这个“高端”的东西,所有RAM都静态映射到地址空间。因此,每个线程都会有用于堆栈的RAM空间,如果线程使用的RAM超过堆栈的数量,则会导致内存溢出或细微的错误。(实际上,每个线程的堆栈空间只是一连续数组空间)。 因此,当我们决定为每个线程分配多少堆栈时,我们只是估计可能需要多少堆栈,但是具体多少可能不是很清楚。 比如,如果这是一个具有多层嵌套调用的GUI线程,则可能需要数个千字节,但如果它是一个流水灯的小线程,则可能几十字节就足够了。 假设我们有三个线程,它们的堆栈消耗如下:

如上面所述,每个线程的寄存器值都保存在线程的堆栈中。线程的寄存器值集称为线程的“上下文”。如下图所示(线程A为在正在执行的“活动线程”):

请注意,在正在执行的线程A的上下文没有保存在堆栈中,堆栈指针指向线程A用户数据的顶部,并且当前处理器的寄存器专用于线程A。 当内核决定将控制权切换到线程B时,它将执行以下操作:

将所有寄存器值保存到堆栈中(保存到线程A堆栈的顶部);

将堆栈指针切换到线程B的堆栈顶部;

从堆栈(从线程B的堆栈顶部)恢复所有寄存器值;

此时,你会看到:

strongerHuang

3

中断(ISR)抢占

上面在执行过程中,或进行上下文切换时,还可能会涉及到一个非常重要的内容:中断。 MCU通常具有外设:TIM、UART、 SPI、 CAN等,它们随时都能发生重要事件以触发中断。 中断条件是当当前正在执行的线程暂停时,处理器在一段时间内执行其他操作(Handles Interrupt),然后返回。中断可能随时触发,我们应该做好处理的准备。 中断处理程序称为ISR(中断服务程序):中断可能具有不同的优先级,例如,如果触发了一些低优先级的中断,则当前正在执行的线程将暂停,并且ISR会获得控制权。然后,如果触发了某个高优先级中断,则当前正在执行的ISR将再次暂停,并为该高优先级中断运行一个新的ISR。 这样一来,完成后,控制权将返回到第一个ISR,并且在完成时,也会恢复被中断的线程。 重要的关键代码:在线程活跃过程中,如果有重要的事情“关键的代码”,在这过程中如果中断发生,很容易导致意想不到的结果。 这部分关键的代码,我们需要要保护起来,通常我们的做法就是:在之前“关键代码”之前禁用全局中断,执行完之后,开始全局中断。 有点需要注意:关闭全局中断,此时就不会相应中断,所以,“关键代码”不能太长。

strongerHuang

3

中断堆栈

在上面说到一点,高优先级中断抢占低优先中断,就会出现一个问题:低优先级的代码需要和线程一样,用于保存数据的堆栈。 一般有两种方法:

使用被中断的线程堆栈;

为中断使用单独的堆栈空间;

1.使用被中断的线程堆栈如果使用被中断的线程堆栈,就类似如下图:

这种情况存在你一个严重的问题,你知道是什么吗? 频繁中断,或者中断较多,线程自身的堆栈空间就会很快被使用完。 每个线程的堆栈都应该包含以下内容:

线程自己的数据;

线程的上下文;

用于执行最坏情况的ISR的数据。

因此,我们就需要换一种方法,为为所有ISR中断开辟单独的堆栈空间。 2.为中断使用单独的堆栈空间

为中断使用单独的堆栈空间大致如上图所示。 好了,本文讲述了上面几种关于抢占,以及相关的内容,你学会了几点,又有几点没懂,欢迎留言讨论。

责任编辑:xj

原文标题:无MMU抢占式操作系统的抢占工作原理

文章出处:【微信公众号:strongerHuang】欢迎添加关注!文章转载请注明出处。

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

    关注

    37

    文章

    7338

    浏览量

    128750
  • 线程
    +关注

    关注

    0

    文章

    508

    浏览量

    20770
  • MMU
    MMU
    +关注

    关注

    0

    文章

    92

    浏览量

    19121

原文标题:无MMU抢占式操作系统的抢占工作原理

文章出处:【微信号:strongerHuang,微信公众号:strongerHuang】欢迎添加关注!文章转载请注明出处。

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

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    什么是嵌入操作系统

    要理解嵌入操作系统(Embedded Operating System,简称 RTOS/EOS),我们可以从本质定义→核心区别→实际作用→典型特征→嵌入开发场景适配,五个维度来拆解, 一
    发表于 12-09 10:33

    抢占优先级和子优先级

    关于抢占优先级和子优先级: 1)具有高抢占优先级的中断可以在具有低抢占优先级的中断服务程序执行过程中被响应,即中断嵌套,或者说高
    发表于 12-03 07:11

    EV10AS180A模数转换器支持哪些操作系统

    应用。EV10AS180A转换器本身并不直接依赖或支持特定的操作系统,其核心功能是完成模拟信号到数字信号的转换,属于硬件层面的数据处理设备。硬件独立性:EV10AS180A作为一款高性能ADC,其工作原理
    发表于 11-18 09:18

    单片机的操作系统

    。 ‌ ‌ RT-Thread ‌:国产开源系统,集成GUI、网络协议栈、文件系统等组件,兼容POSIX接口,适合物联网设备。 ‌ 嵌入操作系统 ‌ μClinux ‌:针对
    发表于 11-14 06:18

    嵌入实时操作系统的特点

    实时嵌入操作系统(Real-Time Embedded Operating System)是专门设计用于嵌入系统的实时操作系统。嵌入
    发表于 11-13 06:30

    用这个秘籍,轻松解决鸿蒙应用中抢占音频焦点的难题

    、恢复门,调试时还得为跨应用协作反复踩坑。 别担心, 华为HarmonyOS开发者官网最新上线的《音频焦点管理》最佳实践文档来了! 针对“前播与后播音频抢焦点”的核心难题,《音频焦点管理》不仅提供标准化系统能力,更附详细
    的头像 发表于 09-01 09:13 479次阅读
    用这个秘籍,轻松解决鸿蒙应用中<b class='flag-5'>抢占</b>音频焦点的难题

    树莓派操作系统:版本、特性及设置完整指南!

    树莓派操作系统是什么?树莓派操作系统是由树莓派基金会专为树莓派开发的官方操作系统。它基于DebianLinux发行版,并针对树莓派的ARM架构进行了专门优化。树莓派操作系统有多个版本,
    的头像 发表于 07-28 18:26 876次阅读
    树莓派<b class='flag-5'>操作系统</b>:版本、特性及设置完整指南!

    一文读懂:嵌入Linux实时性进阶

    在工业控制、机器人、汽车电子等关键领域,嵌入系统对实时性要求极高。 Linux作为强大的通用操作系统,其原生实时性能难以满足最严苛的硬实时需求。为突破这一限制,PREEMPT_RT补丁
    发表于 07-10 15:26

    揭秘LuatOS:实时操作系统RTOS核心库的关键技术剖析!

    为满足实时控制场景的严苛需求,LuatOS核心库采用抢占调度策略,确保高优先级任务即时响应。通过静态内存分配和零拷贝通信机制,系统不仅避免了动态内存碎片问题,还大幅提升了任务间数据交换效率,适用于
    的头像 发表于 05-21 16:02 535次阅读
    揭秘LuatOS:实时<b class='flag-5'>操作系统</b>RTOS核心库的关键技术剖析!

    KaihongOS操作系统FA模型与Stage模型介绍

    FA模型与Stage模型介绍 KaihongOS操作系统中,FA模型(Feature Ability)和Stage模型是两种不同的应用模型,它们提供了不同的应用开发方式和特性。 FA模型
    发表于 04-24 07:27

    国产银河麒麟操作系统V10和星光麒麟V1.0操作系统如何选择?

    国产银河麒麟操作系统和星光麒麟操作系统都是由中国电子旗下科技企业麒麟软件有限公司(简称“麒麟软件”)开发的国产自主可控的操作系统。麒麟软件介绍:麒麟软件以安全可信
    的头像 发表于 01-24 09:14 4336次阅读
    国产银河麒麟<b class='flag-5'>操作系统</b>V10和星光麒麟V1.0<b class='flag-5'>操作系统</b>如何选择?

    云服务器选择什么操作系统好?

    云服务器选择什么操作系统好?选择云服务器操作系统需考虑业务需求、兼容性、安全性、易用性及成本。Linux系统如CentOS、Ubuntu和Debian因稳定、免费且社区支持强大而受欢迎;WindowsServer适合运行特定Wi
    的头像 发表于 01-21 10:56 774次阅读

    2025嵌入操作系统专业培训班正式启动!

    RT-Thread官方将在河南-郑州发起为期三天的嵌入操作系统专业培训班!本次培训将会深入讲解RT-Thread嵌入实时操作系统的核心概念、实战技巧和应用场景!无论企业团队/工程师
    的头像 发表于 01-09 18:46 1394次阅读
    2025嵌入<b class='flag-5'>式</b><b class='flag-5'>操作系统</b>专业培训班正式启动!

    鸿道Intewell操作系统的Windows实时拓展方案

    鸿道Intewell操作系统的Windows实时拓展方案,即鸿道Intewell-Win构型,是一款专为工业控制领域设计的国产操作系统,支持Windows实时扩展,具备以下特点和优势:多业务融合:鸿
    的头像 发表于 12-24 17:40 858次阅读
    鸿道Intewell<b class='flag-5'>操作系统</b>的Windows实时拓展方案

    deepin操作系统介绍

    希望从自己的能力和对桌面操作系统的理解,能给 Linux 的用户与开发者更多的选择。我们也相信 deepin 能够得到更多用户的认可与喜爱,成为开源世界的最佳选择。  一、 deepin 操作系统 先说 Linux 操作系统,它
    的头像 发表于 12-23 09:08 3263次阅读
    deepin<b class='flag-5'>操作系统</b><b class='flag-5'>介绍</b>