《电子技术应用》
您所在的位置:首页 > 其他 > 业界动态 > 基于嵌入式操作系统μc/os-II实现焊缝轨迹智能跟踪系统

基于嵌入式操作系统μc/os-II实现焊缝轨迹智能跟踪系统

2009-02-10
作者:王 悦1 徐 颖2

    摘  要: 传统嵌入式系统软件设计中广泛采用单任务顺序机制,它常带来的重要问题是系统安全性差,这将导致系统频繁复位以致无法达到设计目标。为此本系统在软件设计中引入嵌入式操作系统μc/os-II并设计监视任务实时监视系统运行,使该问题得到了较好的解决。 

    关键词: 嵌入式操作系统  监视任务  消息队列  安全性能

 

    在传统的嵌入式系统软件设计中,多采用单任务顺序机制。此机制的优势在于流程直观,但它常带来一个重要的问题——系统安全性差,即程序运行中任一环节出错都会导致系统混乱,只能依靠看门狗复位重新运行。在焊缝跟踪系统中,弧光干扰严重,若存在单任务顺序机制,虽存在多种软硬件抗干扰措施,系统有时仍需频繁复位以致无法达到系统设计目标。为此在焊缝轨迹智能跟踪系统中,作者将实时嵌入式操作系统μc/os-II用于单片机80c196的软件设计中,并设计监视任务,较好地解决了该问题。μc/os-II是一种免费的操作系统且源代码公开,其可靠性已在许多应用中得到了证明。 

1 系统概述 

    系统设计目标为:在TIG焊条件下,焊接速度为24cm/min时,焊头与焊缝偏差小于1mm。 

    系统的设计思路为:采用电弧传感器采集焊头相对焊缝不同位置时的焊接电流信号,将此信号经信号处理得焊头相对于焊缝的偏差量,此偏差量经控制运算后得相应的控制信号。将此控制信号输出到电机,从而改变焊头与焊缝的偏差。 

    系统的功能块有信号采集、信号处理、控制运算、输出等。另外由于本系统的弧光干扰严重,为防止程序运行中因一个环节出错而导致系统混乱以致无法控制焊头与焊缝的偏差,本系统设计了监视模块用来及时纠错。 

    系统结构图如图1所示,由外而内可分三层,分别为硬件电路层、任务层及操作系统层。 

 

 

2 硬件电路层设计 

    本系统的硬件电路层包括一块信号采集板和一块驱动板。前者的用途在于从电弧传感器获取电流信号并将其转换成电压信号。此电流信号能有效表征焊头与焊缝的位置关系,此电压信号将被任务层的信号采集任务获取。后者的用途在于将任务层中输出任务产生的命令(此命令作用于单片机输出口)传输到电机,从而改变焊头和焊缝的偏差。 

3 任务层设计 

3.1 系统任务层组成及其优先权设置 

    系统任务层并行存在的几个任务依其优先权从高到低依次为:监视任务、输出任务、控制运算任务、信号处理任务、信号采集任务。优先权的设置由各任务的执行顺序以及对系统安全性影响的大小决定。本系统采用静态优先权,即运行过程中任务优先权不变。 

3.2 任务的状态 

    本系统中各任务的状态有4种:等待态、就绪态、运行态以及中断态。状态的转换关系如图2所示。 

    当一个任务占用CPU时该任务处于运行态,其优先权必较所有就绪态任务优先权高。若系统运行导致就绪态某一任务的优先权高于运行态任务优先权,则调用调度函数,运行态任务将丧失对CPU的占用权而转为就绪态,优先权最高的就绪态任务转为运行态。某一时刻只能有一个任务处于运行态。任务在就绪态和运行态间的转化被称为任务切换。 

    当运行态的任务期待某一消息时(即别的任务和该任务的数据传递,本设计中任务间的数据传递被称为消息),该任务将丧失对CPU的占用权而转为等待态,等待时间可由系统设定。若等待时间内该任务收到消息,任务将转为就绪态,否则将被时间管理函数强行转为就绪态。 

    中断发生时运行态的任务将转入中断态,丧失对CPU的占用权。因中断中可能有消息发送使等待态的任务转入就绪态,故中断返回后将首先运行调度函数,决定任务状态。 

3.3 任务的构成 

    系统中每个任务均有以下三部分组成:应用程序、任务堆栈以及任务控制块。其中只有应用程序被烧入ROM,而任务本身则被置于RAM,待系统运行时再予建立。 

    任务堆栈用以存储CPU寄存器内容。当某任务由运行态变为其它状态时,CPU寄存器内容压入相应任务堆栈,反之则将相应任务堆栈内容置入CPU寄存器。 

    作为系统中定义的一个数据结构,任务控制块的内容包括任务堆栈的地址、任务当前状态、任务优先权等。操作系统通过查询任务控制块内容实现对任务的管理。 

3.4 监视任务的设计 

    因系统工作环境干扰强烈,虽已采取多种软硬件抗干扰措施如光电隔离、软件陷阱等,仍有可能因瞬间扰动使系统陷入混乱,导致系统只能依靠看门狗复位重新运行,以致无法实现设计目标。为此本系统采用监视任务监督其它任务是否正常运行,若未能正常运行则采取相应措施以尽量减少看门狗复位次数。 

    监视任务设计思路为:被监视任务正常运行时其执行时间是可预估的,被监视任务在其即将运行完毕时向监视任务发送消息说明自身运行正常。被监视任务运行时,监视任务处于等待态,等待被监视任务给它发送消息,等待时间被设定为预计的任务正常运行所需的最大时间。若等待时间内监视任务收到消息,则认为发送消息的任务运行正常,依照各任务执行顺序的先后下一任务开始运行,监视任务等待下一任务发送的消息。若等待时间已过,监视任务仍未收到消息,则系统的时间管理函数将强行把监视任务置为就绪态。因监视任务的优先权是最高的,它将抢占对CPU的控制权并采取相应的纠错方案。本系统中针对常见故障建立对策库,并将之置于ROM,以便实际应用中根据故障的具体情况采取相应措施。 

    现以信号采集任务中常出现的一个扰动为例加以介绍。信号采集任务进行信号采集前首先查询一个标志位,该标志位显示焊接是否开始。若该标志位置1表明焊接已经开始,任务开始信号采集,否则任务一直查询直至该标志位置1。若该位在置位时由于瞬间扰动导致未能置位成功以致信号采集任务不断查询该标志位,将导致系统混乱。若未采用监视任务,则系统只能依靠看门狗复位。在本设计中由于操作系统的采用,使各任务的关系由传统的顺序机制变成并行机制。监视任务在预定的等待时间后仍未收到信号采集任务发送的消息,被时间管理函数置为就绪态,且由于其优先权较信号采集任务高,将获得CPU的使用权,使信号采集任务重新运行以消除扰动的影响,即刷新看门狗寄存器的值,将信号采集任务置为就绪态,并将信号采集任务的任务堆栈的断点地址值改为信号采集任务起始地址后重新将自身置为等待态。 

4 操作系统层设计 

4.1任务建立 

    因任务并未常驻ROM,操作系统的首要功能为建立所有任务,将其初始化并置刚建立的任务为就绪态。 

4.2 消息队列 

4.2.1 消息队列的结构 

    本设计中将任务间传送的数据称为消息。因系统中任务间有多个数据传送,故采用消息队列。消息队列实质是一个由指针组成的循环缓冲区,如图3所示。 

    其中osqstart为指向消息队列起始地址的指针,osqend为消息队列结束单元的下一地址的指针,osqstart、osqend使消息队列构成一个循环的缓冲区。osqsize为消息队列的总单元数,该值的大小视任务的需要而定。osqentry为消息队列中消息数,其值随数据存取而改变。 

    osqin为指向消息队列存入下一条消息的指针,osqout为指向消息队列取出下一条消息的指针。系统初始化及osqin、osqout到达osqend时将被调整指向消息队列起始地址。系统完成消息队列创建后即开始对其进行初始化,将osqentry置为0,osqin、osqout指向消息队列起始地址。消息队列的存取采取先进先出的原则,osqin、osqout随数据的存取相应改变。 

4.2.2 系统中的消息队列 

    本系统中共有4个消息队列,各消息队列用途分别为: 

    消息队列1被信号采集任务用于发送消息给信号处理,监视任务;消息队列2被信号处理任务用于发送消息给控制运算,监视任务;消息队列3被控制运算任务用于发送消息给输出任务,监视任务;消息队列4被输出任务用于发送消息给监视任务。 

    本系统定义数据结构——队列控制块来实现对多个消息队列的管理,每个消息队列对应一个队列控制块。队列控制块的内容包括指向消息队列的指针以及该消息队列对应的等待任务。消息存取采取优先权原则,即消息队列非空时,该消息队列对应的队列控制块中等待任务列表内优先权最高的任务先从消息队列中取消息。因消息发送可能会导致任务状态的变化,为维护消息的完整,消息发送中禁止任务切换。 

    因本系统中对消息的存取采取先入先出以及优先权的原则,故各任务发送消息至消息队列的顺序为:先发送给监视任务的消息,后发送给其它任务的消息。各任务从消息队列读取的顺序为:监视任务先读,其它任务后读。 

4.3 系统调度

    为保证系统的实时性,系统采用抢占式内核,即优先权高的就绪态任务获得CPU的占有权,优先权低的就绪态任务对CPU的控制权被抢占,从运行态转入就绪态。此过程由调度函数完成。调度函数找到就绪态拥有最高优先权的任务,并将其与运行态任务的优先权比较,若就绪态任务的优先权较高则模拟一次中断,将当前CPU寄存器内容压入运行态任务堆栈,将就绪态任务堆栈内容置于CPU寄存器。 

    本系统采用静态优先权,若就绪态中任务的最高优先权变化,则必有任务从等待态转化成就绪态。而任务从等待态转化成就绪态的前提为有消息产生,故调用调度函数时机为任务中消息发送完成以及中断返回。 

4.4 时间管理函数 

    时间管理函数功能为将等待时间已过的等待态任务置位为就绪态,其实质为时钟中断的中断服务程序。系统运行时将监视任务等待时间置为定时器的延时时间,若被监视任务正常运行,则等待时间内监视任务将从消息队列收到消息,恢复运行态,将对应下一个任务的等待时间(即监视任务收到下一任务给它发送的消息所需时间)置为定时器延时时间。若被监视任务运行异常,将产生时钟中断,强行将监视任务置就绪态,以便它采取相应的纠错措施。 

5 系统运行过程分析 

    系统运行首要环节为初始化,包括两部分:第一部分为建立任务,为之分配优先权,将其置为就绪态;第二部分为实现任务间的数据传递、建立消息队列及对应的队列控制块初始化消息队列。 

    系统初始化后各任务即可开始调度运行。刚开始时各任务均处就绪态,此时监视任务优先权最高,最先运行,查询消息队列1即信号采集任务有无给它发送消息,因消息队列1为空,监视任务变为等待态并确定等待时间。此时输出任务在所有就绪态任务中优先权最高,可以运行,但也因消息队列2空变为等待态,依此类推。虽信号采集任务优先权最低,但其无需等待别的任务给它发送消息,故信号采集任务得到CPU控制权。若信号采集任务未能正常运行则等待时间过后消息队列仍为空,时间管理函数将强行置监视任务为就绪态,因监视任务的优先权高将获得CPU控制权并根据故障情况从对策库中找出相应解决方案。若信号采集任务正常运行则在等待时间内发送消息至消息队列1,信号处理任务及监视任务转为就绪态。因监视任务优先权较高,先从消息队列1获取消息以确认信号采集任务运行无误。查询消息队列2即信号处理任务有无给它发送消息,因信号处理任务尚未运行,消息队列2为空,监视任务退出运行态转入等待态并确定等待时间,信号处理任务获得对CPU控制权,读消息并开始运行。其余任务的运行依此类似。当所有任务均运行一次后所有任务状态为就绪态,开始下一周期的运行。 

    经系统实际运行证明,因实时嵌入式操作系统μc/os-II以及监视任务的采用,较好地提高了系统安全性能,有效地减少了复位次数,达到了系统设计目标。 

参考文献 

1 邵贝贝译, JEAN JLABROSSE著. μc/os-II源码公开的实时嵌入式操作系统.北京: 中国电力出版社,2001.8 

2 程 军. Intel 80C196单片机应用实践与C语言开发.北京:北京航空航天大学出版社,2000.11

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