LPC2292的μC/OS-II硬件抽象层构建 04
![Rank: 8](images/default/star_level3.gif) ![Rank: 8](images/default/star_level3.gif)
- UID
- 872238
|
![](http://images.eccn.com/silabs/silicon_chip_980x60_202203.jpg)
LPC2292的μC/OS-II硬件抽象层构建 04
任务堆栈空间由高到低依次为PC ,LR,R12 ,R11,…,R1,R0,CPSR,SPSR。 在进行堆栈初始化以后,OSTaskStkInit ( ) 返回新的堆栈栈顶指针。图2为任务堆栈增长的方向。其初始化过程如下:
*stk = (OS_STK) task;/*PC*/
*--stk = (OS_STK) task;/*LR*/ //寄存器初始化R12到R1
*--stk = 0;/*R12*/
*--stk = 0;/*R1*/
*--stk = (OS_STK)pdata;/* R0,参数*/
*--stk = (USER_USING_MODE|0x00);/*SPSR,允许IRQ、FIQ中断*/
![](http://embed.chinaitlab.com/UploadFiles_4615/200811/20081122111853141.gif)
图2 堆栈增长的方向 3.4 任务上下文切换
任务上下文管理负责嵌入式操作系统内核中任务管理部分对任务寄存器上下文的创建、删除以及切换等操作。任务的寄存器上下文是操作系统内核所管理的任务的重要组成部分,是CPU内核的寄存器中内容的映像,因此上下文管理的实现依赖于CPU 内核中寄存器的组织,是与体系结构密切相关的。通用硬件抽象层的任务上下文管理统一定义体系结构中的寄存器上下文的保护格式,提供了任务管理对任务上下文的基本操作的API接口。
μC/OS-II的任务切换其实就是通过改变PC中的内容来实现的。将PC指向新任务开始运行的地方,同时将当前任务(被抢占任务)环境保存到相应的任务堆栈中,将新任务环境从任务堆栈中恢复到相应的寄存器中。
μC/OS-II用OS_TASK_SW()完成任务级切换。将μC/OS-II移植到LPC2292上,其任务切换代码如下:
;OS_TASK_SW
;/************************************************
;① 在当前任务(被抢占任务)的堆栈保存当前任务环境
;/************************************************
STMFDSP!, {LR};LR中其实是任务切换时对应的PC值
STMFDSP!, {LR}
STMFDSP!, {R0R12}
MRSR0,CPSR
STMFDSP!,{R0}
;/************************************************
;② 获取当前任务(被抢占任务)控制块地址,地址在R0;获取当
;前任务(被抢占任务)SP地址,在R1;保存新SP到当前任务(被
;抢占任务)的TCB
;/************************************************
LDRR0,=OSTCBCur
LDRR1,[R0]
STRSP,[R1]
;/**********************************************
;③ 获取新最高优先级任务控制块地址,保存最高优先级任务
;地址到当前任务地址
;/************************************************
LDRR2,=OSTCBHighRdy
LDRR1,[R2]
STRR1,[R0]
;/************************************************
;④ 获取当前新任务SP
;/************************************************
LDRSP,[R1]
;/************************************************
;⑤ 恢复任务环境
;/************************************************
LDMFDSP!,{R0}
MSRSPSR_csxf,R0
LDMFDSP!,{R0R12,PC}^
3.5 中断结构和中断处理程序的设计 |
|
|
|
|
|