搜索
bottom↓
回复: 16

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

[复制链接]

出0入4汤圆

发表于 2012-12-9 16:09:18 | 显示全部楼层 |阅读模式
比如这里的两个函数有如下的情况,这里的要求有点钻牛角尖,但实际应用时相似的情况会有的。

出现这样的问题:如果执行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执行一次,

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

阿莫论坛20周年了!感谢大家的支持与爱护!!

知道什么是神吗?其实神本来也是人,只不过神做了人做不到的事情 所以才成了神。 (头文字D, 杜汶泽)

出110入0汤圆

发表于 2012-12-9 17:52:16 | 显示全部楼层
两个必须,怎么都不能同时满足呀

出0入0汤圆

发表于 2012-12-9 18:22:34 | 显示全部楼层
必须不能被中断,那就说明需要多核处理器了。

出0入42汤圆

发表于 2012-12-9 19:04:05 | 显示全部楼层
把第一个任务拆掉吧。500ms多半有大量延时在里面。

出0入4汤圆

 楼主| 发表于 2012-12-9 21:44:00 | 显示全部楼层
是的,我在这里的说过这“要求有点钻牛角尖,但实际应用时相似的情况会有的”
500MS是一个我给定的一个条件。但有时大量的延时在里面不一定能去掉的。有时这个500MS是处理一堆数据呢?

出0入76汤圆

发表于 2012-12-10 00:07:55 | 显示全部楼层
一堆数据处理不能拆分么,把一个长任务,分成若干个短的任务片,类似于一个状态顺序的结构。
不知为什么会不可以呢??

出0入264汤圆

发表于 2012-12-10 00:19:36 来自手机 | 显示全部楼层
想都不用想,肯定无解,单片机上面多任务不是这么玩的。

出0入0汤圆

发表于 2012-12-10 08:52:45 | 显示全部楼层
首先明确 do_work1 是否真的 500ms 都在计算,还是说有很多ms级别的延时函数。
如果都在计算,则无解,CPU速度不够快,果断换CPU。
如果很多延时函数,则可以使用状态机的办法将 do_work1 分解为多个状态不同的执行。

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

出0入0汤圆

发表于 2012-12-10 09:03:30 | 显示全部楼层
do_work2如果不给打断怎么可以给do_work1执行30ms一次的机会呢?
我觉得直接做一个30ms的中断,给到do_work1去执行,do_work2放在主程序中执行.

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

出0入4汤圆

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

出0入93汤圆

发表于 2012-12-10 09:45:23 | 显示全部楼层
PICTURE 发表于 2012-12-10 09:06
实际应用时就遇到这样的一个类似的问题:
一只单片机实现功能1:运行液晶刷新,2:控制响应外部机构快速动 ...

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

出0入0汤圆

发表于 2012-12-10 11:39:45 | 显示全部楼层
PICTURE 发表于 2012-12-10 09:06
实际应用时就遇到这样的一个类似的问题:
一只单片机实现功能1:运行液晶刷新,2:控制响应外部机构快速动 ...

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

出0入0汤圆

发表于 2012-12-10 11:43:46 | 显示全部楼层
himm007 发表于 2012-12-10 11:39
刷屏也可以拆成好几部分,先刷一部分, 然后做其他事情;再回来刷第二部分,接着做其他事情; 尽量不要独 ...

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

出0入0汤圆

发表于 2012-12-10 15:58:53 | 显示全部楼层
你都了,必须,那就无解了
但是实际中,你可能钻进死胡同了。
任何事务都可以分解为多个部分组成
如果照你说的必须,那就只能依靠换方案了,比如多核

出0入0汤圆

发表于 2012-12-10 16:06:45 | 显示全部楼层
PICTURE 发表于 2012-12-9 21:44
是的,我在这里的说过这“要求有点钻牛角尖,但实际应用时相似的情况会有的”
500MS是一个我给定的一个条件 ...

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

出0入0汤圆

发表于 2012-12-10 16:31:46 | 显示全部楼层
如果不是TFT,我想不懂有啥需要500ms刷新的。如果是TFT,一般都有DMA了.....

出0入0汤圆

发表于 2013-4-10 09:36:14 来自手机 | 显示全部楼层
学习一下....
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-7-24 03:28

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表