北京物流信息联盟

提升实时任务时间确定性的三个建议

2021-12-03 09:15:45

        在实时系统开发中,保证时间确定性是非常重要的要求,一般可以通过减少关中断,减少任务锁等机制保证实时性。本文介绍了提升实时任务时间确定性的三个重要的原则:避免进行IO操作;避免动态内存申请;避免递归调用。

一. 避免进行IO操作

        在实时操作系统中,时常将文件系统、串口等设备都纳入IO系统的管理。IO设备分为块设备和字符设备,这两种设备操作时的时间不确定性原因有所差异。

        1. 块设备

        文件系统是一种典型的块设备。在IO系统中,通过信号量来保证对这些设备访问的独占性。一个实际的场景是:高优先级任务A打断了低优先级任务B的执行并进行文件系统读写,如果此时任务B在正在读写文件系统,任务调度器会将任务B的优先级提升,等任务B尽快完成最小粒度的文件操作,任务A才能得到执行。因此任务A的操作时间是不确定的。

        文件系统常见的存储介质是Flash或磁盘,对它们的操作时间也是不确定的。

        2. 字符设备

        字符设备,如串口TTY、socket等,它们数据发送都是有一定的速率的,如果向这样的设备快速写入大量数据时,就会将发送缓冲占满,如果任务需要写入的数据量超过发送缓冲空余容量时,任务就会挂起,等到缓冲中的有足够空间后,对IO的写操作才能返回,这就造成了任务执行时间的不确定。

        一些函数的操作有可能和IO操作相关联,这些函数也不能在有实时性要求的任务中调用。比如printf,它会输出到标准输入输出接口,如果标准输出接口是串口TTY,在调用printf时就有可能发生阻塞。进而造成任务执行时间不确定。

二. 避免动态内存申请

        动态内存申请最常使用的算法是“最先匹配”算法。使用该算法申请内存时,程序沿着内存块链表,找到第一个能放下申请容量的内存块时,就从该内存块中分出指定容量的内存并返回指针。在一个系统中,如果经过了多次内存动态申请和释放,内存碎片会有很多,因此找到合适容量的时间是不确定的。

三. 避免递归调用

        递归调用时,何时能够达到中止条件是不完全确定的,这就造成了程序执行时间的不确定。另外,递归调用会使用到栈,如果递归次数过多,还会发生栈溢出的问题。因此,在实时系统中,要尽量避免递归调用。使用开源库Mini-XML解析XML文件时,就需要使用到递归调用。

四. 结论

        从上面的分析可知,避免进行IO操作、避免动态内存申请和避免递归调用可以提升实时任务的时间确定性。


友情链接

Copyright © 2023 All Rights Reserved 版权所有 北京物流信息联盟