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 .任务调度 操作系统的核心模块就是内核调度。首先要弄清楚其调度原理。带着下面几个问题去思考。 1、任务入口函数第一次是怎么被执行的。 2、任务是怎么被切换的。 3、任务是怎么被抢占的。 以上几个问题是任务调度的核心。带着这几个问题去看内核源码发现任务调度使用的方法就是任务栈和系统栈,内核利用入栈和出栈完成对任务的调度和切换。而任务被调度起来是依靠timer 驱动来工作。基于此分析可以得出内核调度重点是以下几个方面: 1、明白任务栈的构建方式,即任务创建时初始化任务堆栈时保存的数据。这些数据要根据具体的硬件平台去实现,这个栈的初始化就是解决上面的第一个问题的。因为在内核调度时,任务第一次被执行是出此栈来执行对应的入口函数的。对于栈我们要明白任务栈和系统栈的区别,要针对不同的硬件平台而做不同的设计。任务栈有两种类型,一种叫做中断类型栈,是在产生中断保存任务上下文到任务栈空间的数据,其出栈方式是要利用中断返回时的出栈方式;另外一种栈叫做用任务栈是任务在执行过程中自挂起时需要把 CPU 控制权重新交给调度器的时候需要把当前的任务上下文进行保护,在任务出此栈的时候要用子程序返回的方式去出栈。系统栈...