基于DeltaOS的系统软件设计
行。因此如果中断服务所占用的时间过长,同样会降低系统的实时性。 为了提高系统的实时性,本系统软件在中断处理上主要做了以下两方面的优化: ①中断优先级设置的优化,将触发频率高的中断和重要的中断设为高优先级来保证其及时响应。 ②关中断时间应该尽可能地小,ISRs只完成一些必要的操作,如:输入数据、输出数据或将控制信息传递给任务,对中断的进一步处理通过任务来完成[2]。3 可靠性保证和可扩展性的提高 对于任何软件来说,可靠性都是至关重要的。软件的可靠性在任务内是容易做到,通常问题都是出在任务间的接口之上。接口设计也关系到软件可扩展性能。在多任务操作系统中,任务间的接口是通过同步和通信机制来实现的,因此同步和通信机制必须认真选取。 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 致命错误的防止和解决 通常异常是由两种情况引起的:一种是数组越界或使用指针不当;另一种是任务栈溢出。为避免以上情况发生,数组和任务栈的大小必须设置恰当,修改数组元素的时候要保证下标是在合法范围内的,使用指针要特别小心。不过,DeltaOS提供了异常处理机制,用户可以编写自己的扩展例程,当出现致命错误的时候实行一定的挽救措施,比如复位程序整个系统软件或者重新起动指定任务。 DeltaOS是一个强实时性的操作系统,通过优化任务划分、有效的利用中断机制满足了系统的强实时要求。利用本文提出的通信和同步方案,实现了任务的标准化接口,方便地进行了多次功能扩展,并且显示了它可靠性强的优点。
- 基于FPGA的DSP设计方法(08-26)
- 电力电子装置控制系统的DSP设计方案(04-08)
- 基于DSP Builder的VGA接口设计(04-10)
- 基于DSP和USB的高速数据采集与处理系统设计(05-01)
- 数字信号处理(DSP)应用系统中的低功耗设计(05-02)
- 基于DSP的嵌入式显微图像处理系统的设计(06-28)