您好,欢迎访问三七文档
当前位置:首页 > 行业资料 > 其它行业文档 > uCOS-II 在ARM 微处理器上的移植及编译 课程设计
00ARM原理与应用报告一、设计内容1.用ADS1.2IDE软件进行程序代码编译设计,生成可执行的输出文件,并显示运行结果,实现uC/OS-II内核在ARM处理器上移植。2.uC/OS-II在ARM微处理器上的移植及编译。二、设计目的与要求目的:ARM原理与应用课程设计是学生理论联系实际的重要实践教学环节,是对学生进行的一次专业训练,也是对学生掌握和应用嵌入式系统相关知识能力的有效测试。通过ARM原理与应用课程设计,使学生初步了解嵌入式系统软件开发的一般过程和基本设计方法,使学生进一步巩固和加深所学的专业理论知识,培养学生文献查阅、报告撰写等基本技能;培养学生独立分析和解决工程实际问题的能力;培养学生的团队协作精神、创新意识、严肃认真的治学态度和严谨求实的工作作风。要求:1)了解uC/OS-II内核的主要结构。2)掌握将uC/OS-II内核移植到ARM处理器上的基本方法。3)在给定的设备(UP-TECHPXA270-S嵌入式开发平台、PC机、WinXP、ADS1.2集成开发环境、仿真器驱动程序、超级终端通讯程序)上加以实验,学会自己分析、找出解决问题的方法。4)对设计中遇到的问题和困难,独立思考,查阅资料,分析、观察、判断、试验、再判断以寻找答案。5)分析结果,写出设计总结报告论述自己的观点,并应将参考资料列在报告后面以备查询。内容尽量翔实(如上机过程、环境搭建),其中必须有按自己所理解、用自己的语言所描述的内容。0三、设计环境或器材、原理与说明环境:硬件:PC机,博创UP-TECHPXA27-S目标板ARM7TDMI微处理器,串口线,并口JTAG转换线;软件:MS.Virtual.PC.2004,WindowsXP系统,ADS1.2IDE编译环境,LPC2000FlashUtility烧写程序、超级终端通讯程序.原理与说明:1.《ARM原理与应用》课程设计题目涉及ARM应用的诸多方面,须经过思考和认真的学习,有一定难度,在深度方面主要要求学生对具体ARM指令的分析理解,目标板ARM处理器的硬件认识了解,ADS1.2IDE软件的操作能力,解读uC/OS-II内核的自学能力以及自我解决问题的能力。2.µC/OS-II是一个完整的,可移植、可固化、可裁减的占先式实时多任务内核,它功能强大,支持56个用户任务,支持信号量、邮箱、消息队列等多种常用的进程间通信机制。公开源代码,程序可读性强、移植性好,同时可免费获得。LPC2119是由PHILIPS生产的一款32位ARM7TDMI-S微处理器,其核心为高性能的32位RISC体系结构,并具有高密度的16位指令集和极低的功耗。具有零等待128K字节的片内Flash,16k的SRAM,无需扩展存储器,使系统更为简单、可靠。四、设计过程(步骤)或程序代码源代码:1.OS_CPU.H文件该文件定义了和处理器相关的定义及一些全局函数声明。由于ARM7处理器字长为32位,半字长为16位,字节为8位,因此在OS_CPU.h文件修改了一些相关定义以确保uC/OS-Ⅱ的可移植性:#ifndef__OS_CPU_H__#define__OS_CPU_H__#ifdefOS_CPU_GLOBALS#defineOS_CPU_EXT#else#defineOS_CPU_EXTextern#endiftypedefunsignedcharBOOLEAN;typedefunsignedcharINT8U;/*Unsigned8bitquantity*/typedefsignedcharINT8S;/*Signed8bitquantity*/typedefunsignedintINT16U;/*Unsigned16bitquantity*/typedefsignedintINT16S;/*Signed16bitquantity*/typedefunsignedlongINT32U;/*Unsigned32bitquantity*/typedefsignedlongINT32S;/*Signed32bitquantity*/typedeffloatFP32;/*Singleprecisionfloatingpoint*/typedefdoubleFP64;/*Doubleprecisionfloatingpoint*/typedefunsignedintOS_STK;/*Eachstackentryis16-bitwide*/typedefunsignedintOS_CPU_SR;/*DefinesizeofCPUstatusregister(PSR=32bits)*/#defineBYTEINT8S/*Definedatatypesforbackwardcompatibility...*/0#defineUBYTEINT8U/*...touC/OSV1.xx.Notactuallyneededfor...*/#defineWORDINT16S/*...uC/OS-II.*/#defineUWORDINT16U#defineLONGINT32S#defineULONGINT32U从上面定义可看出,uC/OS-Ⅱ代码不使用C的short,int和long等数据类型,这是因为它们是与编译器相关的,不可移植。uC/OS-Ⅱ需要先禁止中断再访问代码的临界段,并且在访问后重新允许中断,这就使得uC/OS-Ⅱ能够保护临界段代码免受多任务或中断服务例程的破坏。uC/OS-Ⅱ对关中断以及开中断的宏定义如下:#defineOS_CRITICAL_METHOD3#ifOS_CRITICAL_METHOD==3/*criticalsectionmacrosusemethod3(savetolocalvarcpu_sr)*/externintINTS_OFF(void);/*ASMroutinestotwiddlebits*/externvoidINTS_ON(void);#defineOS_ENTER_CRITICAL(){cpu_sr=INTS_OFF();}#defineOS_EXIT_CRITICAL(){if(cpu_sr==0)INTS_ON();}#else#errorpleasedefinecriticalmethod#endif#defineOS_STK_GROWTH1/*StackgrowsfromHIGHtoLOWmemoryon80x86*///#defineOS_TASK_SW()OSCtxSw()#endif/*__OS_CPU_H__*/uC/OS-Ⅱ可以处理从下往上长以及从上往下长两种堆栈方式,但由于ARM处理器的堆栈都是从上往下生长,也就是高地址到低地址的生长方向,因此宏定义如下:#defineOS_STK_GROWTH1/*堆栈从上往下增长,1向上,0向下*/2.OS_CPU_C.C文件在这个文件里主要是OSTaskStkInit()函数和一些钩子函数,需要关心的是OSTaskStkInit()。OSTaskStkInit()是任务堆栈初始化函数,它由任务建立函数OSTaskCreateExt()调用,用于初始化任务的堆栈,堆栈的结构初始化成看起来刚刚发生过中断一样,所有的寄存器都被入栈。在ARM体系结构下,任务堆栈空间由高至低依次将保存着pc、lr、r12、r11、r10、…、r1、r0、cpsr、spsr。OSTaskStkInit()函数有四个参数,task,pdata,ptos,opt,它们和建立任务所使用的参数是一致的。函数返回堆栈指针所指的地址。当我们使用OSTaskCreateExt()来建立任务时,就把上述四个参数传递给OSTaskStkInit()函数,初始化好堆栈,再返回给OSTaskCreateExt()堆栈指针,继续走下去。OSTaskStkInit()函数代码最后,使用R0来传递参数,这是符合ARM汇编的规范,使用R0来传递第一个参数。#includeincludes.h/*fromuCOSdirectory*///#includeipport.h/*fromInternichedirectory*//*ARMCPUsupervisormodeforPSRregisters,withINTsenabled*/#defineSUPMODE0x13OS_STK*OSTaskStkInit(void(*task)(void*pd),void*pdata,OS_STK*ptos,INT16Uopt){unsignedint*stk;stk=(unsignedint*)ptos;/*加载堆栈指针*///USE_ARG(opt);opt++;/*buildastackforthenewtask*//*建立任务环境,ADS1.2使用满递减堆栈*/*--stk=(unsignedint)task;/*pc*/0*--stk=(unsignedint)task;/*lr*/*--stk=12;/*r12*/*--stk=11;/*r11*/*--stk=10;/*r10*/*--stk=9;/*r9*/*--stk=8;/*r8*/*--stk=7;/*r7*/*--stk=6;/*r6*/*--stk=5;/*r5*/*--stk=4;/*r4*/*--stk=3;/*r3*/*--stk=2;/*r2*/*--stk=1;/*r1*/*--stk=(unsignedint)pdata;/*r0,第一个参数使用R0传递*/*--stk=(SUPMODE);/*cpsr*/*--stk=(SUPMODE);/*spsr*/return((OS_STK*)stk);}#ifOS_CPU_HOOKS_ENvoidOSTaskCreateHook(OS_TCB*ptcb)/*任务创建钩子函数,当任务被创建时调用该函数*/{ptcb=ptcb;}/*ptcb没有用,是为了防止编译器警告*/voidOSTaskDelHook(OS_TCB*ptcb)/*任务删除钩子函数,当任务被删除时调用该函数*/{ptcb=ptcb;}/*ptcb没有用,是为了防止编译器警告*/voidOSTaskSwHook(void){}/*任务切换函数,可以在执行其他操作时进行上下文切换。*/voidOSTaskStatHook(void){}/*任务统计钩子函数*/voidOSTimeTickHook(void){}voidOSTCBInitHook(OS_TCB*ptcb){ptcb=ptcb;}/*PreventCompilerwarning*/voidOSTaskIdleHook(void){}voidOSInitHookEnd(void){}voidOSInitHookBegin(void){}#endif3.OS_CPU_A.S文件该文件的是移植的关键所在,在本文件中必须完成四个函数的编写工作,它们分别为OSIntCtxSw(),OSCtxSw(),OSStartHighRdy()和OSTickISR()。其中前两个函数是重中之重,它们必须用汇编语言编写,主要完成任务环境的切换工作。AREA|subr|,CODE,READONLYEXPORTOSIntCtxSwEXPORTOS_TASK_SWEXPORTINTS_OFFEXPORTINTS_ONINTS_OFFmrsr0,cpsr;currentCSRmovr1,r0;makeacopyformaskingorrr1,r1,#0xC0;maskoffintbitsmsrCPSR_cxsf,r1;disableints(IRQandFIQ)andr0,r0,#0x80;returnFIQbitfromoriginalCSRmovpc,lr;return0INTS_ONmrsr0,cpsr;currentCSRbicr0,r0,#0xC0;maskonintsmsrCPSR_cxsf,r0;enableints(IRQandFIQ)movpc,lr;ret
本文标题:uCOS-II 在ARM 微处理器上的移植及编译 课程设计
链接地址:https://www.777doc.com/doc-3558449 .html