0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

MCU长耗时任务的优化策略

strongerHuang 来源:大橙子疯嵌入式 2023-11-21 09:39 次阅读

转自 | 大橙子疯嵌入式

MCU 裸机开发中,采用分时片的方式进行多任务处理是一种常见的技术。

然而,长耗时任务可能会影响系统的响应性和性能,因此需要采取一系列优化策略来处理这些情况。

本文将介绍针对长耗时任务的几种常见优化策略,并着重探讨任务分割的思路与方法。

优化策略

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

任务分割和优先级设置

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

时间片调整

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

使用中断处理

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

任务延时和休眠

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

优化算法和数据结构

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

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

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

示例

任务分割的思路与方法

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

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

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

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

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

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

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

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

如何实现?

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

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

voidTask_10ms(void)
{
....
}

//改为
voidTask_2ms(void)
{
staticuint8_ts_state=0;

switch(s_state)
{
case0:
....
s_state=1;
break;
case1:
....
s_state=2;
break;
case2:
....
s_state=3;
break;
case3:
....
s_state=4;
break;
case4:
....
s_state=0;
break;
}
}



审核编辑:汤梓红

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • mcu
    mcu
    +关注

    关注

    146

    文章

    16019

    浏览量

    343668
  • 嵌入式
    +关注

    关注

    4983

    文章

    18286

    浏览量

    288521
  • 中断处理
    +关注

    关注

    0

    文章

    92

    浏览量

    10891

原文标题:如何优化MCU长耗时的任务?

文章出处:【微信号:strongerHuang,微信公众号:strongerHuang】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    鸿蒙原生应用/元服务开发-短时任务

    概述 应用退至后台一小段时间后,应用进程会被挂起,无法执行对应的任务。如果应用在后台仍需要执行耗时不长的任务,如状态保存等,可以通过本文申请短时任务,扩展应用在后台的运行时间。 约束与
    发表于 12-28 16:13

    鸿蒙原生应用/元服务开发-时任务

    概述 功能介绍 应用退至后台后,对于在后台需要长时间运行用户可感知的任务,例如播放音乐、导航等。为防止应用进程被挂起,导致对应功能异常,可以申请时任务,使应用在后台长时间运行。申请
    发表于 01-09 10:52

    关于stm32系统定时任务的问题

    在用stm32做一个飞控程序时。需要用到上面这种系统循环定时任务,有一个问题:在System_Task_Loop函数里面,有1ms 、2ms、5ms的循环任务,但是他的这些定时是怎么得到的?是随便
    发表于 10-10 23:43

    Linux系统定时任务Crond

    会定期(默认每分钟检查一次)检查系统中是否有要执行的任务工作,如果有,便会根据其预先设定的定时任务规则自动执行该定时任务工作,这个crond定时任务服务就相当于我们平时早起使用的闹钟一
    发表于 07-05 06:22

    linux的循环定时任务

    linux循环定时任务
    发表于 05-20 14:59

    ucos iii定时任务有什么用?

    ucos iii 的定时任务有什么用,通过定时任务定时与普通的调用系统定时函数定时有什么区别?
    发表于 10-07 06:16

    时任务的发展史是怎么样的

    了。我司使用quartz就已经升级了三代,每一代在上一代系统之上有所优化,写这篇文章一方面介绍一下quartz的使用,另一方面可以根据此项目的变迁反应出我司平台架构升级的一个缩影。定时任务的使用场景很多,以我们平台来讲:计息,派息、对账等等。
    发表于 07-18 17:38 0次下载
    定<b class='flag-5'>时任务</b>的发展史是怎么样的

    SpringBoot如何实现动态增删启停定时任务

    在spring boot项目中,可以通过 @EnableScheduling 注解和@Scheduled注解实现定时任务,也可以通过SchedulingConfigurer接口来实现定时任务。但是
    的头像 发表于 09-24 09:49 2597次阅读
    SpringBoot如何实现动态增删启停定<b class='flag-5'>时任务</b>

    Python定时任务的实现方式

    在日常工作中,我们常常会用到需要周期性执行的任务,一种方式是采用 Linux 系统自带的 crond 结合命令行实现。另外一种方式是直接使用Python。接下来整理的是常见的Python定时任务
    的头像 发表于 10-08 15:20 3226次阅读

    解析Golang定时任务库gron设计和原理

    正巧,最近看到了 gron 这个开源项目,它是用 Golang 实现一个并发安全的定时任务库。实现非常简单精巧,代码量也不多。今天我们就来一起结合源码看一下,怎样基于 Golang 的能力做出来一个【定时任务库】。
    的头像 发表于 12-15 13:57 948次阅读

    求一种SpringBoot定时任务动态管理通用解决方案

    SpringBoot的定时任务的加强工具,实现对SpringBoot原生的定时任务进行动态管理,完全兼容原生@Scheduled注解,无需对原本的定时任务进行修改
    的头像 发表于 02-03 09:49 551次阅读

    Spring Boot中整合两种定时任务的方法

    框架 Quartz ,Spring Boot 源自 Spring+SpringMVC ,因此天然具备这两个 Spring 中的定时任务实现策略,当然也支持 Quartz,本文我们就来看下 Spring Boot 中两种定时任务
    的头像 发表于 04-07 14:55 1243次阅读
    Spring Boot中整合两种定<b class='flag-5'>时任务</b>的方法

    在Spring Boot中如何使用定时任务

    本文介绍在 Spring Boot 中如何使用定时任务,使用非常简单,就不做过多说明了。
    的头像 发表于 04-12 10:56 782次阅读

    Linux如何使用cron进行定时任务的操作

    按计划执行命令对于计算机来说非常重要,因为假如我亲自去执行一些任务的话,可能会因为多方面因素不能按时执行,所以定时任务就显得非常重要了! cron就是一个能够执行定时任务的命令,其实该命令本身不难,下面小编带您详细了解!
    的头像 发表于 05-12 16:27 1804次阅读

    python定时任务实践

    由于程序需求,监测配置变化需要设置定时任务,每分钟执行一次,对任务持久化要求不高,不需要时可以关闭定时任务
    的头像 发表于 05-20 17:53 784次阅读
    python定<b class='flag-5'>时任务</b>实践