《电子技术应用》
您所在的位置:首页 > 可编程逻辑 > 业界动态 > μC/OS-II内核在FPGA上的硬件化设计与实现

μC/OS-II内核在FPGA上的硬件化设计与实现

2009-06-19
作者:张 涛1,廖力清1,王 颂2

  摘 要: 针对操作系统内核占用系统资源的问题,提出了一种新的实时操作系统设计与实现方法。在仔细研究了μC/OS-II后,改进了原μC/OS-II的TCB模块,配合多任务调度状态机构成的硬件调度系统替代了软调度系统,提高了多任务调度性能并将改进的系统内核在FPGA上硬件化。通过修改51内核,设计了多任务映射的堆栈区,解决了51系列微控制器堆栈过小无法运行多任务的问题。
  关键词: μC/OS-II;实时操作系统;FPGA

 

  随着现代信息技术突飞猛进的发展,软件模块化技术也有了广泛提高。为了更好地发挥微控制器的性能以及满足更多的功能,使软硬件能够更好地结合和展示,在微控制器中移植嵌入式操作系统已经成为一种趋势。目前,嵌入式系统的应用范围非常广泛,不同领域有不同要求。通常有非实时系统和实时系统,而实时系统中又分硬实时和软实时系统。在要求苛刻的系统中,一般需要硬实时操作系统。本文涉及飞行器刹车控制系统,必须使用硬实时操作系统。
1 项目产生背景
  某军用机型的航空刹车控制系统原使用微控制器80C31,外扩ROM、RAM及其他外设。软件为前后台系统,图1为原系统连接示意图。

 


  当新机型的刹车系统控制要求升级后,系统控制对象增多,控制算法复杂度增大,原有系统已完全不能胜任现在的要求。因此,需要寻求新解决方案来满足新系统要求。
  为了保证能够向下兼容原系统,在原有系统基础上能够最大限度升级改进,仍选用51内核的微控制器。经过论证,决定选用FPGA构造新系统,在FPGA系统中内嵌8051 IP核。这是在Oregano Systems公司提供的免费8051 IP核的基础上根据系统的需要而定制的。仅保留51的内核部分,并对内核进行一定的改造以适应需要的操作系统的移植。通过Verilog语言编写多个可编程外设数字模块挂接在系统总线上,功能远远超越一般的51方案。将各种数字器件通过编程和IP核的方式集成在FPGA中,这极大地提高了单芯片功能,减少了元器件数量,从而简化了整个系统设计,降低了系统故障率,缩短了循环开发周期,大幅度减少了电路板面积和系统总成本。
  新系统中的软件部分舍弃了前后台系统,使用实时操作系统。这样,软件系统可以很方便地分成多个在开发和运行上独立而又具有一定联系的小任务,便于多人员参与开发。系统中的各种硬件被看成独立的资源,由各任务来调用。设计者希望创新性地将实时操作系统的内核部分的功能硬件化至FPGA中,从而进一步加强系统的硬实时特性。因为操作系统产生的负载都将由硬件来承担。而此时操作系统对于软件编程员来说几乎是透明的,如同使用一块操作系统芯片,只要将编写的任务编译好直接载入Flash,系统启动后程序初始化操作系统的各控制寄存器填入各任务入口地址即可开始运行。系统采用免费公开源代码的μC/OS-II实时操作系统,并在其基础上根据新系统的硬件条件进行修改,量身定做一个合适的硬件实时操作系统。
  改进后的新系统示意框图如图2所示。


2 改进的任务调度机制的设计
  作为实时系统最为关键的组成部分——实时操作系统内核,其主要功能有:事件管理、时间管理、中断服务、实时调度等[1],如图3所示。现阶段主要针对内核的调度机和事件管理功能进行硬件化改进,并对51 IP内核结构进行相应改进。


2.1 任务控制块(TCB)的改进
  基于μC/OS-II的思想,每个任务在建立后都有一个TCB来管理该任务。TCB是一个数据结构,当任务的CPU使用权被剥夺时,μC/OS-II用它来保存该任务的状态。新系统中,TCB修改后其数据结构占用13 B,其中参数如下所示:

typedef struct os_tcb
{
   INT8U  OSTCBStkPtr;
  OS_EVENT *OSTCBEVENTPtr;
    void   *OSTCBMsg;
  void   *OSTCBTaskPtr;
  INT8U  OSTCBId;
  INT8U  OSTCBPrio;
  INT8U  OSTCBCntInitVlu;
  INT8U  OSTCBCnt
  INT16U  OSTCBDly;
  INT8U  OSTCBStat;
  BOOLEAN OSTCBDelReq;
};
  该数据结构删减了原有TCB的部分参数,保留原有TCB部分参数意义不变,具体请见参考文献[2]。被修改的TCB参数意义表述如下:
  OSTCBStkPtr为任务堆栈指针,占1 B,其保存的是51堆栈指针SP的值;
    *OSTCBTaskPtr为任务函数入口地址指针,其保存的是该任务的入口地址;
  OSTCBId为任务ID号,参数取值为0~63,任意任务的ID值不允许相同,其为每个任务唯一识别码;
  OSTCBPrio为任务优先级,参数取值为0~63,0为最高优先级,63为最低优先级,各个任务的优先级允许相同;
  OSTCBCntInitVlu为任务剩余时间片初始化值,取值从255~0;
  OSTCBCnt为任务剩余时间片,取值从255~0;
  OSTCBStat为任务当前状态及控制寄存器。读寄存器,则会返回当前任务的状态,例如运行或者就绪态;写寄存器,则控制当前任务自动进入某状态,例如写入挂起信号,则调度系统状态机自动将当前任务挂起。
  这些参数中,最重要的改动是OSTCBPrio和OSTCBCnt,由此系统改进成支持时间片轮番调度的可剥夺型内核。创建任务时,任务的OSTCBId被赋唯一初值,OSTCBPrio被赋予合适的优先级,其允许和其他任务同等优先级,OSTCBCnt被赋予合适的任务执行时间。任务执行过程中,OSTCBId和OSTCBPrio不允许改变,而在一个系统节拍过后,当前任务的OSTCBCnt将减1,在任务执行过程中OSTCBCnt将随系统节拍不断减小,直至为0。当就绪态中同种优先级的所有任务的OSTCBCnt全部减为0时,重新将各个任务的OSTCBCntInitVlu的值载入至OSTCBCnt。
  任务的调度规则是:
  (1)OSTCBPrio越小,则越优先执行;
  (2)OSTCBPrio相等,则OSTCBCnt越大的越优先执行;
  (3)OSTCBPrio和OSTCBCnt都相等,则OSTCBId越小越优先执行。
  任务调度执行示意图如图4所示。


  在原μC/OS-II系统中,内核通过一个“就绪表”完成对系统的就绪态最高优先级任务的调度。系统内核基本工作是任务调度,系统运行中,将会有一定的资源消耗在调度上,大约占用CPU资源的2%~5%。这对于51内核来说,可能占用的CPU资源更多。
  本系统改进的目的,是要尽量用硬件完成系统的调度,释放调度占用的CPU资源。因此改进后的系统去掉了“就绪表”,而使用一个有限状态机完成对系统的调度。
  在一个系统节拍中,状态机将遍历所有任务的OSTCBId、OSTCBPrio、OSTCBCnt和OSTCBStat参数,找到STCBStat处于就绪态的任务,且按照上文中所述的调度规则进行搜寻。找到最合适规则的任务ID号即OSTCBId值,首先将其写到任务调度缓冲区TaskIdBuf,之后等待,准备在恰当的时机写入调度寄存器TaskId,进行任务切换。
2.2 任务堆栈区(STK)的改进
  51系列单片机的内部直接寻址范围00H~7FH,CPU复位后,堆栈指针SP复位为07H,堆栈向上增长,显然堆栈最大深度为120 B,而且00H~1FH段为4组通用寄存器区,20H~2FH为位寻址区,如果需要使用这些区域,堆栈的深度则缩减为80 B,这对于多任务处理显然是极其有限的。
  μC/OS-II移植最关键的是堆栈设计,这里有两个最重要的问题:模拟多任务堆栈结构和51系列单片机堆栈较小缺陷的解决。
  解决问题的方法是修改8051的IP核源代码,将51核内部直接寻址区修改成如图5所示的寻址区。


  通过内部地址映射管理器的映射,将FPGA的RAM中的80 B映射到直接寻址区的30H~7FH的任务堆栈区中,这80 B的数据都作为同一个任务的堆栈,这对于一般能在51系统上运行的任务已足够,能够解决堆栈空间较小的问题。本系统最多支持64个任务,因此,在RAM中有连续64个80 B的STK区块可以映射到直接寻址区的STK区块上,同时,映射管理器将RAM中连续的64个13 B的TCB区块映射到FPGA控制寄存器区的TCB寄存器区块上。如此,当任务调度寄存器TaskId中填入的任务ID号改变时,直接寻址区的STK的数据和FPGA控制寄存器区TCB的数据将随之而改变,映射所指向的区块由调度寄存器TaskId来决定。当调度系统决定要开始一次新的任务调度时,由如下步骤来完成:
  (1)给51内核1个INT0外部0号中断信号,通知需要进入系统调度状态;
  (2)中断服务程序将当前任务使用寄存器入栈;
  (3)中断服务程序将当前任务SP的内容保存到当前任务TCB的OSTCBStkPtr;
  (4)中断服务程序发信号至FPGA的调度系统状态机,状态机自动将任务调度缓冲区TaskIdBuf的数据写入调度寄存器TaskId,切换STK和TCB;
  (5)中断服务程序将切换后的任务TCB的OSTCBStkPtr写入51内核的SP;
  (6)中断服务程序将切换后的任务使用寄存器出栈;
  (7)退出中断,切换后的任务开始继续运行。
  如此修改后,任务切换中软件需要完成的工作就极其简单了,这极大降低了软件系统对任务切换进行控制所消耗的成本,这些工作由硬件系统在任务运行的同时并行完成。这样,即使将系统时钟节拍频率设定得比较高,系统的额外负载也不会过重。系统硬件对STK和TCB的物理映射,也同时保证了一个任务对其他任务的STK和TCB的不可见性,保护了其他任务的STK和TCB数据不受该任务的影响,从而一定程度上保证了任务运行的安全。
  本文提出一个新的思想和尝试方法进行操作系统的设计。其创新点主要体现在:
  (1)将操作系统硬件化。以往的操作系统属于在应用系统上运行的软件的一部分,需要占用应用系统中CPU的部分资源。而操作系统硬件化后,在任务运行的同时,硬件操作系统并行地完成了任务调度的准备工作,只需要运行中的任务完成保存现场数据至堆栈的工作,操作系统将立即切换任务。任务切换所需要的时间远远小于传统软件操作系统。
  (2)各任务在RAM区的STK映射到51内核的直接寻址区的STK中,解决了51系列微控制器堆栈区过小的问题,并使得各个任务的堆栈区都是独立的。而编写任务程序时,则是相对于同一个空间地址进行操作,且任务堆栈切换无需软件控制,避免了程序上出错造成的影响。同样使用映射技术的还有TCB区和ECB区,此处不再赘述。
  该改进方案已基本在FPGA系统上实现,目前仍处于性能测试阶段,不足之处有待改进。


 

参考文献
[1] 徐惠民.基于VxWorks的嵌入式系统及实验[M].北京:北京邮电大学出版社,2006.
[2] LABROSSE J J.The real-time kernel second edition[M].北京:北京航空航天大学出版社,2003.
[3] 张培仁.基于C语言编程MCS-51单片机原理与应用[M].北京:清华大学出版社,2003.
[4] 朱明程,熊元姣.ACTEL数字系统现场集成技术[M].北京:清华大学出版社,2004.
[5] 田志鑫,张雷.在51单片机上移植μC/OS-II关键问题的解决[A].微计算机信息,2007,23(12):56-58.
[6] 孙旭祥.浅析实时操作系统的任务调度[A].通信对抗,2005(12):47-50.
[7] 温圣军,王简瑜.80C51原始IP核内部RAM的扩展方案[A].单片机与嵌入式应用,2008(2):64-66.

本站内容除特别声明的原创文章之外,转载内容只为传递更多信息,并不代表本网站赞同其观点。转载的所有的文章、图片、音/视频文件等资料的版权归版权所有权人所有。本站采用的非本站原创文章及图片等内容无法一一联系确认版权者。如涉及作品内容、版权和其它问题,请及时通过电子邮件或电话通知我们,以便迅速采取适当措施,避免给双方造成不必要的经济损失。联系电话:010-82306118;邮箱:aet@chinaaet.com。