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

Nucleus实时操作系统分析报告

Nucleus实时操作系统分析报告
Nucleus实时操作系统分析报告

目录

一、NUCLEUS的内核(KERNEL) (3)

1.1 系统启动 (3)

1.2 初始化线程 (4)

1.3 线程调度 (4)

1.3.1 任务的调度 (5)

1.3.2 中断的调度 (9)

1.3.3 操作系统数据结构的保护 (14)

1.4 任务间通信 (16)

1.4.1 消息管道(Pipes) (17)

1.5 任务的同步 (21)

1.6 定时器 (21)

1.7 内存管理 (22)

1.8 输入/输出设备驱动 (23)

N UCLEUS内核总结: (23)

二、NUCLEUS的开发工具 (25)

2.1 N UCLEUS C++ (25)

2.2 N UCLEUS MNT (25)

2.3 N UCLEUS VNET (25)

2.4 N UCLEUS PC+ (25)

2.5 N UCLEUS FILE (25)

2.6 N UCLEUS CLIB (26)

2.7 N UCLEUS GRAFIX (26)

2.8 N UCLEUS EDE (26)

2.9 N UCLEUS UDB (27)

2.10 N UCLEUS DEBUG+ (27)

2.11 第三方产品的支持 (29)

2.12 SDS S INGLE S TEP (29)

三、NUCLEUS的网络支持 (31)

3.1 I NTERNET套件 (31)

Nucleus NET (31)

Nucleus SNMP (31)

Nucleus RMON (32)

Nucleus SP AN (32)

3.2 N UCLEUS W EB S ERV (32)

3.3 N UCLEUS J VI (32)

3.4 N UCLEUS EPILOGUE (32)

Nucleus实时操作系统是Accelerater Technology公司开发的嵌入式RTOS产品,只需一次性购买Licenses,就可以获得操作系统的源码。

Nucleus购买的灵活性比较大:Kernel,Networking,File System,Web Technology,Target Debugger可以分开购买,如果我们只需要微内核的话只要购买Kernal和Debugger,当前的下位机就是这样配置的。但是,如果以后我们要开发接入服务器和IP Phone的话就必须购买一堆网络协议;上位机要用的话还要购买文件系统。VxWorks就不是这样,其OS基本部分中已经包括了很多基本的网络协议,只有一些比较特殊的网络协议需要单独购买,比如:SNMP1/2,OSPF2,IPX等。当然,Nucleus的好处在于各层协议都提供的是源码,Vxworks则不提供。

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作为一个非主流的操作系统,其自身也存在着很多不足之处,比如:实时性不够、定时中断管理不可靠、I/O管理太简单、操作系统的调试工具太少等。下面分别说明。

一、Nucleus的内核(Kernel)

Nucleus的核心是一个实时的多任务内核——Nucleus PLUS,具有以下特性(Accelerater Technology公司宣称的):

可移植性:

Nucleus PLUS可用于大多数流行的处理器。因为Nucleus PLUS主要是用标准C写的,移植到新的处理器系列相对很直接。这也就意味着用Nucleus PLUS开发的应用程序也具有很高的可移植性。

可用性:

不像其他的商业内核,Nucleus PLUS的系统调用名直接表明了它的功能。比如,你可以通过Nu_Create_Task系统调用来创建一个任务。Nucleus PLUS的系统调用都设计成具有类似的入口参数和返回值类型。Nucleus PLUS的对象都不隐式地和别的对象相关。比如,邮箱和任务之间是不相关的。因此,用户可以利用多个Nucleus PLUS对象之间的结合形成混合系统调用。

配置:

Nucleus PLUS最终是以C库的形式提供给用户,你可以选择所需要的部分链入到你的应用程序中。但是,其可裁剪性并不好,如果某些系统功能不要的话,必须在Nucleus.h的头文件中加一些宏定义,比如定义:#define NU_ENABLE_STACK_CHECK,那么每个系统调用时都要进行堆栈检查,否则就不进行堆栈检查,可以删除的功能并不多。VxWorks的可裁剪性就强多了,有300多个独立模块,微内核6K,最小系统<30K,配全了可达到几百K。

特性:

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

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

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

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

Nucleus PLUS提供其他实时内核都具有的系统服务,比如:任务控制、任务通信、任务同步、内存管理、可编程的定时器、标准的输入/输出设备接口等。对任务的调度依赖优先级、时间片的方法,可以选择挂起一个任务按照先入先出(FIFO)的顺序或按照优先级的顺序。所有的操作系统对象(任务、邮箱、队列、管道等)都可以动态地创建和删除。创建一个对象时,要指定指定其控制块的内存区域和其它的数据要求(堆栈空间等)。

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

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 的线程有两种类型的堆栈帧:

任务创建时,要建立一个初始堆栈帧,线程入口是TCC_Task_Shell ,该Shell 执行任务的入口程序,通常任务的执行是一个死循环,不停地在等待消息或事件,如果没有消息或事件任务就会挂起,否则往下执行。如果,任务在

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

Interrupt 堆栈类型Solicited 堆栈类型

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。

TCD_Highest_Priority:当前就绪任务的最高优先级,并不表示当前正在运行任务的优先级,如果该任务不能抢占。

TCD_Execute_Task:当前正在执行的任务指针。

TCD_Current_Thread:当前正在执行的线程指针(TASK or HISR)。

Nucleus的任务具有五种状态:executing,ready,suspended,finished,terminated。

Executing:任务正在执行,但是其任务控制块TCB中的状态tc_status仍为NU_READY,只是该任务的指针等于当前线程TCD_Current_Thread。

Ready:任务已就绪,但是有其它任务在运行。

Suspended:任务在等待请求服务完成的过程中被挂起,一旦请求服务完成,任务就会迁移至ready状态。

Finished:该任务的处理已经完成(在TCC_Task_Shell调度中返回)。一旦任务处于这种状态就不能再执行了,除非任务被复位。

Terminated:任务被Killed。一旦任务处于这种状态就不能再执行了,除非任务被复位。

Nucleus的每个任务都具有一个0~255的优先级,0表示最高优先级,255表示最低优先级,对于相同优先级的任务分时间片运行,不同优先级的任务则可以发生抢占。

任务的调度涉及到:创建任务、删除任务、复位任务、终止任务、恢复任务、挂起任务等。

①、创建任务(TCC_Create_Task)

任务的创建一般是在Application_Initialize中进行,当然也可以在其它任务中动态地创建和删除任务。任务创建的流程如下:

②、删除任务(TCC_Delete_Task)

对任务删除时,默认任务是处于finished或terminated状态。将任务删除,主要是将任务从已创建任务链表中删除,并不能释放与任务相关连的控制块(TCB)和堆栈。

③、复位任务(TCC_Reset_Task)

当任务处于finished或terminated状态时,才能对该任务执行复位,否则返回NU_NOT_TERMINATED,表示任务没有结束或终止。任务复位主要是将任务控制块中的数据成员重新赋初值,重新创建任务堆栈(任务堆栈复位),将任务状态置为无条件挂起状态NU_PURE_SUSPEND。

④、终止任务(TCC_Terminate_Task)

如果要终止的是当前任务(TCD_Current_Thread),则直接将任务挂起,将任务状态置为

NU_TERMINATED。

如果要终止的不是当前任务,则要对任务状态进行判断。如果任务已经处于finished或terminated状态,则什么也不做。如果任务处于ready状态,则直接将任务挂起,将任务状态置为NU_TERMINATED。如果任务处于suspended状态,则必须释放和该任务相关的所有保护结构后才能将任务终止。

⑤、恢复任务(TCC_Resume_Task)

如果任务可以获得执行所需要的系统资源,比如:对于做NU_Send_To_Pipe系统调用的任务如果消息管道已有空余空间,或者做NU_Reveive_From_Pipe系统调用的任务如果管道中有消息,那么挂起在该管道上的任务就会恢复。

如果任务挂起类型与请求恢复类型一致,则把任务状态置为NU_READY,将任务插入就绪任务优先级链表TCD_Priority_List[task->tc_priority],设置优先级组TCD_Priority_Groups和子优先级组TCD_Sub_Priority_Groups[task->tc_priority/8]中本任务优先级对应的bit,指示本优先级有任务ready。如果要恢复的任务优先级比当前最高优先级TCD_Highest_Priority要高,且当前任务TCD_Execute_Task可以抢占,则将要恢复的任务置为当前任务,同时会产生任务抢占,返回NU_TRUE,否则返回NU_FALSE。

⑥、挂起任务(TCC_Suspend_Task)

如果任务不能获得执行所需要的系统资源,比如:对于做NU_Send_To_Pipe系统调用的任务如果消息管道已满,或者做NU_Reveive_From_Pipe系统调用的任务如果管道已空,那么任务就会被挂起。

任务挂起首先判断要挂起的是不是当前任务TCD_Current_Thread,如果不是挂起当前任务,则要释放任务的当前保护结构tc_current_protect。

其次,如果任务的状态为NU_READY且该任务优先级就绪任务链表TCD_Priority_List[]中只有这一个任务ready,则要清空该优先级就绪任务链表,同时要清除子优先级组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,则将该任务从优先级就绪任务链表中删除,不用修改子优先级组和优先级组,另外也不用调整最高优先级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_System随后又将控制交给TCT_Schedule,TCT_Schedule根据TCD_Execute_HISR或TCD_Execute_Task开始下一轮的任务调度,如果调度过程中发现挂起任务需要的系统资源可以满足,就会把任务恢复,按照优先级重新调度。

任务挂起流程如下:

1.3.2中断的调度

Nucleus的中断分为管理的和非管理的中断。

管理的中断需要向操作系统注册该中断向量,中断产生后通过该中断向量注册的低级中断服务程序(LISR)来激活高级的中断服务程序(HISR)。LISR主要完成硬件中断的处理,及激活HISR。HISR的调度类似于任务,具有优先级,可以使用大多数Nucleus的系统调用。

非管理的中断,则不需要通过操作系统进行管理,直接将中断服务程序挂到中断向量表上,上下文的保存与恢复都要用户自己来做,该中断自己不能嵌套,最好不要被管理的中断再次中断否则会引起堆栈出错,而且非管理的中断不能使用绝大多数的Nucleus系统调用,因为它可能会破坏操作系统某些保护的数据结构(当有线程在运行时)。非管理的中断适用于那些比较频繁的中断,如果通过操作系统来管理这些中断的话,其上下文保存与恢复的时间就比较长,中断的实时性就不能满足要求。

非管理的中断比较简单,类似于以前我们写的中断服务程序,这里就不多说。下面我们讨论的中断的调度都指的是Nucleus管理中断的调度。

中断的调度需要用到以下比较重要的数据结构:

TCD_Registered_LISRs[256]:对应68360的256个中断向量。0表示该中断向量没有注册,是操作系统不能处理的中断(Unhandled_Interrupt);非0表示该中断向量已注册,且其值为在LISR函数指针数组TCD_LISR_Pointers中的索引下标。

TCD_LISR_Pointers[30]:LISR函数指针数组,指向当中断产生时要调用的低级中断服务程序LISR的入口函数。

TCD_Interrupt_Count:表示有多少个中断服务程序(ISRs)正在进行处理。0:没有中断;1:只有一个中断;>1:中断嵌套。

TCD_Interrupt_Level:允许中断的级别,用来给68360的状态寄存器SR赋值。0x700表示屏蔽所有中断,0x500表示屏蔽5级及5级以下的中断,0表示打开所有中断。

TCD_Unhandled_Interrupt:系统出错时,表示不能处理的中断向量号。

TCD_Created_HISRs_List:已创建的HISR链表的头指针。

TCD_Active_HISR_Heads[3]:对应HISR优先级0~2,每个数组元素是该优先级已激活HISR 链表的头指针。

TCD_Active_HISR_Tails[3]:对应HISR优先级0~2,每个数组元素是该优先级已激活HISR 链表的尾指针。

TCD_Execute_HISR:当前正在执行或要执行的具有最高优先级的HISR指针。

每个HISR具有一个0~2的优先级,0表示最高优先级,2表示最低优先级,相同优先级的HISR按照先入先出的顺序处理,优先级不同的HISR按照优先级的高低进行调度。HISR是不能被挂起的,因此其所有的系统调用都要加上NU_NO_SUSPEND参数。

中断的调度包括:中断向量的注册、HISR的创建与删除、上下文的保护与恢复、LISR的执行、HISR的激活以及HISR的调度等。

①、中断向量的注册(TCC_Register_LISR)

一个中断要通过操作系统管理起来,首先要将其中断向量通过系统调用NU_Register_LISR(INT vector, VOID (*new_lisr)(INT), VOID (**old_lisr)(INT))注册起来。该系统

调用的第2个参数是LISR的入口函数指针,也就是中断产生后要执行的LISR。

中断的注册首先要判断该中断向量是否已经注册过。如果该中断已经注册过,则利用TCD_Registered_LISRs索引到该中断向量在LISR函数指针数组TCD_LISR_Pointers中的下标,然后将新的LISR(new_lisr)填入TCD_LISR_Pointers。

如果该中断向量没有注册过,则在LISR函数指针数组TCD_LISR_Pointers中找出一个没有使用的单元,将new_lisr填入该单元,同时将该单元的下标填入该中断向量在TCD_Registered_LISRs中对应的单元。另外,还要判断INT_Loaded_Flag标志,如果该标志为0,则要替换掉当前的中断向量表,否则不修改当前的中断向量表。

②、HISR的创建(TCC_Create_HISR)

HISR也就是中断产生后,要在LISR中激活的高级中断服务程序。

HISR的创建比任务创建简单,不用进行设置任务状态、恢复任务等操作,只需创建一个HISR控制块HCB,初始化HCB中的一些参数,为HISR创建一个Solicited类型的堆栈帧,将该HISR的指针挂到已创建HISR链表TCD_Created_HISRs_List,同时分配一个用户指定的入口函数指针,该函数用来完成真正的中断处理。

③、HISR的删除(TCC_Delete_HISR)

HISR的删除默认HISR处于非激活状态,仅仅是将HISR从已创建HISR链表TCD_Created_HISRs_List中删除,并清除HISR ID标志,并不能释放与HISR相关的内存(控制块、堆栈等),同时也不影响HISR的激活,对HISR的调度可能会产生微小的影响(由于HISR ID被清除)。一般来说,HISR的删除没有什么意义,除非把跟HISR相关的中断也关掉。

④、上下文的保护(TCT_Interrupt_Context_Save)

通常的中断服务程序对要用到的寄存器都要进行堆栈保护,Nucleus操作系统除了做这些外,还要对当前线程进行保护,使得高级中断服务程序HISR可以抢占任务,让HISR得到快速的响应。Nucleus在系统空闲(没有线程运行)时,中断堆栈使用的是系统堆栈TCD_System_Stack;如果有线程(任务或HISR)在运行,使用的是任务或HISR堆栈,上下文保护完成之后,则将堆栈切换到系统堆栈TCD_System_Stack。

上下文保护首先将所有中断屏蔽掉,等保护完成之后再将中断打开。其次判断中断计数器TCD_Interrupt_Count,如果本次中断是中断嵌套,则将TCD_Interrupt_Count加1,然后返回。如果本次中断不是中断嵌套,则判断当前有没有线程在运行,如果当前有线程在运行,则为当前线程建立一个Interrupt类型的堆栈帧,将当前的堆栈指针保存在线程控制块中,再将堆栈指针切换到系统堆栈顶部TCD_System_Stack,然后返回;如果当前没有线程运行,则直接将堆栈指针切换到系统堆栈顶部TCD_System_Stack,然后返回。

⑤、LISR的执行(TCC_Dispatch_LISR)

中断上下文保护完成后,就要根据中断向量,在LISR指针数组TCD_LISR_Pointers中索引到本中断向量的LISR入口函数指针,然后执行LISR函数,通常LISR要做的只是处理硬件中断及激活HISR。LISR执行完毕,则将上下文恢复,将控制权交给TCT_ Shedule进行系统调度。

要注意的是,如果某个中断向量没有注册,则会产生系统错误,进入系统错误线程

ERC_System_Error处理,这种错误是致命的错误,导致整个系统进入一个死循环。

⑥、上下文的恢复(TCT_Interrupt_Context_Restore)

上下文恢复首先判断是不是中断嵌套,如果是中断嵌套,则将TCD_Interrupt_Count减1,将堆栈保护的寄存器恢复,然后利用RTE指令从中断返回。如果不是中断嵌套,则将当前线程TCD_Current_Thread清为0,将堆栈切换到系统堆栈顶部TCD_System_Stack,将控制交给TCT_Shedule进行线程的重新调度,在这里HISR会抢占任务优先运行。

对于没有嵌套的中断恢复,并没有执行RTE指令,从中断产生的指令往下执行,而是将控制交给TCT_Shedule进行重新调度,这类中断恢复可以分三种情况进行分析:i)、系统空闲(做TCD_Shedule死循环)时,产生了中断,则上下文恢复后,再次运行TCD_ Shedule,然后调度由LISR激活的HISR(TCD_Execute_HISR)。

ii)、中断产生时,有一个任务在运行。由于在上下文保护时,已经给当前任务建立了一个中断类型的堆栈帧,同时LISR运行时没有修改当前任务的状态(没有将当前任务挂起),也没有修改TCD_Execute_Task。当中断恢复完成之后,TCD_Shedule首先把TCD_Execute_HISR设置为当前线程TCD_Current_Thread,优先调度HISR,如果HISR运行过程中激活了一个比当前被中断任务优先级更高的任务,则TCD_Execute_Task会被修改,等HISR运行完毕,则将TCD_Execute_Task设置成当前线程。如果TCD_Execute_Task没被修改,则被中断的任务恢复运行;如果有更高级的任务ready,则等高级任务挂起后,被中断的任务才能恢复运行。

iii)、中断产生时,有一个高级中断服务程序HISR在运行。如果本次中断的HISR优先级比当前的HISR(TCD_Execute_HISR)优先级低,则LISR激活HISR时不会修改TCD_Execute_HISR,中断恢复后,继续执行中断前的HISR(上下文保护时已给当前的HISR建立了一个中断类型的堆栈帧),然后再根据HISR的优先级进行调度。如果本次中断的HISR优先级比当前的HISR优先级高,则LISR激活HISR时会修改TCD_Execute_HISR,中断恢复后,优先执行优先级高的HISR,等到TCT_Shedule调度到本次被中断的HISR时,被中断的HISR 接着被中断的部分继续执行。

⑦、HISR的激活(TCT_Active_HISR)

HISR是在LISR中被激活的,TCT_Active_HISR只是激活由LISR指定的HISR以及修改TCD_Execute_HISR,并不真正地执行HISR,HISR在TCT_Shedule中才被真正地调度执行。

激活HISR首先根据激活次数hisr->tc_activation_count来判断该HISR是否已被激活。

如果HISR已被激活,则只将激活次数tc_activation_count加1。

如果该HISR没有被激活过,且该HISR的优先级激活链表为空,则将该HISR挂到本优先级激活链表上,同时根据HISR的优先级决定是否修改TCD_Execute_HISR。

如果该HISR没有被激活过,且该HISR的优先级激活链表非空,则直接将该HISR挂到本优先级激活链表的尾指针,不用修改TCD_Execute_HISR,因为本优先级激活链表的头指针就有可能是TCD_Execute_HISR,或者有更高优先级的HISR已被激活。

⑧、HISR的调度

中断恢复后,如果当前的TCD_Execute_HISR是被中断停下来的HISR,则经TCT_Shedule 调度后,被中断的HISR恢复运行。

如果TCD_ Execute_HISR已被修改,是一个新的HISR,则TCT_Shedule会将该HISR放入TCT_HISR_Shell中进行调度。

TCT_HISR_Shell完成HISR的调度。

首先循环调度当前的TCD_Execute_HISR,也就是循环执行HISR创建时用户指定的入口函数,直至其激活次数tc_activation_count等于0。如果TCD_Execute_HISR只被激活了一次,则HISR的入口函数只会执行一次。

TCD_Execute_HISR调度完毕(激活次数为0),如果TCD_Execute_HISR所在优先级的激活链表只有这一个HISR,则将本优先级激活链表清空(将TCD_Active_HISR_Heads[X]及TCD_Active_HISR_Tails[X]置为NU_NULL),然后从激活链表头指针数组TCD_Active_HISR_Heads中按优先级顺序搜索到一个已被激活的最高优先级的HISR,由此来修改TCD_Execute_HISR,如果没有其他HISR被激活,则TCD_Execute_HISR为空指针。

TCD_Execute_HISR调度完毕,如果TCD_Execute_HISR所在优先级激活链表不只这一个HISR被激活,则将TCD_Execute_HISR从本优先级激活链表删除,将本优先级下一个激活的HISR设置为TCD_Execute_HISR。

最后,为当前正在调度的HISR建立一个solicited类型的堆栈帧,将堆栈指针保存在HISR 控制块中,清除当前线程TCD_Current_Thread,将堆栈切换到系统堆栈顶部TCD_System_Stack。然后将控制权交给TCT_Shedule重新调度,如果还有其它的HISR被激活,则重复上面的过程;否则进入任务的调度,或在TCT_Shedule死循环,等待HISR被激活或任务ready。

一个完整的中断处理流程如下:

①、中断前系统空闲

②、中断前有任务在运行

③、中断前有HISR在运行

1.3.3操作系统数据结构的保护

由于Nucleus操作系统的线程是可以抢占的,高优先级的任务可以抢占低优先级的任务,HISR可以抢占任务,HISR之间也可以抢占。

如果某个低优先级的任务正在通过系统调用对操作系统的某个数据结构进行操作,比如:正在修改已创建任务链表TCD_Created_Tasks_List,或正在往某个消息管道Pipe中填消息(要修改消息管道的数据成员),这时发生了任务抢占,如果发生抢占的高优先级任务也要修改同一数据结构,就必须等待低优先级的任务完成修改数据结构的系统调用后,再让高优先级的任务运行,否则就会破坏操作系统的数据结构。

这一机制是通过操作系统结构保护(Protect)实现的。任务运行时如果要修改操作系统的数据结构,就要通过系统调用TCT_Protect (TC_PROTECT *protect) 把该数据结构的保护结构保护起来,当任务对该数据结构的操作结束就会通过系统调用TCT_Unprotect (void)或TCT_Unprotect_Specific (TC_PROTECT *protect) 来释放保护结构。

如果低优先级的任务没有释放保护结构之前,发生了任务抢占,高优先级的任务抢占了低优先级的任务,如果高优先级的任务也要修改同一系统数据结构,那么在做系统调用TCT_Protect 时,就会发现该数据结构的保护结构已经被另一个线程拥有,当前的线程就会暂时被挂起,将控制交给拥有保护结构的线程,等待拥有该保护结构的线程释放掉保护结构后,也就是拥有保护结构的线程在做TCT_ Unprotect时,高优先级的任务才能真正地把控制权抢占过来。

Nucleus共有四种跟线程调度有关的比较重要的保护结构:

TCD_List_Protect:已创建任务链表的保护结构;

TCD_System_Protect:系统保护结构,用于任务调度;

TCD_LISR_Protect:用于LISR的创建和删除;

TCD_HISR_Protect:用于HISR的创建和删除;

保护结构的结构体是这样定义的:

typedef struct TC_PROTECT_STRUCT

{

TC_TCB tc_tcb_poiter; /* 拥有保护结构的线程指针*/

UNSIGNED tc_thread_waiting; /* 有线程在等待该保护结构的标志*/ }TC_PROTECT;

①、数据结构的保护(TCT_Protect)

当线程在操作的数据结构不想因为线程的抢占而破坏时,就要申请对该数据结构的保护,比如:在创建HISR时,就要申请HISR链表的保护TCT_Protect(&TCD_HISR_Protect);在链表插入完成后,就要调用TCT_Unprotect( )释放当前线程拥有的保护结构。

另外,如果线程正在执行的系统调用不想因为线程的抢占而中断时,就要申请系统保护结构的保护TCT_Protect(&TCD_System_Protect),比如:任务的恢复、任务的挂起、消息管道的收发等,这些操作都要申请系统保护结构,当系统调用结束后,就要调用TCT_Unprotect( )释放当前线程拥有的保护结构。

TCT_Protect首先判断要保护的结构是否被其它线程拥有,如果没有其它线程拥有要保护的

结构,则将当前线线程TCD_Current_Thread赋给protect->tc_tcb_pointer,表示当前线程要占用该保护结构,清除保护结构的线程等待标志,将保护结构的指针送给TCD_Current_Thread->tc_current_protect,表示当前线程拥有一个保护结构,然后返回。

如果其它线程拥有要保护的结构,则要调用TCT_Schedule_Protectd,直至其它线程释放掉该保护结构,然后重复上面的处理,表示当前线程拥有该保护结构。

②、保护结构的释放(TCT_Unprotect)

当拥有保护结构的线程处理完系统调用后,就要释放被保护的结构。保护结构的释放有两个系统调用:TCD_Unprotect释放的是线程当前的保护结构tc_current_protect;TCD_Unprotect_Specific释放的是用户或操作系统指定的保护结构。

TCD_Unprotect首先判断当前线程是否拥有一个保护结构,再判断保护结构的线程等待标志,看看是否有其它线程在等待该保护结构,如果这些条件都成立,则将控制权交给TCT_Control_To_System。TCT_Control_To_System为当前线程创建一个Solicited类型的堆栈帧,清除当前线程拥有的保护结构以及保护结构上挂的线程,清除TCD_Current_Thread,将堆栈从线程堆栈切换到系统堆栈,然后将控制权交给TCD_Schedule重新进行调度,从而引起TASK或HISR的竞争(线程的抢占)。

如果没有其它线程在等待该保护结构,则直接清除当前线程的tc_current_protect,以及保护结构的tc_tcb_pointer,然后返回。

TCD_Unprotect_Specific首先清除指定保护结构上挂的线程tc_tcb_pointer,如果没有其它线程在等待该保护结构就直接返回。如果还有其它线程在等待该保护结构,则为当前线程建立一个Solicited类型的堆栈帧,清除当前线程TCD_Current_Thread,将堆栈从线程堆栈切换到系统堆栈,然后将控制权交给TCD_Schedule重新进行调度,从而引起TASK或HISR的竞争(线程的抢占)。

③、保护的调度(TCT_Schedule_Protected)

保护结构的调度也就是调度拥有保护结构的线程,直至其释放保护。

TCT_Schedule_Protected首先为想得到保护结构的当前线程建立一个Solicited类型的堆栈帧,将拥有保护结构的线程置为当前线程TCD_Current_Thread,将堆栈切换至系统堆栈,将控制权交给TCT_Control_To_Thread,这里将恢复运行因线程抢占而挂起的拥有保护结构的线程,等其处理完相关数据结构后,就会调用TCD_Unprotect来释放保护结构,释放时就会发现还有另一个线程在等待该保护结构,然后控制权就会交给TCD_Schedule重新进行调度,引起线程之间的竞争。

注意:TCT_Schedule_Protected并没有修改TCD_Execute_Task及TCD_ Execute_HISR,只是临时地将拥有保护结构的线程置为当前线程,当拥有保护结构的线程释放保护后,TCD_Schedule又会恢复运行想得到保护结构的TCD_Execute_Task或TCD_ Execute_HISR。

数据结构保护的处理示意图如下:

Nucleus 操作系统不具备优先级自动逆转的功能,它有自己的解决方法。当高优先级的线程不能获得临界系统资源时,高优先级的任务并没有挂起,所有在此优先级之下的线程就都不能运行,Nucleus 会把拥有临界系统资源的低优先级线程临时地升为当前线程TCD_Current_Thread (相当于临时把优先级升为最高),当低优先级的线程释放临界系统资源后,高优先级的任务马上会恢复运行。

VxWorks 是通过互斥信号灯来实现优先级自动逆转的,操作系统能自动提升获得此信号灯的所有任务的优先级,与获得此信号灯的最高优先级任务相同。如果所有任务没有设置信号灯选项,它们的工作方式是这样的:优先级低的任务获得一个临界资源且正在运行,高优先级任务因为没有获得这一临界资源而挂起,这时一个中优先级任务就绪,如果低优先级的任务是可以抢占的,它就会抢占低优先级的任务,造成高优先级任务没有机会运行。如果低优先级和高优先级的任务都设置了互斥信号灯,操作系统会自动提高低优先级任务的优先级和高优先级任务相同,这样就不会出现上面的问题。

1.4 任务间通信

Nucleus 任务间的通信机制有邮箱(mailboxes ),消息对列(queues ),消息管道(pipes )。它们之间的主要不同之处在于使用的消息结构不同。

Nucleus 的邮箱(mailboxes )提供的是单个消息的简单通信机制。每个邮箱最多只能容纳一条4个长字(16 bytes )的消息。邮箱可以动态地创建和删除,邮箱的数目不受限制。

Nucleus 的队列(queues )提供的是传送多个消息的通信机制,一条消息由一个以上的长字组成,支持定长和变长的消息类型。队列也可以动态地创建和删除,队列的数目不受限制。

Nucleus 的管道(pipes )提供的也是传送多个消息的通信机制,一条消息由由一个以上的字节组成,支持定长和变长的消息类型。管道也可以动态地创建和删除,管道的数目不受限制。

Nucleus 的队列和管道是十分类似的,不同之处在于:队列的消息按长字来访问,管道的消息按字节来访问。下面我们只拿管道来分析Nucleus 的任务通信机制。

时间

1.4.1消息管道(Pipes)

管道支持定长和变长的消息类型,消息格式的类型在创建时就已经固定。定长消息的管道比较好管理,每条消息都具有固定的长度;变长消息的管道管理起来就相对复杂一点,每条消息前还要加四个bytes用来指示消息的长度,一条变长的消息有时不是位于连续的内存空间,也就是当管道写指针指到管道尾时,一条变长消息就会分成管道的首尾两块。

①、管道的创建(PIC_Create_Pipe)

管道创建时,首先要对以下比较重要的管道控制块数据成员赋初值,用来确定管道的大小和消息类型:

pipe->pi_fifo_suspend:NU_FIFO表示任务在管道上的挂起顺序是按先入先出(FIFO)的顺序;NU_PRIORITY表示任务在管道上的挂起顺序是按照优先级的顺序。

pipe->pi_fixed_size:NU_V ARIABLE_SIZE表示管道的消息类型是变长的;NU_FIXED_SIZE 表示管道的消息类型是定长的。

pipe->pi_message_size:对于定长的消息类型,表示每条消息的大小;对于变长类型的消息,表示最长消息的大小。

pipe->pi_pipe_size:管道总的大小。

pipe->pi_start,pipe->pi_end:管道在内存空间的起始和终止地址指针。

pipe->pi_read,pipe->pi_write:管道的读写指针。

pipe->pi_suspend_list:管道上的挂起任务链表头指针;

pipe->pi_urgent_list:管道上发送紧急消息的挂起任务链表头指针。

pipe->pi_tasks_waiting:管道上等待任务的个数。

注意:只有任务才能挂起在管道上,HISR是不能挂起的,HISR在管道上收发消息的时候都要使用NU_NO_SUSPEND选项。

然后,将该管道插入已创建管道链表PID_Created_Pipes_List。

②、管道的删除(PIC_Delete_Pipe)

管道的删除首先要把该管道从已创建管道链表中删除。

其次,将管道挂起任务链表pipe->pi_suspend_list上被挂起的任务(在管道上收发消息时被挂起)全部恢复(TCC_Resume_Task),给所有的任务返回状态NU_PIPE_DELETED。

然后,将管道紧急消息挂起链表pipe->pi_urgent_list上被挂起的任务(做PIS_Send_To_Front_Of_Pipe调用时被挂起)全部恢复,给所有任务返回状态NU_PIPE_DELETED。

如果被恢复的任务优先级比做管道删除系统调用的任务优先级高,且做该系统调用的任务可以抢占,则控制权会交给TCT_Control_To_System,发生任务的抢占。

③、往管道发送消息(PIC_Send_To_Pipe)

PIC_Send_To_Pipe负责往指定的管道发送消息,消息的长度由用户指定。

如果管道上有一个或更多的任务在等待消息,则发送的消息直接拷贝至第一个等待任务的消息域,同时挂起的任务被恢复,如果被恢复的任务优先级比当前任务的优先级高,且当前任

务可以抢占,则控制权会交给TCT_Control_To_System,发生任务的抢占。

如果管道上没有足够的空间来存放消息,则往管道发送消息的任务就会被挂起(可以选择挂起或不挂起)。

如果管道上有空间存放消息,则要发送的消息就会copy至管道中。

往管道发送消息的处理流程如下:

④、从管道中接收消息(PIC_Receive_From_Pipe)

PIC_Receive_From_Pipe负责从指定的管道中接收消息,接收到的消息的实际长度放在actual_size中。

如果管道中没有消息,任务可以选择挂起与否。

如果有任务做PIS_Send_To_Front_Of_Pipe系统调用发送紧急消息到管道中,由于管道中没有空间而被挂起,则紧急消息会copy至接收任务的接收消息域,被挂起的任务马上会恢复,如果当前任务可以抢占且被挂起的任务比当前任务优先级高,则控制权会交给TCT_Control_To_System,发生任务抢占。

如果管道中有消息,则管道中读指针指向的消息会copy 至接收任务的接收消息域.。如果有发送消息的任务挂起在管道上,且管道中又有空间存放其要发送的消息,则被挂起的任务会恢复,其要发送的消息会copy至管道中。如果当前任务可以抢占且被挂起的任务比当前任务优先级高,则控制权会交给TCT_Control_To_System,发生任务抢占。

从管道接收消息的处理流程如下:

拿两个任务举列来说明消息管道的收发过程(假设没有其它任务在运行):

①、两个任务具有不同的优先级,高优先级任务不停地发送,低优先级任务不停地接收。

②、两个任务具有不同的优先级,低优先级任务不停地发送,高优先级任务不停地接收。

③、两个任务具有相同的优先级,分时间片运行。

任务任务

网页设计实验报告

实验报告 课程名称网络技术基础实验项目TCP/IP协议配置实验仪器计算机 系别 专业 班级/学号 学生姓名 实验日期 成绩 指导教师

实验一 TCP/IP协议配置 一、实验目的(标题黑体小四) 1.熟练掌握模板的用法。 2.掌握CSS的用法。 3.掌握网站发布的方法。 二、实验内容 1. 创建和使用模板。 2. css的创建和使用。 3. 发布网站。 三、实验课时 4课时 四、实验步骤 创建网站 1、创建一个站点,并创建 images 文件夹存放图片。将示例图片拷贝至images 目录下 2、创建 CSS 文件,名称为 style.css,将其保存至 style文件夹。 3、创建模板文件 tpl.dwt,并保存。结果如下: (1) 给 tpl.dwt 附加样式表 style.css。 在 tpl.dwt 的空白处点击鼠标右键,选择“附加样式表”: 选择 style.css 文件: 完成后,在 tpl.dwt 的 head标签里有如下的代码: (2) 设置模板的背景颜色。打开 CSS 面板,为 style.css 新建一条 css 规则。过程如 下:

将背景颜色设为#ff1e70: 在 style.css 生成如下的代码: body { background-color: #ff1e70? } 3) 制作布局。插入一 2 行 2 列的表格。表格的宽度=316+634=950,其他的设置:让表格居中对齐。 (4) 消除表格两边的空隙。展开 CSS 样式表,双击 body: 双击 body后,打开“body的 CSS 规则定义”对话框,按照下面的方式设置:Style.css 的代码变为: body { background-color: #ff1e70? margin: 0px? }

操作系统实验报告--实验一--进程管理

实验一进程管理 一、目的 进程调度是处理机管理的核心内容。本实验要求编写和调试一个简单的进程调度程序。通过本实验加深理解有关进程控制块、进程队列的概念,并体会和了解进程调度算法的具体实施办法。 二、实验内容及要求 1、设计进程控制块PCB的结构(PCB结构通常包括以下信息:进程名(进程ID)、进程优先数、轮转时间片、进程所占用的CPU时间、进程的状态、当前队列指针等。可根据实验的不同,PCB结构的内容可以作适当的增删)。为了便于处理,程序中的某进程运行时间以时间片为单位计算。各进程的轮转时间数以及进程需运行的时间片数的初始值均由用户给定。 2、系统资源(r1…r w),共有w类,每类数目为r1…r w。随机产生n进程P i(id,s(j,k),t),0<=i<=n,0<=j<=m,0<=k<=dt为总运行时间,在运行过程中,会随机申请新的资源。 3、每个进程可有三个状态(即就绪状态W、运行状态R、等待或阻塞状态B),并假设初始状态为就绪状态。建立进程就绪队列。 4、编制进程调度算法:时间片轮转调度算法 本程序用该算法对n个进程进行调度,进程每执行一次,CPU时间片数加1,进程还需要的时间片数减1。在调度算法中,采用固定时间片(即:每执行一次进程,该进程的执行时间片数为已执行了1个单位),这时,CPU时间片数加1,进程还需要的时间片数减1,并排列到就绪队列的尾上。 三、实验环境 操作系统环境:Windows系统。 编程语言:C#。 四、实验思路和设计 1、程序流程图

2、主要程序代码 //PCB结构体 struct pcb { public int id; //进程ID public int ra; //所需资源A的数量 public int rb; //所需资源B的数量 public int rc; //所需资源C的数量 public int ntime; //所需的时间片个数 public int rtime; //已经运行的时间片个数 public char state; //进程状态,W(等待)、R(运行)、B(阻塞) //public int next; } ArrayList hready = new ArrayList(); ArrayList hblock = new ArrayList(); Random random = new Random(); //ArrayList p = new ArrayList(); int m, n, r, a,a1, b,b1, c,c1, h = 0, i = 1, time1Inteval;//m为要模拟的进程个数,n为初始化进程个数 //r为可随机产生的进程数(r=m-n) //a,b,c分别为A,B,C三类资源的总量 //i为进城计数,i=1…n //h为运行的时间片次数,time1Inteval为时间片大小(毫秒) //对进程进行初始化,建立就绪数组、阻塞数组。 public void input()//对进程进行初始化,建立就绪队列、阻塞队列 { m = int.Parse(textBox4.Text); n = int.Parse(textBox5.Text); a = int.Parse(textBox6.Text); b = int.Parse(textBox7.Text); c = int.Parse(textBox8.Text); a1 = a; b1 = b; c1 = c; r = m - n; time1Inteval = int.Parse(textBox9.Text); timer1.Interval = time1Inteval; for (i = 1; i <= n; i++) { pcb jincheng = new pcb(); jincheng.id = i; jincheng.ra = (random.Next(a) + 1); jincheng.rb = (random.Next(b) + 1); jincheng.rc = (random.Next(c) + 1); jincheng.ntime = (random.Next(1, 5)); jincheng.rtime = 0;

四种实时操作系统特性进行分析和比较

四种实时操作系统特性进行分析和比较 https://www.doczj.com/doc/d110022914.html,2006年11月18日21:55ChinaByte 本文对四种实时操作系统(RTOS)特性进行分析和比较。它们是:Lynx实时系统公司的LynxOS、QNX软件系统有限公司的QNX以及两种具有代表性的实时Linux——新墨西哥工学院的RT-Linux和堪萨斯大学的KURT-Linux。 近年来,实时操作系统在多媒体通信、在线事务处理、生产过程控制、交通控制等各个领域得到广泛的应用,因而越来越引起人们的重视。 基本特征概述 *QNX是一个分布式、嵌入式、可规模扩展的实时操作系统。它遵循POSIX.1 (程序接口)和POSIX.2(Shell和工具)、部分遵循POSIX.1b(实时扩展)。它最早开发于1980年,到现在已相当成熟。 *LynxOS是一个分布式、嵌入式、可规模扩展的实时 操作系统,它遵循POSIX.1a、POSIX.1b和POSIX.1c标准。它最早开发于1988年。 *RT-Linux是一个嵌入式硬实时操作系统,它部分支持POSIX.1b标准。 *KURT-Linux不是为嵌入式应用设计的,不同于硬(hard)实时/软(soft)实时应用,他们提出“严格(firm)”实时应用的概念,如一些多媒体应用和ATM网络应用,KURT是为这样一些应用设计的“严格的”实时系统。 体系结构异同 实时系统的实现多为微内核体系结构,这使得核心小巧而可靠,易于ROM固化,并可模块化扩展。微内核结构系统中,OS服务模块在独立的地址空间运行,所以,不同模块的内存错误便被隔离开来。但它也有弱点,进程间通信和上下文切换的开销大大增加。相对于大型集成化内核系统来说,它必须靠更多地进行系统调用来完成相同的任务。 *QNX是一个微内核实时操作系统,其核心仅提供4种服务:进程调度、进程间通信、底层网络通信和中断处理,其进程在独立的地址空间运行。所有其它OS服务,都实现为协作的用户进程,因此QNX核心非常小巧(QNX4.x大约为12Kb)而且运行速度极快。 *LynxOS目前还不是一个微内核结构的操作系统,但它计划使用所谓的“Galaxy”技术将其从大型集成化内核改造成微内核,这一技术将在LynxOS 3.0中引入。新的28Kb微内核提供以下服务:核心启动和停止、底层内存管理、出错处理、中断处理、多任务、底层同步和互斥支持。

实时操作系统报告

实时操作系统课程实验报告 专业:通信1001 学号:3100601025 姓名:陈治州 完成时间:2013年6月11日

实验简易电饭煲的模拟 一.实验目的: 掌握在基于嵌入式实时操作系统μC/OS-II的应用中,基于多任务的模式的编程方法。锻炼综合应用多任务机制,任务间的通信机制,内存管理等的能力。 二.实验要求: 1.按“S”开机,系统进入待机状态,时间区域显示当前北京时间,默认模式“煮饭”; 2.按“C”选择模式,即在“煮饭”、“煮粥”和“煮面”模式中循环选择; 3.按“B”开始执行模式命令,“开始”状态选中,时间区域开始倒计时,倒计时完成后进入“保温”状态,同时该状态显示选中,时间区域显示保温时间; 4.按“Q”取消当前工作状态,系统进入待机状态,时间区域显示北京时间,模式为当前模式; 5.按“X”退出系统,时间区域不显示。 6.煮饭时长为30,煮粥时长为50,煮面时长为40. 三.实验设计: 1.设计思路: 以老师所给的五个程序为基础,看懂每个实验之后,对borlandc的操作有了大概的认识,重点以第五个实验Task_EX为框架,利用其中界面显示与按键扫描以及做出相应的响应,对应实现此次实验所需要的功能。 本次实验分为界面显示、按键查询与响应、切换功能、时钟显示与倒计时模块,综合在一起实验所需功能。 2.模块划分图: (1)界面显示: Main() Taskstart() Taskstartdispinit() 在TaskStartDispInit()函数中,使用PC_DispStr()函数画出界面。

(2)按键查询与响应: Main() Taskstart() 在TaskStart()函数中,用if (PC_GetKey(&key) == TRUE)判断是否有按键输入。然后根据key 的值,判断输入的按键是哪一个;在响应中用switch语句来执行对应按键的响应。 (3)切换功能: l计数“C”按 键的次数 M=l%3 Switch(m) M=0,1,2对应于煮饭,煮粥,煮面,然后使用PC_DispStr()函数在选择的选项前画上“@”指示,同时,在其余两项钱画上“”以“擦出”之前画下的“@”,注意l自增。 四.主要代码: #include "stdio.h" #include "includes.h" #include "time.h" #include "dos.h" #include "sys/types.h" #include "stdlib.h" #define TASK_STK_SIZE 512 #define N_TASKS 2 OS_STK TaskStk[N_TASKS][TASK_STK_SIZE]; OS_STK TaskStartStk[TASK_STK_SIZE]; INT8U TaskData[N_TASKS];

RTOS实时操作系统(Real Time Operating System)

John Lee 20:27:07 上次讲到了 RTOS 的抢占机制对事件响应能力提高的帮助,避免了事件的丢失。 John Lee 20:27:07 上次讲到了 RTOS 的抢占机制对事件响应能力提高的帮助,避免了事件的丢失。小道(569198569) 20:27:39 老师辛苦 John Lee 20:27:45 但光依靠 RTOS 的抢占机制,并不能做到完全不丢失事件,只是从一定程度上降低了丢失事件的机率。 丶砖家(1361439207) 20:28:16 LEE 丶砖家(1361439207) 20:28:14 好复杂呀 John Lee 20:28:54 上次的这个图: John Lee 20:30:20 是没有丢失事件了,但如果我们把 E2 的第 3 个事件提前一些: John Lee 20:32:30 对于这样情况,RTOS 提供了一些带有通信功能的同步对象,可以让应用程序构造软件缓冲机制,来保持突发事件。 John Lee 20:33:19 关于具体的实现方法,要等到我们学习完了 RTOS 同步机制和各种同步对象后,才能讨论。

John Lee 20:34:24 除此之外,还有其它一些系统设计时,需要仔细考虑的问题: 中断处理时间到底多长合适? 等待设备事件产生,是否一定要用中断? 如何划分任务? 如何确定合适的调度算法? 是否需要任务优先级? 静态优先级能不能满足要求? 系统节拍的频率多少合适? 如何选则合适的同步对象? DsPower小灰灰(108430786) 20:35:56 对这就是我的问题 wei(34103820) 20:36:02 John Lee 20:36:07 这些问题,都留到我们学习完 RTOS 后,再来讨论。 小道(569198569) 20:36:23 wei(34103820) 20:36:02 遵守纪律 John Lee 20:36:39 现在讨论,很多同学没有基础,晕的。 John Lee 20:37:12 我们继续学习《嵌入式系统的实时概念》。 DsPower小灰灰(108430786) 20:38:13 支持老师 DsPower小灰灰(108430786) 20:38:14 雪狼(982332664) 20:38:55 我都晕乎了 John Lee 20:40:01 我们上次停下来的地方,是: 4.4.5 调度算法。

Web网页设计实验报告

WEB系统开发 综合实验报告 题目红尘客栈网上订房页面 专业计算机科学与技术(信息技术及应用) 班级计信2班 学生蒋波涛 重庆交通大学 2013年

目录 一、设计目的 (3) 二、设计题目 (3) 三、结构设计 (3) 四、技术分析 (4) 五、设计过程 (7) 六、实验心得 (10) 七、实验总结 (11)

一、设计目的 在Internet飞速发展的今天,互联网成为人们快速获取、发布和传递信息的重要渠道,它在人们政治、经济、生活等各个方面发挥着重要的作用。因此网站建设在Internet 应用上的地位显而易见,它已成为政府、企事业单位信息化建设中的重要组成部分,从而倍受人们的重视。我们当代大学生更是离不开网络给我们带来的好处与便利.但是,我们成天浏览的网站网页到底是如何制作的呢?我想这一点很多同学都没有去深究过.所以,这学期我选择了”web网页设计”这门课, 本课程的设计目的是通过实践使同学们经历网页制作的全过程. 通过设计达到掌握网页设计、制作的技巧。 了解和熟悉网页设计的基础知识和实现技巧。根据题目的要求,给出网页设计方案,可以按要求,利用合适图文素材设计制作符合要求的网页设计作品。 熟练掌握Photoshop cs3、Dreamweaver cs等软件的的操作和应用。增强动手实践能力,进一步加强自身综合素质。学会和团队配合,逐渐培养做一个完整项目的能力。 二、设计题目 《红尘客栈》 三、结构设计 选定主题,确定题目之后,在做整个网站之前对网站进行需求分析。首先,做好需求调研。调研方式主要是上网查阅资料,在图书馆里翻阅相关书籍。 然后,调研结束之后对整个网站进行功能描述,并对网站进行总体规划,接着逐步细化。 我们选做的主题是个人主页,并且选定题目为“红尘客栈”,其目的是做一个简单的网站,介绍酒店概况,提供一定的资讯信息。 四、技术分析 (一)建立布局 在这次的网页设计中用到大量的布局,所以怎么样建立布局是关键。Dreamweaver cs3是大多数人设计网页的称手兵器,也是众多入门者的捷径。特别是其在布局方面的出色表现,更受青睐。大家都知道,没有表格的帮助,很难组织出一个协调合理的页面。 1.点击“ALT+F6”键,进入布局模式,插入布局表格。建立一个大概的布局。 2.使用背景图片:选中该项,按浏览可以插入一幅准备好的图片作为表格的背景,因为图片是以平铺的形式作为表格背景,所以表格大小和图片尺寸都要控制好。 (二)网页中的图像

嵌入式操作系统实验报告

中南大学信息科学与工程学院实验报告 姓名:安磊 班级:计科0901 学号: 0909090310

指导老师:宋虹

目录 课程设计内容 ----------------------------------- 3 uC/OS操作系统简介 ------------------------------------ 3 uC/OS操作系统的组成 ------------------------------ 3 uC/OS操作系统功能作用 ---------------------------- 4 uC/OS文件系统的建立 ---------------------------- 6 文件系统设计的原则 ------------------------------6 文件系统的层次结构和功能模块 ---------------------6 文件系统的详细设计 -------------------------------- 8 文件系统核心代码 --------------------------------- 9 课程设计感想 ------------------------------------- 11 附录-------------------------------------------------- 12

课程设计内容 在uC/OS操作系统中增加一个简单的文件系统。 要求如下: (1)熟悉并分析uc/os操作系统 (2)设计并实现一个简单的文件系统 (3)可以是存放在内存的虚拟文件系统,也可以是存放在磁盘的实际文件系统 (4)编写测试代码,测试对文件的相关操作:建立,读写等 课程设计目的 操作系统课程主要讲述的内容是多道操作系统的原理与技术,与其它计算机原理、编译原理、汇编语言、计算机网络、程序设计等专业课程关系十分密切。 本课程设计的目的综合应用学生所学知识,建立系统和完整的计算机系统概念,理解和巩固操作系统基本理论、原理和方法,掌握操作系统开发的基本技能。 I.uC/OS操作系统简介 μC/OS-II是一种可移植的,可植入ROM的,可裁剪的,抢占式的,实时多任务操作系统内核。它被广泛应用于微处理器、微控制器和数字信号处理器。 μC/OS 和μC/OS-II 是专门为计算机的嵌入式应用设计的,绝大部分代码是用C语言编写的。CPU 硬件相关部分是用汇编语言编写的、总量约200行的汇编语言部分被压缩到最低限度,为的是便于移植到任何一种其它的CPU 上。用户只要有标准的ANSI 的C交叉编译器,有汇编器、连接器等软件工具,就可以将μC/OS-II嵌入到开发的产品中。μC/OS-II 具有执行效率高、占用空间小、实时性能优良和可扩展性强等特点,最小内核可编译至2KB 。μC/OS-II 已经移植到了几乎所有知名的CPU 上。 严格地说uC/OS-II只是一个实时操作系统内核,它仅仅包含了任务调度,任务管理,时间管理,内存管理和任务间的通信和同步等基本功能。没有提供输入输出管理,文件系统,网络等额外的服务。但由于uC/OS-II良好的可扩展性和源码开放,这些非必须的功能完全 可以由用户自己根据需要分别实现。 uC/OS-II目标是实现一个基于优先级调度的抢占式的实时内核,并在这个内核之上提供最基本的系统服务,如信号量,邮箱,消息队列,内存管理,中断管理等。 uC/OS操作系统的组成 μC/OS-II可以大致分成核心、任务处理、时间处理、任务同步与通信,CPU的移植等5个部分。如下图:

物联网操作系统的必备特性

物联网操作系统的必备特性 物联网所带来的机遇与挑战都是空前的。要抓住机遇,迎接挑战,是否拥有最佳的操作系统做为基础是极为关键的问题。 那么,物联网环境对操作系统提出了哪些不同于以往的需求?产品开发商采用怎样的操作系统,拥有哪些特征或技术,最有可能在物联网的发展中把握先机?基本上,今后的RTOS 不仅必须具备传统的实时性、确定性和可靠性,还必须提供高度互联、全面安全、远程管理等物联网环境所要求的全新能力。最近,风河公司推出了VxWorks7,对这套在嵌入式领域主导多年的RTOs(实时操作系统)进行了再次创新,其目标正是“物联网市场已达 实时操作系统 (The RTOS for thelnternet of Things) ”。实时性依然是物联网操作系统的必备特性 实时操作系统( RTOS,RealTimeOperation System)是指能够在确定的时间对内部或者外部的事件做出正确的响应。在实时操作系统中,进程执行结果的正确与否不仅与逻辑运算或数学计算结果的正确性相关,而且与得出这个正确结果的时间有关。也就

是说,在实时系统 中,如果一个进程的运算结果虽然 是正确的,但是由 于它完成的时间超出了给定的最后期限,那么这个结果就是毫无意义的。 例如汽车中使用的气囊。当报告车辆碰撞的传感器通知CPu 后,操作系统应快速地发出打开气囊的任务,并且不允许任何其他非实时处理进行干扰,晚一秒钟展开气囊比没有气囊的情况更糟糕,这就是一个典型的实时系统。 通常认为,实时操作系统要求速度非常快。但实际上,实时操作系统强调的不仅仅是速度,而是时间关系的次序和确定性。例如,一条货轮在码头等待各地的卡车运来货物之后装船运往海外,规定好了离港启航的时间。那么,如果有一辆卡车在货轮离港时间之后才把货物运到了码头,逻辑上它虽然完成了陆地货运任务,但已经没有任何意义了。货车行驶速度和气囊打开速度当然不可相提并论,但就它与货轮配合的时间顺序而言具有同样都是实时系统,都必须要满足的是时序确定性,而跟速度有多快不一定相关! 再例如,如果使用足够高性能的CPU,Windows 可以提供非常快的速度。但是,当某些后台任务正在运行时,有时候响应会变得非常漫长,以至于某一个简单的读取文件的任务也会很长时间无响应。并不是说Windows 不够

实时操作系统 期末报告

实时操作系统期末总结报告 一、实时操作系统的概述 实时操作系统(RTOS)是指当外界事件或数据产生时,能够接受并以足够快的速度予以处理,其处理的结果又能在规定的时间之内来控制生产过程或对处理系统做出快速响应,并控制所有实时任务协调一致运行的操作系统。因而,提供及时响应和高可靠性是其主要特点。实时操作系统有硬实时和软实时之分,硬实时要求在规定的时间内必须完成操作,这是在操作系统设计时保证的;软实时则只要按照任务的优先级,尽可能快地完成操作即可。我们通常使用的操作系统在经过一定改变之后就可以变成实时操作系统。 1.1.实时操作系统的相关概念 (1)实时操作系统的定义 实时操作系统是保证在一定时间限制内完成特定功能的操作系统。例如人驾驶的汽车中的系统,需要一个比较稳定的实时操作系统。在“硬”实时操作系统中,如果不能在允许时间内完成使物体可达的计算,操作系统将因错误结束。在“软”实时操作系统中,比如汽车不能很快的识别人的操作指令,那么它可能造成严重的事故(如:汽车的瞬时刹车;公交车,它能准确的报站,这其实就是一个实时操作系统的具体体现;其次,车上的GPS导航仪,其实质也是一个比较精确实时操作系统的产物,如果不能实时,那么导航仪将失效,结果不能正确的指导司机驾驶的方向,同时这种实时操作系统的及时性必须达到一定的程度:ms级)。一些实时操作系统是为特定的应用

设计的,另一些是通用的。一些通用目的的操作系统称自己为实时操作系统。但某种程度上,大部分通用目的的操作系统,如微软的Windows NT或IBM的OS/390有实时系统的特征。这就是说,即使一个操作系统不是严格的实时系统,它们也能解决一部分实时应用问题。 (2)实时操作系统中的一些重要的概念 代码临界段:指处理时不可分割的代码。一旦这部分代码开始执行则不允许中断打入; 资源:任何为任务所占用的实体; 共享资源:可以被一个以上任务使用的资源; 任务:也称作一个线程,是一个简单的程序。每个任务被赋予一定的优先级,有它自己的一套CPU寄存器和自己的栈空间。典型地,每个任 务都是一个无限的循环,每个任务都处在以下五个状态下:休眠 态,就绪态,运行态,挂起态,被中断态; 任务切换:将正在运行任务的当前状态(CPU寄存器中的全部内容)保存在任务自己的栈区,然后把下一个将要运行的任务的当前状态从该任 务的栈中重新装入CPU的寄存器,并开始下一个任务的运行; 内核:负责管理各个任务,为每个任务分配CPU时间,并负责任务之间通讯。分为不可剥夺型内核和可剥夺型内核; 调度:内核的主要职责之一,决定轮到哪个任务运行。一般基于优先级调度法; (3)及时性 关于实时操作系统的及时性,我将从如下两个方面进行介绍:实时操作系统的时间限和实时操作系统的应用相关。 时间限:对一些实时性要求较高的系统,它们要求的时间限一般是毫秒级(ms),但是通常的实时操作系统,一般是秒级(s)或是在

简单网页制作实验总结报告

《大学计算机基础》 实验报告 专业名称: 电子商务2班 学号: xxxxxxxxxxx 姓名: x x 指导教师: x x 2011年12月24日

目录 第一章网站主题设计说明 (1) 1.1 主题内容 (1) 1.2 设计思路 (1) 第二章网站内容设计 (2) 1.1 链接1标题 (2) 1.2 链接2标题 (2) 1.3 flash制作说明 (2) 第三章网站技术难点 (3) 第四章心得体会..................................... ..... ......................... (4)

第一章网站主题设计说明 1.1 主题内容 (1) 网站主题为“四季の花”,包括春夏秋冬四个季节的比较典型的花朵及有关花的诗句,色彩缤纷,十分艳丽夺目。 1.2 设计思路 (2) 大多网站都设计的关于音乐,影视,购物等非常热门的东西,本站设计的主题是花,能让人们在闲下来的时候看看花,品品诗歌,所以做有关花的网页是个不错的选择。同时,让人们分清楚春夏秋冬都各有什么典型的花。

第二章网站内容设计 1.1链接1标题:春の花 春天是生命的季节,在这个季节里,万物复苏。所以就找了虞美人,桃花,牡丹,以及海棠花来作为春天的代表。同时配有与这些花有关的诗句。 1.2 链接2标题:夏の花 夏天充满了激情与阳光,我找了兰花,荷花,百合花等来代表这个季节,色彩艳丽,十分醒目夺人。 1.3 链接3标题:秋の花 大丽花,菊花,月季和牡丹花都竞相出现在本网页,色彩缤纷,赏心悦目。 1.4 链接4标题:冬の花 蝴蝶兰,水仙,迎春花,梅花是冬季的代表,他们刻画了一副傲立冬天的坚强的姿态。

批处理 分时 实时操作系统的特点

批处理、分时、实时操作系统的特点 一、批处理系统的特点 1、多道:在内存中同时存放多个作业,一个时刻只有一个作业运行,这些作业共享CPU和外部设备等资源。 2、成批:用户和他的作业之间没有交互性。用户自己不能干预自己的作业的运行,发现作业错误不能及时改正。 3、批处理系统的目的是提高系统吞吐量和资源的利用率。 二、分时系统的特点 1、同时性,计算机系统能被多个用户同时使用; 2、独立性:用户和用户之间都是独立操作系统的,在同时操作时并不会发生冲突,破坏,混淆等现象; 3、及时性:系统能以最快的速度将结果显示给用户; 4、交互作用性:用户能和电脑进行人机对话。 三、实时操作系统的特点 1、高精度计时系统 计时精度是影响实时性的一个重要因素。在实时应用系统中,经常需要精确确定实时地操作某个设备或执行某个任务,或精确的计算一个时间函数。这些不仅依赖于一些硬件提供的时钟精度,也依赖于实时操作系统实现的高精度计时功能。

2、多级中断机制 一个实时应用系统通常需要处理多种外部信息或事件,但处理的紧迫程度有轻重缓急之分。有的必须立即作出反应,有的则可以延后处理。因此,需要建立多级中断嵌套处理机制,以确保对紧迫程度较高的实时事件进行及时响应和处理。 3、实时调度机制 实时操作系统不仅要及时响应实时事件中断,同时也要及时调度运行实时任务。但是, [3] 处理机调度并不能随心所欲的进行,因为涉及到两个进程之间的切换,只能在确保“安全切换”的时间点上进行,实时调度机制包括两个方面,一是在调度策略和算法上保证优先调度实时任务;二是建立更多“安全切换”时间点,保证及时调度实时任务。

嵌入式实时操作系统实验报告

嵌入式实时操作系统实验报告 任务间通信机制的建立 系别计算机与电子系 专业班级***** 学生姓名****** 指导教师 ****** 提交日期 2012 年 4 月 1 日

一、实验目的 掌握在基于嵌入式实时操作系统μC/OS-II的应用中,任务使用信号量的一般原理。掌握在基于优先级的可抢占嵌入式实时操作系统的应用中,出现优先级反转现象的原理及解决优先级反转的策略——优先级继承的原理。 二、实验内容 1.建立并熟悉Borland C 编译及调试环境。 2.使用课本配套光盘中第五章的例程运行(例5-4,例5-5,例5-6),观察运行结果,掌握信号量的基本原理及使用方法,理解出现优先级反转现象的根本原因并提出解决方案。 3.试编写一个应用程序,采用计数器型信号量(初值为2),有3个用户任务需要此信号量,它们轮流使用此信号量,在同一时刻只有两个任务能使用信号量,当其中一个任务获得信号量时向屏幕打印“TASK N get the signal”。观察程序运行结果并记录。 4. 试编写一个应用程序实现例5-7的内容,即用优先级继承的方法解决优先级反转的问题,观察程序运行结果并记录。 5.在例5-8基础上修改程序增加一个任务HerTask,它和YouTask一样从邮箱Str_Box里取消息并打印出来,打印信息中增加任务标识,即由哪个任务打印的;MyTask发送消息改为当Times为5的倍数时才发送,HerTask接收消息采用无等待方式,如果邮箱为空,则输出“The mailbox is empty”, 观察程序运行结果并记录。 三、实验原理 1. 信号量 μC/OS-II中的信号量由两部分组成:一个是信号量的计数值,它是一个16位的无符号整数(0 到65,535之间);另一个是由等待该信号量的任务组成的等待任务表。用户要在OS_CFG.H中将OS_SEM_EN开关量常数置成1,这样μC/OS-II 才能支持信号量。

网页制作实验报告

网页制作实验报告 页制作实验报告 实验一:站点设置 一、实验目的及要求 本实例是经过“站点定义为”对话框中的“高级”选项卡创建一具新站点。 二、仪器用具 1、生均一台多媒体电脑,组建内部局域,同时接入国际互联。 2、安装windows xp操作系统;建立iis服务器环境,支持asp。 3、安装页三剑客(dreamweaver mx;flash mx;fireworks mx)等页设计软件; 三、实验原理 经过“站点定义为”对话框中的“高级”选项卡创建一具新站点。 四、实验办法与步骤 1)执行“站点\治理站点”命令,在弹出的“治理站点”对话框中单击“新建”按钮,在弹出的快捷菜单中挑选“站点”命令。 2)在弹出的“站点定义为”对话框中单击“高级”选项卡。 3)在“站点名称”文本框中输入站点名称,在“默认文件夹”文本框中挑选所创建的站点文件夹。在“默认图象文件夹”文本框中挑选存放图象的文件夹,完成后单击“确定”按钮,返回“治理站点”对话框。 4)在“治理站点”对话框中单击“完成”按钮,站点创建完毕。 五、实验结果 六、讨论与结论 实验开始之前要先建立一具根文件夹,在实验的过程中把站点存在自己建的文件夹里,如此才干使实验条理化,别至于在实验后寻别到自己的站点。在实验过程中会浮现一些选项,计算机普通会有默认的挑选,最后别要去更改,假如要更改要先充分了解清晰该选项的含义,以及它会造成的效果,否则会使实验的结果失真。实验前先熟悉好操作软件是做好该实验的关键。 实验二:页面图像设置 一、实验目的及要求: 本实例的目的是设置页面的背景图像,并创建鼠标经过图像。 二、仪器用具 1、生均一台多媒体电脑,组建内部局域,同时接入国际互联。 2、安装windows xp操作系统;建立iis服务器环境,支持asp。 3、安装页三剑客(dreamweaver mx;flash mx;fireworks mx)等页设计软件; 4、安装acdsee、photoshop等图形处理与制作软件; 5、其他一些动画与图形处理或制作软件。 三、实验原理 设置页面的背景图像,并创建鼠标经过图像。 四、实验办法与步骤 1) 在“页面属性”对话框中设置页面的背景图像。 2) 在页面文档中单击“”插入鼠标经过图像。 五、实验结果

分时实时批处理操作的特点

一、批处理系统的特点 1、多道:在内存中同时存放多个作业,一个时刻只有一个作业运行,这些作业共享CPU和外部设备等资源。 2、成批:用户和他的作业之间没有交互性。用户自己不能干预自己的作业的运行,发现作业错误不能及时改正。 3、批处理系统的目的是提高系统吞吐量和资源的利用率。 二、分时系统的特点 1、同时性,计算机系统能被多个用户同时使用; 2、独立性:用户和用户之间都是独立操作系统的,在同时操作时并不会发生冲突,破坏,混淆等现象; 3、及时性:系统能以最快的速度将结果显示给用户; 4、交互作用性:用户能和电脑进行人机对话。 三、实时操作系统的特点 1、高精度计时系统

计时精度是影响实时性的一个重要因素。在实时应用系统中,经常需要精确确定实时地操作某个设备或执行某个任务,或精确的计算一个时间函数。这些不仅依赖于一些硬件提供的时钟精度,也依赖于实时操作系统实现的高精度计时功能。 2、多级中断机制 一个实时应用系统通常需要处理多种外部信息或事件,但处理的紧迫程度有轻重缓急之分。有的必须立即作出反应,有的则可以延后处理。因此,需要建立多级中断嵌套处理机制,以确保对紧迫程度较高的实时事件进行及时响应和处理。 3、实时调度机制 实时操作系统不仅要及时响应实时事件中断,同时也要及时调度运行实时任务。但是, [3] 处理机调度并不能随心所欲的进行,因为涉及到两个进程之间的切换,只能在确保“安全切换”的时间点上进行,实时调度机制包括两个方面,一是在调度策略和算法上保证优先调度实时任务;二是建立更多“安全切换”时间点,保证及时调度实时任务。

扩展资料: 实时操作系统是保证在一定时间限制内完成特定功能的操作系统。实时操作系统有硬实时和软实时之分,硬实时要求在规定的时间内必须完成操作,这是在操作系统设计时保证的;软实时则只要按照任务的优先级,尽可能快地完成操作即可。我们通常使用的操作系统在经过一定改变之后就可以变成实时操作系统。 例如,可以为确保生产线上的机器人能获取某个物体而设计一个操作系统。在“硬”实时操作系统中,如果不能在允许时间内完成使物体可达的计算,操作系统将因错误结束。在“软”实时操作系统中,生产线仍然能继续工作,但产品的输出会因产品不能在允许时间内到达而减慢,这使机器人有短暂的不生产现象。

实时操作系统实验报告2

实时操作系统实验报告 专业:11通信工程 学号:20110306136 姓名: 王帅 指导老师:申屠浩

实验二 任务管理实验 实验目的: 1、理解任务管理的基本原理,了解任务的各个基本状态及其变迁过程; 2、掌握μC/OS -II 中任务管理的基本方法(挂起、解挂); 3、熟练使用μC/OS -II 任务管理的基本系统调用。 实验要求与思路: 为了体现任务的各个基本状态及其变迁过程,本实验设计了T0、T1和T3三个任务,它们交替运行,如图2-2所示。 T0 T1 T2 T3 T4 T5 T6 T7 T8 图2-2 注意: 图中的栅格并不代表严格的时间刻度,而仅仅表现各任务启动和执行的相对先后关系。 说明: 在系统完成初始化后,可以先创建并启动优先级最低的TaskStart ,由它创建其他3个应用任务T0、T1和T2,之后整个系 T0 T2 T1 T0 T1 T2 T1 T0

统的运行流程如下: 1)优先级最高的T0开始执行,之后T0挂起自己; 2)然后系统调度选中T1开始执行,之后T1挂起自己; 3)接着系统调度选中T2,之后唤醒T0; 4)如此循环 实现提示: 在启动任务中创建三个任务后,应挂起任务1和任务2。 在每个任务恢复其它任务并挂起自己之前,显示当前三个任务的状态,并延时1秒。 函数说明: void PC_GetDateTime (char *s); 获取"YYYY-MM-DD HH:MM:SS"格式的时间字串存放在字符串s中,s的长度最少为21字节。 void PC_DispStr (INT8U x, INT8U y, INT8U *s, INT8U color); 在y行x列以color颜色值显示字串s,注意color由背景色和前景色两种颜色构成。 INT8U OSTimeDlyHMSM (INT8U hours, INT8U minutes, INT8U seconds, INT16U milli); 按时、分、秒、毫秒设置进行延时。 void OSTimeDly (INT16U ticks) 按ticks值进行延时,1 ticks一般为10ms。 INT32U OSTimeGet (void)

实时操作系统包括硬实时和软实时的区别

一.什么是真正的实时操作系统 做嵌入式系统开发有一段时间了,做过用于手机平台的嵌入式Linux,也接触过用于交换机、媒体网关平台的VxWorks,实际应用后回过头来看理论,才发现自己理解的肤浅,也发现CSDN 上好多同学们都对实时、嵌入式这些概念似懂非懂,毕竟如果不做类似的产品,平时接触的机会很少,即使做嵌入式产品开发,基本也是只管调用Platformteam封装好的API。所以在此总结一下这些概念,加深自己的理解,同时也给新手入门,欢迎大家拍砖,争取写个连载,本文先总结一下实时的概念,什么是真正的实时操作系统? 1. 首先说一下实时的定义及要求: 参见 Donal Gillies 在 Realtime Computing FAQ 中提出定义:实时系统指系统的计算正确性不仅取决于计算的逻辑正确性,还取决于产生结果的时间。如果未满足系统的时间约束,则认为系统失效。

一个实时操作系统面对变化的负载(从最小到最坏的情况)时必须确定性地保证满足时间要求。请注意,必须要满足确定性,而不是要求速度足够快!例如,如果使用足够强大的CPU,Windows在CPU空闲时可以提供非常短的典型中断响应,但是,当某些后台任务正在运行时,有时候响应会变得非常漫长,以至于某一个简单的读取文件的任务会长时间无响应,甚至直接挂死。这是一个基本的问题:并不是Windows不够快或效率不够高,而是因为它不能提供确定性,所以,Windows不是一个实时操作系统。 根据实际应用,可以选择采用硬实时操作系统或软实时操作系统,硬实时当然比软实时好,但是,如果你的公司正在准备开发一款商用软件,那请你注意了,业界公认比较好的VxWorks(WindRiver开发),会花光你本来就很少的银子,而软实时的操作系统,如某些实时Linux,一般是开源免费的,我们公司本来的产品就是基于VxWorks的,现在业界都在CostReduction,为了响应号召,正在调研如何把平台换成免费的嵌入式实时Linux。同学们,如何选择,自己考虑吧:-)

网页制作实验报告

北京理工大学珠海学院课程设计说明书 _2013_—_2014_学年第_1_学期 题目: 《Web应用开发课程设计》 学院:计算机学院 专业班级: 11级软件工程3班 学号: 110202031031 学生姓名:蒋征 指导教师:魏志军 成绩: 时间: 2014/1/5 2014年 1 月 5 日

摘要 本次作品是一个IT技术交流论坛,实现论坛的基本功能,注册、登录、发帖、浏览和回帖。 论坛分三个分板块,网页、C#和JA V A,纵向层次也是三层,主页、板块页和帖子页。网站使用JavaScript实现动态页面。 关键词:计算机技术交流社区JavaScript 网页 I

目录 摘要 ............................................. I 目录 ............................................. II 1 网站结构和布局 (1) 1.1 网站结构 (1) 1.1.1 总体结构 (1) 1.1.2 横向链接结构 (2) 1.2 页面布局 (3) 1.2.1 主页 (3) 1.2.2 分版页面 (6) 1.2.3 帖子页面 (6) 2 技术应用 (8) 2.1 逻辑设计 (8) 2.1.1 HTML和CSS设计 (8) 2.1.2 JavaScript设计 (10) 参考文献 (13) 心得体会 (14) I

教师评语 (15) 成绩评定表 (16) 课程设计答辩记录表 (17) II

1 网站结构 1.1主体结构 1.1.1总结构 网站是以技术交流社区为主题的论坛型网站。 这个网站是按树形结构设计如图1-1-1,页面种类共分三层,分别是主页,分主题页还有就是内容页。 主页连向三个分主题分区页面,分别是MTHL板块,C#板块还有就是JAVA 板块。 主题分区页面下面是内容帖子。 图1-1-1网页关系 1

实时操作系统期末复习题资料

实时操作系统期末复习题 考虑到降低难度,将原有的多选全部换成单选,同时增加简答,减少综合。试卷分数比例与本复习题完全一致。 一、单选题(60题,每题一分) 1、操作系统的主要功能有(C )。 A.进程管理、存储器管理、设备管理、处理机管理 B.虚拟存储管理、处理机管理、进程调度、文件管理 C.处理机管理、存储器管理、设备管理、文件管理 D.进程管理、中断管理、设备管理、文件管理 2、单处理机计算机系统中,(A)是并行操作的。 A.处理机操作和通道操作是并行的 B.程序与程序 C.主程序与子程序 D.用户程序与操作系统程序 3、处理机的所有指令可以在(D )中执行。 A.目态B.浏览器中C.任意时间D.系统态 4、要求在规定的时间内对外界的请求必须给予及时相应的OS是(B )。 A.多用户分时系统B.实时系统 C.批处理系统时间D.网络操作系统 5、(A )对实时系统最重要。 A.实时性B.交互性C.共享性D.运行效率

6、分布式系统和网络系统的主要区别是(C)。 A.并行性B.透明性C.共享性D.复杂性 7、如果分时操作系统的时间片一定,那么(B ),则相应时间越长。A.用户数越少B.用户数越多C.内存越小D.内存越大 8、下面六个系统中,必须是实时操作系统的有(C )个。 (1)航空订票系统(2)过程控制系统(3)机器口语翻译系统(4)计算机辅助系统(5)办公自动化系统(6)计算机激光照排系统 A.1 B.2 C.3 D.4 9、进程在系统中是否存在的惟一标志是(D )。 A.数据集合B.目标程序C.源程序D.进程控制块 10、当( B )时,进程从执行状态转变为就绪状态。 A.进程被调度程序选中B.时间片到 C.等待某一事件D.等待的事件发生 11、在进程状态转换时,下列( D )转换是不可能发生的。 A.就绪态→运行态B.运行态→就绪态 C.运行态→阻塞态D.阻塞态→运行态 12、下列各项工作步骤中,( B )不是创建进程所必需的步骤。 A.建立一个PCB B.作业调度程序为进程分配CPU C.为进程分配内存等资源D.将PCB链入进程就绪队列13、进程是B

相关主题
相关文档 最新文档