Nucleus实时操作系统分析报.pdf
《Nucleus实时操作系统分析报.pdf》由会员分享,可在线阅读,更多相关《Nucleus实时操作系统分析报.pdf(35页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、Nucleus 分析报告1 Nucleus 实时操作系统分析报告目录一、NUCLEUS的内核(KERNEL).31.1 系统启动.31.2 初始化线程.41.3 线程调度.41.3.1 任务的调度.51.3.2 中断的调度.10 1.3.3 操作系统数据结构的保护.15 1.4 任务间通信.17 1.4.1 消息管道(Pipes).18 1.5 任务的同步.23 1.6 定时器 .24 1.7 内存管理.24 1.8 输入/输出设备驱动.25 NUCLEUS内核总结:.25 二、NUCLEUS的开发工具.27 2.1 NUCLEUS C+.27 2.2 NUCLEUS MNT.27 2.3 N
2、UCLEUS VNET.27 2.4 NUCLEUS PC+.27 2.5 NUCLEUS FILE.27 2.6 NUCLEUS CLIB.28 2.7 NUCLEUS GRAFIX.28 2.8 NUCLEUS EDE.28 2.9 NUCLEUS UDB.29 2.10 NUCLEUS DEBUG+.29 2.11 第三方产品的支持.31 2.12 SDS SINGLESTEP.31 三、NUCLEUS的网络支持.33 3.1 INTERNET套件.33 Nucleus NET.33 Nucleus SNMP.33 Nucleus RMON.34 Nucleus SPAN.34 3.2
3、NUCLEUS WEBSERV.34 3.3 NUCLEUS JVI.34 3.4 NUCLEUS EPILOGUE.34 Nucleus 分析报告2 Nucleus 实时操作系统分析报告Nucleus 实时操作系统是Accelerated Technology 公司开发的嵌入式RTOS 产品,只需一次性购买 Licenses,就可以获得操作系统的源码。Nucleus 购买的灵活性比较大:Kernel,Networking,File System,Web Technology,Target Debugger 可以分开购买,如果我们只需要微内核的话只要购买Kernal 和 Debugger,当前
4、的下位机就是这样配置的。但是,如果以后我们要开发接入服务器和IP Phone 的话就必须购买一堆网络协议;上位机要用的话还要购买文件系统。Nucleus 的另一大好处是程序员不用写板支持软件包(BSP),因为操作系统已经开放给程序员,不同的目标板在操作系统BOOT 时可以通过修改源码进行不同的配置。对于程序员来说,写 BSP 是一项比较繁琐的任务,有了OS 的源码这项工作就简单多了,同时调试时也可以跟踪到中断、寄存器那一级,简化了硬件的调试。VxWorks 和 pSOS 都必须购买标准的BSP模板工具来写板支持软件包,开发工作量就比较大了。Nucleus 对 CPU 的支持能力比较强,支持当前
5、流行的大多数RISC、CISC、DSP 处理器,比如:80 x86(实时、保护模式)、68xxx、PowerPC、i960、MIPS、SH、ARM、ColdFire。Nucleus系统对于不同的处理器,操作系统的源码大部分是相同的,只有 5%的源码是用汇编写的跟CPU有关。如果使用另外的CPU,则只用修改5、6 个汇编程序就可以进行移植,但是对于不同系列的处理器,它们的Compiler、Linker、Debugger 是不同的(要另外购买),而且编译预处理的过程也是不一样的,这就要投入一部分力量去进行操作系统的移植。当然,这也是 Nucleus 的一个优点,VxWorks 和 pSOS 都没有
6、源码,换一个系列的CPU 操作系统又要重新购买,实际上他们OS 开发的工作量并没有多少,但却造成了用户的重复性投资。Nucleus 分析报告3 一、Nucleus的内核(Kernel)Nucleus 的核心是一个实时的多任务内核Nucleus PLUS,具有以下特性(Accelerated Technology 公司宣称的):可移植性:Nucleus PLUS 可用于大多数流行的处理器。因为 Nucleus PLUS 主要是用标准C 写的,移植到新的处理器系列相对很直接。这也就意味着用Nucleus PLUS 开发的应用程序也具有很高的可移植性。可用性:不像其他的商业内核,Nucleus PL
7、US 的系统调用名直接表明了它的功能。比如,你可以通过 Nu_Create_Task 系统调用来创建一个任务。Nucleus PLUS 的系统调用都设计成具有类似的入口参数和返回值类型。Nucleus PLUS 的对象都不隐式地和别的对象相关。比如,邮箱和任务之间是不相关的。因此,用户可以利用多个Nucleus PLUS 对象之间的结合形成混合系统调用。配置:Nucleus PLUS 最终是以C 库的形式提供给用户,你可以选择所需要的部分链入到你的应用程序中。特性:、快速响应时间:对临界资源的检测时间不依赖于占有该临界资源的线程执行时间的长短,一旦低优先级线程释放掉临界资源(不管其是否执行完)
8、,高优先级线程就会抢占运行。、每个任务的执行时间和其他任务的处理时间无关。、较高吞吐量:随着任务数目的增多,任务的调度时间为常数。、可扩展性:利用现有系统调用的结合可得到新的系统调用。Nucleus PLUS 提供其他实时内核都具有的系统服务,比如:任务控制、任务通信、任务同步、内存管理、可编程的定时器、标准的输入/输出设备接口 等。对任务的调度依赖优先级、时间片的方法,可以选择挂起一个任务按照先入先出(FIFO)的顺序或按照优先级的顺序。所有的操作系统对象(任务、邮箱、队列、管道等)都可以动态地创建和删除。创建一个对象时,要指定指定其控制块的内存区域和其它的数据要求(堆栈空间等)。Nucle
9、us 在任务调度时,首先查看任务是否可以抢占,如果不能抢占,则一直执行到任务完成或任务放弃时间片;否则,依靠优先级进行调度,先调入优先级最高的任务,对于优先级相同的任务则分享时间片、轮流调度。/ben:请问这里的时间片是系统节拍还是由多个节拍组成的时间片,猜测应该就是时间节拍若每个任务分配一些时间片,怎样保证实时?/错了,1.1系统启动对于 68K 系列的 CPU,如果采用CrossCode C 编译器的话,Nucleus 使用的是 CrossCode CNucleus 分析报告4 的启动函数,标号 START 是系统的入口点。START 标号在文件start.s 中,用汇编及 CrossCo
10、de C的宏指令写的。主要完成68360 中断向量表指针VBR 和寄存器基址MBAR的初始化,以及外部 RAM 各分区的初始化,这些分区包括:ram,data,malloc,init,sys_memory 等。系统低级初始化完成后,控制就交给初始化线程INT_Initialize。1.2初始化线程初始化线程是系统开始执行的第一个线程,线程的入口是INT_Initialize,同时也是系统的主函数,具有另外的标号名main。系统初始化首先完成硬件寄存器的配置,包括:存储器片选(CS0CS7),软件看门狗SWT,系统周期定时器PIT,A 口、B 口、C 口引脚功能设定,串行通信控制器的初步配置等。
11、这些硬件的配置跟目标板有关,需要用户自己用汇编来写。其次,将系统堆栈指针TCD_System_Stack 初始化为堆栈区stack 的顶部,同时在系统内存区 sys_memory 中拿出TMD_HISR_Stack_Size大小的一片内存用作高级中断服务程序的堆栈HISR_STACK。然后,控制交给INC_Initialize。INC_Initialize首先完成操作系统数据结构的初始化,包括:线程控制、邮箱、队列、管道、信号量、事件、分区内存、动态内存、定时器、I/O Driver等。其次,调用Application_Initialize,这一函数由用户编写,完成任务、消息队列等的创建、中断
12、的注册以及应用程序的初始化。当所有的初始化都完成后,INC_Initialize调用 TCT_Schedule 开始线程的调度。1.3线程调度TCT_Schedule 是线程调度的入口,负责将控制权交给具有最高优先级的高级中断服务程序HISR(TCD_Execute_HISR)或处于就绪状态的最高优先级任务(TCD_Execute_Task)。当没有任务或 HISR 执行时,线程调度就在TCT_Schedule 中做死循环,等待 TASK 或 HISR 就绪。HISR的优先权比任务高,一旦有HISR 就绪,则当前调度的任务将会被挂起,优先调度HISR。一 旦 有TASK或HISR就 绪,控 制
13、 就 会 交 给TCT_Control_To_Thread,在 这 里 将TCD_Execute_HISR 或 TCD_Execute_Task 设置为当前线程TCD_Current_Thread,启动任务时间片定时器,根据线程的不同堆栈类型恢复堆栈,然后执行RTS 或 RTE 指令,将控制权交给线程。Nucleus 的线程有两种类型的堆栈帧:/ben:有什么区别呢?线程入口 PC 值SR保留A6 A0D 7D 0堆栈类型为 1线程入口 PC 值A6 A2D 6 D 2堆栈类型为0In te rru p t 堆栈类型So licite d堆栈类型Nucleus 分析报告5 任务创建时,要建立一
14、个初始堆栈帧,线程入口是TCC_Task_Shell,该 Shell 执行任务的入口程序,通常任务的执行是一个死循环,不停地在等待消息或事件,如果没有消息或事件任务就会挂起,否则往下执行。如果,任务在Shell 调度中返回,则表示该任务已执行完毕,将任务终止,其状态置为NU_FINISHED。HISR 创建时,也要建立一个初始堆栈帧,线程入口是TCC_HISR_Shell。HISR_Shell 调度的是当前具有最高优先级的HISR,直至TCD_Execute_HISR的激活计数器tc_activation_count为 0,才调度同一优先级或低优先级的其它HISR。HISR_Shell 对 H
15、ISR 调度就是执行HISR 的入口程序,然后根据激活计数器循环调度,HISR 是不能被挂起的。1.3.1 任务的调度任务的调度需要用到以下比较重要的数据结构:TCD_Created_Tasks_List:已创建任务链表的头指针。TCD_Priority_List256:任务控制块TCB 的指针数组,每个元素是优先级0255 就绪任务链表的头指针。TCD_Priority_Groups:按位来定义的长字,对应32 组优先级,每bit 是一组,负责8 个优先级,如果其中任意一个优先级有任务就绪,则该bit 置 1。TCD_Sub_Priority_Groups32:子优先级组的位映像图,每一元素
16、对应一组优先级。比如TCD_Sub_Priority_Groups0 对应优先级07,bit0bit7 分别表示优先级07。TCD_Highest_Priority:当前就绪任务的最高优先级,并不表示当前正在运行任务的优先级,如果该任务不能抢占。TCD_Execute_Task:当前正在执行的任务指针。TCD_Current_Thread:当前正在执行的线程指针(TASK or HISR)。Nucleus 的任务具有五种状态:executing,ready,suspended,finished,terminated。Executing:任务正在执行,但是其任务控制块TCB 中的状态tc_sta
17、tus 仍为 NU_READY,只是该任务的指针等于当前线程TCD_Current_Thread。Ready:任务已就绪,但是有其它任务在运行。Suspended:任务在等待请求服务完成的过程中被挂起,一旦请求服务完成,任务就会迁移至 ready 状态。Finished:该任务的处理已经完成(在TCC_Task_Shell 调度中返回)。一旦任务处于这种状态就不能再执行了,除非任务被复位。Terminated:任务被Killed。一旦任务处于这种状态就不能再执行了,除非任务被复位。Nucleus 的每个任务都具有一个0255 的优先级,0 表示最高优先级,255 表示最低优先级,对于相同优先级
18、的任务分时间片运行,不同优先级的任务则可以发生抢占。任务的调度涉及到:创建任务、删除任务、复位任务、终止任务、恢复任务、挂起任务等。、创建任务(TCC_Create_Task)任务的创建一般是在Application_Initialize中进行,当然也可以在其它任务中动态地创建和删除任务。任务创建的流程如下:Nucleus 分析报告6、删除任务(TCC_Delete_Task)对任务删除时,默认任务是处于finished 或 terminated 状态。将任务删除,主要是将任务从已创建任务链表中删除,并不能释放与任务相关连的控制块(TCB)和堆栈。、复位任务(TCC_Reset_Task)当
19、任 务 处 于finished或terminated状 态 时,才 能 对 该 任 务 执 行 复 位,否 则 返 回NU_NOT_TERMINA TED,表示任务没有结束或终止。任务复位主要是将任务控制块中的数据成员重新赋初值,重新创建任务堆栈(任务堆栈复位),将任务状态置为无条件挂起状态NU_PURE_SUSPEND。、终止任务(TCC_Terminate_Task)Ap plica tio n_In itia lizeNU_ C rea te _T askT C C_ C re ate _T ask初始化任务控制块TC B 的各数据成员创建任务初始堆栈帧将该任务插入已创建任务链表T CD
20、 _C re ate d_ T asks_ Listca ll T C C_ Resu m e_T a sk置任务状态为 N U _R EAD Y修改T CD _Prio rity_ G ro ups及TC D_ Su b_ Prio rity_ G ro u ps指示本任务对应的优先级有任务 re ady根据任务优先级调整T CD _Exe cu te _T ask将控制交给 T C T_ Sch edu le进行 线程调度Nucleus 分析报告7 如果要终止的是当前任务(TCD_Current_Thread),则直接将任务挂起,将任务状态置为NU_TERMINA TED。如果要终止的不是
21、当前任务,则要对任务状态进行判断。如果任务已经处于finished或terminated 状态,则什么也不做。如果任务处于ready 状态,则直接将任务挂起,将任务状态置为 NU_TERMINA TED。如果任务处于suspended状态,则必须释放和该任务相关的所有保护结构后才能将任务终止。、恢复任务(TCC_Resume_Task)如果任务可以获得执行所需要的系统资源,比如:对于做NU_Send_To_Pipe 系统调用的任务如果消息管道已有空余空间,或者做 NU_Reveive_From_Pipe 系统调用的任务如果管道中有消息,那么挂起在该管道上的任务就会恢复。如果任务挂起类型与请求恢
22、复类型一致,则把任务状态置为NU_READY,将任务插入就绪任务优先级链表TCD_Priority_Listtask-tc_priority,设置优先级组TCD_Priority_Groups和子优先级组 TCD_Sub_Priority_Groupstask-tc_priority/8中本任务优先级对应的bit,指示本优先级有任务 ready。如果要恢复的任务优先级比当前最高优先级TCD_Highest_Priority要高,且当前任务 TCD_Execute_Task 可以抢占,则将要恢复的任务置为当前任务,同时会产生任务抢占,返回NU_TRUE,否则返回NU_FALSE。、挂起任务(TC
23、C_Suspend_Task)如果任务不能获得执行所需要的系统资源,比如:对于做NU_Send_To_Pipe 系统调用的任务如果消息管道已满,或者做 NU_Reveive_From_Pipe 系统调用的任务如果管道已空,那么任务就会被挂起。任务挂起首先判断要挂起的是不是当前任务TCD_Current_Thread,如果不是挂起当前任务,则要释放任务的当前保护结构tc_current_protect。其次,如果任务的状态为NU_READY 且该任务优先级就绪任务链表TCD_Priority_List中只 有 这 一 个 任 务ready,则 要 清 空 该 优 先 级 就 绪 任 务 链 表,
24、同 时 要 清 除 子 优 先 级 组TCD_Sub_Priority_Groups和优先级组TCD_Priority_Groups对应的 bit。如果要挂起的任务具有最高优先级,则要根据优先组和子优先组重新搜索最高优先级,如果其他组中没有任务就绪,则 TCD_Highest_Priority=255。然后根据最高优先级,重新调整TCD_Execute_Task,如果最高优先级为 255,则 TCD_Execute_Task=NU_NULL。如果任务的状态为NU_READY 且该任务优先级就绪任务链表TCD_Priority_List中不只这一个任务ready,则将该任务从优先级就绪任务链表中
25、删除,不用修改子优先级组和优先级组,另 外 也 不 用 调 整 最 高 优 先 级TCD_Highest_Priority,只 是 利 用 最 高 优 先 级 重 新 调 整TCD_Execute_Task。如果要挂起的是当前线程TCD_Current_Thread,则将控制交给TCD_Control_To_System,在 TCD_Control_To_System中给当前线程创建一个solicited 类型的堆栈帧,线程入口是调用TCD_Control_To_System的 下 一 条 指 令,任 务 恢 复 时 从 这 条 指 令 开 始 继 续 执 行。TCD_Control_To_S
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- Nucleus 实时 操作系统 分析
限制150内