基于S3C44B0X的UcOS移植课件_第1页
基于S3C44B0X的UcOS移植课件_第2页
基于S3C44B0X的UcOS移植课件_第3页
基于S3C44B0X的UcOS移植课件_第4页
基于S3C44B0X的UcOS移植课件_第5页
已阅读5页,还剩129页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

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

调试涉及到的文件用户调试编写的测试文件54OS_CFG.H各种定义事件标志消息邮箱内存管理互斥型信号量消息队列信号量任务管理时间管理OS_CFG.H各种定义55调试涉及到的文件移植须编写的文件OS_CPU_A.ASMOS_CPU_C.COS_CPU.H调试涉及到的文件移植须编写的文件56调试涉及到的文件与移植无关的Uc/os-II文件OS_CORE.COS_FLAG.COS_MBOX.COS_MEM.COS_MUTEX.COS_Q.COS_SEM.COS_TASK.COS_TIME.CUcos_II.CUcos_II.CuCOS_II.H调试涉及到的文件与移植无关的Uc/os-II文件57验证调试环境编写最小的TEST.C

#include“includes.h”Voidmain(void){OSInt();OSStart();}验证调试环境编写最小的TEST.C58验证OSTaskStkInit()和OSStartHighRdy修改OS_CFG.H,设置OS_TAST_STAT_EN为0。单步执行main()程序进入OSStart中的OSStartHighRdy()验证OSTaskStkInit()和OSStartHighR59验证OSTaskStkInit()和OSStartHighRdyOS_TaskIdle()的最后一条语句会从中断中返回。一旦执行这条语句,调试器就应该指向OS_TaskIdle()的第1条指令。而如果这一步没有发生,那么可能没有将正确的任务地址放在任务堆栈中。这是就要修改上述两个函数。验证OSTaskStkInit()和OSStartHighR60验证OSCtxSw()函数#include“includes.h”OS_STKTestTaskStk[100];Voidmain(void){OSInit();OSTaskCreate(TestTask,(void*)0,&TestStk[99],0)OSStart();}VoidTestTask(void*pdata){pdata=pdata;while(1){OSTimeDly(1);}

验证OSCtxSw()函数#include“include61验证OSCtxSw()函数正常情况下程序能进入到OSTimeDly()函数。OSTimeDly()调用OS_Sched(),而OS_Sched()调用OSCtxSw()的代码。OSCtxSw()的代码查找优先级最高的任务。从软中断中返回。此后,应该进入OS_TaskIdle()如果没有进入,应当是OSCtxSw()有错。验证OSCtxSw()函数正常情况下程序能进入到OSTime62验证OSIntCtxSw()和OSTickISR()改写Test.C。观察LED指示等。验证OSIntCtxSw()和OSTickISR()改写Te63Test.c中的示意代码#include“Include.h”OS_STKTestTaskStk[100];Voidmain(void){OSInit();off_led();Set_clk_int();OSTaskCreate(TsetTask,(void*)0,&TestTaskStk[99],0);OSStart();}VoidTestTask(void*pdata){BOOLEANled_state;pdata=pdata;int_clk_timer()led_state=FALSE;on_led();while(1){OSTimeDly(1);if(led_state==FALSE){led_state=TRUE;led_on();}else{led_state=FALSE;off_led;}}}Test.c中的示意代码#include“Include.64验证OSIntCtxSw()和OSTickISR()如果Led能够闪烁,调试成功。如果不闪烁,在test.c中单独测试OStickISR(),如果闪烁检查OSIntCtxSw(),不闪烁检查OSTickISR()。验证OSIntCtxSw()和OSTickISR()如果Le65结语uC/OS-Ⅱ提供的仅仅是一个任务调度的内核,将其移植到ARM7微处理器上以后,要想实现一个相对完整、实用的RTOS,还需要进行相当多的扩展性工作。这部分工作主要包括:建立文件系统、为外部设备建立驱动程序并规范相应的API函数、创建图形用户接口(GUI)函数、建立其他实用的应用程序接口函数等。结语uC/OS-Ⅱ提供的仅仅是一个任务调度的内核,将其移植到66uC/OS-II内核扩展的RTOS框图uC/OS-II内核扩展的RTOS框图67基于S3C44B0X的uC/OS移植SC06023001莫凡SC06023002钟轶基于S3C44B0X的uC/OS移植SC06023001莫68主要内容 基本概念uC/OS-Ⅱ在S3CEV40上的移植调试与测试主要内容 基本概念69有关操作系统移植的三个问题什么情况下需要进行移植操作系统?什么情况下需要移植实时操作系统?选择什么样的实时操作系统进行移植?有关操作系统移植的三个问题什么情况下需要进行移植操作系统?70问题1:操作系统的必要性为什么需要操作系统硬件资源的复杂,需要在应用程序与硬件之间提供一个软件层次以简化开发资源的丰富,需要有专门的资源管理任务的增加,需要有系统来进行任务的调度操作系统的功能设备访问、资源管理、任务管理、统计及其他功能问题1:操作系统的必要性为什么需要操作系统71问题2:实时性的需求实时性指的是系统对于特定的事件的处理需要在要求的时间内完成。从操作系统的角度来讲,实时性指的系统的结构能在多大程度上保证反映的速度早期的嵌入式操作系统几乎都是实时操作系统,但近年随着一些手持通用计算机设备的出现,使得现在的嵌入式操作系统有很多不需要实时性问题2:实时性的需求实时性指的是系统对于特定的事件的处理需要72问题2:实时性的需求(续)是否需要完全取决于软件项目的复杂程度要保证多个模块的执行时间并行的功能模块比较多定时处理的功能比较多程序的执行需要判断很多条件参数或资源需要规划代码执行的优先顺序要保证多个模块的执行时间问题2:实时性的需求(续)是否需要完全取决于软件项目的复杂程73问题3:RTOS的选择内核占用存储区尺寸RTOS性能:任务切换时间、任务调度数、任务优先级数开发调试工具易用性兼容性许可证形式问题3:RTOS的选择内核占用存储区尺寸74uC/OS-Ⅱ简介uC/OS-Ⅱ是美国一个名为JeanLabrosse的工程师开发的实时操作系统。它以小内核、多任务、丰富的系统服务、容易使用等特点越来越受欢迎uC/OS-Ⅱ实时系统的商业应用非常广泛,具有非常稳定、可靠的性能,成功应用于生命科学、航天工程等重大科研项目中。由于其极小的内核,特别适用于对程序代码存储空间极其敏感的嵌入式系统开发uC/OS-Ⅱ是一款源码公开的实时性操作系统uC/OS-Ⅱ简介uC/OS-Ⅱ是美国一个名为JeanLa75uC/OS-Ⅱ的实时性“可剥夺内核”与“不可剥夺内核”的区分往往是RTOS与非实时嵌入式操作系统的区别所在uC/OS-Ⅱ是可剥夺型内核,它总是让就绪态的高优先级的任务先运行,并规定所有任务的优先级必须不同,任务的优先级同时也唯一的标识了任务。uC/OS-Ⅱ的实时性“可剥夺内核”与“不可剥夺内核”的区分76uC/OS-Ⅱ的特点可移植性绝大部分uC/OS-Ⅱ的源代码是用移植性很强的ANSIC写的,和微处理器相关部分使用汇编语言写的,且已经压到最低限度,可以在绝大部分8位,16位,32位,64位微处理器上,微控制器上和DSP上运行可裁减用户可以在应用程序中通过语句#defineconstants来定义所需的uC/OS-Ⅱ功能模块,以减少不必要的存储器空间开支uC/OS-Ⅱ的特点可移植性77uC/OS-Ⅱ的特点(续)占先式uC/OS-Ⅱ属于完全占先式的内核,这意味着uC/OS-Ⅱ总是运行就绪条件下优先级最高的任务多任务可以管理64个任务,支持56个用户任务,赋予每个任务的优先级必须是不相同的,不支持时间片轮转调度法uC/OS-Ⅱ的特点(续)占先式78uC/OS-Ⅱ的特点(续)中断管理中断可以使正在执行的任务挂起,如果优先级更高的任务被唤唤醒,则高优先级的任务再中断嵌套全部推出后立即执行,中断嵌套可达255层其它公开源代码、可固化、可确定性、任务栈、提供很多系统服务、稳定性和可靠性强uC/OS-Ⅱ的特点(续)中断管理79uC/OS-Ⅱ内核中的概念临界区(共享资源的保护手段)任务和任务的状态任务的控制块任务的调度任务的切换过程时钟节拍uC/OS-Ⅱ的中断uC/OS-Ⅱ的初始化和启动uC/OS-Ⅱ内核中的概念临界区(共享资源的保护手段)80uC/OS-Ⅱ文件体系结构uC/OS-Ⅱ文件体系结构81uC/OS-Ⅱ在S3CEV40上的移植所谓移植,就是使一个实时操作系统能够在某个微处理器平台或微控制器上运行,在移植之前,先要了解移植uC/OS-Ⅱ到处理器上必须满足的条件。uC/OS-Ⅱ在S3CEV40上的移植所谓移植,就是使一个实82移植条件处理器的C编译器能产生可重入代码用C语言可打开和关闭中断处理器支持中断并且能产生定时中断处理器支持能够容纳一定量数据的硬件栈处理器有将堆栈指针和其它CPU寄存器读出和存储到堆栈或内存中的指令移植条件处理器的C编译器能产生可重入代码83移植条件(续)对于S3C44BOX来说,上面的这些条件都是可以满足的。开发工具采用EmbestIDEforARM,可以生成可重入代码;在ARM7TDMl的处理器上可以产生定时器中断;开/关中断可以通过设置相应寄存器来实现;ARM7TDMl核的处理器支持容纳一定量数据的硬件堆栈且具有有关的堆栈指令。移植条件(续)对于S3C44BOX来说,上面的这些条件都是可84移植过程由uC/OS-Ⅱ的文件体系结构可知,移植的主要工作就是修改与CPU相关的三个文件修改OS_CPU.H文件修改OS_CPU_A.ASM文件修改OS_CPU_C.C文件移植过程由uC/OS-Ⅱ的文件体系结构可知,移植的主要工作就85修改OS_CPU.H文件该部分主要完成基本的配置和定义,包括:定义与编译器相关的数据类型定义使能和禁止中断宏定义栈的增长方向定义OS_TASK_SW宏修改OS_CPU.H文件该部分主要完成基本的配置和定义,包括86定义数据类型uC/OS-II有8种整数数据类型:INT8U无符号8位整数INT8S有符号8位整数INT16U无符号16位整数INT16S有符号16位整数INT32U无符号32位整数INT32S有符号32位整数他们需要同编译器中的数据类型相匹配。定义数据类型uC/OS-II有8种整数数据类型:87定义数据类型(续)匹配方法:TypedefunsignedcharINT8UTypedefsignedcharINT8UTypedefunsignedintINT16UTypedefsignedintINT16STypedefsignedlongINT32STypedefINT32UintOS_STK;TypedefINT16UOS_CPU_SR;定义数据类型(续)匹配方法:88定义使能和禁止中断宏定义OS_ENTER_CRITICAL()和OS_EXIT_CRITICAL();uC/OS-II使用这两个语句开关中断,开关中断具体指令和方式需要根据不同的处理器来编写和选择。定义使能和禁止中断宏定义89定义使能和禁止中断宏(续)使用场合执行临界代码段时cpu不容许被打断,因此在临界代码段前后添加两个函数来保护临界代码段。{OS_ENTER_CRITICAL();/*uc/OS-II临界代码段*/OS_EXIT_CRITICAL();}定义使能和禁止中断宏(续)使用场合90开关中断的方式uC/OS-II定义了三种开关中断的方法:方法一直接开,直接关。方法二直接开,利用psw恢复。方法三直接开,利用局部变量恢复psw的内容。究竟选择那种方法跟编译器和处理器有关,三种方法各有优劣。开关中断的方式uC/OS-II定义了三种开关中断的方法:91方式一方法一的示意程序#defineOS_ENTER_CRITICAL()disable_int()#defineOS_EXIT_CRITICAL()enable_int()方式一方法一的示意程序92方式一(续)使用方法一的场合处理器相应的编译器只能使用某条指令开中断或关中断方法一存在问题如果在禁止中断的情况下调用uC/OS-II函数,那么从uC/OS-II函数,那么从uC/OS-II返回时中断可能就允许了。方式一(续)使用方法一的场合93方式二方式二的示意程序#defineOS_ENTER_CRITICAL()Asm(“PUSHPSW”);Asm(“DI”);#defineOS_EXIT_CRITICAL()Asm(“poppsw”)方式二方式二的示意程序94方式二(续)使用方式二的场合:处理器及相应的编译器有从PSW中恢复相应的中断状态的语句。优点:保证临界段代码执行时中断关闭,执行完毕恢复原先开关中断的状态。方式二(续)使用方式二的场合:95方式三方法三的示意程序:#defineOS_ENTER_CRITICAL()Cpu_sr=get_processor_psw();Disable_interrupts()OS_CRITICAL()enable_int()方式三方法三的示意程序:96方式三(续)使用方式二的场合:处理器及相应的编译器有从PSW中恢复相应的中断状态的语句。但需要使用局部变量。注意事项用户在编写应用程序中开关中断必须添加相应的声明和语句。方式三(续)使用方式二的场合:97方式三(续)添加声明和语句的示意程序:VoidSom_uCOS_II_Service(arguments){OS_CPU_SRcpu_srCpu_sr=get_processor_psw();Disable_interrupts()/*临界段代码*/Set_processor_psw()}方式三(续)添加声明和语句的示意程序:98三种方式的选择三种方式比较:方法二最好,但需要处理器和编译器的支持。方法的选择:使用S3C44B0X处理器及GCC编译器具备使用方法二的条件。三种方式的选择三种方式比较:99定义堆栈增长方向OS_CPU.H中的相关代码:#defineOS_STK_GROWTH0表示堆栈从下往上生长;#defineOS_STK_GROWTH1表示堆栈从上往下生长;堆栈增长方向的选择:该选项跟处理器和编译器有关。虽然ARM处理器核对于两种方式都支持,但GCC的C语言编译器仅支持从上往下生长,故选1。定义堆栈增长方向OS_CPU.H中的相关代码:100定义OS_TASK_SW()宏OS_TASK_SW()函数被调用的场合OS_TASK_SW()宏是uC/OS-II从低优先级切换到最高优先级任务时被调用的。如果处理器支持软中断,则可使用软中断将中断向量指向OSCtx-SW()函数;或者直接调用OSCtxSW()函数。定义OS_TASK_SW()宏OS_TASK_SW()函数被101修改OS_CPU_A.ASM文件OS_CPU_A.ASM汇编代码文件有4个汇编函数需要移植。OSStartHighRdy()_多任务执行时的最高优先级任务切换OSCtxSw()_任务完成任务切换OSIntCtxSw()_中断退出任务切换OSTickISR()_节拍中断处理修改OS_CPU_A.ASM文件OS_CPU_A.ASM汇编102OSStartHighRdy()OSStartHighRdy()函数是在OSStart()多任务启动之后,负责从最高优先级任务的TCB控制块中获得该任务的堆栈指针,并通过SP,并通过SP依次将CPU现场恢复。这时系统将控制权交给用户创建的任务进程,直到该任务被阻塞或者被其他更高优先级的任务抢占CPU。该函数仅仅在多任务启动时被执行一次,用来启动最高优先级的任务执行。OSStartHighRdy()OSStartHighR103OSCtxSw()该函数由OS_TAST_SW宏调用,OS_TAST_SW()由OSSched()函数调用,OSSched()函数负责任务之间的调度。OSCtxSw()函数的工作是,先将当前任务的CPU现场保存到然后获得最高优先级任务的指针,并从该堆栈中恢复此任务的CPU现场,使之继续执行。该函数就完成了一次任务切换。OSCtxSw()该函数由OS_TAST_SW宏调用,OS_104OSIntCtxSw()该函数由OSIntExit()调用。由于中断可能会使更高优先级的任务进入就绪态,因此,为了更高优先级的任务能立即运行,在中断服务子程序的最后,OSIntExit()函数会调用OSIntCtxSw()做任务切换。这样做的目的主要是能够尽快地让高优先级的任务得到响应,保证系统的实时性能。OSIntCtxSW()与OSCtxSw()都是用于任务切换的函数,其区别在于,在OSIntCtxSw()中无需再保存CPU寄存器,因为在调用OSInCtxSw()之前已发生了中断,OSIntCtxSw()已将默认的cpu寄存器保存到了被中断的任务级堆栈中。OSIntCtxSw()该函数由OSIntExit()调用。105OSTickISR()时钟节拍是特定的周期性中断,是由硬件定时器产生的。这个中断可看作是系统心脏的脉动。时钟的节拍式中断使得内核可将任务延时若干个整数时钟节拍,以及当任务等待事件发生时,提供等待超时的依据。时钟节拍的频率越高,系统的额外开销就越大。中断间的时间间隔取决于不同的应用。OSTickISR()时钟节拍是特定的周期性中断,是由硬件定106OSTickISR()(续)OSTickISR()首先将CPU寄存器的值保存在被中断任务的堆栈中,之后调用OSIntEnter()。随后,OSTickISR()调用OSTimeTick(),检查所用处于延时等待状态的任务。OSTimeTick(),检查所有处于延时等待状态的任务,判断是否有延时结束的就绪的任务。OSTickISR()最后调用OSIntExit(),如果在中断中(或其他嵌套的中断)有更高优先级的任务就绪,并且当前中断为嵌套的最后一层,那么OSIntExit()将进行任务调度。OSTickISR()(续)OSTickISR()首先将CP107修改OS_CPU_C.C文件什么是钩子函数操作系统在特殊时刻调用用来补充扩展uC/OS操作系统功能修改OS_CPU_C.C文件什么是钩子函数108OS_CPU_C.C中的钩子函数OSTaskStkInit()OSInitHookBegin()OSInitHookEnd()OSTaskCreatHook()OSTaskDelHook()OSTaskSwHook()OSTaskStatHook()OSTCBInitHook()OSTimeTickHook()OSTaskIdleHook()uC/OS-II中的钩子函数共有十个OS_CPU_C.C中的钩子函数OSTaskStkInit(109OSTaskStkInit()这是将UC/OS-II移植到S3C44B0X上唯一必须编写的钩子函数这个函数在任务创建时被调用,负责初始化任务的堆栈结构并返回新的堆栈指针。OSTaskStkInit()这是将UC/OS-II移植到S110OSTaskCreatHook()调用者OSTaskCreat()OSTaskCreatExt()调用时中断是禁止的,所以要减少代码。OSTaskCreatHook()调用者111OSTaskDelHook()调用场合任务被删除时。用途被调用时会收到指向被删除任务的OS_TCB的指针,这样它就可访问所有的结构成员了。用来检验TCB扩展是否被建立了,并进行清除操作。OSTaskDelHook()调用场合112OSTaskSwHook()调用者OSCtxSw()OSIntCtxSw()功能能够访问OSTCBCur和OSTCBHighRdy这两个变量分别指向被切换出去的任务和新任务注意该函数执行时中断是关掉的。OSTaskSwHook()调用者113OSTaskStatHook()调用者OSTaskStatHook()功能可以扩展统计功能。OSTaskStatHook()调用者114OSTimeTickHook()调用场合每个时钟节拍中断,OSTimeTick()之前调用功能优先处理紧急任务OSTimeTickHook()调用场合115OSInitHookBegin()调用场合OSInt()刚进入时调用功能让用户自己扩充初始化功能。OSInitHookBegin()调用场合116OSInitHookEnd()调用场合OSInt()刚返回时调用功能让用户自己扩充初始化功能。OSInitHookEnd()调用场合117OSTCBInitHook()调用者OS_TCBInit()在调用OSTaskCreatHook()之前,会现调用OSTCBInitHook().功能能够做初始化功能块OS_TCB。OSTCBInitHook()调用者118OSTaskIdleHook()调用者OSTaskIdle()功能能实现无任务时进入cpu的功耗模式后面的调试也将用到该函数。OSTaskIdleHook()调用者119uC/OS-II的调试调试的任务验证调试系统验证OSTaskStkInit()和OSStartHighRdy()验证OSCtxSw()函数验证OSIntCtx()函数uC/OS-II的调试调试的任务120调试涉及到的文件用户调试编写的测试文件TEST.C测试主程序,程序从此运行OS_CFG.HuC/OS-II的注册表INCLUDES.H各种库OS_CFG.HOS_CPU.HUCOS_ii.h

调试涉及到的文件用户调试编写的测试文件121OS_CFG.H各种定义事件标志消息邮箱内存管理互斥型信号量消息队列信号量任务管理时间管理OS_CFG.H各种定义122调试涉及到的文件移植须编写的文件OS_CPU_A.ASMOS_CPU_C.COS_CPU.H调试涉及到的文件移植须编写的文件123调试涉及到的文件与移植无关的Uc/os-II文件OS_CORE.COS_FLAG.COS_MBOX.COS_

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论