您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 质量控制/管理 > 基于S3C44B0X的UcOS移植
基于S3C44B0X的uC/OS移植SC06023001莫凡SC06023002钟轶主要内容基本概念uC/OS-Ⅱ在S3CEV40上的移植调试与测试有关操作系统移植的三个问题1.什么情况下需要进行移植操作系统?2.什么情况下需要移植实时操作系统?3.选择什么样的实时操作系统进行移植?问题1:操作系统的必要性为什么需要操作系统硬件资源的复杂,需要在应用程序与硬件之间提供一个软件层次以简化开发资源的丰富,需要有专门的资源管理任务的增加,需要有系统来进行任务的调度操作系统的功能设备访问、资源管理、任务管理、统计及其他功能问题2:实时性的需求实时性指的是系统对于特定的事件的处理需要在要求的时间内完成。从操作系统的角度来讲,实时性指的系统的结构能在多大程度上保证反映的速度早期的嵌入式操作系统几乎都是实时操作系统,但近年随着一些手持通用计算机设备的出现,使得现在的嵌入式操作系统有很多不需要实时性问题2:实时性的需求(续)是否需要完全取决于软件项目的复杂程度要保证多个模块的执行时间并行的功能模块比较多定时处理的功能比较多程序的执行需要判断很多条件参数或资源需要规划代码执行的优先顺序要保证多个模块的执行时间问题3:RTOS的选择内核占用存储区尺寸RTOS性能:任务切换时间、任务调度数、任务优先级数开发调试工具易用性兼容性许可证形式uC/OS-Ⅱ简介uC/OS-Ⅱ是美国一个名为JeanLabrosse的工程师开发的实时操作系统。它以小内核、多任务、丰富的系统服务、容易使用等特点越来越受欢迎uC/OS-Ⅱ实时系统的商业应用非常广泛,具有非常稳定、可靠的性能,成功应用于生命科学、航天工程等重大科研项目中。由于其极小的内核,特别适用于对程序代码存储空间极其敏感的嵌入式系统开发uC/OS-Ⅱ是一款源码公开的实时性操作系统uC/OS-Ⅱ的实时性“可剥夺内核”与“不可剥夺内核”的区分往往是RTOS与非实时嵌入式操作系统的区别所在uC/OS-Ⅱ是可剥夺型内核,它总是让就绪态的高优先级的任务先运行,并规定所有任务的优先级必须不同,任务的优先级同时也唯一的标识了任务。uC/OS-Ⅱ的特点可移植性绝大部分uC/OS-Ⅱ的源代码是用移植性很强的ANSIC写的,和微处理器相关部分使用汇编语言写的,且已经压到最低限度,可以在绝大部分8位,16位,32位,64位微处理器上,微控制器上和DSP上运行可裁减用户可以在应用程序中通过语句#defineconstants来定义所需的uC/OS-Ⅱ功能模块,以减少不必要的存储器空间开支uC/OS-Ⅱ的特点(续)占先式uC/OS-Ⅱ属于完全占先式的内核,这意味着uC/OS-Ⅱ总是运行就绪条件下优先级最高的任务多任务可以管理64个任务,支持56个用户任务,赋予每个任务的优先级必须是不相同的,不支持时间片轮转调度法uC/OS-Ⅱ的特点(续)中断管理中断可以使正在执行的任务挂起,如果优先级更高的任务被唤唤醒,则高优先级的任务再中断嵌套全部推出后立即执行,中断嵌套可达255层其它公开源代码、可固化、可确定性、任务栈、提供很多系统服务、稳定性和可靠性强uC/OS-Ⅱ内核中的概念临界区(共享资源的保护手段)任务和任务的状态任务的控制块任务的调度任务的切换过程时钟节拍uC/OS-Ⅱ的中断uC/OS-Ⅱ的初始化和启动uC/OS-Ⅱ文件体系结构uC/OS-Ⅱ在S3CEV40上的移植所谓移植,就是使一个实时操作系统能够在某个微处理器平台或微控制器上运行,在移植之前,先要了解移植uC/OS-Ⅱ到处理器上必须满足的条件。移植条件1.处理器的C编译器能产生可重入代码2.用C语言可打开和关闭中断3.处理器支持中断并且能产生定时中断4.处理器支持能够容纳一定量数据的硬件栈5.处理器有将堆栈指针和其它CPU寄存器读出和存储到堆栈或内存中的指令移植条件(续)对于S3C44BOX来说,上面的这些条件都是可以满足的。开发工具采用EmbestIDEforARM,可以生成可重入代码;在ARM7TDMl的处理器上可以产生定时器中断;开/关中断可以通过设置相应寄存器来实现;ARM7TDMl核的处理器支持容纳一定量数据的硬件堆栈且具有有关的堆栈指令。移植过程由uC/OS-Ⅱ的文件体系结构可知,移植的主要工作就是修改与CPU相关的三个文件修改OS_CPU.H文件修改OS_CPU_A.ASM文件修改OS_CPU_C.C文件修改OS_CPU.H文件该部分主要完成基本的配置和定义,包括:定义与编译器相关的数据类型定义使能和禁止中断宏定义栈的增长方向定义OS_TASK_SW宏定义数据类型uC/OS-II有8种整数数据类型:1.INT8U无符号8位整数2.INT8S有符号8位整数3.INT16U无符号16位整数4.INT16S有符号16位整数5.INT32U无符号32位整数6.INT32S有符号32位整数他们需要同编译器中的数据类型相匹配。定义数据类型(续)匹配方法:TypedefunsignedcharINT8UTypedefsignedcharINT8UTypedefunsignedintINT16UTypedefsignedintINT16STypedefsignedlongINT32STypedefINT32UintOS_STK;TypedefINT16UOS_CPU_SR;定义使能和禁止中断宏定义OS_ENTER_CRITICAL()和OS_EXIT_CRITICAL();uC/OS-II使用这两个语句开关中断,开关中断具体指令和方式需要根据不同的处理器来编写和选择。定义使能和禁止中断宏(续)使用场合执行临界代码段时cpu不容许被打断,因此在临界代码段前后添加两个函数来保护临界代码段。{OS_ENTER_CRITICAL();/*uc/OS-II临界代码段*/OS_EXIT_CRITICAL();}开关中断的方式uC/OS-II定义了三种开关中断的方法:方法一直接开,直接关。方法二直接开,利用psw恢复。方法三直接开,利用局部变量恢复psw的内容。究竟选择那种方法跟编译器和处理器有关,三种方法各有优劣。方式一方法一的示意程序#defineOS_ENTER_CRITICAL()disable_int()#defineOS_EXIT_CRITICAL()enable_int()方式一(续)使用方法一的场合处理器相应的编译器只能使用某条指令开中断或关中断方法一存在问题如果在禁止中断的情况下调用uC/OS-II函数,那么从uC/OS-II函数,那么从uC/OS-II返回时中断可能就允许了。方式二方式二的示意程序#defineOS_ENTER_CRITICAL()Asm(“PUSHPSW”);Asm(“DI”);#defineOS_EXIT_CRITICAL()Asm(“poppsw”)方式二(续)使用方式二的场合:处理器及相应的编译器有从PSW中恢复相应的中断状态的语句。优点:保证临界段代码执行时中断关闭,执行完毕恢复原先开关中断的状态。方式三方法三的示意程序:#defineOS_ENTER_CRITICAL()Cpu_sr=get_processor_psw();Disable_interrupts()OS_CRITICAL()enable_int()方式三(续)使用方式二的场合:处理器及相应的编译器有从PSW中恢复相应的中断状态的语句。但需要使用局部变量。注意事项用户在编写应用程序中开关中断必须添加相应的声明和语句。方式三(续)添加声明和语句的示意程序:VoidSom_uCOS_II_Service(arguments){OS_CPU_SRcpu_srCpu_sr=get_processor_psw();Disable_interrupts()/*临界段代码*/Set_processor_psw()}三种方式的选择三种方式比较:方法二最好,但需要处理器和编译器的支持。方法的选择:使用S3C44B0X处理器及GCC编译器具备使用方法二的条件。定义堆栈增长方向OS_CPU.H中的相关代码:#defineOS_STK_GROWTH0表示堆栈从下往上生长;#defineOS_STK_GROWTH1表示堆栈从上往下生长;堆栈增长方向的选择:该选项跟处理器和编译器有关。虽然ARM处理器核对于两种方式都支持,但GCC的C语言编译器仅支持从上往下生长,故选1。定义OS_TASK_SW()宏OS_TASK_SW()函数被调用的场合1.OS_TASK_SW()宏是uC/OS-II从低优先级切换到最高优先级任务时被调用的。2.如果处理器支持软中断,则可使用软中断将中断向量指向OSCtx-SW()函数;3.或者直接调用OSCtxSW()函数。修改OS_CPU_A.ASM文件OS_CPU_A.ASM汇编代码文件有4个汇编函数需要移植。OSStartHighRdy()_多任务执行时的最高优先级任务切换OSCtxSw()_任务完成任务切换OSIntCtxSw()_中断退出任务切换OSTickISR()_节拍中断处理OSStartHighRdy()OSStartHighRdy()函数是在OSStart()多任务启动之后,负责从最高优先级任务的TCB控制块中获得该任务的堆栈指针,并通过SP,并通过SP依次将CPU现场恢复。这时系统将控制权交给用户创建的任务进程,直到该任务被阻塞或者被其他更高优先级的任务抢占CPU。该函数仅仅在多任务启动时被执行一次,用来启动最高优先级的任务执行。OSCtxSw()该函数由OS_TAST_SW宏调用,OS_TAST_SW()由OSSched()函数调用,OSSched()函数负责任务之间的调度。OSCtxSw()函数的工作是,先将当前任务的CPU现场保存到然后获得最高优先级任务的指针,并从该堆栈中恢复此任务的CPU现场,使之继续执行。该函数就完成了一次任务切换。OSIntCtxSw()该函数由OSIntExit()调用。由于中断可能会使更高优先级的任务进入就绪态,因此,为了更高优先级的任务能立即运行,在中断服务子程序的最后,OSIntExit()函数会调用OSIntCtxSw()做任务切换。这样做的目的主要是能够尽快地让高优先级的任务得到响应,保证系统的实时性能。OSIntCtxSW()与OSCtxSw()都是用于任务切换的函数,其区别在于,在OSIntCtxSw()中无需再保存CPU寄存器,因为在调用OSInCtxSw()之前已发生了中断,OSIntCtxSw()已将默认的cpu寄存器保存到了被中断的任务级堆栈中。OSTickISR()时钟节拍是特定的周期性中断,是由硬件定时器产生的。这个中断可看作是系统心脏的脉动。时钟的节拍式中断使得内核可将任务延时若干个整数时钟节拍,以及当任务等待事件发生时,提供等待超时的依据。时钟节拍的频率越高,系统的额外开销就越大。中断间的时间间隔取决于不同的应用。OSTickISR()(续)OSTickISR()首先将CPU寄存器的值保存在被中断任务的堆栈中,之后调用OSIntEnter()。随后,OSTickISR()调用OSTimeTick(),检查所用处于延时等待状态的任务。OSTimeTick(),检查所有处于延时等待状态的任务,判断是否有延时结束的就绪的任务。OSTickISR()最后调用OSIntExit(),如果在中断中(或其他嵌套的中断)有更高优先级的任务就绪,并且当前中断为嵌套的最后一层,那么OSIntExit()将进行任务调度。修改OS_CPU_C.C文件什么是钩子函数操作系统在特殊时刻调用用来补充扩展uC/OS操作系统功能OS_CPU_C.C中的钩子函数OSTaskStkInit()OSInitHookBegin()OSInitHookEnd()OSTaskCreatHook()OSTaskDelHook()OSTaskSwHo
本文标题:基于S3C44B0X的UcOS移植
链接地址:https://www.777doc.com/doc-443179 .html