首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

一种实时多任务系统软件设计方法(2)

一种实时多任务系统软件设计方法(2)

3 总体模型
综上所述,一个完整的、严格按“前向分支”原则进行线程拆分和进程调度的多任务系统模型可以归纳为图5所示的结构。该模型由三部分构成:主循环、分属于不同进程的“前向分支”的连程以及一个基础定时中断程序。该模型结构最大的特点是:除了主循环中最后一个回跳以外,其它任何地方都不存在循环结构。换言之,系统中所有的循环“反向”转跳,都被归并成了主循环中的一个回跳。这样的结构能使主循环在各进程间快速地切换,有利于提高CPU的利用率,改善系统的响应,使得各进程能够得到及时、均匀、公平的服务。同时,基础定时中断程序也完全是“前向分支”结构,有利于减少对CPU的占用。
考虑到各进程对响应时间和服务频度的不同要求,在该模型中设置了对各进程进行定时同步的功能。在基础定时中断服务程序中增加了同步定时器cTimerSyn_i和同步定时标志fTimerSyn_i。同步定时器和动作定时器构成了基础定时中断服务程序的主体。
基础定时中断的中断间隔时间按所有定时任务的最大公约数来选取,所选取中断间隔时间越大,对CPU的占用越少,越有利于系统效率的提高。
进程定时同步的本质是为了不同响应时间需求的任务安排不同的服务频度。降低低优先级任务的服务频度相当于提高了高优先级任务的服务频度。在很多情况下,这样的优先级处理已令人满意。有一类进程出于功能(而不一定是优先级)的需要,也必须进行定时同步。
如前所述,严格按照“前向分支”原则拆分线程是,拆分数量不应上于时程中的循环返回节点数Nback和Nback+1。这是拆分线程时重要的参考依据。但是,在实际应用中,并不一定非要将线程中的循环彻底消除,应当根据具体情况和实际需求灵活掌握。
如果拆分粒度过细(即线程拆分数量过多),虽然对提高系统的响应速度有帮助,但由于进程切换过于频繁,进程切换所需的额外开销会导致系统效率下降(即有效的CPU机时占CPU总机时的比例下降)。粒度越细,这种情况也就越严重。另外,粒度越细,源程序和程序文档的可读性越差,这程序的调试和维护以及文档的维护带来困难。因此,在能够保证系统的响应速度和调度的均匀性等前提之下,拆分粒度倾向于粗一些。在多数情况下,倾向于将次数不确定的等待循环、较为耗时的循环和较长的纯延时拆分为线程。而那些循环数确定且不太耗时的循环则建议保留。在这种情况下,线程拆分数小于Nback或Nback+1。
实时系统要求系统能够对输入做出快速的反应和处理。但是,“实时”只是一个相对的概念,响应时间快慢实际上是衡量一个系统是否“实时”的重要指标。由图5可以看出,对于本文所介绍的模型来说,由于进程都是确定的,响应时间可以大致按以下方法估算:各地程中最耗时线程的运行时间之和就是最不利的响应时间,平均响应时间应等于各进程中线程平均运行时间之和的二分之一。根据以上估算,还可以大致推断运行期间发生过几次定时中断。将基础定时中断所占用的CPU时间也估算进去,可以进一步提高响应时间估算的准确度。当然,响应时间也可以通过实验来测定。如果响应时间不能满足某一任务的要求,可以将长线程进一步拆分,或者应当考虑更换速度更高、能力更强的CPU。
子程序是程序设计中广泛应用的一种程序结构。在本模型的基础上,可以将子程序设计为子进程。子进程同样可按“前几分支”原则拆分为子线程,这样,系统中仍然可以消除所有的局部循环。子线程的拆分方法与上述线程的拆分方法类似,但需注意调用时的争用和重入问题。
以上介绍模型的调度算法简单、实现方法规范、对CPU资源没有特殊的要求。在实现应用中,该模型可以根据项目的具体情况灵活地变通和扩充。同时,该模型比较容易工程化实施,便于快速、低成本地构造系统程序的原型。但该模型没有对进程设置严格意义上的优先级,另外,源程序的可读性也不太令人满意。
与通用操作系统不同,该模型适用于静态内存分配和资源分配的确定性任务(多数的单片机应用项目和机电设备控制系统属于这种情形)。显然,该模型不适合那些在运行时动态加载、需要进行动态内存功能的资源分配的不确定性任务。
返回列表