资源描述
,单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,#,单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,#,嵌入式系统rteoscosii的移植,嵌入式系统rteoscosii的移植,第1页,主要内容,移植规划,C/OS-II,移植,嵌入式系统初始化,嵌入式系统rteoscosii的移植,第2页,移植规划,-,概述,所谓“,移植,”,就是使一个实时内核能在其它微处理器或微控制器上运行。,尽管大个别,C/OS-II,代码是用,C,语言编写,不过在编写与处理器硬件相关代码时还是不得不使用汇编语言。,移植主要工作就是编写这些与处理器硬件相关代码。,操作系统移植大致能够分为两个层次:,跨体系结构移植,针对特定处理器移植,嵌入式系统rteoscosii的移植,第3页,移植规划,在移植前针对所使用微处理器进行规划,主要有以下几个方面考虑:,编译器选择,任务模式选择,支持指令集,嵌入式系统rteoscosii的移植,第4页,移植规划(续),编译器选择,针对,ARM,处理器核,C,语言编译器有很多,如,SDT,、,ADS,、,IAR,、,TASKING,和,GCC,等,当前在我国最流行是,ADS,、,SDT,和,GCC,SDT,和,ADS,均为,ARM,企业自己开发,,ADS,为,SDT,升级版,以后,ARM,企业不再支持,SDT,,故不选择,SDT,。,GCC,即使支持广泛,很多开发套件使用它作为编译器,不过与,ADS,比较其编译效率较低,这对充分发挥芯片性能不利,考虑,使用,ADS,编译程序和调试,嵌入式系统rteoscosii的移植,第5页,ARM,工作模式,ARM处理器有7种操作模式:,用户模式,(usr),-正常程序执行模式,快速中止模式,(fiq),-支持高速数据传输或通道处理,中止模式,(,irq),-用于通用中止处理,管理员模式,(svc),-操作系统保护模式.,中止模式,(abt),-支持虚拟内存和/或内存保护等异常,系统模式,(sys),-支持操作系统特殊用户模式(运行操作系统任务),未定义模式,(und),-支持硬件协处理器软件仿真,除了用户模式外,其它模式均可视为特权模式,嵌入式系统rteoscosii的移植,第6页,移植规划(续),任务模式取舍,ARM7,处理器核含有上述七种模式,其中除用户模式外其它均为,特权模式,。其中管理、中止、未定义、中止和快中止模式,与对应异常相联络,,任务使用这些模式不太适合。,系统模式除了是特权模式外,其它与用户模式一样,因而可选为,任务使用模式只有用户模式和系统模式,。,为了尽可能降低任务代码错误对整个程序影响,,缺省任务模式定为用户模式,可选为系统模式,,同时提供接口使任务能够在这两种模式间切换。,嵌入式系统rteoscosii的移植,第7页,移植规划(续),支持指令集,带,T,变量,ARM7,处理器核含有两个指令集:,标准,32,位,ARM,指令集,16,位,Thumb,指令集,两种指令集有不一样应用范围。,为了最大程度地支持芯片特征,任务应该,能够使用任意一个指令集并能够自由切换,,而且不一样任务应该能够使用不一样指令集,嵌入式系统rteoscosii的移植,第8页,移植,C/OS-II,概述,要移植一个操作系统到一个特定,CPU,体系结构并不是一件很轻易事情,它对移植者有以下要求:,1,对目标体系结构要有很深了解;,2,对,OS,原理要有较深入了解;,3,对所使用编译器要有较深入了解;,4,对需要移植操作系统要有相当了解;,5,对详细使用芯片也要一定了解,嵌入式系统rteoscosii的移植,第9页,要移植一个操作系统到一个特定,CPU,体系结构上并不是一件很轻易事情,它对移植者有以下要求:,1,对目标体系结构要有很深了解;,2,对,OS,原理要有较深入了解;,3,对所使用编译器要有较深入了解;,4,对需要移植操作系统要有相当了解;,5,对详细使用芯片也要一定了解。,概述,要移植一个操作系统到一个特定,CPU,体系结构上并不是一件很轻易事情,它对移植者有以下要求:,1,对目标体系结构要有很深了解;,2,对,OS,原理要有较深入了解;,3,对所使用编译器要有较深入了解;,4,对需要移植操作系统要有相当了解;,5,对详细使用芯片也要一定了解。,参考,ARM,企业,ARM,体系结构,文档,参考,嵌入式实时操作系统,C/OS-II,一书,参考,ADS,软件自带,编译器和连接器手册,参考,嵌入式实时操作系统,C/OS-II,一书,参考详细芯片,数据手册,和,使用手册,因为第,4,点影响是全局性,它决定移植代码框架和功效。,所以重点介绍第,4,点。,嵌入式系统rteoscosii的移植,第10页,主要内容,移植规划,C/OS-II,移植,嵌入式系统初始化,嵌入式系统rteoscosii的移植,第11页,C/OS,-II,文件结构,嵌入式系统rteoscosii的移植,第12页,C/OS-II,移植,应用程序,(用户代码),C/OS-II,(与处理器无关代码),OS_CORE.c,OS_FLAG.c,.,C/OS-II,配置,(与应用相关),OS_CFG.H,INCLUDES.H,C/OS-II,移植,(与处理器相关代码),CPU,定时器,硬件,软件,C/OS-II,硬件软件体系结构,用于产生系统时钟,移植时需要编写代码,嵌入式系统rteoscosii的移植,第13页,移植,C/OS-II,满足条件,处理器,C,编译器能产生可重入代码,在程序中能够打开或者关闭中止,处理器支持中止,而且能产生定时中止(通常在,10,100Hz,之间),处理器支持能够容纳一定量数据硬件堆栈(通常是几千字节),处理器有将堆栈指针和其它,CPU,存放器内容存放和读出到堆栈(或者内存)指令,嵌入式系统rteoscosii的移植,第14页,什么是可重入代码,可重入代码指是一段能够被多个任务同时调用,而无须担心会破坏数据代码(比如:一个函数),即:可重入型函数在任何时候都能够被中止执行,过一段时间以后又能够继续运行,而不会因为在函数中止时候被其它任务重新调用,而影响函数中数据,嵌入式系统rteoscosii的移植,第15页,可重入代码举例,程序,1,:可重入型函数,void swap(int*x,int*y),int temp;,temp=*x;,*x=*y;,*y=temp;,嵌入式系统rteoscosii的移植,第16页,非可重入代码举例,程序,2,:非可重入型函数,int temp;,void swap(int*x,int*y),temp=*x;,*x=*y;,*y=temp;,嵌入式系统rteoscosii的移植,第17页,不可重入函数被中止破坏,嵌入式系统rteoscosii的移植,第18页,怎样使函数含有可重入性,使,Swap(),函数含有可重入性条件:,把,Temp,定义为局部变量,调用,Swap(),函数之前关中止,调用,后再开中止,用信号量禁止该函数在使用过程中,被再次调用,嵌入式系统rteoscosii的移植,第19页,概述,依据,C/OS-II,要求,移植,C/OS-II,到一个新体系结构上需要提供,2,个或,3,个文件:,OS_CPU.H,(,C,语言头文件),OS_CPU_C.C,(,C,程序源文件),OS_CPU_A.ASM,(汇编程序源文件),其中,OS_CPU_A.ASM,在一些情况下不需要,但极其罕见。不需要,OS_CPU_A.ASM,必须满足以下苛刻条件:,1,.,能够直接使用,C,语言开关中止;,2,.,能够直接使用,C,语言编写中止服务程序;,3,.,能够直接使用,C,语言操作堆栈指针;,4,.,能够直接使用,C,语言保留,CPU,全部存放器。,移植需要编写文件,嵌入式系统rteoscosii的移植,第20页,概述,移植内容,类型,所属文件,描述,BOOLEAN,、,INT8U,、,INT8S,、,数据类型,OS_CPU.H,与编译器无关数据类型,OS_STK,数据类型,OS_CPU.H,堆栈数据类型,OS_ENTER_CRITICAL(),和,OS_EXIT_CRITICAL(),宏,OS_CPU.H,开关中止代码,OS_STK_GROWTH,常量,OS_CPU.H,定义堆栈增加方向,OS_TASK_SW,函数,OS_CPU.H,任务切换时执行代码,OSTaskStkInit(),函数,OS_CPU_C.C,任务堆栈初始化函数,OSInitHookBegin(),、,OSInitHookEnd(),、,函数,OS_CPU_C.C,C/OS-II在执行一些操作时调用用户函数,普通为空,OSStartHighRdy(),函数,*OS_CPU_A.ASM,进入多任务环境时运行优先级最高任务,,OSIntCtxSw(),函数,*OS_CPU_A.ASM,中止退出时任务切换函数,OSTickISR(),中止服务程序,*OS_CPU_A.ASM,时钟节拍中止服务程序,实际上,还有一个文件很主要,它就是,IRQ.INC,,它定义了一个汇编宏,它是,C/OS-II for ARM7,通用中止服务程序汇编与,C,函数,接口代码,。时钟节拍中止服务程序也没有移植,因为其与芯片和应用都强烈相关,需要用户自己编写,不过能够经过,IRQ.INC,简化用户代码编写。,移植代码包含主要内容,嵌入式系统rteoscosii的移植,第21页,关于头文件,includes.h,和,config.h,C/OS-II,要求,全部,.C,文件都要包含头文件,includes.h,,这么使得用户项目中每个,.C,文件不用分别去考虑它实际上需要哪些头文件。,使用,INCLUDES.H,缺点是它可能会包含一些实际不相关头文件,这意味着每个文件编译时间可能会增加,但却增强了代码可移植性。,在移植中另外增加了一个头文件,config.h,,要求,全部用户程序必须包含,config.h,,,在,config.h,中包含,includes.h,和特定头文件和配置项,。而,C/OS-II,系统文件依然只是包含,includes.h,,即,C/OS-II,系统文件完全无须改动。,全部配置改变包含头文件增减均在,config.h,中进行,,而,includes.h,定下来后无须改动(,C/OS-II,系统文件需要包含东西是固定)。这么,,C/OS-II,系统文件需要编译次数大大降低,编译时间随之降低。,congfig.h,UC/OS,内核文件,Includes.h,用户程序,嵌入式系统rteoscosii的移植,第22页,设置与处理器和编译器相关代码,OS_CPU.H,中定义了与编译器相关数据类型。比如:,INT8U,、,INT8S,等。,与,ARM,处理器相关代码,使用,OS_ENTER_CRITICAL(),和,OS_EXIT_CRITICAL(),宏开启关闭中止,设置堆栈增加方向:堆栈由高地址向低地址增加,嵌入式系统rteoscosii的移植,第23页,编写,OS_CPU.H,C/OS-II,使用结构常量,OS_STK_GROWTH,中指定堆栈生长方式:,置,OS_STK_GROWTH,为,0,表示堆栈,从下往上长,。,置,OS_STK_GROWTH,为,1,表示堆栈,从上,(高地址),往下,(低地址),长,。,即使,ARM,处理器查对于两种方式均支持,但,ADS,C,语言编译器仅支持一个方式,即,从上往下长,而且必须是满递减堆栈,,所以,OS_STK_GROWTH,值为,1,。,#define OS_STK_GROWTH 1,堆栈生长方式,嵌入式系统rteoscosii的移植,第24页,编写,OS_CPU.H,C/OS-II,不使用,C,语言中,short,、,int,、,long,等数据类型定义,因为它们,与处理器类型相关,隐含着不可移植性,。代之以移植性强整数数据类型,这么,既直观又可移植,不过这就成了必须移植代码。依据,ADS,编译器特征,这些代码以下程序清单所表示,(与编译相关),。,typedef,unsigned char BOOLEAN;,typedef,unsigned char INT8U;,typedef,signed char INT8S;,typedef,unsigned short INT16U;,typedef,signed short INT16S;,typedef,unsigned int INT32U;,typedef,signed int INT32S;,typedef,float FP32;,typedef,double FP64;,typedef,INT32U OS_STK;,不依赖于编译数据类型,嵌入式系统rteoscosii的移植,第25页,设置,includes.h,typedef unsigned char BOOLEAN;,typedef unsigned char,INT8U,;,typedef signed char,INT8S,;,typedef unsigned int INT16U;,typedef signed int INT16S;,typedef unsigned long INT32U;,typedef signed long INT32S;,typedef float FP32;,typedef double FP64;,typedef unsigned long OS_STK;,typedef unsigned long OS_CPU_SR;,extern int INTS_OFF(void);,extern void INTS_ON(void);,#define,OS_ENTER_CRITICAL(),cpu_sr=INTS_OFF();,#define,OS_EXIT_CRITICAL(),if(cpu_sr=0)INTS_ON();,#define,OS_STK_GROWTH,1 /*,从高向低*,/,嵌入式系统rteoscosii的移植,第26页,程序状态存放器(,CPSR,),条件位,:,N=1-,结果为负,0-,结果为正或,0,Z=1-,结果为,0,0-,结果不为,0,C=1-,进位,,0-,借位,V=1-,结果溢出,,0,结果没溢出,Q,位,:,仅,ARM 5TE/J,架构支持,指示增强型,DSP,指令是否溢出,J,位,仅,ARM 5TE/J,架构支持,J=1:,处理器处于,Jazelle,状态,中止禁止位,:,I =1:,禁止,IRQ.,F=1:,禁止,FIQ.,T Bit,仅,ARM xT,架构支持,T=0:,处理器处于,ARM,状态,T=1:,处理器处于,Thumb,状态,Mode,位,(,处理器模式位,):,0b10000User,0b10001FIQ,0b10010IRQ,0b10011Supervisor,0b10111Abort,0b11011Undefined,0b11111System,27,31,N Z C V,Q,28,6,7,I F,T,mode,16,23,8,15,5,4,0,24,f,s,x,c,U n d e f i n e d,J,嵌入式系统rteoscosii的移植,第27页,编写,OS_CPU.H,C/OS-II,运行时,处理器可能处于模式以下列图所表示:,使用软中止,SWI,作底层接口,Thumb,指令集,ARM,指令集,用户模式,系统模式,用户任务使用处理器模式,ARM7,内核含有指令集,ARM,指令,用户模式,ARM,指令,系统模式,Thumb,指令,系统模式,Thumb,指令,用户模式,嵌入式系统rteoscosii的移植,第28页,编写,OS_CPU.H,为了使底层接口函数与处理器状态无关,同时在任务调用对应函数不需要知道函数位置,在移植中使用,软中止指令,SWI,作为底层接口,使用不一样,功效号,区分不一样函数。软中止功效号分配以下表所表示,未列出为保留功效。,使用软中止,SWI,作底层接口,功效号,接口函数,介绍,0 x00,void OS_TASK_SW(void),任务级任务切换函数,0 x01,_OSStartHighRdy(void),运行优先级最高任务,由OSStartHighRdy产生,0 x02,void OS_ENTER_CRITICAL(void),关中止,0 x03,Void OS_EXIT_CRITICAL(void),开中止,0 x80,Void ChangeToSYSMode(void),任务切换到系统模式,0 x81,Void ChangeToUSRMode(void),任务切换到用户模式,0 x82,Void TaskIsARM(INT8U prio),任务代码是,ARM,代码,0 x83,Void TaskIsTHUMB(INT8U prio),任务代码是,THUMB,代码,嵌入式系统rteoscosii的移植,第29页,编写,OS_CPU.H,用软中止作为操作系统底层接口就需要在,C,语言中使用,SWI,(,SoftWare Interrupt,),指令。在,ADS,中,有一个关键字,_swi,,用它申明一个不存在函数,则调用这个函数就在调用这个函数地方插入一条,SWI,指令,而且能够指定功效号。同时,这个函数也能够有参数和返回值,其传递规则与普通函数相同。,使用软中止,SWI,作底层接口,/*,任务级任务切换函数*,/,_swi(0 x00)void OS_TASK_SW(void);,/*,运行优先级最高任务 *,/,_swi(0 x01)void _OSStartHighRdy(void);,/*,关中止 *,/,_swi(0 x02)void OS_ENTER_CRITICAL(void);,/*,开中止 *,/,_swi(0 x03)void OS_EXIT_CRITICAL(void);,/*,任务切换到系统模式 *,/,_swi(0 x80)void ChangeToSYSMode(void);,/*,任务切换到用户模式 *,/,_swi(0 x81)void ChangeToUSRMode(void);,/*,任务代码是,ARM,代码 *,/,_swi(0 x82)void TaskIsARM(INT8U prio);,/*,任务代码是,THUMB,代码*,/,_swi(0 x83)void TaskIsTHUMB(INT8U prio);,程序中调用软中止时使用函数名,软件中止号,该调用不返回参数,嵌入式系统rteoscosii的移植,第30页,编写,OS_CPU_C.C,C/OS-II,移植要求用户编写,10,个,C,函数:,OSTaskStkInit,():,OSTaskCreat,()和,OSTaskCreatExt,()经过调用,本函数,初始化任务栈结构,OSTaskCreateHook,():每当添加任务时由,OS_TCBInit(),函数调用,OSTaskDelHook,():任务被删除后由,OSTaskDel,()调用,OSTaskSwHook,():任务切换时两种情况均会调用该函数,OSTaskIdleHook,():,OSTaskIdle,()函数可调用该函数实现,CPU,低功耗模式,OSTimeTickHook,():本函数在每个时钟节拍都会被,OSTimeTick,()调用,OSInitHookBegin,():进入,OSInit,()函数后本函数会马上被调用,OSInitHookEnd,():,OSInit,()函数返回之前被调用,OSTCBInitHook,():,OS_TCBInit(),在调用,OSTaskCreateHook,()之前将先,调用本函数,唯一必要函数是,OStaskStkInit,(),其它,9,个函数必须申明,但不一定要包含任何代码,嵌入式系统rteoscosii的移植,第31页,编写,OS_CPU_C.C,该函数用于初始化任务堆栈,使任务堆栈看起来就像刚发生中止一样。即任务被执行时,就像从中止返回一样。,在编写此函数之前,必须先确定任务堆栈结构。而,任务堆栈结构是与,CPU,体系结构、编译器有亲密关联,。本移植堆栈结构以下列图所表示。,OSTaskStkInit(),任务入栈,其它数据,LR,R12,R11,R10,R9,R8,.,栈底,任务环境开始,SP,PC,R2,R1,R0,OSEnterSum,空闲空间,嵌入式系统rteoscosii的移植,第32页,编写,OS_CPU_C.C,OSTaskStkInit(),OS_STK*,OSTaskStkInit,(void(*task)(void*pd),void*pdata,OS_STK*ptos,INT16U opt),OS_STK*stk;,opt =opt;,stk =ptos;,*stk=(OS_STK)task;,*-stk=(OS_STK)task;,*-stk=0;,*-stk=0;,*-stk=0;,*-stk=0;,*-stk=0;,*-stk=0;,*-stk=0;,*-stk=0;,*-stk=0;,*-stk=0;,*-stk=0;,*-stk=0;,*-stk=(unsigned int)pdata;,*-stk=(USER_USING_MODE|0 x00);,*-stk=0;,return(stk);,入栈数据,任务入栈,其它数据,LR,R12,R11,R10,R9,R8,.,栈底,任务环境开始,SP,PC,R2,R1,R0,OSEnterSum,空闲空间,嵌入式系统rteoscosii的移植,第33页,编写,OS_CPU_C.C,OSTaskStkInit(),OS_STK*,OSTaskStkInit,(void(*task)(void*pd),void*pdata,OS_STK*ptos,INT16U opt),OS_STK*stk;,opt =opt;,stk =ptos;,*stk=(OS_STK)task;,*-stk=(OS_STK)task;,*-stk=0;,*-stk=0;,*-stk=0;,*-stk=0;,*-stk=0;,*-stk=0;,*-stk=0;,*-stk=0;,*-stk=0;,*-stk=0;,*-stk=0;,*-stk=0;,*-stk=(unsigned int)pdata;,*-stk=(USER_USING_MODE|0 x00);,*-stk=0;,return(stk);,该数据比较尤其,它用于保留该任务关中止次数,它在调用,OS_ENTER_CRITICAL(),时加,1,,在调用,OS_EXIT_CRITICAL(),时减,1,。,这么每个任务都能够独立控制本任务中止允许状态,而不会影响其它任务中止允许状态。所以关中止和开中止就能够嵌套。,嵌入式系统rteoscosii的移植,第34页,编写,OS_CPU_C.C,软件中止异常服务程序,操作系统与硬件相关底层函数使用软件中止作为接口,以下表所表示。,移植代码中一个主要工作就是为这些软件中止,编写服务程序,功效号,接口函数,介绍,0 x00,void OS_TASK_SW(void),任务级任务切换函数,0 x01,_OSStartHighRdy(void),运行优先级最高任务,由OSStartHighRdy产生,0 x02,void OS_ENTER_CRITICAL(void),关中止,0 x03,Void OS_EXIT_CRITICAL(void),开中止,0 x80,Void ChangeToSYSMode(void),任务切换到系统模式,0 x81,Void ChangeToUSRMode(void),任务切换到用户模式,0 x82,Void TaskIsARM(INT8U prio),任务代码是,ARM,代码,0 x83,Void TaskIsTHUMB(INT8U prio),任务代码是,THUMB,代码,嵌入式系统rteoscosii的移植,第35页,编写,OS_CPU_C.C,软件中止异常服务程序,功效号,介绍,0 x00,任务级任务切换函数,0 x01,运行优先级最高任务,由OSStartHighRdy产生,0 x02,关中止,0 x03,开中止,0 x80,任务切换到系统模式,0 x81,任务切换到用户模式,0 x82,任务代码是,ARM,代码,0 x83,任务代码是,THUMB,代码,功效号,接口函数,介绍,0 x00,void OS_TASK_SW(void),任务级任务切换函数,0 x01,_OSStartHighRdy(void),运行优先级最高任务,由OSStartHighRdy产生,0 x02,void OS_ENTER_CRITICAL(void),关中止,0 x03,Void OS_EXIT_CRITICAL(void),开中止,0 x80,Void ChangeToSYSMode(void),任务切换到系统模式,0 x81,Void ChangeToUSRMode(void),任务切换到用户模式,0 x82,Void TaskIsARM(INT8U prio),任务代码是,ARM,代码,0 x83,Void TaskIsTHUMB(INT8U prio),任务代码是,THUMB,代码,void SWI_Exception(int SWI_Num,int*Regs),OS_TCB *ptcb;,switch(SWI_Num),case 0 x02:/,关中止,.,case 0 x03:/,开中止,.,case 0 x80:/,任务切换到系统模式,.,case 0 x81:/,任务切换到用户模式,.,case 0 x82:/,任务代码是,ARM,代码,.,case 0 x83:/,任务代码是,Thumb,代码,.,default:,这两个软件中止使用汇编代码完成,嵌入式系统rteoscosii的移植,第36页,编写,OS_CPU_C.C,软件中止异常服务程序,功效号,介绍,0 x00,任务级任务切换函数,0 x01,运行优先级最高任务,由OSStartHighRdy产生,0 x02,关中止,0 x03,开中止,0 x80,任务切换到系统模式,0 x81,任务切换到用户模式,0 x82,任务代码是,ARM,代码,0 x83,任务代码是,THUMB,代码,C/OS-II,开启多任务环境函数叫做,OSStart(),,用户在调用,OSStart(),之前,必须已经建立了一个或更多任务。,OSStart(),最终调用函数,OSStartHighRdy(),运行多任务开启前优先级最高任务。,void,OSStartHighRdy,(void),_OSStartHighRdy();,该函数在,Os_cpu_a.s,文件中实现。,嵌入式系统rteoscosii的移植,第37页,编写,OS_CPU_C.C,软件中止异常服务程序,功效号,介绍,0 x00,任务级任务切换函数,0 x01,运行优先级最高任务,由OSStartHighRdy产生,0 x02,关中止,0 x03,开中止,0 x80,任务切换到系统模式,0 x81,任务切换到用户模式,0 x82,任务代码是,ARM,代码,0 x83,任务代码是,THUMB,代码,关中止和开中止是为了保护临界段代码。这些代码与处理器相关,是需要移植代码。在,ARM,处理器核中关中止和开中止时经过改变,程序状态存放器,CPSR,中对应控制位实现。因为使用了软件中止,程序状态存放器,CPSR,保留到,程序状态保留存放器,SPSR,中,软件中止退出时会将,SPSR,恢复到,CPSR,中,所以程序只要改变程序状态保留存放器,SPSR,中对应控制位就能够了。,嵌入式系统rteoscosii的移植,第38页,编写,OS_CPU_C.C,软件中止异常服务程序,功效号,介绍,0 x00,任务级任务切换函数,0 x01,运行优先级最高任务,由OSStartHighRdy产生,0 x02,关中止,0 x03,开中止,0 x80,任务切换到系统模式,0 x81,任务切换到用户模式,0 x82,任务代码是,ARM,代码,0 x83,任务代码是,THUMB,代码,void SWI_Exception(int SWI_Num,int*Regs),.,case,0 x02,:/,关中止,_asm ,MRS R0,SPSR,ORR R0,R0,#NoInt,MSR SPSR_c,R0,OsEnterSum+;,break;,case,0 x03,:/,开中止,if(-OsEnterSum=0),_asm,MRS R0,SPSR,BIC R0,R0,#NoInt,MSR SPSR_c,R0,break;,.,每关闭一次中止,中止关闭计数器加,1,每调用一次开中止函数,该计数器减,1,,为,0,时允许打开中止,关闭中止,打开中止,嵌入式系统rteoscosii的移植,第39页,编写,OS_CPU_C.C,软件中止异常服务程序,功效号,介绍,0 x00,任务级任务切换函数,0 x01,运行优先级最高任务,由OSStartHighRdy产生,0 x02,关中止,0 x03,开中止,0 x80,任务切换到系统模式,0 x81,任务切换到用户模式,0 x82,任务代码是,ARM,代码,0 x83,任务代码是,THUMB,代码,它们能够在任何情况下使用。它们改变,程序状态保留存放器,SPSR,对应位段,而程序状态保留存放器会在软件中止退出时复制到,程序状态存放器,CPSR,,任务处理器模式就改变了。,嵌入式系统rteoscosii的移植,第40页,编写,OS_CPU_C.C,软件中止异常服务程序,功效号,介绍,0 x00,任务级任务切换函数,0 x01,运行优先级最高任务,由OSStartHighRdy产生,0 x02,关中止,0 x03,开中止,0 x80,任务切换到系统模式,0 x81,任务切换到用户模式,0 x82,任务代码是,ARM,代码,0 x83,任务代码是,THUMB,代码,void SWI_Exception(int SWI_Num,int*Regs),.,case,0 x80,:/,任务切换到系统模式,_asm,MRS R0,SPSR,BIC R0,R0,#0 x1f,ORR R0,R0,#SYS32Mode,MSR SPSR_c,R0,break;,case,0 x81,:/,任务切换到用户模式,_asm,MRS R0,SPSR,BIC R0,R0,#0 x1f,ORR R0,R0,#USR32Mode,MSR SPSR_c,R0,break;,.,使用内嵌汇编将处理器模式切换到用户模式,使用内嵌汇编将处理器模式切换到系统模式,嵌入式系统rteoscosii的移植,第41页,编写,OS_CPU_C.C,软件中止异常服务程序,功效号,介绍,0 x00,任务级任务切换函数,0 x01,运行优先级最高任务,由OSStartHighRdy产生,0 x02,关中止,0 x03,开中止,0 x80,任务切换到系统模式,0 x81,任务切换到用户模式,0 x82,任务代码是,ARM,代码,0 x83,任务代码是,THUMB,代码,任务能够使用,ARM,两种指令集任意一个运行,不过任务建立时默认只是一个指令集。假如任务使用第一条指令与默认指令集不一样,则程序运行错误。所以增加两个函数,TaskIsARM(),和,TaskIsTHUMB(),用于改变任务建立时默认指令集。,它们都有唯一参数:需要改变任务优先级,值得注意是,这两个函数必须在对应任务建立后但还没有运行时调用。,嵌入式系统rteoscosii的移植,第42页,编写,OS_CPU_C.C,软件中止异常服务程序,功效号,介绍,0 x00,任务级任务切换函数,0 x01,运行优先级最高任务,由OSStartHighRdy产生,0 x02,关中止,0 x03,开中止,0 x80,任务切换到系统模式,0 x81,任务切换到用户模式,0 x82,任务代码是,ARM,代码,0 x83,任务代码是,THUMB,代码,.,case,0 x82,:/,任务代码是,ARM,代码,if(Regs0 OSTCBStkPtr1&=,(1 5);,break;,case,0 x83,:/,任务代码是,Thumb,代码,if(Regs0 OSTCBStkPtr1|=,(1 5);,break;,.,被设置任务号一定不能大于最低优先级任务,获取指定任务任务控制块地址,修改任务堆栈中,CPSR,值,在任务重新运行时,切换到,ARM,指令方式,修改任务堆栈中,CPSR,值,在任务重新运行时,切换到,Thumb,指令方式,CPSR,:,程序状态存放器,嵌入式系统rteoscosii的移植,第43页,编写,OS_CPU_C.C,软件中止异常服务程序,功效号,介绍,0 x00,任务级任务切换函数,0 x01,运行优先级最高任务,由OSStartHighRdy产生,0 x02,关中止,0 x03,开中止,0 x80,任务切换到系统模式,0 x81,任务切换到用户模式,0 x82,任务代码是,ARM,代码,0 x83,任务代码是,THUMB,代码,注意,:,这两个函数必须在对应任务建立后但还没有运行时,调用,。,假如在低优先级任务中创建高优先级任务就十分危险了。此时,处理方法有三种:,(1),高优先级任务使用默认指令集;,(2),改变函数,OSTaskCreateHook(),使任务默认不是处于就绪状态,建立任务后调用函数,OSTaskResume(),来使任务进入就绪状态;,(3),建立任务时禁止任务切换,调用函数,TaskIsARM(),或,TaskIsTHUMB(),后再允许任务切换。,嵌入式系统rteoscosii的移植,第44页,编写,OS_CPU_C.C,在,Os_cpu_c.c,文件中还有许多,Hook,(),函数,,它们在某个特定系统动作时被调用,,,允许执行函数中用户代码,。这些函数默认是空函数,用户依据实际情况添加相关代码。它们分别以下表所表示。,Hook(),函数,函数名,被执行条件,OSInitHookBegin(),在开始执行,OSInit(),函数时被执行,OSInitHookEnd(),在,OSInit(),函数结束时被执行,OSTaskCreateHook(),在任务建立时被调用,OSTaskDelHook(),在任务删除时被调用,OSTaskSwHook(),在进行任务切换时被调用,OSTaskStatHook(),被统计任务调用,每秒执行一次,OSTCBInitHook(),在建立全部TCB后,由OSTCBInit函数调用,OSTimeTickHook(),每个时钟节拍产生后被调用,OSTaskIdleHook(),由空闲任务调用,嵌入式系统rteoscosii的移植,第45页,移植,C/OS-II,编写,OS_CPU_A.ASM,在,OS_CPU_A.ASM,文件中有:,软件中止汇编接口程序,任务切换程序,OS,开启时运行就绪最高优先级任务程序,嵌入式系统rteoscosii的移植,第46页,OS_CPU_A.ASM,C/OS-II,移植要求用户编写,4,个汇编语言函数:,OSStartHighRdy,(),OSCtxSw,(),OSIntCtxSw,(),OSTickISR,(),假如编译器支持插入行汇编代码,就能够将全部与处理器相关代码放到,OS_CPU_C.C,文件中,而无须再有单独汇编语言文件,嵌入式系统rteoscosii的移植,第47页,编写,OS_CPU_A.ASM,在调用软中止之后,处理器切换到,ARM,指令和管理模式下工作。在执行软件中止服务函数之前,要提取中止号和其它入口参数,这些经过软件中止接口程序完成。,软件中止汇编接口,SoftwareInterrupt,LDR SP,StackSvc,STMFD SP!,R0-R3,R12,LR,MOV
展开阅读全文