微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > 基于DeltaOS的系统软件设计

基于DeltaOS的系统软件设计

时间:08-18 来源:互联网 点击:

行。因此如果中断服务所占用的时间过长,同样会降低系统的实时性。

为了提高系统的实时性,本系统软件在中断处理上主要做了以下两方面的优化:

①中断优先级设置的优化,将触发频率高的中断和重要的中断设为高优先级来保证其及时响应。

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

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top