About The Site

Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Phasellus a erat. Nulla quis felis quis libero ultricies vestibulum. Etiam eros elit, porttitor vel, imperdiet venenatis, tristique vel, lacus. Nunc eros lacus, condimentum ut, suscipit id, elementum ut, eros. Sed lorem. Proin aliquet suscipit sapien. Cras sit amet nulla. Aenean vitae metus. Suspendisse elementum varius mi. Duis malesuada, turpis ut luctus faucibus, justo leo tristique.

μC/OS-II在凌阳单片机SPCE061A上的移植

摘要:以凌阳单片机为例详细介绍μC/OS-II的移植方法;重点讲解在系统移植过程中一些难以理解的概念,并首次实现了μC/OS-II在凌阳SPCE061A单片机上的移植。

关键词:μC/OS-II 凌阳单片机 嵌入式系统

引 言
  目前,实时操作系统已广泛应用于工业控制的各个领域。μC/OS-II作为一个实时内核,由于其源码公开、代码规范,广受开发人员的喜爱。SPCE061A是凌阳公司继μ’nSPTM系列产品SPCE500A等之后新推出的一款16位单片机,内部集成A/D、D/A等多种接口电路,能很方便地嵌入工业控制的各种场合。更重要的是,其内嵌2K字的SRAM和32K的Flash ROM,因此,在不需要扩展外部存储器的情况下就可以实现μC/OS-II系统的移植。

1 μC/OS-II实时操作系统介绍

  μC/OS-II是一种专门为微控制器设计的抢占式实时多任务操作系统,它以源代码的形式给出。其内核主要提供进程管理、时间管理、内存管理等服务。系统最多支持56个任务,每个任务均有一个独有的优先级。由于其内核为抢先式,所以总是处于运行态最高优先级的任务占用CPU。系统提供了丰富的API函数,实现进程之间的通信以及进程状态的转化。

2 μC/OS-II系统结构分析与移植

  μC/OS-II的软件体系结构如图1所示。从图1中可以看到,如果要使用μC/OS-II, 必须为其编写OS_CPU.H、OS_CPU_C.C、OS_CPU_A.ASM三个文件。这三个文件是与芯片的硬件特性有关的,它们主要提供任务切换与系统时钟的功能。其它文件用C写成,它们为系统提供任务管理、任务之间通信、时间管理以及内存管理等功能。
      
  众所周知,μC/OS-II是一个多任务操作系统。既然是多任务,就需要解决任务切换的问题。任务切换是在进行系统移植过程需要解决的最主要的问题。由于任务切换涉及到对芯片寄存器的操作,所以它主要用汇编语言写成,因此,对于不同的单片机,其任务切换的代码是不同的;但是只要理解其原理,就能举一反三,以不变应万变。下文将重点讲解任务切换的原理。多任务系统在运行时每个任务好像独立占用CPU一样,因此系统必须为每个任务开辟一块内存空间作为该任务的任务堆栈。该堆栈的作用是保存任务被切换前时CPU各寄存器的值以及系统堆栈的数据。根据以上讨论,可总结出在进行任务切换时需要完成的工作,主要步骤如下:

  ① 将当前任务CPU所有的寄存器压栈;
  ② 将CPU系统堆栈的数据全部拷贝到当前任务的任务堆栈中;
  ③ 得到下一个处于运行态优先级最高的任务的任务堆栈的指针;
  ④ 恢复下一个任务的CPU寄存器的值;
  ⑤ 恢复下一个任务的系统堆栈中的数据;
  ⑥ 通过中断返回指令或函数返回指令,间接修改PC寄存器的值来进行任务切换。

  在为μCOS-II编写任务切换代码时需要注意的是:μCOS-II在每次发生中断后都会产生任务调度,但在中断结束后进行的任务切换,不能调用普通任务切换函数,这是因为在中断过程中往往伴随将CPU的状态寄存器压栈操作。以凌阳单片机为例,在中断后,芯片将PC和SR寄存器的值压入堆栈,因此,在中断结束后进行的任务切换中必须对堆栈指针进行调整。

  在系统移植过程中另一个较为重要的部分是系统时钟。μCOS-II要求系统能产生10~100Hz的时钟节拍。该时钟节拍由硬件定时器产生。仍以凌阳单片机为例,可选用时基信号TMB2产生128Hz中断,作为系统时钟节拍的产生源。系统时钟中断服务子程序用汇编语言写成,由于其主要功能在用C编写的子函数中实现,因此,编写该服务子程序的难度不大。

3 μC/OS-II BSP代码的编写


  BSP(板级支持包)是介于底层硬件和操作系统之间的软件层,它对底层硬件进行封装,使得操作系统不再面对具体的硬件。我们以凌阳SPACE061A单片机为例介绍BSP代码的编写。

3.1 任务切换

  凌阳SPACE061A单片机有R1~R5 五个通用寄存器,还有1个SR(CPU状态寄存器),再加上PC,总共有7个CPU内部寄存器在任务切换时需要保存。μCOS-II系统调用OSCtxSw( )来实现任务的切换,下面给出其部分代码:
_OSCtxSw:
PUSHALL // 将所有寄存器压栈
OSIntCtxSw_in:
// 求出系统堆栈的长度 ,并将其存入R2
R1=SP
R2=OSStkStart
R1+=1
R2=R2-R1
R1=[_OSTCBCμγ]// R1≤OSTCBStkPtr, R1 为任
//务堆栈的头指针
R1=[R1] // 首先将系统堆栈长度保存在任
//务堆栈中
[R1]=R2
R3=OSStkStart // 得到堆栈的起始地址
// 保存系统堆栈到任务堆栈
save_stack:
R3-=1
R1+=1
R4=[R3]
[R1]=R4
R2-=1
JNZ save_stack
CALL _OSTaskSwHook
R1=[_OSTCBHighRdy]
[_OSTCBCur]=R1
R1=[_OSPrioHighRdy]
[_OSPrioCur]=R1
JMP OSCtxSw_in

3.2 μCOS-II系统时钟

  以凌阳SPCE061A单片机的TMB2时基信号作为系统时钟,每经历一个时钟节拍的时间将产生一次中断,在中断服务子程序中会调用OSTickISR()函数,汇编代码如下:
_OSTickISR:
PUSHALL
R1=0x0001
test R1,[P_INT_Ctrl]
JZ OUT
R1=0x0001
[P_INT_Clear]=R1
CALL _OSIntEnter
CALL _OSTimeTick
CALL _OSIntExit
OUT:
R1=0x0001
[P_INT_Clear]=R1
POPALL
RETI

结 语

  RTOS是当今嵌入式应用的热点。应用RTOS,可以提高产品的可靠性,降低研发周期。μCOS-II具有很好的实时性和很小的代码量,因此掌握μCOS-II的移植方法是相当重要的。本文移植修改的源代码请参见本刊网络补充版(http://www.dpj.com.cn)。

                    参考文献
1 (美)拉伯罗斯著. μCOS-II——源码公开的实时嵌入式操作系统.邵贝贝译. 北京:中国电力出版社, 2001
2 薛钧义,张彦斌, 等编著.凌阳十六位单片机原理及应用.北京:北京航空航天大学出版社,2003