当前位置:文档之家› Nucleus实时操作系统分析报告

Nucleus实时操作系统分析报告

目录一、NUCLEUS的内核(KERNEL) (3)1.1 系统启动 (3)1.2 初始化线程 (4)1.3 线程调度 (4)1.3.1 任务的调度 (5)1.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)N UCLEUS内核总结: (25)二、NUCLEUS的开发工具 (27)2.1 N UCLEUS C++ (27)2.2 N UCLEUS MNT (27)2.3 N UCLEUS VNET (27)2.4 N UCLEUS PC+ (27)2.5 N UCLEUS FILE (27)2.6 N UCLEUS CLIB (28)2.7 N UCLEUS GRAFIX (28)2.8 N UCLEUS EDE (28)2.9 N UCLEUS UDB (29)2.10 N UCLEUS DEBUG+ (29)2.11 第三方产品的支持 (31)2.12 SDS S INGLE S TEP (31)三、NUCLEUS的网络支持 (33)3.1 I NTERNET套件 (33)Nucleus NET (33)Nucleus SNMP (33)Nucleus RMON (34)Nucleus SP AN (34)3.2 N UCLEUS W EB S ERV (34)3.3 N UCLEUS J VI (34)3.4 N UCLEUS EPILOGUE (34)Nucleus实时操作系统是Accelerated Technology公司开发的嵌入式RTOS产品,只需一次性购买Licenses,就可以获得操作系统的源码。

Nucleus购买的灵活性比较大:Kernel,Networking,File System,Web Technology,Target Debugger可以分开购买,如果我们只需要微内核的话只要购买Kernal和Debugger,当前的下位机就是这样配置的。

但是,如果以后我们要开发接入服务器和IP Phone的话就必须购买一堆网络协议;上位机要用的话还要购买文件系统。

Nucleus的另一大好处是程序员不用写板支持软件包(BSP),因为操作系统已经开放给程序员,不同的目标板在操作系统BOOT时可以通过修改源码进行不同的配置。

对于程序员来说,写BSP是一项比较繁琐的任务,有了OS的源码这项工作就简单多了,同时调试时也可以跟踪到中断、寄存器那一级,简化了硬件的调试。

VxWorks和pSOS都必须购买标准的BSP模板工具来写板支持软件包,开发工作量就比较大了。

Nucleus对CPU的支持能力比较强,支持当前流行的大多数RISC、CISC、DSP处理器,比如:80x86(实时、保护模式)、68xxx、PowerPC、i960、MIPS、SH、ARM、ColdFire。

Nucleus 系统对于不同的处理器,操作系统的源码大部分是相同的,只有5%的源码是用汇编写的跟CPU 有关。

如果使用另外的CPU,则只用修改5、6个汇编程序就可以进行移植,但是对于不同系列的处理器,它们的Compiler、Linker、Debugger是不同的(要另外购买),而且编译预处理的过程也是不一样的,这就要投入一部分力量去进行操作系统的移植。

当然,这也是Nucleus的一个优点,VxWorks和pSOS都没有源码,换一个系列的CPU操作系统又要重新购买,实际上他们OS开发的工作量并没有多少,但却造成了用户的重复性投资。

一、Nucleus的内核(Kernel)Nucleus的核心是一个实时的多任务内核——Nucleus PLUS,具有以下特性(Accelerated Technology公司宣称的):可移植性:Nucleus PLUS可用于大多数流行的处理器。

因为Nucleus PLUS主要是用标准C写的,移植到新的处理器系列相对很直接。

这也就意味着用Nucleus PLUS开发的应用程序也具有很高的可移植性。

可用性:不像其他的商业内核,Nucleus PLUS的系统调用名直接表明了它的功能。

比如,你可以通过Nu_Create_Task系统调用来创建一个任务。

Nucleus PLUS的系统调用都设计成具有类似的入口参数和返回值类型。

Nucleus PLUS的对象都不隐式地和别的对象相关。

比如,邮箱和任务之间是不相关的。

因此,用户可以利用多个Nucleus PLUS对象之间的结合形成混合系统调用。

配置:Nucleus PLUS最终是以C库的形式提供给用户,你可以选择所需要的部分链入到你的应用程序中。

特性:①、快速响应时间:对临界资源的检测时间不依赖于占有该临界资源的线程执行时间的长短,一旦低优先级线程释放掉临界资源(不管其是否执行完),高优先级线程就会抢占运行。

②、每个任务的执行时间和其他任务的处理时间无关。

③、较高吞吐量:随着任务数目的增多,任务的调度时间为常数。

④、可扩展性:利用现有系统调用的结合可得到新的系统调用。

Nucleus PLUS提供其他实时内核都具有的系统服务,比如:任务控制、任务通信、任务同步、内存管理、可编程的定时器、标准的输入/输出设备接口等。

对任务的调度依赖优先级、时间片的方法,可以选择挂起一个任务按照先入先出(FIFO)的顺序或按照优先级的顺序。

所有的操作系统对象(任务、邮箱、队列、管道等)都可以动态地创建和删除。

创建一个对象时,要指定指定其控制块的内存区域和其它的数据要求(堆栈空间等)。

Nucleus在任务调度时,首先查看任务是否可以抢占,如果不能抢占,则一直执行到任务完成或任务放弃时间片;否则,依靠优先级进行调度,先调入优先级最高的任务,对于优先级相同的任务则分享时间片、轮流调度。

//ben:请问这里的时间片是系统节拍还是由多个节拍组成的时间片,猜测应该就是时间节拍若每个任务分配一些时间片,怎样保证实时?//错了,1.1系统启动对于68K系列的CPU,如果采用CrossCode C编译器的话,Nucleus使用的是CrossCode C的启动函数,标号START 是系统的入口点。

START 标号在文件start.s 中,用汇编及CrossCode C 的宏指令写的。

主要完成68360中断向量表指针VBR 和寄存器基址MBAR 的初始化,以及外部RAM 各分区的初始化,这些分区包括:ram ,data ,malloc ,init ,sys_memory 等。

系统低级初始化完成后,控制就交给初始化线程INT_Initialize 。

1.2 初始化线程初始化线程是系统开始执行的第一个线程,线程的入口是INT_Initialize ,同时也是系统的主函数,具有另外的标号名main 。

系统初始化首先完成硬件寄存器的配置,包括:存储器片选(CS0~CS7),软件看门狗SWT ,系统周期定时器PIT ,A 口、B 口、C 口引脚功能设定,串行通信控制器的初步配置等。

这些硬件的配置跟目标板有关,需要用户自己用汇编来写。

其次,将系统堆栈指针TCD_System_Stack 初始化为堆栈区stack 的顶部,同时在系统内存区sys_memory 中拿出TMD_HISR_Stack_Size 大小的一片内存用作高级中断服务程序的堆栈HISR_STACK 。

然后,控制交给INC_Initialize 。

INC_Initialize 首先完成操作系统数据结构的初始化,包括:线程控制、邮箱、队列、管道、信号量、事件、分区内存、动态内存、定时器、I/O Driver 等。

其次,调用Application_Initialize ,这一函数由用户编写,完成任务、消息队列等的创建、中断的注册以及应用程序的初始化。

当所有的初始化都完成后,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 就绪,控制就会交给TCT_Control_To_Thread ,在这里将TCD_Execute_HISR 或TCD_Execute_Task 设置为当前线程TCD_Current_Thread ,启动任务时间片定时器,根据线程的不同堆栈类型恢复堆栈,然后执行RTS 或RTE 指令,将控制权交给线程。

Nucleus 的线程有两种类型的堆栈帧://ben :有什么区别呢?Interrupt 堆栈类型Solicited 堆栈类型任务创建时,要建立一个初始堆栈帧,线程入口是TCC_Task_Shell,该Shell执行任务的入口程序,通常任务的执行是一个死循环,不停地在等待消息或事件,如果没有消息或事件任务就会挂起,否则往下执行。

如果,任务在Shell调度中返回,则表示该任务已执行完毕,将任务终止,其状态置为NU_FINISHED。

HISR创建时,也要建立一个初始堆栈帧,线程入口是TCC_HISR_Shell。

HISR_Shell调度的是当前具有最高优先级的HISR,直至TCD_Execute_HISR的激活计数器tc_activation_count 为0,才调度同一优先级或低优先级的其它HISR。

HISR_Shell对HISR调度就是执行HISR的入口程序,然后根据激活计数器循环调度,HISR是不能被挂起的。

1.3.1 任务的调度任务的调度需要用到以下比较重要的数据结构:TCD_Created_Tasks_List:已创建任务链表的头指针。

TCD_Priority_List[256]:任务控制块TCB的指针数组,每个元素是优先级0~255就绪任务链表的头指针。

TCD_Priority_Groups:按位来定义的长字,对应32组优先级,每bit是一组,负责8个优先级,如果其中任意一个优先级有任务就绪,则该bit置1。

TCD_Sub_Priority_Groups[32]:子优先级组的位映像图,每一元素对应一组优先级。

比如TCD_Sub_Priority_Groups[0]对应优先级0~7,bit0~bit7分别表示优先级0~7。

相关主题