ImageVerifierCode 换一换
格式:DOCX , 页数:23 ,大小:258.41KB ,
资源ID:10026472      下载积分:12 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/10026472.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(uCOSII在ARM微处理器上的移植和编译课程设计报告书.docx)为本站会员(b****7)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

uCOSII在ARM微处理器上的移植和编译课程设计报告书.docx

1、uCOSII在ARM微处理器上的移植和编译课程设计报告书ARM原理与应用报告一、设计内容1.用ADS1.2 IDE软件进行程序代码编译设计,生成可执行的输出文件,并显示运行结果,实现uC/OS-II内核在ARM处理器上移植。2.uC/OS-II在ARM微处理器上的移植及编译。二、 设计目的与要求目的:ARM原理与应用课程设计是学生理论联系实际的重要实践教学环节,是对学生进行的一次专业训练,也是对学生掌握和应用嵌入式系统相关知识能力的有效测试。通过ARM原理与应用课程设计,使学生初步了解嵌入式系统软件开发的一般过程和基本设计方法,使学生进一步巩固和加深所学的专业理论知识,培养学生文献查阅、报告撰

2、写等基本技能;培养学生独立分析和解决工程实际问题的能力;培养学生的团队协作精神、创新意识、严肃认真的治学态度和严谨求实的工作作风。要求:1) 了解uC/OS-II 内核的主要结构。2) 掌握将uC/OS-II 内核移植到ARM 处理器上的基本方法。3)在给定的设备(UP-TECH PXA270-S嵌入式开发平台、PC 机 、WinXP、ADS1.2 集成开发环境、仿真器驱动程序、超级终端通讯程序)上加以实验,学会自己分析、找出解决问题的方法。4)对设计中遇到的问题和困难,独立思考,查阅资料,分析、观察、判断、试验、再判断以寻找答案。5)分析结果,写出设计总结报告论述自己的观点,并应将参考资料列

3、在报告后面以备查询。内容尽量翔实(如上机过程、环境搭建),其中必须有按自己所理解、用自己的语言所描述的内容。三、 设计环境或器材、原理与说明环境:硬件:PC机,博创UP-TECHPXA27-S目标板ARM7TDMI微处理器,串口线,并口JTAG 转换线;软件:MS.Virtual.PC.2004,Windows XP系统,ADS1.2 IDE编译环境,LPC2000 Flash Utility烧写程序、超级终端通讯程序.原理与说明:1.ARM原理与应用课程设计题目涉及ARM应用的诸多方面,须经过思考和认真的学习,有一定难度,在深度方面主要要求学生对具体ARM指令的分析理解,目标板ARM处理器的

4、硬件认识了解,ADS1.2 IDE软件的操作能力,解读uC/OS-II 内核的自学能力以及自我解决问题的能力。2.c/os-ii是一个完整的,可移植、可固化、可裁减的占先式实时多任务内核,它功能强大,支持56个用户任务,支持信号量、邮箱、消息队列等多种常用的进程间通信机制。公开源代码,程序可读性强、移植性好,同时可免费获得。lpc2119是由philips生产的一款32位arm7tdmi-s微处理器,其核心为高性能的32位risc体系结构,并具有高密度的16位指令集和极低的功耗。具有零等待128K字节的片内Flash,16k的Sram,无需扩展存储器,使系统更为简单、可靠。四、 设计过程(步骤

5、)或程序代码源代码:1. OS_CPU.H文件该文件定义了和处理器相关的定义及一些全局函数声明。由于ARM7 处理器字长为32位,半字长为16位,字节为8位,因此在OS_CPU.h文件修改了一些相关定义以确保uC/OS-的可移植性:#ifndef _OS_CPU_H_#define _OS_CPU_H_#ifdef OS_CPU_GLOBALS#define OS_CPU_EXT#else#define OS_CPU_EXT extern#endiftypedef unsigned char BOOLEAN;typedef unsigned char INT8U; /* Unsigned 8

6、bit quantity */typedef signed char INT8S; /* Signed 8 bit quantity */typedef unsigned int INT16U; /* Unsigned 16 bit quantity */typedef signed int INT16S; /* Signed 16 bit quantity */typedef unsigned long INT32U; /* Unsigned 32 bit quantity */typedef signed long INT32S; /* Signed 32 bit quantity */t

7、ypedef float FP32; /* Single precision floating point */typedef double FP64; /* Double precision floating point */typedef unsigned int OS_STK; /* Each stack entry is 16-bit wide */typedef unsigned int OS_CPU_SR; /* Define size of CPU status register (PSR = 32 bits) */#define BYTE INT8S /* Define dat

8、a types for backward compatibility . */#define UBYTE INT8U /* . to uC/OS V1.xx. Not actually needed for . */#define WORD INT16S /* . uC/OS-II. */#define UWORD INT16U#define LONG INT32S#define ULONG INT32U从上面定义可看出,uC/OS-代码不使用C的short,int和long等数据类型,这是因为它们是与编译器相关的,不可移植。uC/OS-需要先禁止中断再访问代码的临界段,并且在访问后重新允许中

9、断,这就使得uC/OS-能够保护临界段代码免受多任务或中断服务例程的破坏。uC/OS-对关中断以及开中断的宏定义如下:#define OS_CRITICAL_METHOD 3#if OS_CRITICAL_METHOD = 3 /* critical section macros use method 3 (save to local var cpu_sr) */extern int INTS_OFF(void); /* ASM routines to twiddle bits */extern void INTS_ON(void);#define OS_ENTER_CRITICAL() cp

10、u_sr = INTS_OFF(); #define OS_EXIT_CRITICAL() if(cpu_sr = 0) INTS_ON(); #else #error please define critical method#endif#define OS_STK_GROWTH 1 /* Stack grows from HIGH to LOW memory on 80x86 */#define OS_TASK_SW() OSCtxSw()#endif /*_OS_CPU_H_*/uC/OS-可以处理从下往上长以及从上往下长两种堆栈方式,但由于ARM处理器的堆栈都是从上往下生长,也就是高地

11、址到低地址的生长方向,因此宏定义如下:#define OS_STK_GROWTH 1 /*堆栈从上往下增长,1向上,0向下*/2. OS_CPU_C.C文件在这个文件里主要是OSTaskStkInit()函数和一些钩子函数,需要关心的是OSTaskStkInit()。OSTaskStkInit()是任务堆栈初始化函数,它由任务建立函数OSTaskCreateExt()调用,用于初始化任务的堆栈,堆栈的结构初始化成看起来刚刚发生过中断一样,所有的寄存器都被入栈。在ARM体系结构下,任务堆栈空间由高至低依次将保存着pc、lr、r12、r11、r10、r1、r0、cpsr、spsr。OSTaskSt

12、kInit()函数有四个参数,task,pdata,ptos,opt,它们和建立任务所使用的参数是一致的。函数返回堆栈指针所指的地址。当我们使用OSTaskCreateExt()来建立任务时,就把上述四个参数传递给OSTaskStkInit()函数,初始化好堆栈,再返回给OSTaskCreateExt()堆栈指针,继续走下去。OSTaskStkInit()函数代码最后,使用R0来传递参数,这是符合ARM汇编的规范,使用R0来传递第一个参数。#include includes.h /* from uCOS directory */#include ipport.h /* from Interni

13、che directory */* ARM CPU supervisor mode for PSR registers, with INTs enabled */#define SUPMODE 0x13OS_STK * OSTaskStkInit (void (*task)(void *pd), void *pdata, OS_STK *ptos, INT16U opt) unsigned int * stk; stk = (unsigned int *)ptos; /* 加载堆栈指针 */ /USE_ARG(opt); opt+; /* build a stack for the new t

14、ask */*建立任务环境,ADS1.2使用满递减堆栈*/ *-stk = (unsigned int) task; /* pc */ *-stk = (unsigned int) 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 =

15、3; /* r3 */ *-stk = 2; /* r2 */ *-stk = 1; /* r1 */ *-stk = (unsigned int) pdata; /* r0, 第一个参数使用R0传递*/ *-stk = (SUPMODE); /* cpsr */ *-stk = (SUPMODE); /* spsr */ return (OS_STK *)stk);#if OS_CPU_HOOKS_ENvoid OSTaskCreateHook (OS_TCB *ptcb) /*任务创建钩子函数,当任务被创建时调用该函数*/ ptcb = ptcb; /* ptcb没有用,是为了防止编译器警

16、告*/void OSTaskDelHook (OS_TCB *ptcb) /*任务删除钩子函数,当任务被删除时调用该函数*/ptcb = ptcb; /* ptcb没有用,是为了防止编译器警告*/void OSTaskSwHook (void) /*任务切换函数,可以在执行其他操作时进行上下文切换。*/void OSTaskStatHook (void) /*任务统计钩子函数*/void OSTimeTickHook (void)void OSTCBInitHook (OS_TCB *ptcb) ptcb = ptcb; /* Prevent Compiler warning */void O

17、STaskIdleHook (void)void OSInitHookEnd (void)void OSInitHookBegin (void)#endif3.OS_CPU_A.S文件该文件的是移植的关键所在,在本文件中必须完成四个函数的编写工作,它们分别为OSIntCtxSw( ),OSCtxSw( ), OSStartHighRdy( )和OSTickISR( )。其中前两个函数是重中之重,它们必须用汇编语言编写,主要完成任务环境的切换工作。 AREA |subr|, CODE, READONLY EXPORT OSIntCtxSw EXPORT OS_TASK_SW EXPORT INT

18、S_OFF EXPORT INTS_ONINTS_OFF mrs r0, cpsr ; current CSR mov r1, r0 ; make a copy for masking orr r1, r1, #0xC0 ; mask off int bits msr CPSR_cxsf, r1 ; disable ints (IRQ and FIQ) and r0, r0, #0x80 ; return FIQ bit from original CSR mov pc,lr ; returnINTS_ON mrs r0, cpsr ; current CSR bic r0, r0, #0xC

19、0 ; mask on ints msr CPSR_cxsf, r0 ; enable ints (IRQ and FIQ) mov pc,lr ; return ; External symbols we need the addresses of IMPORT OSTCBCuraddr_OSTCBCur DCD OSTCBCur IMPORT OSTCBHighRdyaddr_OSTCBHighRdy DCD OSTCBHighRdy IMPORT OSPrioCuraddr_OSPrioCur DCD OSPrioCur IMPORT OSPrioHighRdyaddr_OSPrioHi

20、ghRdy DCD OSPrioHighRdy IMPORT IRQStack ;FIQ_STACKOSIntCtxSw; post FIQ Context switcher. This is called from OSIntExit when a hooked ISR; wants to return in the context of another task. We load the new tasks context; (from OSPrioHighRdy) and do the return from interrupt. ; Get pointer to stack where

21、 ISR_FiqHandler saved interrupted context ; ISR entry only saves first seven regs and LR. ; ;add r7, sp, #24 ; save pointer to register file, we must adjust this pointer to the position that just Enter Interrupt LDR sp, =IRQStack ;IRQ_STACK ;test to del it sub r7, sp, #4 ;r7 is the position that jus

22、t Enter Interrupt ; Change ARM CPU to SVC mode for stack operations. ; This gets the CPU off the interrupt stack and back to the ; interrupted tasks stack, which is the one we want to alter. ; mrs r1, SPSR ; get suspended PSR orr r1, r1, #0xC0 ; disable IRQ, FIQ. msr CPSR_cxsf, r1 ; switch mode (sho

23、ld be SVC_MODE) ; PSR, SP, LR regs are now restored to the interrupted SVC_MODE. ; now set up the tasks stack frame as OS_TASK_SW does.; ldr r0, r7, #52 ; get IRQs LR (tasks PC) from IRQ stack /r0-r12 ldr r0, r7 ; get IRQs LR (tasks PC) from IRQ stack sub r0, r0, #4 ; Actual PC address is (saved_LR

24、- 4) STMFD sp!, r0 ; save task PC STMFD sp!, lr ; save LR sub lr, r7, #52 ;/we save the r0-r12 when we enter IRQ.; mov lr, r7 ; save FIQ stack ptr in LR (going to nuke r7) ldmfd lr!, r0-r12 ; get saved registers from FIQ stack STMFD sp!, r0-r12 ; save registers on task stack ; save PSR and PSR for t

25、ask on tasks stack MRS r4, CPSR bic r4, r4, #0xC0 ; leave interrupt bits in enabled mode STMFD sp!, r4 ; save tasks current PSR MRS r4, SPSR STMFD sp!, r4 ; SPSR too ; OSPrioCur = OSPrioHighRdy / change the current process LDR r4, addr_OSPrioCur LDR r5, addr_OSPrioHighRdy LDRB r6, r5 STRB r6, r4 ; G

26、et preempted taskss TCB LDR r4, addr_OSTCBCur LDR r5, r4 STR sp, r5 ; store sp in preempted taskss TCB ; Get new task TCB address LDR r6, addr_OSTCBHighRdy LDR r6, r6 LDR sp, r6 ; get new tasks stack pointer ; OSTCBCur = OSTCBHighRdy STR r6, r4 ; set new current task TCB address LDMFD sp!, r4 MSR SP

27、SR_cxsf, r4 LDMFD sp!, r4 BIC r4, r4, #0xC0 ; we must exit to new task with ints enabled MSR CPSR_cxsf, r4 LDMFD sp!, r0-r12, lr, pc; void OS_TASK_SW(void) ; Perform a context switch.; On entry, OSTCBCur and OSPrioCur hold the current TCB and priority; and OSTCBHighRdy and OSPrioHighRdy contain the

28、same for the task; to be switched to.; The following code assumes that the virtual memory is directly; mapped into physical memory. If this is not true, the cache must ; be flushed at context switch to avoid address aliasing.OS_TASK_SW STMFD sp!, lr ; save pc STMFD sp!, lr ; save lr STMFD sp!, r0-r1

29、2 ; save registers and ret address MRS r4, CPSR STMFD sp!, r4 ; save current PSR MRS r4, SPSR STMFD sp!, r4 ; save SPSR ; OSPrioCur = OSPrioHighRdy LDR r4, addr_OSPrioCur LDR r5, addr_OSPrioHighRdy LDRB r6, r5 STRB r6, r4 ; Get current task TCB address LDR r4, addr_OSTCBCur LDR r5, r4 STR sp, r5 ; s

30、tore sp in preempted taskss TCB ; Get highest priority task TCB address LDR r6, addr_OSTCBHighRdy LDR r6, r6 LDR sp, r6 ; get new tasks stack pointer ; OSTCBCur = OSTCBHighRdy STR r6, r4 ; set new current task TCB address ; restore tasks mode regsiters LDMFD sp!, r4 MSR SPSR_cxsf, r4 LDMFD sp!, r4 M

31、SR CPSR_cxsf, r4 ; return in new task context LDMFD sp!, r0-r12, lr, pc; void OSStartHighRdy(void) ; Start the task with the highest priority; EXPORT OSStartHighRdyOSStartHighRdy LDR r4, addr_OSTCBCur ; Get current task TCB address LDR r5, addr_OSTCBHighRdy ; Get highest priority task TCB address LDR r5, r5

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1