搜索
bottom↓
回复: 20

主函数的轮询讨论

[复制链接]

出0入0汤圆

发表于 2013-12-2 16:57:14 | 显示全部楼层 |阅读模式
void main(void)
{
        init();
       
        while(1)
        {
                founcationA();
                founcationB();
                ...
                feeddog();
        }
}

如果founcationA执行时间比较长,造成founcationB响应不及时,大家都是怎么解决?



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

曾经有一段真挚的爱情摆在我的面前,我没有珍惜,现在想起来,还好我没有珍惜……

出0入0汤圆

 楼主| 发表于 2013-12-2 17:00:37 | 显示全部楼层
如果founcationB执行时间短,放在定时器内不会对其他方面造成影响的话,我一般在定时器内执行。但是总感觉差点火候,各位大神有没有什么好的解决方法?

出0入0汤圆

发表于 2013-12-2 17:01:08 | 显示全部楼层
B函数需要多快执行? 比如 1ms  10ms?
你的A执行又是多久

出0入0汤圆

 楼主| 发表于 2013-12-2 17:01:51 | 显示全部楼层
要是VC就好了,可以开几个线程,但是单片机的话,应该怎么解决啊?

出0入0汤圆

发表于 2013-12-2 17:06:24 | 显示全部楼层
founcationA=founcationA1+founcationA2

出0入0汤圆

 楼主| 发表于 2013-12-2 17:06:30 | 显示全部楼层
severewinner 发表于 2013-12-2 17:01
B函数需要多快执行? 比如 1ms  10ms?
你的A执行又是多久

假如B需要在10ms内响应,而A执行时间为1s。
我的意思是假如俩函数在响应上发生冲突时应该怎么办

出0入0汤圆

 楼主| 发表于 2013-12-2 17:13:04 | 显示全部楼层
khuohuo 发表于 2013-12-2 17:06
founcationA=founcationA1+founcationA2

谢谢。
拆开倒是可以。
如果能两个能并发执行的话就好了,必须上操作系统?

出0入0汤圆

发表于 2013-12-2 17:14:37 | 显示全部楼层
cumthe 发表于 2013-12-2 17:13
谢谢。
拆开倒是可以。
如果能两个能并发执行的话就好了,必须上操作系统? ...

你说对了,不拆是没有办法的,你都说了不想放在中断里。

如果a是1s,证明你的函数结构有明显问题啊,你a里面干嘛了?

出0入0汤圆

发表于 2013-12-2 17:19:20 | 显示全部楼层
几十ms以上一般都是软件延时了,用状态机拆开就不需要并行,论坛里有很多这种帖子

出0入0汤圆

 楼主| 发表于 2013-12-2 17:22:49 | 显示全部楼层
severewinner 发表于 2013-12-2 17:14
你说对了,不拆是没有办法的,你都说了不想放在中断里。

如果a是1s,证明你的函数结构有明显问题啊,你a ...

谢谢。
a里面有好几个电机动作,并且电机都是连环性的,等检测到一个电机到位了,才能动另一个。

出0入0汤圆

发表于 2013-12-2 17:26:30 | 显示全部楼层
cumthe 发表于 2013-12-2 17:22
谢谢。
a里面有好几个电机动作,并且电机都是连环性的,等检测到一个电机到位了,才能动另一个。 ...

你那什么电机,我猜你的电机执行至少ms级别的吧,你可以不等待,因为你的函数该不长,执行一圈也就是  几个毫秒,再看看状态机的思想,好好领悟一下再改函数

如果你想先完成项目就放在定时器里吧,

出0入42汤圆

发表于 2013-12-2 17:30:19 | 显示全部楼层
电机动起来后, 到位触发中断, 如果确认不可能那么快, 接下来干别的, 干完再看看电机到了没. 用线程没问题, 只会用线程问题就大了.

出0入0汤圆

 楼主| 发表于 2013-12-2 17:50:38 | 显示全部楼层
severewinner 发表于 2013-12-2 17:26
你那什么电机,我猜你的电机执行至少ms级别的吧,你可以不等待,因为你的函数该不长,执行一圈也就是  几 ...

谢谢。
直流电机,其实很多时间都在等,但是一圈执行下来就得1-2s。我看看状态机吧。
如果能达到效果: 任务A还没执行完,任务B可能执行了好几次了  就好了。

出0入0汤圆

 楼主| 发表于 2013-12-2 17:56:09 | 显示全部楼层
albert_w 发表于 2013-12-2 17:30
电机动起来后, 到位触发中断, 如果确认不可能那么快, 接下来干别的, 干完再看看电机到了没. 用线程没问题,  ...

谢谢。其实任务B,很快就执行完了,轮询一圈完全是在等待。
我想达到的效果是: 任务A还没执行完,任务B可能已经执行了好几次了。
做过一段时间上位机,受那个影响很大 ,感觉上位机比单片机容易上手,并且还简单点儿

出0入10汤圆

发表于 2013-12-2 18:00:19 | 显示全部楼层
怪不得电脑的软件要硬件越来越强大才行。

出0入42汤圆

发表于 2013-12-2 18:48:54 | 显示全部楼层
cumthe 发表于 2013-12-2 17:56
谢谢。其实任务B,很快就执行完了,轮询一圈完全是在等待。
我想达到的效果是: 任务A还没执行完,任务B ...

因为你做的上位机太森破了

出0入0汤圆

发表于 2013-12-2 19:39:35 | 显示全部楼层
执行时间长的分段执行

出0入0汤圆

 楼主| 发表于 2013-12-2 21:05:29 | 显示全部楼层
SNOOKER 发表于 2013-12-2 19:39
执行时间长的分段执行

之前说的数据都是假设。
我把时间精简到最短,这样一个流程下来还是要3s,机械位不允许电机同时运动,所以只能A电机到位后,B电机再运动,时间不能在缩短了。
其他任务只是改变个io电平什么的。
所以我感觉其他任务放在定时器里应该是比较好的一个解决方案。

出0入0汤圆

发表于 2013-12-2 21:14:52 | 显示全部楼层
状态机能够解决的吧。

出0入0汤圆

发表于 2013-12-4 15:08:08 | 显示全部楼层
也许马老师的按键 状态机思路能帮到你

出0入0汤圆

发表于 2013-12-4 15:12:53 | 显示全部楼层
毫无疑问是用状态机……
电机驱动也就控制继电器、开关管动作的那一瞬间,几us就搞定了……所以可以通过状态机来不停查询时间到没有、输出动作、结束没有……
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-8-26 18:43

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

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