欢迎来到课桌文档! | 帮助中心 课桌文档-建筑工程资料库
课桌文档
全部分类
  • 党建之窗>
  • 感悟体会>
  • 百家争鸣>
  • 教育整顿>
  • 文笔提升>
  • 热门分类>
  • 计划总结>
  • 致辞演讲>
  • 在线阅读>
  • ImageVerifierCode 换一换
    首页 课桌文档 > 资源分类 > DOCX文档下载  

    RTOS多线程抢占工作原理.docx

    • 资源ID:1562597       资源大小:96.34KB        全文页数:10页
    • 资源格式: DOCX        下载积分:5金币
    快捷下载 游客一键下载
    会员登录下载
    三方登录下载: 微信开放平台登录 QQ登录  
    下载资源需要5金币
    邮箱/手机:
    温馨提示:
    用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)
    支付方式: 支付宝    微信支付   
    验证码:   换一换

    加入VIP免费专享
     
    账号:
    密码:
    验证码:   换一换
      忘记密码?
        
    友情提示
    2、PDF文件下载后,可能会被浏览器默认打开,此种情况可以点击浏览器菜单,保存网页到桌面,就可以正常下载了。
    3、本站不支持迅雷下载,请使用电脑自带的IE浏览器,或者360浏览器、谷歌浏览器下载即可。
    4、本站资源下载后的文档和图纸-无水印,预览文档经过压缩,下载后原文更清晰。
    5、试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。

    RTOS多线程抢占工作原理.docx

    操作系统对于初学者来说是一个很"高深'的内容,里面很多原理摸不清姑,导致还没入门就放弃了。本文就从底层开始,讲述抢占式操作系统(大多数RTOS)的抢占原理.包含:线程基础原理线程之间抢占中断抢占线程中断抢占中断运行多个线程1 .单核“单线程”严格来说,单核处理器1次只能执行一条指令,也就是说只能“单线程”.当然,多核处理就不一样)为了在单核处理器上运行多个线程,我们实际上需要定期在线程之间迸行快速切换,以便用户感觉多个线程在并行运行.比如处理器执行两个线程,处理器实际在两个线程之间来回切换,如下图:Userthreads2 .处理器在线程之间切换,它是如何做到的?我们说的单核处理搭足“电线程”的,它有一组寄存器,我们就叫这组寄存器属于一个“线程"。例如,计算两个数字的总和时:假设我们有两个整数:a和bintc=a+b;实际发生的情况如下所示(当然,它取决于的MCU类型,但总体思路是相同):#H1.PS反汇编:1.»VO1-32744(GP)aa”的值从KAM加载到寄存器VO1.WVI,-32740(GP)#值"b"从RAM加载到寄存SSYIADDUVO1VI,VO#a、b值相加,结果保存到寄存器VO中SUVO1-32496(GP)«寄存器VO的值存储在RAM中(变IftC所在的位置)你会发现上面执行了4个动作,但是抢占式操作系统可以在任何时候抢占另一个线程,包括在这4个动作之间.假如在这过程中有其他线程抢占了,其他线程同样抢占了当前线程V0、V,如果不对VO、Y1.进行保存,那么下次回来执行当前线程,结果就会出错.所以,针对当前这种问Sg,我们就需要在切换线程之前,对V0.V1.的数值进行保存,当下次切换到当前线程,再饮更VO,V1.的数值,大致流程如下:大概意思就是:当我们能要从一个规程切换到另一个线程时,内核获得捽制权,执行必要的内务处理(至少要保存和饮红寄存器值).然后将控制权转移到下一个线程以运行.上面说的抢占位置,到底在哪里,每个线程保存在哪个寄存器值中?这就是线程的堆栈的内容.在有MMU的操作系统中,(用户的线程堆栈可以按需动态增长:线程需要的堆栈空间越多,线程堆栈就越多(如果内核允许)。但是,我们一般的MCU却没有MMU这个“高端”的东西.所有RAH都静态映射到地址空间.因此,每个线程都会有用于堆校的RAM空间,如果设程使用的RRM超过堆栈的数量,则会导致内存溢出或细微的错误.(实际上,每个线程的推枝空间只是一连续数组空间).因此,当我们决定为每个线程分配多少堆栈时,我们只是估计可能需要多少堆栈,但是具体多少可能不是很清楚.比如,如果这是一个具有多层嵌真调用的GU1.线程,则可能需要数个千字节,但如果它是一个流水灯的小线程,则可能几十字节就足够了。假设我们有三个线程,它们的堆栈消耗如下:如上面所述,每个线程的寄存器值都保存在线程的堆栈中线程的寄存器值集称为线程的“上下文”.如下图所示(线程A为在正在执行的“活动线程”):请注意,在正在执行的战程R的上下文没有保存在堆栈中,堆栈指针指向线程A用户数据的顶部,并且当前处理器的寄存器凸用于线程A.当内核淡定将控制权切换到规程B时,它将执行以下振作:将所有寄存器值保存到堆栈中(保存到线程A堆栈的顶部):将堆栈指针切换到线程B的堆栈顶部:从堆栈(从线程B的雁极顶部)恢复所有寄存器值:此时,你会看到:中W(ISR)抢占上面在执行过程中或进行上卜文切焕时,还可能会涉及到一个非常重要的内容:中断.MCU通常具有外设:TIM.UART,SPI,CAX等,它们随时都能发生更要事件以触发中断。中断条件是当当前正在执行的线程物停时,处理器在一段时间内执行其他操作Hand1.esInterrupt),然后返回。中断可能Ki时触发,我们应该做好处理的准备。中断处理程序称为ISR(中断服务程序):中断可能具有不同的优先级.例如,如果触发了一些低优先级的中断,则当前正在执行的线程将暂停,并且ISR会获得控制权.然后,如果触发了某个高优先级中断,则当前正在执行的ISR将再次出停,并为该高优先级中断运行一个新的ISR。这样一来,完成后,控制权将返回到第一个ISR.并凡在完成时,也会恢复被中®i的线程.由要的关犍代码:在线程活跃过程中,如果有重要的事情“关键的代码”,在这过程中如果中断发生,很容易导致意想不到的结果.这部分关健的代码,我们需要要保护起来,通常我们的做法就是:在之前“关键代码”之前禁用全局中断,执行完之后,开始全同中断。有点需要注意:关闭全局中断,此时就不会相应中断,所以,“关处代码”不能太长。中断堆栈在上面说到一点,优先级中断抢占低优先中断,就会出现一个问题:低优先级的代码需要和线程一样,用于保存数据的堆栈.-一般有两种方法:使用被中断的线程堆栈;为中断使用单独的堆栈空间:1 .使用被中断的线程堆枝如果使用被中断的线程堆栈,就类似如下图:这种情况存在你个严重的问超,你知道是什么吗?颇繁中断,或者中断较多,规程自身的堆栈空间就会很快被使用完每个线程的堆栈都应该包含以卜内容:线程自己的数据:线程的上下文;用于执行最坏情况的ISR的数据.因此,我们就需要换一种方法,为为所有ISR中断开辟单独的堆栈空间。2 .为中断使用单独的堆栈空间Interruptusesseparatestack25002000IfreespaceSIsoOISR为中断使用单独的堆栈空间大致如上图所示。

    注意事项

    本文(RTOS多线程抢占工作原理.docx)为本站会员(夺命阿水)主动上传,课桌文档仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知课桌文档(点击联系客服),我们立即给予删除!

    温馨提示:如果因为网速或其他原因下载失败请重新下载,重复下载不扣分。




    备案号:宁ICP备20000045号-1

    经营许可证:宁B2-20210002

    宁公网安备 64010402000986号

    课桌文档
    收起
    展开