打印
[综合信息]

如何优化长耗时的任务?

[复制链接]
707|2
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
jcky001|  楼主 | 2023-11-13 15:43 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
1. 前言
在 MCU 裸机开发中,采用分时片的方式进行多任务处理是一种常见的技术。然而,长耗时任务可能会影响系统的响应性和性能,因此需要采取一系列优化策略来处理这些情况。本文将介绍针对长耗时任务的几种常见优化策略,并着重探讨任务分割的思路与方法。

2. 优化策略
以下是针对长耗时任务的几种常见优化策略:

任务分割和优先级设置

将长耗时任务分割成多个较小的子任务,每个子任务只在每个时间片内执行一部分。同时,通过设置任务的优先级,确保高优先级任务能够在适当时刻得到执行,从而保证系统的响应性。

时间片调整

对于特别耗时的任务,可以将它们的时间片调整为更大,以确保它们能够在较长的时间段内得到充分的执行时间。这样可以减少任务切换的开销,提高长耗时任务的效率;同时也有更多的时间执行其他任务,保证其他任务能够及时被调度。

使用中断处理

对于一些需要高实时性的任务,可以考虑使用中断处理。将长耗时任务分为多个阶段,在每个时间片内执行一个阶段,当中断触发时,可以切换到中断处理程序,然后再回到任务继续执行。这样可以在不中断其他任务的情况下,保证某些任务得到及时处理。

任务延时和休眠

对于一些不需要即时执行的任务,可以在任务中添加适当的延时或休眠。这样可以让其他高优先级任务有更多的执行时间,同时降低长耗时任务对系统的影响。

优化算法和数据结构

针对特定的长耗时任务,可以优化算法和数据结构,以减少计算量和内存使用。这可以显著提高任务的执行效率。

任务优先级监控和动态调整

实时监控系统中各个任务的执行状态和响应时间,根据实际情况动态调整任务的优先级和时间片大小,以适应不同的工作负载。

3. 示例
任务分割的思路与方法
任务分割是优化长耗时任务的关键策略之一。它的核心思想是将长耗时任务切分成多个较小的子任务,每个子任务在一个时间片内执行一部分工作。以下是任务分割的大致步骤:

任务分析:首先,对长耗时任务进行详细分析,确定任务的执行流程、涉及的计算和操作,以及可能的耗时瓶颈点。

子任务划分:将任务划分为多个子任务,每个子任务代表一个可以在一个时间片内完成的工作单元。确保划分后的子任务是相对独立的,不会导致数据依赖性问题。

优先级设置:为每个子任务设置适当的优先级,确保高优先级任务在必要时能够及时执行。通常,长耗时任务的子任务应该具有相对较高的优先级。

时间片分配:根据子任务的数量和优先级,合理分配时间片。对于长耗时任务的子任务,可以将其时间片设置为较大值,以确保每个子任务能够得到充分的执行时间。

任务执行与切换:在每个时间片内,依次执行每个子任务的一部分工作。在任务切换时,确保上下文的正确保存和恢复,以保证任务的连续性。

中断处理:如果长耗时任务需要高实时性,可以在适当的地方引入中断处理,以在必要时切换到中断处理程序,然后返回继续执行子任务。

通过任务分割,长耗时任务可以被有效地分解成可管理的部分,从而提高系统的响应性和效率。然而,需要注意的是,任务分割过程需要综合考虑任务之间的依赖关系、优先级设置以及任务切换的开销,以达到最佳的优化效果。

如何实现?
在优化初期,可以结合状态机的思想完成任务的拆分和切换,比如10毫秒的任务,而一个执行时长需要5毫秒的任务,在运行周期10毫秒无法调整的情况下,而任务可细分时,可以分成多个子状态(子任务)执行,如5个状态(子任务),那么该任务周期为2毫秒,所有子状态(子任务)运行时间依然是10毫秒(理想状态下)。

当然,这种优化需要保证大部分的子状态(子任务)执行时长不要超过时间片,如果不能保证,那么继续细分多个子状态(子任务),直到无法继续细分为止(比如IIC/SPI发送数据等场景)。

void Task_10ms(void)
{
    ....
}

// 改为
void Task_2ms(void)
{
    static uint8_t s_state = 0;

    switch(s_state)
    {
    case 0:
        ....
        s_state = 1;
    break;
    case 1:
        ....
        s_state = 2;
    break;
    case 2:
        ....
        s_state = 3;
    break;
    case 3:
        ....
        s_state = 4;
    break;
    case 4:
        ....
        s_state = 0;
    break;
    }
}

使用特权

评论回复
沙发
yangxiaor520| | 2023-11-14 08:17 | 只看该作者
学习了,分片运行,设置优先级。

使用特权

评论回复
板凳
yangxiaor520| | 2023-11-14 08:17 | 只看该作者
学习了,分片运行,设置优先级。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1510

主题

4548

帖子

6

粉丝