




已阅读5页,还剩6页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
uc/os-II在ARM7上的移植1、移植的要求要使C/OS-正常运行于某处理器上,须满足以下要求:1)处理器的C编译器能产生可重入代码;2)可以在C语言代码中打开和关闭中断;3)处理器支持中断,并且能产生定时中断(通常在10至100Hz之间);4)处理器支持能够容纳一定量数据(可能是几千字节)的硬件堆栈;5)处理器有将堆栈指针和其它CPU寄存器读出和存储到堆栈或内存中的指令。2、移植过程基于C/OS-的硬/软件体系结构如下图。教材P165 图5-8C/OS-的移植集中在OS_CPU.h,OS_CPU_A.s,OS_CPU.c这三个文件上,下面分别详细介绍三个文件中的函数和需要修改或者编写的代码。2.1 OS_CPU.h的移植该文件定义了和处理器及编译器相关的定义及一些全局函数声明。由于ARM7 处理器字长为32位,半字长为16位,字节为8位,因此在OS_CPU.h文件修改与编译器相关的定义如下:typedef unsigned char BOOLEAN; typedef unsigned char INT8U; typedef signed char INT8S;typedef unsigned short INT16U; /*某些编译器中int是32位的,故统一用short表示*/ typedef signed short INT16S; typedef unsigned long INT32U; typedef signed long INT32S; typedef float FP32; typedef double FP64; typedef unsigned long OS_STK; /*堆栈宽度为32位,即ARM7种的字对齐方式*/ /*下面是与处理器相关的代码*/ #define OS_CRITICAL_METHOD 2 /*使用方式2保护临界代码*/ #define OS_ENTER_CRITICAL() ARMDisableInt() /*临界段代码保护宏定义*/ #define OS_EXIT_CRITICAL() ARMEnableInt() #define OS_STK_GROWTH 1 /*定义堆栈生长方向为向下生长 */ #define OS_TASK_SW OSCtxSw /*宏定义,用于非中断级的任务切换*/ /*下面开始声明全局函数声明,均是OS_CPU_A.S中需要编写的函数*/ extern void OSCtxSw(void); /*声明任务级任务切换函数*/ extern void OSIntCtxSw(void); /*声明中断级任务切换函数*/ extern void ARMDisableInt(void); /*声明中断禁止函数*/ extern void ARMEnableInt(void); /*声明中断恢复函数*/ extern void OSTickISR(void); /*声明时钟中断服务函数*/ 2.2 OS_CPU_C.C文件移植OS_CPU_C.C文件时,需要编写的是任务堆栈初始化函数OSTaskStkInit和时钟节拍中断服务钩子函数OSTimeTickHook。在C/OS-II中,每一个任务都有自己的任务堆栈,当发生任务切换或者中断时,其CPU使用权被剥脱,为了任务能被再次运行,那么这个被打断的任务所用到的处理器的寄存器内容均应得到保存,按照ARM7 处理器的压栈和入栈指令的特点,设计任务堆栈如下任务堆栈的结构:CPSRR0R1 R12LR(R14)PC(R15)根据任务堆栈结构示意图,OS_STK函数编写如下:#define SVCMODE 0x13 /*定义svc模式的命令字,用户任务运行在svc模式下*/ OS_STK * OSTaskStkInit (void (*task)(void *pd), void *pdata, OS_STK *ptos, INT16U opt) OS_STK *stk; /*定义堆栈指针*/ opt = opt;stk = (OS_STK) ptos; /*保存任务堆栈栈顶指针*/*-stk = (OS_STK) task; /* 用来保存PC,初始化成任务入口地址在被保护存现场的则是该任务运行时被中断时的地址*/ *-stk = (OS_STK) task; /* 用来保存LR*/ *-stk = 0; /* r12 */ *-stk = 0; /* r11 */ *-stk = 0; /* r10 */ *-stk = 0; /* r9 */ *-stk = 0; /* r8 */ *-stk = 0; /* r7 */ *-stk = 0; /* r6 */ *-stk = 0; /* r5 */ *-stk = 0; /* r4 */ *-stk = 0; /* r3 */ *-stk = 0; /* r2 */ *-stk = 0; /* r1 */ *-stk = (INT32U) pdata; /* 在ARM的编译建议中,r0用于参数传递 */ *-stk = (SVC32MODE|0x40); /*用来保存CPSR,并禁止FIQ,由于任务和操作系统均运行在svc模式,被中断到其他模式再返回后仍然回到svc模式,故SPSR没有用到*/ return (OS_STK *)stk); /*返回任务堆栈的指针*/ 说明:用户创建任务时,OSTaskCreat()会调用OSTaskStkInit函数初始化该任务的堆栈,并把返回的堆栈指针保存到该任务的TCB结构中的最前面的参数OSTCBStkPtr中,当该任务要被恢复时,任务切换函数从其TCB块中取得其任务堆栈指针,依次将堆栈内容弹到处理器对应的CPSR、r0,r1,r12,lr,pc的寄存器中,完成现场的恢复和程序指针PC的返回。另一个需要编写的函数是OSTimeTickHook,该函数被时钟节拍中断服务函数OSTickISR中的OSTimeTick函数调用,用来清除时钟节拍中断发生设备的请求。本移植方案使用S3C44B0X处理器的RTC模块的tick中断作为时钟节拍中断,该函数编写如下:void OSTimeTickHook(void) rI_ISPC =(INT32U)0x01) 20;/*清RTC模块的tick中断*/ 注意:用户也可不修改此函数,但是必须在OSTickISR中执行清除发生节拍中断的设备的中断请求标志,为便于说明,本文将利用内核提供给用户的OSTimeTickHook函数来完成清中断的任务。另外几个hook函数不必去改它们。至此,OS_CPU.C编写完成。2.3 OS_CPU_A.S文件的移植该文件是移植过程中唯一需要用汇编语言来实现的文件,也是移植的重点和难点所在。在这个文件里,需要编写的函数有OSStartHighRdy,OSCtxSW,OSIntCtxSW,OSTickISR,ARMDisableInt,ARMEnableInt几个。下面先结合us/os的任务切换的过程分析一下这几个函数的作用。1)OSStartHighRdy()函数当程序执行内核的OSStart函数时,表示多任务系统开始启动, OSStart函数将调用OSStartHighRdy函数从最高优先级任务的TCB块中获得该任务的堆栈指针,通过该指针,依次从该任务的任务堆栈中恢复CPU的现场。由于任务在堆栈初始化时,已经设定了弹出到程序指针寄存器PC的是该任务函数的入口地址,因此,OSStartHighRdy函数只需依次弹出任务栈内容到处理器寄存器,该任务便将得以运行。2)OSCtxSw()函数该函数是任务级的上下文切换函数,当任务被阻塞而主动请求CPU开始任务调度时执行,其过程是将当前任务的的CPU现场保存到该任务堆栈中去,然后从OSTCBHighRdy中获得更高优先级任务的堆栈指针,再从该指针指向的堆栈中恢复此任务的CPU现场,使之继续执行,从而完成一次任务级别的切换。下为此函数的伪代码。void OSCtxSw(void) 保存处理器寄存器;/*将欲挂起的任务的CPU寄存器压入当前堆栈*/ OSTCBCur-OSTCBStkPtr = sp; /*OSTCBCur目前指向的是被打断的任务TCB,此操作将该任务的栈顶指针保存到其OSTCBStkPtr中去,便于下次恢复时从这里获取栈顶指针*/OSTCBCur = OSTCBHighRdy; /*OSTCBHighRdy 指向的是就绪的高优先级任务的TCB,将其装载到OSTCBCur 中来*/SP = OSTCBHighRdy-OSTCBStkPtr; /*取得就绪的高优先级任务的栈顶指针*/恢复该任务的现场(); /*于是便可通过刚取得的栈顶指针恢复该任务 */执行中断返回指令; /*若OSCtxSw含有软中断指令则需中断返回,本移植不使用软中断*/ 3) OSIntCtxSw() 函数该函数用于中断级的上下文切换。由于CPU响应时钟节拍中断后,处理器从svc进入了irq模式,并进入时钟节拍中断服务函数OSTickISR,OSTickISR函数发现若有高优先级任务需要运行,则系统不返回中断前的任务,而直接调度就绪的高优先级任务使之尽快得到执行,以保证实时性能。但是由于OSTickISR函数一开始已经保存过任务中断前的CPU现场,因此OSIntCtxSW()不需要再进行类似的操作。当OSTickISR调用OSIntExit函数找出需要运行的更高优先级任务后,OSIntExit会将该任务的TCB指针放在OSTCBHighRdy中,然后OSIntExit在最后调用OSIntCtxSW函数来从OSTCBHighRdy中获取堆栈指针然后恢复该高优先级任务的现场,使得其继续执行,并不再返回时钟节拍中断服务程序。显然,OSIntCtxSW函数的过程和OSCtxSW函数的后半部分操作相同,因此,OSCtxSW可以借用OSIntCtxSW的代码。4) OSTickISR()函数在CPU响应时钟节拍中断后,程序指针PC发生跳转后进入该函数,由于OSTickISR调用OSTimeTick函数使得所有的延时节拍不为0的任务延时节拍数减1,并调用OSIntExit函数来找出就绪的高优先级任务,若需要切换,则最后由OSIntCtxSw来完成新任务的调度,否则仍然返回到被时钟节拍中断的任务。OSTickISR函数的伪码和注释:void OSTickISR(void) 保存处理器寄存器;/*注意在irq模式下保存CPSR_svc时,要先强制切换到svc模式*/调用OSIntEnter(); /* 防止在嵌套的中断中发生调度 */给产生中断的设备清中断; /*本操作已由OSTimeTick中的OSTimeTickHook函数完成*/调用OSTimeTick(); /*将所有任务不为0的延时节拍数减1*/ 调用OSIntExit(); /*检索就绪任务,并将需要调度的高优先级任务的堆栈指针存到OSTCBHighRdy中去,然后调用OSIntCtxSW恢复该任务的现场*/恢复处理器寄存器;执行中断返回指令; /*若没有中断级任务切换,则返回到中断前的任务*/ 5) ARMDisableInt和ARMEnableInt函数ARMDisableInt是用来暂时禁止FIQ及IRQ中断的函数,ARMEnableInt则是恢复ARMDisableInt执行前的中断使能状态,二者成对使用,用来保护临界段代码不被中断破坏。本移植使用方式2,即在进入临界段代码前关中断,完成后恢复先前的中断使能状态。下面给出OS_CPU_A.S的全部内容和注释。; *OS_CPU_A.S文件汇编代码开始* AREA |subr|, CODE, READONLY ;声明为代码段 ;* OSStartHighRdy代码开始*EXPORT OSStartHighRdy ;关键词EXPORT表示声明此函数被其他文件使用,下同IMPORT OSTaskSwHook ;关键词IMPORT声明此函数/参量在其他文件中定义,下同IMPORT OSTCBHighRdyIMPORT OSRunningOSStartHighRdy ; 使就绪表中任务最高的优先级的任务开始运行BL OSTaskSwHook ; 调用用户的Hook函数,空函数LDR r4,=OSRunning ; 将OSRunning置1,声明多任务OS开始运行MOV r5, #1STRB r5, r4LDR r4, =OSTCBHighRdy ; 伪指令,取得存储OSTCBHighRdy的地址LDR r4, r4 ; 得到最高优先级任务的任务堆栈地址LDR sp, r4 ; 切换到新任务的堆栈LDMFD sp!, r4 ;从新任务堆栈中读取第一个参数(CPSR)到(r4)MSR cpsr_cxsf, r4 ;再传给cpsr,堆栈中的CPSR弹出到CPU的cpsr寄存器LDMFD sp!, r0-r12,lr,pc ;依次恢复该任务r0r12,lr,pc,切换到该任务; *下面开始OSCtxSw函数,完成任务级的任务切换* EXPORT OSCtxSwIMPORT OSPrioCur IMPORT OSPrioHighRdy IMPORT OSTCBCur IMPORT OSTaskSwHookIMPORT OSTCBHighRdy;该变量指向任务切换后即将运行的任务的OS_TCBOSCtxSwSTMFD sp!, lr ; OSCtxSw是被调用的,lr的值就是调用前的PC值,入栈STMFD sp!, r0-r12,lr ; 将lr和其他寄存器入栈MRS r4, cpsr ;通过MRS指令将cpsr入栈STMFD sp!, r4 ; 被挂起的当前任务的寄存器保存完毕,下面接着保存该;任务的堆栈指针,以便下次恢复时,可以找到其堆栈指针,便可恢复其寄存器LDR r4, =OSTCBCur ; 得到当前TCB块的地址,传给r4LDR r5, r4 ; 将OSTCBCur中的值传给r5,注意OSTCBCur存的是指针STR sp, r5 ; 将当前任务的sp传到OSTCBCur存的指针中去; *下面OSCtxSw准备恢复优先级更高的就绪任务,这部分可共用OSIntCtxSw的代码* ; *OSIntCtxSw函数开始* EXPORT OSIntCtxSwIMPORT OSTaskSwHookOSIntCtxSw ;准备任务切换BL OSTaskSwHook ;调用Hook函数,此为空函数LDR r4, =OSTCBHighRdyLDR r4, r4 ;将高优先级的任务栈顶指针存到r4中LDR r5, =OSTCBCurSTR r4, r5 ; OSTCBCur = OSTCBHighRdyLDR r6, =OSPrioHighRdy;取出高优先级LDRB r6, r6 ;优先级,字节传送LDR r5, =OSPrioCurSTRB r6, r5 ; OSPrioCur = OSPrioHighRdyLDR sp, r4 ;从r4中取得要恢复的任务的栈顶指针LDMFD sp!, r4 ;弹出任务栈中的第一个参数,即cpsrMSR cpsr_cxsf, r4 ;首先开始恢复cpsrLDMFD sp!, r0-r12,lr,pc ;依次恢复r0r12,lr,pc,任务切换; *OSTickISR开始*EXPORT OSTickISRIMPORT OSIntEnterIMPORT OSTimeTickIMPORT OSIntExitLINK_SAVE DCD 0 ;用来保存时钟节拍中断前的lr,以便计算出pc而使之入栈PSR_SAVE DCD 0 ;用来保存中断前的spsr,中断产生时,svc模式下的cpsr存到spsrOSTickISR ;时钟节拍中断服务程序入口,需要用户在主函数中安装STMFD sp!, r4 ;因为r4下面要使用,故先保存r4到irq模式的堆栈中LDR r4, =LINK_SAVE ; 准备保存LR,SPSR,以便得到中断前的pc和cpsr_svcSTR lr, r4 ; LINK_SAVE = lr_irq,此时lr=PC(中断发生前)+4MRS lr, spsr ;lr已保存,用lr取得spsr(保存的是中断前的cpsr)STR lr, r4, #4 ; PSR_SAVE = spsr_irqLDMFD sp!, r4 ;恢复r4ORR lr, lr, #0x80 ;在上下文切换前,屏蔽irq中断。注意lr存的是中断前的cpsrMSR cpsr_cxsf, lr ;中断产生前是svc模式,故必须要切换到此模式下保存现场SUB sp, sp, #4 ;按任务栈结构,空一个空间预留给PCSTMFD sp!, r0-r12,lr ; 依次保存lr、r12r0LDR r4, =LINK_SAVE ;准备保存pc,取得存svc模式下发生中断前lr的地址LDR lr, r4, #0SUB lr, lr, #4 ;中断前的pc = LINK_SAVE - 4,此前lr为异常前pc+4的值STR lr, sp, #(14*4);保存pc到任务栈中预留的空间LDR r4, r4, #4 ;开始保存cpsr,r4 = PSR_SAVE,即中断前的cpsr_svcSTMFD sp!, r4 ;保存svc模式下任务的cpsr,寄存器保护完毕LDR r4, =OSTCBCur ;下面开始将该堆栈指针传给OSTCBCur所指向的指针LDR r4, r4 ;便于OSIntExit函数判断是否当前任务优先级最高STR sp, r4 ;在OSTCBCur-OSTCBstkptr保存被中断的任务的栈顶
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年电力系统运行值班员专业技能测试题库
- 申报课件教学课件
- 甲骨文的演变
- 甲状腺癌护士课件
- 游戏主题活动方案设计
- 《教学相长》课件
- 甲午中日战争课件简短
- 急性肾功能衰竭透析指征护理查房
- 2025年英语四级阅读理解专项训练试卷 阅读理解词汇训练
- 2025年秋季会计职称考试 税法与财务会计实务历2025年真题试卷
- 痔疮的健康教育课件
- 优甲乐(左甲状腺素钠片)健康教育
- 肝脏弥漫性病变超声诊断与检查规范
- 风力发电税务培训课件
- 2025年长沙市中考物理试卷真题(含答案)
- 建筑工地驻场人员管理办法及流程
- 检验科生化培训课件
- 配电类“两种人”题库(2025年3月修编)改
- 2025年全国工会系统经审业务技能大赛知识总题库(1800题)-中部分
- 心脏骤停的急救及处理
- 红十字急救包扎技术培训课件
评论
0/150
提交评论