版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、COS-II 在ARM 微处理器上的移植一、 实验目的1 了解UC/OS-II 内核的主要结构。2 掌握将UC/OS-II 内核移植到ARM7 处理器上的基本方法。二、 实验内容1 将UC/OS-II 内核移植到ARM7 处理器上。2 按键盘上的任意键,在超级终端上显示对应的键值。三、 预备知识1 掌握在ARM SDT 2.5 集成开发环境中编写和调试程序的基本过程。2 会使用Source Insight 3 编辑C 语言源程序。3 了解ARM7 处理器的结构。4 了解UC/OS-II 系统结构。四、 实验设备及工具硬件:ARM 嵌入式开发板、用于ARM7TDMI 的JTAG 仿真器、PC 机
2、Pentumn100 以上。软件:PC 机操作系统win98、ARM SDT 2.51 集成开发环境、仿真器驱动程序、SourceInsight 3.0五、 实验原理所谓移植,指的是一个操作系统可以在某个微处理器或者微控制器上运行。虽然COS-II的大部分源代码是用C 语言写成的,但是,仍需要用C 语言和汇编语言完成一些与处理器相关的代码。比如:COS-II 在读写处理器寄存器时只能通过汇编语言来实现。因为COS-II在设计的时候就已经充分考虑了可移植性,所以,COS-II 的移植还是比较容易的1。要使COS-II 可以正常工作,处理器必须满足如下要求:1 处理器的C 编译器能产生可重入代码。
3、可重入的代码指的是一段代码(比如:一个函数)可以被多个任务同时调用,而不必担心会破坏数据。也就是说,可重入型函数在任何时候都可以被中断执行,过一段时间以后又可以继续运行,而不会因为在函数中断的时候被其他的任务重新调用,影响函数中的数据。下面的两个例子可以比较可重入型函数和非可重入型函数:程序1:可重入型函数void swap(int *x, int *y)int temp;temp=*x;*x=*y;*y=temp;程序2:非可重入型函数int temp;void swap(int *x, int *y)temp=*x;*x=*y;*y=temp;程序1 中使用的是局部变量temp 作为变量,
4、通常的C 编译器,把局部变量分配在栈中。所以,多次调用同一个函数,可以保证每次的temp 互不受影响。而程序2 中temp 定义的是全局变量,多次调用函数的时候,必然受到影响。代码的可重入性是保证完成多任务的基础,除了在C 程序中使用局部变量以外,还要C编译器的支持。笔者使用的是ARM SDT 的集成开发环境,可以生成可重入的代码。2 在程序中可以打开或关断中断。在COS-II 中,可以通过OS_ENTER_CRITICAL()或者OS_EXIT_CRITICAL()宏来控制系统关闭或者打开中断。这需要处理器的支持。在ARM7TDMI 的处理器上,可以设置相应的寄存器来关闭或者打开系统的所有中
5、断。3 处理器支持中断,并能产生定时中断(通常在10Hz1000Hz 之间)。COS-II 是通过处理器产生的定时器的中断来实现多任务之间的调度的。在ARM7TDMI 的处理器上可以产生定时器中断。4 处理器支持能够容纳一定量数据(可能是几千字节)的硬件堆栈。5 处理器有将堆栈指针和其他CPU 寄存器读出和存储到堆栈或内存中的指令。移植工作包括以下几个内容:1 用#define 设置一个常量的值(OS_CPU.H)。2 声明10 个数据类型(OS_CPU.H)。3 用#define 声明三个宏(OS_CPU.H)。4 用C 语言编写六个简单的函数(OS_CPU_C.C)。5 编写四个汇编语言函
6、数(OS_CPU_A.ASM)。COS-II 进行任务调度的时候,会把当前任务的CPU 寄存器存放到此任务的堆栈中,然后,再从另一个任务的堆栈中恢复原来的工作寄存器,继续运行另一个任务。所以,寄存器的入栈和出栈是COS-II 多任务调度的基础。在移植过程中,INCLUDES.H 使得用户项目中的每个.C 文件不用分别去考虑它实际上上需要那些头文件。使用INCLUDES.H 的唯一缺点是,它可能会包括一些实际不相关的头文件。这意味着每个文件的编译时间可能会增加。但由于它增强了代码的可移植性,所以我们还是决定使用这一方法。用户可以通过编辑INCLUDES.H 来增加自己的头文件,但用户的头文件必须
7、添加在头文件列表的最后。uC/OS 硬件和软件体系结构六、 实验步骤1 设置OS_CPU.H 中与处理器和编译器相关的代码/* 与编译器相关的数据类型*/typedef unsigned char BOOLEAN;typedef unsigned char INT8U; /8 位无符号整数typedef signed char INT8S; /8 位有符号整数typedef unsigned int INT16U; /16 位无符号整数typedef signed int INT16S; /16 位有符号整数typedef unsigned long INT32U; /32 位无符号整数typ
8、edef signed long INT32S; /32 位有符号整数typedef float FP32; /单精度浮点数typedef double FP64; /双精度浮点数typedef unsigned int OS_STK; /堆栈入口宽度为16 位#define BYTE INT8S /字节型#define UBYTE INT8U /为了与 uC/OS V1.xx.兼容#define WORD INT16S / . uC/OS-II.#define UWORD INT16U#define LONG INT32S#define ULONG INT32U/* 与 ARM 处理器相关的
9、代码*/#define OS_ENTER_CRITICAL() ARMDisableInt() /*关闭中断*/#define OS_EXIT_CRITICAL() ARMEnableInt() /*开启中断*/* 设施堆栈的增长方向 */#define OS_STK_GROWTH 1 /*堆栈由高地址向低地址增长*/2 用C 语言编写六个操作系统相关的函数(OS_CPU_C.C)void *OSTaskStkInit (void (*task)(void *pd),void *pdata, void *ptos, INT16U opt)unsigned int *stk;opt = opt;
10、 /* 因为opt 变量没有用到,防止编译器产生警告*/stk = (unsigned int *)ptos; /*装载堆栈指针*/* 为新任务创建上下文 */*-stk = (unsigned int) task; /* pc */*-stk = (unsigned int) 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;
11、 /* r5 */*-stk = 0; /* r4 */*-stk = 0; /* r3 */*-stk = 0; /* r2 */*-stk = 0; /* r1 */*-stk = (unsigned int) pdata; /* r0 */*-stk = (SVC32MODE|0x0); /* cpsr IRQ, 关闭FIQ */*-stk = (SVC32MODE|0x0); /* spsr IRQ, 关闭FIQ */return (void *)stk);void OSTaskCreateHook (OS_TCB *ptcb)ptcb=ptcb;/防止编译时出现警告void OSTa
12、skDelHook (OS_TCB *ptcb)ptcb=ptcb;/防止编译时出现警告void OSTaskSwHook (void)void OSTaskStatHook (void)void OSTimeTickHook (void)后5 个函数为钩子函数,可以不加代码。3 用汇编语言编写四个与处理器相关的函数(OS_CPU.ASM)(1)OSStartHighRdy();运行优先级最高的就绪任务LDR r4, addr_OSTCBCur ; 得到当前任务的TCB 地址LDR r5, addr_OSTCBHighRdy ; 得到高优先级任务的TCB 地址LDR r5, r5 ;得到堆栈指
13、针LDR sp, r5 ;切换到新的堆栈STR r5, r4 ; 设置新的当前任务的TCB 地址LDMFD sp!, r4MSR SPSR_cxsf, r4LDMFD sp!, r4 ; 从栈顶得到新的声明MSR CPSR_cxsf, r4LDMFD sp!, r0-r12, lr, pc ; 开始新的任务END(2)OSCtxSw();任务级的任务切换函数STMFD sp!, lr ; 保存PC 指针STMFD sp!, lr ; 保存lr 指针STMFD sp!, r0-r12 ;保存寄存器文件和ret 地址MRS r4, CPSRSTMFD sp!, r4 ; 保存当前 PSRMRS r
14、4, SPSRSTMFD sp!, r4; OSPrioCur = OSPrioHighRdyLDR r4, addr_OSPrioCurLDR r5, addr_OSPrioHighRdyLDRB r6, r5STRB r6, r4; 得到当前任务的TCB 地址LDR r4, addr_OSTCBCurLDR r5, r4STR sp, r5 ; 保存栈指针在占先任务的TCB 上; 取得高优先级任务的TCB 地址LDR r6, addr_OSTCBHighRdyLDR r6, r6LDR sp, r6 ;得到新任务的堆栈指针; OSTCBCur = OSTCBHighRdySTR r6, r
15、4 ; 设置当前新任务的TCB 地址set new current task TCBaddressLDMFD sp!, r4MSR SPSR_cxsf, r4LDMFD sp!, r4MSR CPSR_cxsf, r4LDMFD sp!, r0-r12, lr, pc(3)OSIntCtxSw();中断级的任务切换函数LDMIA sp!,a1-v1, lrSUBS pc, lr, #4SUB lr, lr, #4MOV r12, lrMRS lr, SPSRAND lr, lr, #0xFFFFFFE0ORR lr, lr, #0xD3MSR CPSR_cxsf, lr(4)OSTickISR();中断服务函数STMDB sp!,r0-r11,lr;interrupt disable(not nessary)mrs r0, CPSRorr r0, r0, #0x80 ; 设置中断禁止标msr CPSR_cxsf, r0 ;中断结束; rI_I
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026湖北大学统一招聘专职辅导员10人笔试备考题库及答案解析
- 2026年江西应用技术职业学院单招综合素质笔试备考题库含详细答案解析
- 2026年青岛市卫生健康委员会直属事业单位公开招聘卫生类岗位工作人员(383名)笔试备考题库及答案解析
- 2026年甘肃陇南西和县卢河九年制学校招聘笔试备考试题及答案解析
- 2026湖北武汉东风汽车集团跃创科技有限公司启新热系统分公司管理岗位招聘笔试备考试题及答案解析
- 2026山东滨州邹平市第二中学招聘4人笔试备考试题及答案解析
- 2026第一季度重庆市精神卫生中心考核招聘高层次和紧缺人才2人笔试备考题库及答案解析
- 2026广东广州花都区炭步供销合作社招聘合同制工作人员1人笔试备考试题及答案解析
- 2026青海海东市第三中学春季招聘教师3人笔试备考试题及答案解析
- 2026浙江省海洋与渔业执法总队招聘编外工作人员的1人笔试备考试题及答案解析
- 输电线路建设成本控制方案
- 全国畜禽养殖污染防治“十五五”规划发布
- 尾矿库隐蔽工程专项检查报告总结范文
- 多模态信息环境下虚假新闻智能检测技术研究
- 软枣猕猴桃的深度加工技术及市场应用
- 2025年天津市高考语文 文言文核心知识清单(实词+句式+虚词)
- 三大从句课件
- 福建福州市2025-2026学年物理高三第一学期期末监测试题
- 深静脉置管的并发症与护理讲课件
- 智能客户服务实务(第三版)课件全套 王鑫 项目1-8 走近智能时代客户服务-打造极致的客户体验
- 应急管理部档案馆度招考1名应届毕业生模拟预测(共1000题)笔试备考题库及答案解析
评论
0/150
提交评论