读书人

dispatch.sMQX-Lite调度与间断系统

发布时间: 2013-11-03 15:39:14 作者: rapoo

dispatch.s——MQX-Lite调度与中断系统的基础(1)
dispatch.s——MQX-Lite调度与中断系统的基础

MQX调度器的核心文件是dispatch.s,在这里先简单的预览一下这个文件的内容。
首先,这个文件是由汇编语言编写的。使用汇编语言是实现这些代码一方面是考虑了调度器的执行效率,毕竟在RTOS应用中最浪费的程序就是调度器(调度过程对应用没有任何贡献),但是汇编还有另一个优势,就是可以直接直接调用指令集中的命令,实现特权访问,这是C语言也办不到的,例如操作系统的栈指针,而这些特权操作又是调度器必然会用到的。所以,基于上述原因,调度器核心的内容由汇编语言实现是有充分理由的。
在分析代码之前,先对代码进行精简,替换或删除部分内容。原始的代码是从CodeWarrior的PEx系统中提取出来的,但继承自MQX,因此有对CodeWarrior、IAR、Keil使用各自编译器的兼容性设计。由于目前使用的IDE是IAR,因此将相关的兼容性代码全部去掉,还原成最直接、最简单的、基于IAR的原始汇编。在研究最核心的部分时,日志系统和用户模式也不是我们关注的重点,因此也要删掉。注释部分是目前仅有的参考,必然要保留,在分析的过程中也会尽量加一些新的注释。经过精简之后,剩下的内容主要就是上下文切换和系统中断服务程序的上半部了。在这里进行先介绍一下,具体的机制将在对各自系统的专门分析中整理出来。
dispatch.s文件中主要开放的函数接口如下:
_task_block:                // store active task registers                STORE_ALL_REGISTERS                //disable interrupts                cpsid i                GET_KERNEL_DATA r0                ldr r3, [r0, #KD_ACTIVE_PTR]        // get active task descriptor                str r1, [r3, #TD_STACK_PTR]         // store task SP to task descriptor td                // set task block bit                ldr r2, [r3, #TD_STATE]                movs r1, #1                        // TODO change from number to define                orrs r2, r2, r1                str r2, [r3, #TD_STATE]                                // remove active task from ready queue                /* 这个狠,将任务保存后将任务从就绪任务队列中移除 */                ldr r2, [r3, #TD_TD_PREV]           // get ptr to ready_q structure                ldr r1, [r3, #TD_TD_NEXT]                str r1, [r2, #RQ_HEAD_READY_Q]                str r2, [r1, #TD_TD_PREV]                /* 此时从当前任务就绪队列开始向后找新的就绪任务 */                b sched_internal   // Search for the next task in the ready queue.

写到这里先告一段落,做个小总结。这里理出来的是调度内核中上下文切换实现的主线,在实际的调用中还要考虑程序调用的上下文,比如调用的时机,参数的传递,尤其是汇编函数和C函数的调用特性(主要是C程序调汇编函数)等,这些在跟踪调度的执行细节中都要再进行细致、明确地分析。在操作系统中,中断与调度联系也是比较紧密的,MQX-Lite中断的核心——中断Socket也在dispatch文件中,请听下回分解。

(今天网页的排版真是让人崩溃。。。~^~)


读书人网 >软件架构设计

热点推荐