版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、uCOS-II在ARM上的移植 uCOS-II在ARM上的移植详细方法:移植工作介绍实际上uC/OS-II可以简单地看作 是一个多任务调度器,在这个任务调度器上完善地添加了与多任务操作系统相关的一些系统服务,如信号量、邮箱等。其90%的代码是用C语言写的,可以直接移 植到有C语言编译器的处理器上。移植工作主要都集中在多任务切换的实现上,因为这部分代码用来保存和恢复CPU现场(即写/读相关寄存器),不能用C语 言,只能使用汇编语言完成。uC/OS-II的全部源代码量大约是60007000行,共15个文件。将 uC/OS-II 移植到ARM处理器上,需要修改三个与ARM体系结构相关的文件,代码量大
2、约是500行。以下分别介绍这三个文件的移植工作。OS_CPU.H OS_CPU_A.ASM OS_CPU_C.COS_CPU.H 文件图1 ARM体系结构的寄存器位置·1-数据类型定义数据类型的修改与所用的编译器相关,不同的编译器使用不同的字
3、节长度表示同一数据类型,比如int,同样在x86平台上,GNU的gcc编译为4 bytes,而MS VC则编译为2 bytes。·2-堆栈单位在任务切换时,CPU现场的寄存器将保存在当前运行任务的堆栈中,所以OS_STK 数据类型应该与CPU的寄存器长度一致。typedef unsigned int os STK;typedef unsigned char BOOLEAN; /* 布尔变量
4、60; */typedef unsigned char INT8U;
5、160; /* 无符号8位整型变量 */typedef signed char INT8S;
6、160; /* 有符号8位整型变量 */typedef unsigned short INT16U;
7、0; /* 无符号16位整型变量 */typedef signed short INT16S; &
8、#160; /* 有符号16位整型变量 */typedef unsigned int INT32U; /*
9、无符号32位整型变量 */typedef signed int INT32S; /*
10、 有符号32位整型变量 */typedef float FP32;
11、60; /* 单精度浮点数(32位长度) */typedef double FP64;
12、; /* 双精度浮点数(64位长度) */typedef INT32U OS_STK;
13、; /* 堆栈是32位宽度 */#define BYTE INT8S#define UBYTE
14、160; INT8U#define WORD INT16S#define UWORD INT16U#define LONG INT32S#define ULONG
15、60; INT32U·3-堆栈增长方向void OS_TASK_SW(void; /* 任务级任务切换函数 */void OSStartHighRdy(void;
16、0; /* 运行优先级最高的任务 */void OS_ENTER_CRITICAL(void; /* 关中断 */void OS_EXIT_CRITICAL
17、(void; /* 开中断 */#define OS_STK_GROWTH 1
18、60; /* 堆栈是从上往下长的 */#define USR32Mode 0x10 /* 用户模
19、式 */#define SYS32Mode 0x1f /* 系统模式
20、160; */#define NoInt 0x80#ifndef USER_USING_MODE#define USER_USING_MODE SYS32Mode
21、60; /* 任务缺省模式 */#endif#ifndef OS_SELF_EN#define OS_SELF_EN 0
22、 /* 允许返回OS与任务分别编译、固化*/ #endifOS_CPU_A用汇编编写任务开始函数OSStartHighRdy MSR CPSR_c,#(NoInt | SYS32Mode LDR R1,=OSRunning MOV R2,#
23、1 STRB R2,R1 ;OSRunning=1 BL OSTaskSwHook ;调用OSTaskSwHook( B _OSStartHighRdy ;运行最高优先
24、级任务任务切换函数OS_TASK_SW STMFD SP!,LR ;保存当前任务的PC STMFD SP!,R0-R12,LR ;依次保存R0-R12、LR MRS R0,CPSR STMFD SP!,R0
25、0; ;保存CPSR LDR R1,=OSTCBCur LDR R1,R1 STR SP,R1 ;OSTCBCur->OSTCBStkPtr = SP(在当前任务控制块中保存当前任务的堆栈指针
26、60; BL OSTaskSwHook ;调用OSTaskSwHook( LDR R3,=OSPrioCur LDR R4,=OSPrioHighRdy
27、160; LDRB R4,R4 STRB R4,R3 ;OSPrioCur=OSPrioHighRdy中断任务切换函数OSIntCtxSw BL OSTaskSwHook ;调用钩子函数OSTaskSwH
28、ook( MSR CPSR_c, #(NoInt | IRQ32Mode LDR R0, =OSTCBHighRdy LDR R0,
29、 R0 LDR R1, =OSTCBCur STR R0, R1 ;OSTCBCur=OSTCBHighRdy
30、; LDR R0,=OSPrioCur LDR R1,=OSPrioHighRdy LDRB R1,R1 STRB R1,R0 ;OSPrioCur=OSPrioHig
31、hRdy LDR R0,=IRQStack LDR R0,R0 SUB R0,R0,#4 ; MOV SP,R0
32、0; ;IRQ模式堆栈保留一个字 MSR CPSR_c, #(NoInt | SYS32Mode ;进入系统模式 LDR R2, =OSTCBHighRdy LDR R2, R2 &
33、#160; LDR R2, R2 ;取得新任务堆栈指针OSTCBHighRdy->OSTCBStkPtr并存入R2中 LDR R1,R2 &
34、#160; ;取得新任务的CPSR存入R1中 LDR R3,R2,#15*4 ;取得新任务的PC存入R3中 STR R3,R0
35、60; ;把新任务的PC存入IRQ模式的堆栈中 MSR CPSR_c, #(NoInt | IRQ32Mode ;进入IRQ模式 MSR SPSR_cxsf,R1
36、60; ;把新任务的CPSR保存到IRQ模式的SPSR中 MSR CPSR_c, #(NoInt | SYS32Mode ;进入系统模式
37、0; ADD R2,R2,#4 ;调整新任务堆栈指针 MOV SP,R2 ;
38、0; 系统模式SP|R0 | LDMFD SP!,R0-R12,LR ;恢复新任务的R0-R12,LR, 系统模式SP|PC | ADD SP,SP,#4 ;调整系统模式堆栈指针 &
39、#160; MSR CPSR_c, #(NoInt | IRQ32Mode ;进入IRQ模式 LDMFD SP!,PC ;恢复新任务的CPSR、PC和IRQ模式SP中断禁止和允许函数OS_ENTER_CRITICAL STMFD SP!,R
40、0 MRS R0,CPSR ORR R0,R0,#NoInt MSR CPSR_cxsf,R0 LDMFD SP!,R0 MOV PC,LROS_EXIT_CRITICAL STMFD SP!,R0 MRS R0,CPSR BIC R0,R0,#NoInt
41、0; MSR CPSR_cxsf,R0 LDMFD SP!,R0 MOV PC,LR节拍中断函数OS_CPU_C.C 文件·1-任务堆栈初始化在 此讨论任务初始化时的堆栈设计,也就是在堆栈增长方向上如何定义每个需要保存的寄存器位置。在ARM体系结构下,任务堆栈空间由高至低依次将保存着pc、 lr、r12、r11、r10、. r1、r0、CPSR、SPSR,有两点需要说明:一是,当前任务堆栈初始化完成后,OSTaskStkInit 返回新的堆栈指针STK,在 OSTas
42、kCreate()执行时,将会调用 OSTaskStkInit 的初始化过程,然后通过OSTCBInit()函数调用,将返回的SP指针保存到该任务的TCB块中。二是,初始状态的堆栈是模拟了一次中断后的堆栈结 构,因为任务创建后并不是直接就获得执行,而是通过OSSched()函数进行调度分配,满足执行条件后才能获得执行。为了使这个调度简单一致,就预先将 该任务的PC指针和返回地址LR都指向函数入口,以便被调度时从堆栈中恢复刚开始运行时的CPU现场。·2-系统钩子函数(6个c函数)在该文件中需要实现几个操作系统规定的hook函数,如下:OSSTaskCreateHook( OSTaskD
43、elHook( OSTaskSwHook( OSTaskStatHook( OSTimeTickHook( 若无特殊需求,只需简单地将它们都实现为空函数即可。任务堆栈初始化 OS_STK *OSTaskStkInit (void (*task(void *pd, void *pdata, OS_STK *ptos, INT16U opt OS_STK *stk; opt = opt;
44、; /* 'opt' 没有使用。作用是避免编译器警告 */ stk = ptos;
45、; /* 获取堆栈指针 */
46、0; /* 建立任务环境,ADS1.2使用满递减堆栈 */&
47、#160; *-stk = (OS_STK task; /* pc */ *-stk = (OS_STK task; /* lr *
48、/ *-stk = 0; /* r12 */ *-stk = 0;
49、60; /* r11 */ *-stk = 0;
50、 /* r10 */ *-stk = 0; /* r9 */ *-stk = 0; &
51、#160; /* r8 */ *-stk = 0;
52、; /* r7 */ *-stk = 0; /* r6 */
53、 *-stk = 0; /* r5 */ *-stk = 0; /* r4 */ *-stk = 0;
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 文化传媒行业美工工作总结
- 婚纱店前台接待员总结
- 网络营销实训心得体会和收获
- 2024年物流配送中心智能化升级合作协议3篇
- 班级竞技活动的组织与参与计划
- 幼儿园大班数学课教案《牙签摆图形》及教学反思
- 家具行业采购供应商管理
- 描写描写方法6篇
- 教育行业员工激励策略分享
- 媒体编辑前台接待总结
- 羽毛球教学与实战智慧树知到期末考试答案章节答案2024年阜阳师范大学
- 停车场服务培训课件
- 半导体芯片知识讲座
- 河北省石家庄市2023-2024学年高一上学期期末教学质量检测生物试题(含答案解析)
- 苏教版三年级上册竖式计算练习300题及答案
- 健康体检科工作总结
- 循证护理在骨科中的护理
- 缠中说禅公式代码
- 电影八佰观后感
- 华南理工大学2022年622物理化学考研真题(含答案)
- 新生儿死亡评审
评论
0/150
提交评论