• 嵌入式操作系统uC/OS-II在电能计量电表中的应用研究
    控制工程

    [摘要]:目前嵌入式系统正在不断地向智能化、网络化的方向发展,在实时控制系统中采用嵌入式操作系统已成为当前嵌入式应用系统中的一个发展方向。本文以开发电能计量电表中应用C/OS-II为实例,介绍了将实时嵌入式操作系统C/OS-II移植到目标系统中的方法,分析和研究了在单片机系统中使用嵌入式操作系统的有关问题。 

    [关键词]:嵌入式操作系统; mC/OS-II; 内核; 实时性; 电能计量电表 

    1 引言

           随着后PC时代和网络以及通信技术时代的到来,嵌入式操作系统在通信、电子、自动化等领域受已经到了越来越多的关注。因为一个好的嵌入式实时操作系统能够提高产品的研制效率,缩短产品的开发周期,所以许多生产厂家正在纷纷考虑采用嵌入式操作系统技术来开发自己的产品。

           实时嵌入式操作系统的种类繁多,大体可分为两种——商用型及免费型。商用型的实时操作系统功能稳定、可靠、有完善技术支持及售后服务,但其昂贵价格限制了它在为数众多的低端低成本的场合的应用。并且对这些场合来讲,一个包含网络协议核、文件管理,内存管理的操作系统实在显得过于庞大了。它们需要的仅仅是一个稳定的包含任务管理及进程调度的实时内核,对一个 8位或16位单片机的应用场合,一个代码长度不超过10KB,占用系统资源不超过10%象mC/OS-II这样的实时内核是非常适合的。

    2 mC/OS-II 系统简介

        mC/OS-II 是由Labrose先生编写的开放式内核,具有源码公开,可移植、可固化、可裁剪,稳定性及可靠性高的特点。其内核提供任务调度与管理、时间管理任务同步与通信、内存管理及中断服务等功能,支持64用户服务。90%的代码函数用标准的ANSI C语言书写,程序可读性强、移植性好。适合于小型控制系统,具有执行效率高,占用空间小,实时性能优良,可扩展性强的特点,加之它稳定、可靠,现已被广泛应用在航空、医疗器械、工业控制等领域,被证明是一个成熟稳定的实时内核。
       
    3 在AT89C51上运行mC/OS-II

        要使用mC/OS-II,首先就必须把这个内核成功地移植到使用的CPU上去。下面就给出在电能计量电表所用的AT89C51上移植mC/OS-II过程。mC/OS-II移植的软件部分要完成以下工作。

    3.1 与编译器有关的代码

        在不同的处理器中有不同的字长,所以必须定义一系列数据类型以确保移植的正确性。在C/OS-II中,不使用C的char、int和long等数据类型,这些都是和编译器相关的,在AT89C51处理器中,各种数据类型定义如下:
    typedef unsigned char BOOLEAN;
    typedef unsigned char  INT8U;
    typedef signed char INT8S;
    typedef unsigned int INT16U;
    typedf signed int INT16S;
    typedef unsigned long INT32U;
    typedef signed long INT32S;
    typedef float FP32;
    typedef double FP64;
    typedef unsigned char OS_STK;

    mC/OS-II需要先禁止中断访问代码的临界区,并且在访问完毕后重新允许中断。mC/OS-II定义了两个宏OS_ENTER_CRITICAL()和OS_EXIT_CRITICAL()来禁止和允许中断。实现方法如下:
    #define OS_ENTER_CRITICAL()  EA = 0
    #define OS_EXIT_CRITICAL()   EA = 1
    #define OS_STK_GROWTH  0
    #define OS_TASK_SWO  0SCtxSW()

    3.2  4个汇编语言函数
           这部分需要对处理器的寄存器进行操作,所以必须用汇编语言来编写。mC/OS-II的移植要求用户编写4个简单的汇编语言函数:OSStarHighRdy(),OSCtxSw(),OSIntCtxSw(),OSTickISR()。

           OSStarHighRdy()在多任务系统启动函数OSStar()中调用。主要功能是将就绪表中最高优先级任务的栈指针加载到SP中,并强制中断返回。这样就绪的最高优先级任务就如同从中断处理返回到运行态一样,使得整个系统得以运转。

           OSCtxSw()在任务级任务切换函数中调用。任务级的切换问题是通过发软中断命令或依靠处理器执行陷阱指令来完成的。由于AT89C51没有软中断命令或依靠处理器执行陷阱指令,所以用OS_TASK_SW()直接调用OSCtxSw()来完成。

           OSIntCtxSw()通过调用OSIntCtxSw()来从ISR中执行切换功能。具体完成任务是调整堆栈指针,保存当前任务的SP,载入就绪最高优先级任务的SP,恢复就绪最高优先级任务的环境变量,中断返回,从而完成中断级任务切换。

          OSTickISR()是系统时钟节拍中断服务函数。这是一个周期性中断,为内核提供时钟节拍,频率越高系统负荷越重。此外还要编写6个与操作系统有关的函数,有关这些函数具体功能更详细的阐述,请参考文献[1][2]。做完以上工作后,mC/OS-II就可以运行了。

    4 在电能计量电度表中应用mC/OS-II

    4.1 电能计量电度表的功能与任务分配

           电能计量电度表是为了方便供电局进行用量管理,同时也为了使用户合理用电而进行“尖、峰、平、谷”不同时段分别计费的智能仪器。图1是电能计量电度表结构原理图。该系统主要由两个部分构成,一是电能计量芯片AD7755,二是数据的采集、存储、显示和报警系统。

     


    图1 电能计量电度表结构原理图

           根据电能计量电度表的工作原理,结合mC/OS-II可以把电能计量仪器的软件结构划分为下述几个任务:

        (1)RS-485口命令读取。串口命令是从上位PC主机或红外线抄表仪器发送到电能计量仪器的数据读取或设置命令。这些命令必须为串口完全接收,不允许电能计量表在接收命令时发生数据丢失。实时要求很高。

        (2)1s将保存在RAM中的当前用电量存储到EEPROM。以防止单片机失电时电量计量丢失,实时要求高。

        (3)100ms完成一次时钟芯片实时钟读取,以便更新当前的年、月、日、时、分秒。每100ms进行一次,或接收上位机广播校时时钟芯片,实时要求很高。

        (4)温度芯片数值的读取和存储每300ms进行一次,实时要求较高。

        (5)RS-485或红外线抄表仪器口数据回送,电能计量电表接收到上位机命令后,完成指定操作,并将处理结果送回上位机或红外线抄表仪器,实时要求低。

        (6)液晶显示内容每3s更新一次,液晶每3s更新显示数据。实时要求很低。

        (7)如果5min内没有按键操作,则关闭液晶显示以降低功耗。实时要求很低。

          上面将实现的功能划分为7个任务,并对这些任务的实时要求作了分析。在实时设计中,任务的的实时要求越高,对应的优先级就应该越高。另外,需要增加一个最高优先级任务来提供准确的100ms事件流,上述任务划分如表1所示。


    表1 任务划分表

    4.2 基于mC/OS-II的中断处理
           在mC/OS-II中,中断处理也非常重要的,电能计量电表的中断源及各种中断用途以及优先级如表2所示。
    表2  电能计量电表的中断


           虽然mC/OS-II允许使用多个中断,并允许多层中断嵌套,但为了减少中断处理时间,提高系统响应速度,中断处理程序或发出信号灯,通知相应的任务去处理。或进行简单的数据处理,中断处理的结构非常简单,处理时间也很短,所以极少会出现多层中断嵌套的情况。

          在完成任务划分后,还需要考虑任务的通信,在初始化mC/OS-II时创建了以下信号灯和消息邮箱用于任务间通信:

        (1)串口命令信号灯SemCmd。该信号灯由串口接收缓冲区满中断处理程序发出,由任务2(RS-485或红外抄表仪器命令读取)接收。表示上位机已经有命令通过串口发送过来。

        (2)时钟芯片读取或校准消息邮箱Mbox。该消息由任务1或任务2发出,由任务3(100ms一次系统时间校正或广播校时时钟芯片)接收。

        (3)电量存储信号灯Sem1s。该信号灯由任务3发出,由任务4接收。以1s为周期存储当前电量到EEPROM。

        (4)温度数值的读取信号灯Sem300ms。该信号灯由任务3发出,由任务5接收。以300ms为周期发出,通知任务5存储温度。

        (5)显示更新信号灯Sem5s。该信号灯由任务3发出,由任务7(3s一次液晶显示内容更新)接收,以3s为周期发出,通知任务7刷新液晶显示。

        (6)液晶自动关闭信号灯Sem5min。该信号灯由任务3发出,由任务8(5min液晶自动关闭)接收,以5min为周期发出,通知任务8。如果过去5min内没有按键,则关闭液晶显示。

        (7)串口命令缓冲区满信号灯SemCmdProc。该信号灯由任务2(RS-485口命令读取)发出,由任务6(RS-485或红外抄表仪器口数据回送)接收。用于向上位机发送数据。

        每个任务都没有被删除,其软件流程如图2所示:            
        初始化消息邮箱, 信号灯     

              
       
    5 结 语

           目前我们开发的这个基于mC/OS-II内核的电能计量电表应用系统在系统的实时响应速度、软件设计的模块化问题、系统的抗干扰能力等方面都解决得比较好。已经在实际中投入运行,获得了比较好的效果。




     
     
    网站首页  |  关于我们  |  联系我们  |  广告服务  |  版权隐私  |  友情链接  |  站点导航