新闻中心

EEPW首页>嵌入式系统>设计应用> 基于DeltaOS的系统软件设计

基于DeltaOS的系统软件设计

作者: 时间:2011-08-18 来源:网络 收藏
3 可靠性保证和可扩展性的提高

本文引用地址://m.amcfsurvey.com/article/150332.htm

  对于任何来说,可靠性都是至关重要的。的可靠性在任务内是容易做到,通常问题都是出在任务间的接口之上。接口也关系到可扩展性能。在多任务操作中,任务间的接口是通过同步和通信机制来实现的,因此同步和通信机制必须认真选取。

  DeltaCORE提供了消息队列(message queue)、信号量(semaphore)、异步信号(signal)、事件(event)这四种通信和同步机制。其中,消息队列和事件机制可以同时实现通信和同步,信号量机制可以实现同步和互斥,异步信号(又叫软中断机制)可以实现同步。

  为了满足通信和同步的需要,可以采用两种方案:第一种方案是信号量等同步机制实现同步,用全局数组或其他的共享数据结构来实现各任务间的通信,如图5;另一种是采用消息队列来同时实现通信和同步,如图6。

  对比两种方案,各有优缺点:方案一实时性强,但存在可重入性问题;方案二实现简单而且可靠,但是消息队列机制通信的实时性相对较弱。本中出站信息的突发性强,如果采用方案一,则可能导致第二个通道的数据失效或者第一个通道的数据被覆盖;如果采用方案二虽然数据的处理延时稍大,但是数据能够完整存储到消息队列中不被损坏。此外,利用消息队列为任务提供唯一的入口,能简化接口和方便功能扩展。因此,本文采用消息队列方案,其实现方法如下:

  每个任务都对应一个消息队列,任务只处理与之相对应的消息队列中的消息。对于发送方(task1),当它需要将发送缓冲区buffer中的数据交给task2处理时,只须将buffer中的数据发送到与task2对应的消息队列Q2中就行了。

  ret = delta_message_queue_send ( Queue_id[ 2 ], buffer, size );

  其中Queue_id[2]为消息队列Q2的ID,size为消息大小(单位字节)。

  对于接收方(task2),将接收消息函数的等待时间参数设为永久等待,达到当消息队列为空时阻塞任务的目的。task2的代码如下:

  delta_task task1()

  {

  delta_status_code ret;

  …… // 定义其他局部变量

  while(1)

  {

  ret = delta_message_queue_receive(

  Queue_id[ 2 ], /*消息队列ID*/

  RecBuff, /*指向接收缓冲区的指针*/

  size,/*接收消息的尺寸(单位字节)*/

  DELTA_DEFAULT_OPTIONS, /*属性集*/

  DELTA_NO_TIMEOUT /*等待时间*/

  );

  …… //完成task1功能的代码

  }

  }

  通过这种方式,任务与任务之间、任务与中断之间的通信和同步都得以实现。任务的状态转换如图7:

4 致命错误的防止和解决

  通常异常是由两种情况引起的:一种是数组越界或使用指针不当;另一种是任务栈溢出。为避免以上情况发生,数组和任务栈的大小必须设置恰当,修改数组元素的时候要保证下标是在合法范围内的,使用指针要特别小心。不过,提供了异常处理机制,用户可以编写自己的扩展例程,当出现致命错误的时候实行一定的挽救措施,比如复位程序整个系统软件或者重新起动指定任务。

是一个强实时性的操作系统,通过优化任务划分、有效的利用中断机制满足了系统的强实时要求。利用本文提出的通信和同步方案,实现了任务的标准化接口,方便地进行了多次功能扩展,并且显示了它可靠性强的优点。


上一页 1 2 下一页

评论


相关推荐

技术专区

关闭