标题:
LPC2292的μC/OS-II硬件抽象层构建(2)
[打印本页]
作者:
yuyang911220
时间:
2016-11-21 10:46
标题:
LPC2292的μC/OS-II硬件抽象层构建(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 中断结构和中断处理程序的设计
中断结构和中断处理程序的设计是嵌入式操作系统HAL中最重要的组成部分。中断机制是操作系统内核实现与外部设备通信、任务系统调用、进行出错处理,以及实现对任务的实时调度的重要手段。因此,硬件抽象层中断系统的管理部分是整个硬件抽象层中的关键。
μC/OS-II采用了二次跳转的办法。首先在ARM处理器定义的中断向量处安放跳转指令,跳转到指定位置后,再进行位置的第二次映射。其中位置的映射是通过一个汇编定义的宏来实现的。将μC/OS-II移植到LPC2292中,其宏汇编的定义如下:
MACRO
$IRQ_Label HANDLER $IRQ_Exception_Function
EXPORT$IRQ_Label; 输出的标号
IMPORT$IRQ_Exception_Function; 引用的外部标号
$IRQ_Label
SUBLR, LR, #4; 计算返回地址
STMFDSP!, {R0R3, R12, LR}; 保存任务环境
MRSR3, SPSR; 保存状态
STMFDSP, {R3, SP, LR}^; 保存用户状态的R3、SP、LR,注意不能回写
BL$IRQ_Exception_Function; 调用C语言的中断处理程序
;/************************************************
;比较当前任务控制块和最高优先级任务控制块是否一致,如果一致则直接恢复任务环境;否则,在中断退出时需要进行任务切换,CPU将运行优先级最高的任务,而不是中断前运行的任务
;***********************************************
LDRR0, =OSTCBHighRdy
LDRR0, [R0]
LDRR1, =OSTCBCur
LDRR1, [R1]
CMPR0, R1
ADDSP, SP, #4*3
MSRSPSR_cxsf, R3
LDMEQFDSP!, {R0R3, R12, PC}^; 恢复环境
LDRPC, =OS_TASK_SW; 调用进行任务切换
MEND
为了使用ISR的汇编宏,每个受μC/OS-II管理的ISR都必须按宏汇编要求的格式,在文件IRQ.S中定义:
XXXX_HANDLERHANDLERXXXX_Exception
其中:
XXXX_HANDLER是ISR的起始地址,即汇编宏的起始地址,在初始化向量中断控制器时作为中断向量的地址使用。用户按中断源来命名,即把其中的XXXX换为具体的中断源名称。
XXXX_Exception是用户用C语言实现编写的功能函数名。该函数供汇编宏调用,用户可以按实际的中断源来命名,即把XXXX换为具体的中断源名称。
3.6 定时管理
μC/OS-II需要一个周期性的中断源来产生系统时钟节拍。μC/OS-II利用了LPC2292的Timer0作为定时器产生时钟节拍。其实现步骤为:
添加中断句柄Timer0_HandlerHANDLER Timer0_Exception配置中断源定时器T0IR = 0xffffffff;T0TC = 0;T0TCR = 0x01;T0MCR = 0x03;T0MR0 = (Fpclk / OS_TICKS_PER_SEC);配置向量中断控制器extern void Timer0_Handler(void);VICVectAddr0 = (uint32)Timer0_Handler;VICVectCntl0 = (0x20 | 0x04);使能中断VICIntEnable = 1<<4;
4 总结
硬件抽象层的出现,使得嵌入式操作系统的设计者不需要考虑嵌入式系统硬件环境差异较大的问题,可以专心设计通用的操作系统,而将与硬件的接口部分留给硬件抽象层来实现,这样大大提高了嵌入式操作系统在不同硬件平台之间的移植能力。本文基于LPC2292硬件平台,详细介绍了μC/OS-II的硬件抽象层的构建方法,对其向其他平台的移植提供了参考。
欢迎光临 电子技术论坛_中国专业的电子工程师学习交流社区-中电网技术论坛 (http://bbs.eccn.com/)
Powered by Discuz! 7.0.0