资源描述
μC/OS-Ⅱ操作系统在各种处理器上的移植
长江大学 杨青胜 徐爱钧
摘要 介绍μC/OS-II操作系统的应用和移植条件;阐述μC/OS-Ⅱ操作系统在普通的51单片机,NXP公司的LPC2210,ALTERA公司的Nios II 三种处理器上的移植。
关键字 μC/OS-II 移植 51单片机 LPC2210 Nios II
PortingμC/ OS - Ⅱto Various processor
Yangtze University Yang Qingsheng Xu Aijun
Abstract : Introduced the μC/OS-II operating system application and transplant conditions;Explained the μC/OS-II operating system on 51 common microprocessor ,NXP's LPC2210, ALTERA's Nios II three processors transplant.
Key Words: μC/OS-II port 51 microprocessor LPC2210 Nios II
μC/OS-II操作系统是一种抢占式多任务、单内存空间、微小内核的嵌入式操作系统,具有高效、紧凑的特点。它具有执行效率高、占用空间小、可移植性强、实时性能良好和可扩展性强 等特点。采用μc/os-ii实时操作系统可以有效地对任务进行调度;对各任务赋予不同的优先级可以保证任务及时响应,而且采用实时操作系统,降低了程序的复杂度,方便程序的开发和维护。非常适合应用在一些小型的嵌入式产品应用场合,在家用电器,机器人,工业控制,航空航天,军事科技等领域有着广泛的应用。
单片机ARM, FPGA与μC/OS-II操作系统的结合,实现一些具体功能是目前嵌入式应用中比较常见。在这些应用中基础性的工作就是操作系统的移植,故而本文选取使用较多的51单片机,LPC2210, NiosII三种处理器做介绍必定有一定的意义。
1 μC/OS-II操作系统移植条件
μC/OS-II操作系统的大部分源代码都是用C语言书写的,但仍需使用C语言和汇编语言来完成一些和处理器相关的操作,例如读写处理器,寄存器时只能使用汇编语言来实现。因此,μC/OS-II操作系统的移植在目标处理器上,需要从硬件和软件两方面来考虑。
硬件方面,目标处理器需满足以下条件:
Ⅰ 处理器的 C编译器能产生可重入代码 ;
Ⅱ 用 C 语言可以开,关中断 ;
Ⅲ 处理器支持中断 ,并且能够产生定时中断( 通常在l0~1000 Hz之间) ;
Ⅳ 处理器能够支持容纳一定量数据的硬件堆栈 ;
Ⅴ 处理器有将堆栈指针和其它寄存器读出和存储到堆栈或内存中的指令 。
软件方面,主要关注的是一些与处理器相关的代码移植,其分布在 OS-CPU. H,OS-CPU-C. C和OS-CPU-A. ASM 这3个不同的文件中。
2 目标处理器硬件支持
51单片机,LPC2210, NiosII三种处理器在硬件方面上均能满足μC/OS-II操作系统的移植要求。
51单片机:选择 Keil 公司的集成开发环境作为开发工具 ,因为该集成开发环境的 C51 编译器能产生可重入型代码 ,且用 C语言就可以开/关中断。同时具有一定数量的堆栈和操作相关要求的寄存器的指令。
LPC2210:采用ARM7微控制器可以满足上述Ⅱ,Ⅳ,Ⅴ,而ADS1.2的C编译器可以满足Ⅰ,Ⅲ的要求。
NiosII处理器: Nios 处理器可以配置成最 多支持 6 4个中断 ,包括外部硬件中断 、内部中断以及 T R AP ( 调试中断) 。Nios II处理器可以配置使用32位内部定时器,通过用软件控制写入几个控制寄存器的内容来获得定时工作,与一般的定时器工作原理相同,可以产生定时中断 。Nios处理器可以外接存储器,以使用的DE2开发板为例,外接512S R AM资源,可以提供足够的数据硬件堆栈。NiosII 8.0 IDE采用GNU编译器,支持C/C ++的编译、连接产生重入代码 ,允许在 C语言中嵌入汇编语言。
3 软件移植过程
3.1 OS-CPU. H的实现
OS_CPU.H文件包括了用#define语言定义的与处理器相关的常数、宏以及数据类型。
①数据类型,在上述三种处理器采用的不同编译器中的定义是相同的,在此不做具体介绍。
②在OS_CPU.H中定义与处理器相关的宏,主要是进入临界区的
OS_ENTER_CRITICAL( )和退出临界区的OS_EXIT_CRITICAL( )。
在Keil编译器中:EA是总中断
#define OS_ENTER_CRITICAL( ) EA=0; //关中断
#define OS_EXIT_CRITICAL( ) EA=1; //开中断
在ADS编译器中:定义为软件中断函数,并编写软件中断处理代码实现开关中断
_swi(0x00)viod OS_TASK_SW(viod);//任务级任务切换函数
_swi(0x00)viod OS_ENTER_CRITICAL(viod ) //关中断
_swi(0x00)viod OS_EXIT_CRITICAL( viod) //开中断
在 NiosII 8.0 IDE编译器中:
#define OS_ENTER_CRITICAL( ) asm(“PFX 8\n WRCTL%g0;”)
//关中断
# define OS_EXIT _CRITICAL( ) asm( “PFX 9\n WRC T L%g 0 ;”)
//开中断
③定义堆栈的增长方向
堆栈的增长方向通过设置OS_STK_GROWTH为0或者1来确定
51单片机中只能设置为0,表示堆栈是从下往上增长的。
LPC2210中则可以设置成0或者1,都可以。
Nios II 中则只能设置成1,表示堆栈是从上往下增长的。
3.2 OS-CPU-C. C的实现
OS_CPU_C.C中主要应改写堆栈初始化函数OSTaskStkIint(),必须根据移植时统一定义的任务堆栈结构进行初始化,其他9个钩子函数只需说明即可,也可根据移植时用户自己的需要编写相应的操作代码。
以LPC2210为例,堆栈空间从高到低依次存放着 PC, LR, R12, R11, ……R1, R0, CPSR, OsEnterSum (如下图)。每个任务都有独立的 Os-EnterSum, 在任务切换时保存和恢复各自的 OsEnter-Sum值。各个任务开关中断的状态可以不同,这样实现了开关中断的嵌套。
PC
LC
R12
R11
…
R1
R0
CPSR
Os-EnterSum
OS_STK*OSTaskStkInit(void(*task)(void*pd),void*pdata,OS_STK*ptos,
INT16U opt)
{
OS_STK*stk;
opt=opt;
stk=stk;
*stk=(OS_STK)task;
*--stk=(OS_STK)task;
*--stk=0;
*--stk=0;
*--stk=0;
*--stk=0;
*--stk=0;
*--stk=0;
*--stk=0;*--stk=0;
*--stk=0;
*--stk=0;
*--stk=0;
*--stk=0;
*--stk=(unsigned int)pdata;
*--stk=(USER_USING_MODE|0x00);
*--stk=0;
return(stk);
}
关于51单片机和Nios II处理器的这部分移植,限于篇幅,请参看文后参考文献。
3.3 OS-CPU-A. S的实现
这部分需要对处理器的寄存器进行操作,所以必须用汇编语言来编写 。μC/OS-II移植要求用户编写 4个简单的汇编语言函数 : OSStartHighRdy( ) ,OSCtxSw( ),OSIntCtxSw( ) ,OSTickISR( )。
OSStartHighRdy()的任务是进行任务调度和切换;
OSCtxSw()的任务是强制CPU进行寄存器和程序计数器的切换;
OSIntCtxSw()的任务是在中断返回时进行任务切换;
OSTickISR()是时钟节拍中断服务程序,用来实现时间的延迟和超时功能。
以OSStartHighRdy()任务调度和切换函数为例介绍三种处理器移植代码
① 51单片机:
OSStartHighRdy:
;-----------------
; OSRunning = TURE
;-----------------
;because EA is not enabled. where in OSStartHighRdy set OSRunning to true is not important
MOV DPH,#HIGH (OSRunning)
MOV DPL,#LOW (OSRunning)
MOV A,#1
MOVX @DPTR,A
;-----------------
; TR0 = 1
;-----------------
SETB TR0
② LPC2210:
__OSStartHighRdy
MSR CPSR_c, #(NoInt | SYS32Mode)
;告诉uC/OS-II自身已经运行
LDR R4, =OSRunning
MOV R5, #1
STRB R5, [R4]
BL OSTaskSwHook ;调用钩子函数
LDR R6, =OSTCBHighRdy
LDR R6, [R6]
B OSIntCtxSw_1
END
③ Nios II处理器:
OSStartHighRdy:
; C function starts with "save %sp,xx"
; Call OSTaskSwHook()
.if (OS_CPU_HOOKS_EN == 1)
MOVI32 %g0, OSTaskSwHook@h
CALL %g0
NOP
.endif
; OSRunning = TRUE;
inc8 OSRunning
; Switch to the highest priority task.
; %sp = OSTCBHighRdy->OSTCBStkPtr
MOVI32 %g0, OSTCBHighRdy ; %g0 = &OSTCBHighRdy
LD %g1, [%g0] ; %g1 = &OS_TCB
LD %sp, [%g1] ; stack is the first element
LOAD_CONTEXT
TRET %o7 ; ISTATUS -> STATUS (no change in fact)
NOP
4 结语
51单片机,LPC2210, NiosII三种处理器在我们的目前的嵌入式应用方面有着广泛的市场前景。将μC/OS-II操作系统移植到其处理器上,能够更好地保证系统运行的稳定性和实时性,而且该操作系统代码少,易于掌握和移植。
本文所介绍的μC/OS-II操作系统在三种处理器上的移植是在本人在实际学习过程中,进行的一些梳理和小结,相信能给初学者一定的参考价值。
参考文献
1 Jean J. Labrosse. 嵌入式实时操作系统μ C/OS-II. 第2版[M]. 邵贝贝译. 北京:北京航空航天大学出版社,2003
2 周立功 等.ARM嵌入式系统基础教程. 北京:北京航空航天大学出版社,2005
3 胡大可 ,李培弘 ,方路平.基于单片机8051的嵌入式开发指南[M] . 北京:电子工业出版社,2003.
4 张志刚. FPGA与SOPC设计教程:DE2实践[M]. 西安:西安电子科技大学出版社,2007
5 徐爱钧 彭秀华. Keil Cx51 V7.0 单片机高级语言编程与uVision2应用实践. 北京:电子工业出版社,2004
杨青胜(硕士),主要研究方向:自动检测与控制,嵌入式系统等
徐爱钧(教授),主要研究方向:嵌入式系统,单片机智能化仪器仪表等。
联系地址:湖北荆州 长江大学 主教
邮编:434023
Emall:yangqish@
展开阅读全文