PICTURE 发表于 2012-12-9 16:09:18

如何解决任务长时间占用CPU资源的问题

比如这里的两个函数有如下的情况,这里的要求有点钻牛角尖,但实际应用时相似的情况会有的。

出现这样的问题:如果执行do_work1()时,do_work2();就会被延时了。

暂时想到的解决方法:
如果用中断执行do_work2(),那么do_work1()也实现不了不能被中断的要求。
如果用操作系统实现,do_work2()设优先级比do_work1()高,当do_work2()释放CPU 资源后执行do_work1()时,当do_work1()还没有释放CPU 资源。do_work2();也会被延时。
但发生OS时钟中断时会实现任务切换执行do_work1()。那么do_work1()也实现不了不能被中断的要求

这样的问题各位大大一般如何解决?

void task1(void)
{
        do_work1();                //执行时占用了500ms 必须占用CPU资源不能被中断

        do_work2();                //执行时占用了10MS,必须每30ms执行一次,

        //还有其它的操作函数。。
}

Flyback 发表于 2012-12-9 17:52:16

两个必须,怎么都不能同时满足呀

dr2001 发表于 2012-12-9 18:22:34

必须不能被中断,那就说明需要多核处理器了。

jimmy_xt 发表于 2012-12-9 19:04:05

把第一个任务拆掉吧。500ms多半有大量延时在里面。

PICTURE 发表于 2012-12-9 21:44:00

是的,我在这里的说过这“要求有点钻牛角尖,但实际应用时相似的情况会有的”
500MS是一个我给定的一个条件。但有时大量的延时在里面不一定能去掉的。有时这个500MS是处理一堆数据呢?

foxpro2005 发表于 2012-12-10 00:07:55

一堆数据处理不能拆分么,把一个长任务,分成若干个短的任务片,类似于一个状态顺序的结构。
不知为什么会不可以呢??

mcu_lover 发表于 2012-12-10 00:19:36

想都不用想,肯定无解,单片机上面多任务不是这么玩的。

Etual 发表于 2012-12-10 08:52:45

首先明确 do_work1 是否真的 500ms 都在计算,还是说有很多ms级别的延时函数。
如果都在计算,则无解,CPU速度不够快,果断换CPU。
如果很多延时函数,则可以使用状态机的办法将 do_work1 分解为多个状态不同的执行。

如果是OS的话,可以将 do_work2 设置优先级比 do_work1 高,每次TICK延时到了之后 do_work2 总能抢占 do_work1
这点和使用中断差不多的。

zhonggp 发表于 2012-12-10 09:03:30

do_work2如果不给打断怎么可以给do_work1执行30ms一次的机会呢?
我觉得直接做一个30ms的中断,给到do_work1去执行,do_work2放在主程序中执行.

我记得当时傻孩子有发过一个这样的框架.就前不久

PICTURE 发表于 2012-12-10 09:06:12

实际应用时就遇到这样的一个类似的问题:
一只单片机实现功能1:运行液晶刷新,2:控制响应外部机构快速动作,
就遇到以上的问题了。如运行液晶刷新(这时不能在刷屏时中断,否则显示会有花屏)但这时运行的外部机构检测点不能及时响应,引起机构动作超过规定范围。
需然减慢了液晶的刷新时间能基本实现功能要求。但也会存在以上的问题。如果有好的方法当然把这个问题解决了就好。如果这个是无解的。就需要两只CPU 来实现了。

takashiki 发表于 2012-12-10 09:45:23

PICTURE 发表于 2012-12-10 09:06 static/image/common/back.gif
实际应用时就遇到这样的一个类似的问题:
一只单片机实现功能1:运行液晶刷新,2:控制响应外部机构快速动 ...

嗯,不错,液晶刷新必须独占500ms,这不明摆着做幻灯片嘛!既然是做幻灯片,中间稍稍打断一下又有何妨。一开始的架构就错了,后面再怎么纠结都没有用。换牛X的U,或多U。

himm007 发表于 2012-12-10 11:39:45

PICTURE 发表于 2012-12-10 09:06 static/image/common/back.gif
实际应用时就遇到这样的一个类似的问题:
一只单片机实现功能1:运行液晶刷新,2:控制响应外部机构快速动 ...

刷屏也可以拆成好几部分,先刷一部分, 然后做其他事情;再回来刷第二部分,接着做其他事情; 尽量不要独占CPU太长时间

lpc1788 发表于 2012-12-10 11:43:46

himm007 发表于 2012-12-10 11:39 static/image/common/back.gif
刷屏也可以拆成好几部分,先刷一部分, 然后做其他事情;再回来刷第二部分,接着做其他事情; 尽量不要独 ...

定时器模拟N个软件中断就可以实现了

orzorzorzorz 发表于 2012-12-10 15:58:53

你都了,必须,那就无解了
但是实际中,你可能钻进死胡同了。
任何事务都可以分解为多个部分组成
如果照你说的必须,那就只能依靠换方案了,比如多核

tiancaigao7 发表于 2012-12-10 16:06:45

PICTURE 发表于 2012-12-9 21:44 static/image/common/back.gif
是的,我在这里的说过这“要求有点钻牛角尖,但实际应用时相似的情况会有的”
500MS是一个我给定的一个条件 ...

只要这个任务里面有延迟,就意味着他可以被拆分,延迟应该主动放弃CPU。而不是机械的让CPU空转。

Etual 发表于 2012-12-10 16:31:46

如果不是TFT,我想不懂有啥需要500ms刷新的。如果是TFT,一般都有DMA了.....

jz701209李 发表于 2013-4-10 09:36:14

学习一下....
页: [1]
查看完整版本: 如何解决任务长时间占用CPU资源的问题