0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

MCU長(zhǎng)耗時(shí)任務(wù)的優(yōu)化策略

strongerHuang ? 來源:大橙子瘋嵌入式 ? 2023-11-21 09:39 ? 次閱讀

轉(zhuǎn)自 | 大橙子瘋嵌入式

MCU 裸機(jī)開發(fā)中,采用分時(shí)片的方式進(jìn)行多任務(wù)處理是一種常見的技術(shù)。

然而,長(zhǎng)耗時(shí)任務(wù)可能會(huì)影響系統(tǒng)的響應(yīng)性和性能,因此需要采取一系列優(yōu)化策略來處理這些情況。

本文將介紹針對(duì)長(zhǎng)耗時(shí)任務(wù)的幾種常見優(yōu)化策略,并著重探討任務(wù)分割的思路與方法。

優(yōu)化策略

以下是針對(duì)長(zhǎng)耗時(shí)任務(wù)的幾種常見優(yōu)化策略:

任務(wù)分割和優(yōu)先級(jí)設(shè)置

將長(zhǎng)耗時(shí)任務(wù)分割成多個(gè)較小的子任務(wù),每個(gè)子任務(wù)只在每個(gè)時(shí)間片內(nèi)執(zhí)行一部分。同時(shí),通過設(shè)置任務(wù)的優(yōu)先級(jí),確保高優(yōu)先級(jí)任務(wù)能夠在適當(dāng)時(shí)刻得到執(zhí)行,從而保證系統(tǒng)的響應(yīng)性。

時(shí)間片調(diào)整

對(duì)于特別耗時(shí)的任務(wù),可以將它們的時(shí)間片調(diào)整為更大,以確保它們能夠在較長(zhǎng)的時(shí)間段內(nèi)得到充分的執(zhí)行時(shí)間。這樣可以減少任務(wù)切換的開銷,提高長(zhǎng)耗時(shí)任務(wù)的效率;同時(shí)也有更多的時(shí)間執(zhí)行其他任務(wù),保證其他任務(wù)能夠及時(shí)被調(diào)度。

使用中斷處理

對(duì)于一些需要高實(shí)時(shí)性的任務(wù),可以考慮使用中斷處理。將長(zhǎng)耗時(shí)任務(wù)分為多個(gè)階段,在每個(gè)時(shí)間片內(nèi)執(zhí)行一個(gè)階段,當(dāng)中斷觸發(fā)時(shí),可以切換到中斷處理程序,然后再回到任務(wù)繼續(xù)執(zhí)行。這樣可以在不中斷其他任務(wù)的情況下,保證某些任務(wù)得到及時(shí)處理。

任務(wù)延時(shí)和休眠

對(duì)于一些不需要即時(shí)執(zhí)行的任務(wù),可以在任務(wù)中添加適當(dāng)?shù)难訒r(shí)或休眠。這樣可以讓其他高優(yōu)先級(jí)任務(wù)有更多的執(zhí)行時(shí)間,同時(shí)降低長(zhǎng)耗時(shí)任務(wù)對(duì)系統(tǒng)的影響。

優(yōu)化算法和數(shù)據(jù)結(jié)構(gòu)

針對(duì)特定的長(zhǎng)耗時(shí)任務(wù),可以優(yōu)化算法和數(shù)據(jù)結(jié)構(gòu),以減少計(jì)算量和內(nèi)存使用。這可以顯著提高任務(wù)的執(zhí)行效率。

任務(wù)優(yōu)先級(jí)監(jiān)控和動(dòng)態(tài)調(diào)整

實(shí)時(shí)監(jiān)控系統(tǒng)中各個(gè)任務(wù)的執(zhí)行狀態(tài)和響應(yīng)時(shí)間,根據(jù)實(shí)際情況動(dòng)態(tài)調(diào)整任務(wù)的優(yōu)先級(jí)和時(shí)間片大小,以適應(yīng)不同的工作負(fù)載。

示例

任務(wù)分割的思路與方法

任務(wù)分割是優(yōu)化長(zhǎng)耗時(shí)任務(wù)的關(guān)鍵策略之一。它的核心思想是將長(zhǎng)耗時(shí)任務(wù)切分成多個(gè)較小的子任務(wù),每個(gè)子任務(wù)在一個(gè)時(shí)間片內(nèi)執(zhí)行一部分工作。以下是任務(wù)分割的大致步驟:

任務(wù)分析:首先,對(duì)長(zhǎng)耗時(shí)任務(wù)進(jìn)行詳細(xì)分析,確定任務(wù)的執(zhí)行流程、涉及的計(jì)算和操作,以及可能的耗時(shí)瓶頸點(diǎn)。

子任務(wù)劃分:將任務(wù)劃分為多個(gè)子任務(wù),每個(gè)子任務(wù)代表一個(gè)可以在一個(gè)時(shí)間片內(nèi)完成的工作單元。確保劃分后的子任務(wù)是相對(duì)獨(dú)立的,不會(huì)導(dǎo)致數(shù)據(jù)依賴性問題。

優(yōu)先級(jí)設(shè)置:為每個(gè)子任務(wù)設(shè)置適當(dāng)?shù)膬?yōu)先級(jí),確保高優(yōu)先級(jí)任務(wù)在必要時(shí)能夠及時(shí)執(zhí)行。通常,長(zhǎng)耗時(shí)任務(wù)的子任務(wù)應(yīng)該具有相對(duì)較高的優(yōu)先級(jí)。

時(shí)間片分配:根據(jù)子任務(wù)的數(shù)量和優(yōu)先級(jí),合理分配時(shí)間片。對(duì)于長(zhǎng)耗時(shí)任務(wù)的子任務(wù),可以將其時(shí)間片設(shè)置為較大值,以確保每個(gè)子任務(wù)能夠得到充分的執(zhí)行時(shí)間。

任務(wù)執(zhí)行與切換:在每個(gè)時(shí)間片內(nèi),依次執(zhí)行每個(gè)子任務(wù)的一部分工作。在任務(wù)切換時(shí),確保上下文的正確保存和恢復(fù),以保證任務(wù)的連續(xù)性。

中斷處理:如果長(zhǎng)耗時(shí)任務(wù)需要高實(shí)時(shí)性,可以在適當(dāng)?shù)牡胤揭胫袛嗵幚?,以在必要時(shí)切換到中斷處理程序,然后返回繼續(xù)執(zhí)行子任務(wù)。

通過任務(wù)分割,長(zhǎng)耗時(shí)任務(wù)可以被有效地分解成可管理的部分,從而提高系統(tǒng)的響應(yīng)性和效率。然而,需要注意的是,任務(wù)分割過程需要綜合考慮任務(wù)之間的依賴關(guān)系、優(yōu)先級(jí)設(shè)置以及任務(wù)切換的開銷,以達(dá)到最佳的優(yōu)化效果。

如何實(shí)現(xiàn)?

在優(yōu)化初期,可以結(jié)合狀態(tài)機(jī)的思想完成任務(wù)的拆分和切換,比如10毫秒的任務(wù),而一個(gè)執(zhí)行時(shí)長(zhǎng)需要5毫秒的任務(wù),在運(yùn)行周期10毫秒無法調(diào)整的情況下,而任務(wù)可細(xì)分時(shí),可以分成多個(gè)子狀態(tài)(子任務(wù))執(zhí)行,如5個(gè)狀態(tài)(子任務(wù)),那么該任務(wù)周期為2毫秒,所有子狀態(tài)(子任務(wù))運(yùn)行時(shí)間依然是10毫秒(理想狀態(tài)下)。

當(dāng)然,這種優(yōu)化需要保證大部分的子狀態(tài)(子任務(wù))執(zhí)行時(shí)長(zhǎng)不要超過時(shí)間片,如果不能保證,那么繼續(xù)細(xì)分多個(gè)子狀態(tài)(子任務(wù)),直到無法繼續(xù)細(xì)分為止(比如IIC/SPI發(fā)送數(shù)據(jù)等場(chǎng)景)。

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;
}
}



審核編輯:湯梓紅

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • mcu
    mcu
    +關(guān)注

    關(guān)注

    146

    文章

    16885

    瀏覽量

    349916
  • 嵌入式
    +關(guān)注

    關(guān)注

    5059

    文章

    18973

    瀏覽量

    302024
  • 中斷處理
    +關(guān)注

    關(guān)注

    0

    文章

    94

    瀏覽量

    10947

原文標(biāo)題:如何優(yōu)化MCU長(zhǎng)耗時(shí)的任務(wù)?

文章出處:【微信號(hào):strongerHuang,微信公眾號(hào):strongerHuang】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏

    評(píng)論

    相關(guān)推薦

    鴻蒙原生應(yīng)用/元服務(wù)開發(fā)-短時(shí)任務(wù)

    概述 應(yīng)用退至后臺(tái)一小段時(shí)間后,應(yīng)用進(jìn)程會(huì)被掛起,無法執(zhí)行對(duì)應(yīng)的任務(wù)。如果應(yīng)用在后臺(tái)仍需要執(zhí)行耗時(shí)不長(zhǎng)的任務(wù),如狀態(tài)保存等,可以通過本文申請(qǐng)短時(shí)任務(wù),擴(kuò)展應(yīng)用在后臺(tái)的運(yùn)行時(shí)間。 約束與
    發(fā)表于 12-28 16:13

    鴻蒙原生應(yīng)用/元服務(wù)開發(fā)-長(zhǎng)時(shí)任務(wù)

    概述 功能介紹 應(yīng)用退至后臺(tái)后,對(duì)于在后臺(tái)需要長(zhǎng)時(shí)間運(yùn)行用戶可感知的任務(wù),例如播放音樂、導(dǎo)航等。為防止應(yīng)用進(jìn)程被掛起,導(dǎo)致對(duì)應(yīng)功能異常,可以申請(qǐng)長(zhǎng)時(shí)任務(wù),使應(yīng)用在后臺(tái)長(zhǎng)時(shí)間運(yùn)行。申請(qǐng)長(zhǎng)
    發(fā)表于 01-09 10:52

    關(guān)于stm32系統(tǒng)定時(shí)任務(wù)的問題

    在用stm32做一個(gè)飛控程序時(shí)。需要用到上面這種系統(tǒng)循環(huán)定時(shí)任務(wù),有一個(gè)問題:在System_Task_Loop函數(shù)里面,有1ms 、2ms、5ms的循環(huán)任務(wù),但是他的這些定時(shí)是怎么得到的?是隨便
    發(fā)表于 10-10 23:43

    Linux系統(tǒng)定時(shí)任務(wù)Crond

    會(huì)定期(默認(rèn)每分鐘檢查一次)檢查系統(tǒng)中是否有要執(zhí)行的任務(wù)工作,如果有,便會(huì)根據(jù)其預(yù)先設(shè)定的定時(shí)任務(wù)規(guī)則自動(dòng)執(zhí)行該定時(shí)任務(wù)工作,這個(gè)crond定時(shí)任務(wù)服務(wù)就相當(dāng)于我們平時(shí)早起使用的鬧鐘一
    發(fā)表于 07-05 06:22

    linux的循環(huán)定時(shí)任務(wù)

    linux循環(huán)定時(shí)任務(wù)
    發(fā)表于 05-20 14:59

    時(shí)任務(wù)的發(fā)展史是怎么樣的

    使用quartz就已經(jīng)升級(jí)了三代,每一代在上一代系統(tǒng)之上有所優(yōu)化,寫這篇文章一方面介紹一下quartz的使用,另一方面可以根據(jù)此項(xiàng)目的變遷反應(yīng)出我司平臺(tái)架構(gòu)升級(jí)的一個(gè)縮影。定時(shí)任務(wù)的使用場(chǎng)景很多,以我們平臺(tái)來講:計(jì)息,派息、對(duì)賬等等。
    發(fā)表于 07-18 17:38 ?0次下載
    定<b class='flag-5'>時(shí)任務(wù)</b>的發(fā)展史是怎么樣的

    Python定時(shí)任務(wù)的實(shí)現(xiàn)方式

    在日常工作中,我們常常會(huì)用到需要周期性執(zhí)行的任務(wù),一種方式是采用 Linux 系統(tǒng)自帶的 crond 結(jié)合命令行實(shí)現(xiàn)。另外一種方式是直接使用Python。接下來整理的是常見的Python定時(shí)任務(wù)
    的頭像 發(fā)表于 10-08 15:20 ?5549次閱讀

    解析Golang定時(shí)任務(wù)庫gron設(shè)計(jì)和原理

    正巧,最近看到了 gron 這個(gè)開源項(xiàng)目,它是用 Golang 實(shí)現(xiàn)一個(gè)并發(fā)安全的定時(shí)任務(wù)庫。實(shí)現(xiàn)非常簡(jiǎn)單精巧,代碼量也不多。今天我們就來一起結(jié)合源碼看一下,怎樣基于 Golang 的能力做出來一個(gè)【定時(shí)任務(wù)庫】。
    的頭像 發(fā)表于 12-15 13:57 ?1272次閱讀

    求一種SpringBoot定時(shí)任務(wù)動(dòng)態(tài)管理通用解決方案

    SpringBoot的定時(shí)任務(wù)的加強(qiáng)工具,實(shí)現(xiàn)對(duì)SpringBoot原生的定時(shí)任務(wù)進(jìn)行動(dòng)態(tài)管理,完全兼容原生@Scheduled注解,無需對(duì)原本的定時(shí)任務(wù)進(jìn)行修改
    的頭像 發(fā)表于 02-03 09:49 ?743次閱讀

    Spring Boot中整合兩種定時(shí)任務(wù)的方法

    框架 Quartz ,Spring Boot 源自 Spring+SpringMVC ,因此天然具備這兩個(gè) Spring 中的定時(shí)任務(wù)實(shí)現(xiàn)策略,當(dāng)然也支持 Quartz,本文我們就來看下 Spring Boot 中兩種定時(shí)任務(wù)
    的頭像 發(fā)表于 04-07 14:55 ?1502次閱讀
    Spring Boot中整合兩種定<b class='flag-5'>時(shí)任務(wù)</b>的方法

    在Spring Boot中如何使用定時(shí)任務(wù)

    本文介紹在 Spring Boot 中如何使用定時(shí)任務(wù),使用非常簡(jiǎn)單,就不做過多說明了。
    的頭像 發(fā)表于 04-12 10:56 ?936次閱讀

    如何動(dòng)態(tài)添加修改刪除定時(shí)任務(wù)?

    如何動(dòng)態(tài)添加修改刪除定時(shí)任務(wù)?那么我們一起看看具體怎么實(shí)現(xiàn),先看下本節(jié)大綱: (1)思路說明; (2)代碼解析; (3)修改定時(shí)任務(wù)執(zhí)行周期特別說明;
    的頭像 發(fā)表于 04-12 11:06 ?1045次閱讀

    Linux如何使用cron進(jìn)行定時(shí)任務(wù)的操作

    按計(jì)劃執(zhí)行命令對(duì)于計(jì)算機(jī)來說非常重要,因?yàn)榧偃缥矣H自去執(zhí)行一些任務(wù)的話,可能會(huì)因?yàn)槎喾矫嬉蛩夭荒馨磿r(shí)執(zhí)行,所以定時(shí)任務(wù)就顯得非常重要了! cron就是一個(gè)能夠執(zhí)行定時(shí)任務(wù)的命令,其實(shí)該命令本身不難,下面小編帶您詳細(xì)了解!
    的頭像 發(fā)表于 05-12 16:27 ?2017次閱讀

    python定時(shí)任務(wù)實(shí)踐

    由于程序需求,監(jiān)測(cè)配置變化需要設(shè)置定時(shí)任務(wù),每分鐘執(zhí)行一次,對(duì)任務(wù)持久化要求不高,不需要時(shí)可以關(guān)閉定時(shí)任務(wù)
    的頭像 發(fā)表于 05-20 17:53 ?947次閱讀
    python定<b class='flag-5'>時(shí)任務(wù)</b>實(shí)踐

    linux定時(shí)任務(wù)的用法總結(jié)

    習(xí)慣了使用 windows 的計(jì)劃任務(wù),使用 linux 中的 crontab 管理定時(shí)任務(wù)時(shí)很不適應(yīng)。
    的頭像 發(fā)表于 08-14 18:16 ?782次閱讀
    linux定<b class='flag-5'>時(shí)任務(wù)</b>的用法總結(jié)