threadx操作系统各模块详解第一部分.doc

  1. 1、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
threadx操作系统各模块详解第一部分

THREADX深入学习 简介 最近在做THREADX移植项目,所以在开始学习THREADX操作系统。想把自己学到的东西总结一下。学习操作系统时,按照领导的意思把操作系统进行模块划分。通过查找资料将操作系统划分为任务调度模块、任务管理模块、任务间同步和通信模块、内存管理模块、中断管理模块、时钟管理模块。下面将分别对各个模块进行分析和研究。我将深入介绍各个模块的工作原理,通过此文档能对操作系统的工作原理有深入的了解。首先得我的分析是针对MIPS、ARM、251内核进行分析。 我移植的平台是16位的251平台。个人认为移植一个操作系统,首先对操作系统的内核调度原理必须十分清楚,然后对你的移植平台架构、指令集也要十分清楚,比如说下面几个方面: 1、子程序调用时PC值是怎么被保存得(MPIS,将子程序的返回值存放在了RA寄存器中,251是PC自动入栈(ECALL指令)退出时使用ERET等指令,ARM是在LR寄存器中要计算相应减去的数值)。 2、中断发生时(251PC自动入栈但顺序和子程序调用压入顺序不一样,中断返回使用RETI指令。MIPS,PC是被存入了EPC寄存器中,使用eret指令。ARM,LR中数值的计算,赋值给PC即可) 2.任务调度 操作系统的核心模块就是内核调度。首先要弄清楚其调度原理。带着下面几个问题去思考。 任务入口函数第一次是怎么被执行的。 任务是怎么被切换的。 任务是怎么被抢占的。 以上几个问题是任务调度的核心。带着这几个问题去看内核源码发现任务调度使用的方法就是任务栈和系统栈,内核利用入栈和出栈完成对任务的调度和切换。而任务被调度起来是依靠timer驱动来工作。基于此分析可以得出内核调度重点是以下几个方面: 1、明白任务栈的构建方式,即任务创建时初始化任务堆栈时保存的数据。这些数据要根据具体的硬件平台去实现,这个栈的初始化就是解决上面的第一个问题的。因为在内核调度时,任务第一次被执行是出此栈来执行对应的入口函数的。对于栈我们要明白任务栈和系统栈的区别,要针对不同的硬件平台而做不同的设计。任务栈有两种类型,一种叫做中断类型栈,是在产生中断保存任务上下文到任务栈空间的数据,其出栈方式是要利用中断返回时的出栈方式;另外一种栈叫做用任务栈是任务在执行过程中自挂起时需要把CPU控制权重新交给调度器的时候需要把当前的任务上下文进行保护,在任务出此栈的时候要用子程序返回的方式去出栈。系统栈主要系统内核自己需要使用的栈。移植过程中我们可能要不断的切换SP在这两个栈之间。也可能只用系统的SP,不切换只是来回的复制两个栈空间的内容(如51系列)。 这里移植的时候可能会出现以下几个问题: a、TIMER中断产生后,任务调度任务第一次执行出栈时,是按照子程序返回的方式去出栈。这样中断将永远不会被返回。这样就有问题了,这个在任务切换的时候经常遇到就是任务入口函数第一次被执行的时候。解决的办法是初始化任务栈的时候初始化成中断类型的栈。 b、要明白硬件平台的压栈方式。发生中断时的压栈方式和子程序调用时的压栈方式是不同的。像MIPS这样产生中断和子程序调用时都有相应的寄存器保存相应的值,这样的平台实现起来比较简单。而251平台确没有,251不管是中断还是子程序调用都是把PC值压入栈中,而且压入得顺序也不一样。(251中产生中断和子程序调用时PC值入栈的顺序是不一样的,PC分三次入栈,见具体的芯片手册) c、任务的出栈方式。任务出栈是在任务调度后恢复优先级最高的任务时执行的,先判断任务栈类型然后采用相应的出栈方式。251平台任务栈和中断栈保护的数据一样,但出栈的方式也就是子程序返回的方式是RETI和ERET。子程序调用可以采用RETI而中断产生时不能采用ERET否则会中断一直无法返回。 d、入栈的方式:对于mips把相应的寄存器数据压入到任务栈就OK了。而251平台是系统自动压栈,出栈的时候要出对应的PC值才OK。因此在产生中断时先进行入栈操作,然后调用子程序。由于是在子程序中把栈数据拷贝到任务栈中,因此要把SP减去相应的值,要看子程序调用压入了几个数据。ECALL是减3。切记不要在任务栈中存入额外的数据。否则出栈就出错了。 2、TIMER产生中断执行timer中断处理函数,timer中断会对当前任务的时间片进行计时,时间到期后会调用任务切换函数,切换下一个更高优先级的任务。任务切换函数只是把当前任务切换到同一个优先级列表的最后,并没有去执行下一个任务。这个工作交给了任务上下文恢复函数,此函数会比较当前正在执行的任务和下一个要执行的任务控制块指针。如果两个控制块指针的值不一样就要去回到调度接口去重新调度了。正好上面的2问题。 3、任务在执行过程中释放信号量、中断等操作时使一个更高优先级任务就绪时就会发生抢占。此时当前任务上下文会被保存同时高优先

文档评论(0)

sandaolingcrh + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档