• 休闲生活
  • 教育教学
  • 经济贸易
  • 政法军事
  • 人文社科
  • 农林牧渔
  • 信息科技
  • 建筑房产
  • 环境安全
  • 当前位置: 达达文档网 > 达达文库 > 经济贸易 > 正文

    嵌入式实时操作系统中的数据缓冲技术

    时间:2020-10-18 07:52:15 来源:达达文档网 本文已影响 达达文档网手机站

    【摘要】数据缓冲是软件领域的常用开发技术,在多任务实时操作系统中,数据缓冲及相应的操作系统任务设计影响到整个系统的性能及稳定性。本文提出“高优先级-低复杂度”的操作系统任务设计原则,尽可能地将高优先级任务中的复杂工作量拆分到低优先级的任务当中,借助数据缓冲来完成工作的传递,由此带来系统性能的提升,在实际产品中取得了良好效果。

    Abstract:Data buffer is a common technology in software development,in a multi task real-time operating system,data buffer and the corresponding operating system task design affects the performance and stability of the whole system.This paper put forward the“high priority-low complexity”principles of operating system task design,that is,split the work which is done in the high priority task,and put as much as the none real-time part into the lower priority tasks,while the work is transferred by buffer between tasks.This will improve the performance of system,and be already achieved good results in actual products.

    随着嵌入式计算机技术的发展及性能的日益增强,其承载的功能也越来越丰富,随之而来的是软件规模的扩大及开发难度的增加。为了简化软件开发流程,提高软件的可移植性,嵌入式操作系统被广泛应用。在数据量大,数据处理复杂度高的应用场合,为了保证数据接收的完整性,同时不过多占用CPU资源影响其它任务的流畅运行,往往对可以异步处理的数据采取缓冲技术,既先存储再处理。在操作系统任务设计时依据“高优先级-低复杂度”的原则,剥离高优先级任务中非实时性的工作量到低优先级的任务当中去,如下面的阶梯形图示(图1)。下面以VxWorks操作系统下对串口数据的解析为例,介绍一种二级数据缓冲技术的实现方法。

    图1 “高优先级-低复杂度”的任务设计模式

    本系统的主要功能是接收并解析多路串口数据,以图形界面显示处理结果并提供丰富的用户交互功能,所使用的硬件嵌入式平台为PC104单板计算机,软件环境为VxWorks5.5操作系统,系统组成框图如图2所示:

    图2 系统组成框图

    该系统要求完整的记录串口接收到的数据,同时兼顾用户界面友好性,提供较佳的使用体验。据此,在VxWorks系统软件设计上建立如表1所示的两个任务。

    表1 两个任务

    任务名 优先级(相对) 任务功能

    Task_Data High 接收/解析/处理串口数据

    Task_UI Normal 响应用户键盘消息/界面绘制

    因为要确保数据不丢失,所以任务Task_Data的优先级要高于任务Task_UI的优先级,这样做的缺点是数据处理势必影响用户界面的流畅性。在实测中,串口数据量较大时Task_Dat会占据大部分的CPU资源(如图3所示),造成用户界面的严重卡顿现象。

    从CPU时间片在操作系统多任务间的轮转角度看,只要task_Data的工作量未执行完,它就会占用CPU时间片,而在这期间task_UI便无法获得CPU资源,如图4所示。

    图3 没有缓冲区时的任务执行情况

    图4 没有缓冲区时的CPU时间片轮转情况

    针对此现象,本文提出的数据缓冲区设计思路为:将数据接收/解析/处理功能分解到多个任务中去完成,根据其功能复杂度、实时性确定其优先级,已达到CPU资源的合理利用。重新设计的任务如表2所示。

    将Task_Data任务拆分为三个任务task_Recv、task_Combine以及task_Parse,其中task_Recv直接与串口数据源相关,为保证数据不丢失,其优先级应该最高,同时为保证不过多占用CPU资源,该任务的功能应尽可能简单。在此它仅完成将串口接收到的字节流写入第一级缓冲区的功能。task_Combine从一级缓冲区中读取字节流定位帧头、帧尾并进行数据校验,将通过校验的完整数据帧写入二级缓冲区,其复杂度较task_Recv略高,但为了使得一级缓冲区不至于饱和,其优先级不宜过低,设置为Normal。task_Parse完成数据字段的解析、类型转换、逻辑组合等功能,复杂度最高,因为在本系统中对数据处理的实时性要求不高,所以将该任务的优先级设置为Low,等其他任务空闲时再进行工作,这样就避免的大工作量对数据记录和用户界面流畅度的影响。

    以上任务所涉及的缓冲区均为环形缓冲区,通过读写游标控制存取位置,在具体实现上可采用数组、队列等数据结构。一级缓冲区为一维结构,顺序存储来自一个串口数据的字节流。二级缓冲区为二位结构,第一维为缓冲区长度,第二维为数据帧长度,顺序存储完整的数据帧,如图5所示:

    图5 多级缓冲区执行原理

    缓冲区大小可根据数据峰值量和CPU的处理能力综合确定,在采取上述设计后,实测中的CPU使用情况如图6所示:

    图6 建立两级缓冲区后的任务执行情况

    可以看到,原来占整个CPU资源70%的高优先级的工作量有10%分配到普通优先级任务去做,%55分配到低优先级任务去做,只有5%留在高优先级。这5%足以保证数据的完整性,又不会对用户界面造成明显的影响。

    从CPU时间片在操作系统多任务间的轮转角度看,由于task_Recv的工作量很少,它仅占用很少的CPU时间片。而当task_UI工作量增大时(用户操作频繁),它可以抢占低优先级task_Parse的CPU时间片,从而保证用户界面的流畅。如图7所示。

    图7 建立两级缓冲区后的CPU时间片转换情况

    建立两级缓冲区而不是一级的意义在于:若将65%的工作量(task_Combine的%10加上task_Parse的55%)全部放在优先级为Normal的任务里去做,那么势必影响同优先级及更低优先级上任务的执行,体现在这里就是会影响界面的流畅性。若将这65%的工作量全部放在优先级为Low的任务里去做,那么就不能保证一级缓冲区里的数据能被及时取走,造成一级缓冲区的溢出。总之,多级缓冲区的设计原则是分解大块的工作量为小模块,并将它们安排在最合适的优先级任务去完成。

    从本质上讲,数据缓冲区不能降低总的CPU工作量,但可以将突发的大工作量在时间上展开,避免其对其他任务的冲击,从而达到提高系统稳定性,改善用户体验的目的。文中提及的系统采用该设计思路已转入批生产阶段,在数据压力测试中取得了良好的效果。另外,多级缓冲区的设计思想不局限应用于嵌入式领域,在个人计算机、服务器的软件开发中同样可以应用。

    注:本文获国家863计划项目资金支持(课题编号:2012AA091804)。

    相关热词搜索: 缓冲 嵌入式 实时 操作系统 数据

    • 生活居家
    • 情感人生
    • 社会财经
    • 文化
    • 职场
    • 教育
    • 电脑上网