搜索
bottom↓
回复: 141

我认为,程序里delay()用得越少,编程水平越高,你认为呢?

  [复制链接]

出0入0汤圆

发表于 2012-3-25 13:55:23 | 显示全部楼层 |阅读模式
今天看了师兄做的一台仪器的控制程序。
两个步进电机,x和y轴
一个舵机,控制盖子开关
两个泵,5个阀,控制5路液体加样抽样
ssd控制ptc电阻的pid温控,ds18b20
若干个继电器
除了ds18b20的时序用了delay()以外,通篇没有一个delay().
很是佩服

当然,个人愚见,不绝对哈

出0入0汤圆

发表于 2012-3-25 14:13:41 | 显示全部楼层
有一定行数,分多个C文件,多个中断,并且你容易看懂的程序作者水平高

出0入0汤圆

发表于 2012-3-25 14:20:58 | 显示全部楼层
这个不敢说,来听课。

出0入264汤圆

发表于 2012-3-25 14:48:41 | 显示全部楼层
裸机情况下,基本是这样。合理分配CPU的时间资源。

出0入0汤圆

发表于 2012-3-25 14:56:48 | 显示全部楼层
实时性强的应用尽量减少或不用delay,一般应用只要不影响功能用些delay也无妨
和编程水平联系恐怕并不大

出0入0汤圆

发表于 2012-3-25 15:08:08 | 显示全部楼层
针对裸机,理论来说确实如此,如果用系统的话,有点不太适用

出0入228汤圆

发表于 2012-3-25 15:09:55 | 显示全部楼层
多用用状态机嘛

出0入8汤圆

发表于 2012-3-25 15:10:17 | 显示全部楼层
这个和编程水平关系不是很大的    只要不影响功能  使用些也无所谓的   不过我基本没有用过, 我喜欢用事件驱动的。  

出0入0汤圆

发表于 2012-3-25 16:25:04 | 显示全部楼层
学习

出0入0汤圆

发表于 2012-3-25 16:25:39 | 显示全部楼层
学习

出0入0汤圆

发表于 2012-3-25 16:27:28 | 显示全部楼层
本帖最后由 MiniCat 于 2012-3-25 16:28 编辑

卡了下 一下发了2条出去

刚开始学习单片机的时候 什么都用Delay 现在除了时序严格的底层驱动外 基本不咋用啦

出0入22汤圆

发表于 2012-3-25 17:37:47 | 显示全部楼层
Delay 全部换成 装入定时器,等中断。

该等的地方还是等等。

出0入17汤圆

发表于 2012-3-25 17:40:20 | 显示全部楼层
不一定!!

出0入0汤圆

发表于 2012-3-25 18:07:32 | 显示全部楼层
我个人认为,delay()使用在两种情况下:
第一种情况:需要短时间延时。这种情况出现在驱动层较多,涉及到对硬件操作时序的时间问题。通常的延时时间为us级,对于us级的延时采用定时器可能更为麻烦。而采用程序delay()延时并不会影响系统性能,而且能够简化程序设计;
第二种情况:需要ms级的延时。这种情况下既可以采用定时器做,也可以采用delay()做。前提是,采用程序delay()做时不能影响系统性能。
所以采用哪种程序延时看需要,一味反对和歧视delay()其实是一种不成熟的行为,这就和一味反对goto语句一样。如果做硬件驱动时,需要等待一个us而采用定时器做,那反而问题更大了。

说一下delay()的优劣:
优势:实现简单,简化程序设计;
劣势:延时时间越大,对系统的实时性影响越大。
认清了它的优势和劣势,我们就知道什么时候使用delay(),什么时候使用定时器了。大量使用和完全不用,都是两个极端。权衡利弊,在合适的时候选择最合适的,才是正确的做法。

出0入0汤圆

发表于 2012-3-25 18:09:19 | 显示全部楼层
拿                       分

出0入0汤圆

发表于 2012-3-25 18:10:24 | 显示全部楼层
初始化的工作用延时是没关系的.

出0入0汤圆

发表于 2012-3-25 18:10:39 | 显示全部楼层
与编程水平没关系!

出0入0汤圆

发表于 2012-3-25 18:30:28 | 显示全部楼层
本帖最后由 Anqi90 于 2012-3-25 18:31 编辑

只要能实现功能,不影响目标的实现,用多少都没问题

个人认为水平的高低取决于能不能实现设计要求,实现的怎么样,而不是用的什么样的编程方法

同样的道理,能不能说“用ARM的水平都比用51的高”呢?

只要不影响目标的实现,用delay也无妨,反而可以降低对单片机的要求(需要有定时器),能降低成本的设计不是好设计吗?

有时候即使节约出来的系统时间也是在计时器里做累加而已,不需要实时性的情况下和delay没有区别

反过来说,如果需要实时性的情况下还能用delay把功能实现的很好,这才叫高水平,因为可以降低对片上资源的要求,降低成本

出0入0汤圆

发表于 2012-3-25 18:57:36 | 显示全部楼层
工具讲究的是趁手和实用,尺有所短寸有所长

出0入0汤圆

发表于 2012-3-25 19:04:01 | 显示全部楼层
我的程序里从不用delay

出0入0汤圆

发表于 2012-3-25 19:16:45 | 显示全部楼层
如楼上所说,在写驱动用的较多

出0入0汤圆

发表于 2012-3-25 19:31:53 | 显示全部楼层
Goselff 发表于 2012-3-25 18:07
我个人认为,delay()使用在两种情况下:
第一种情况:需要短时间延时。这种情况出现在驱动层较多,涉及到对 ...

赞一个!!!

出70入0汤圆

发表于 2012-3-25 21:02:08 | 显示全部楼层
以前常用 ,现在用标志,定时器!感觉一个延时要用到两个标志,一个变量,有点浪费。不知道你们是怎么用的?

出0入0汤圆

发表于 2012-3-26 12:57:43 | 显示全部楼层
又学习了  !我感觉 那种方式简单 用哪个

出0入0汤圆

发表于 2012-3-26 17:44:10 | 显示全部楼层
这个应该就像讨论PCB走线拐直角一样的吧,拿分走人。

出0入0汤圆

发表于 2012-3-26 18:43:38 | 显示全部楼层
以前在学校用一个2051控制7-8种外设,想进各种办法引脚复用时序穿插,真痛苦
但是现在不同了,资源充裕的时候你爱怎么着就怎么着吧

出0入0汤圆

发表于 2012-3-26 18:48:41 | 显示全部楼层
牛人可以利用其它必须要的进程消耗的时间来巧妙替代这个纯粹的延时,虽然这样做效率很高,但是还是很麻烦的!作为程序后期的精简优化还是可以的

出0入0汤圆

发表于 2012-3-26 18:49:17 来自手机 | 显示全部楼层
学习了

出0入0汤圆

发表于 2012-3-26 18:58:35 来自手机 | 显示全部楼层
没有必然联系

出0入0汤圆

发表于 2012-3-26 19:01:21 | 显示全部楼层
敢说的这么绝对?

出0入0汤圆

发表于 2012-3-26 19:07:10 | 显示全部楼层
怎么舒服怎么用,那些考试出的刁钻试题,实际编程中很多是大忌。

出0入0汤圆

发表于 2012-3-26 19:14:01 | 显示全部楼层
学习模式

出10入10汤圆

发表于 2012-3-26 19:16:58 | 显示全部楼层
短时间延时还是可以用一下的,比如DS18b20

出0入0汤圆

发表于 2012-3-26 19:25:24 | 显示全部楼层
有些地方时序要求严格的地方用还是方便点吧

出0入0汤圆

发表于 2012-3-26 19:35:53 | 显示全部楼层
要是有while for 语句构成的死等的延时,对于跑系统不可取,这样在延时的循环中别的任务都没法处理了。。。。。。。。。
建议结合中断,用累加的方法来控制时间.........

出0入0汤圆

发表于 2012-3-26 19:42:09 | 显示全部楼层
模块编程

出0入0汤圆

发表于 2012-3-26 19:43:07 | 显示全部楼层
看来还是要多学习啊

出0入0汤圆

发表于 2012-3-26 20:19:09 | 显示全部楼层
俺从不用DELAY,俺用OS
但从没觉得自己水平高,倒是觉得折腾出OS和那么多编程理论的人太牛逼

出0入0汤圆

发表于 2012-3-26 20:21:23 | 显示全部楼层
哪种情况下用哪个,就像讨论goto使用一样,比讨论goto稍微意义大点点

出0入0汤圆

发表于 2012-3-26 20:35:34 | 显示全部楼层
个人认为,不能以此做判断的标准,能满足实际使用即可,没必要太执着

出0入0汤圆

发表于 2012-3-26 20:42:27 | 显示全部楼层
了解下...

出0入0汤圆

发表于 2012-3-26 20:47:09 | 显示全部楼层
实现产品功能,稳定就可以了,速度交给mcu厂商,反正芯片速度越来越快,现在一个delay(0xff_ffff)才差不多1S

出0入0汤圆

发表于 2012-3-26 20:49:49 | 显示全部楼层
这个应该看情况而论的,我现在做单片机的思路是喜欢用状态机实现。

出0入0汤圆

发表于 2012-3-26 20:51:33 | 显示全部楼层
逻辑的情况下基本同意

出0入0汤圆

发表于 2012-3-26 20:52:34 | 显示全部楼层
本帖最后由 wangguanfu 于 2012-3-26 20:53 编辑

不见得,具体情况具体论

出0入0汤圆

发表于 2012-3-26 20:59:35 | 显示全部楼层
Goselff 发表于 2012-3-25 18:07
我个人认为,delay()使用在两种情况下:
第一种情况:需要短时间延时。这种情况出现在驱动层较多,涉及到对 ...

支持13楼的说法:大量使用和完全不用,都是两个极端。权衡利弊,在合适的时候选择最合适的,才是正确的做法。

出0入55汤圆

发表于 2012-3-26 21:12:08 | 显示全部楼层
和编程能力无关,和编程思路有关,时间触发和事件触发。

出0入0汤圆

发表于 2012-3-26 21:21:24 | 显示全部楼层
这个不能一概而论吧,编程水平俺觉得应该看整个程序的结构、思路啥的,软件延时用的少只能算是其中一方面。

出0入0汤圆

发表于 2012-3-26 21:25:04 | 显示全部楼层
已阅,拿分,谢谢

出0入0汤圆

发表于 2012-3-26 21:40:29 | 显示全部楼层
咱以为该用delay还得用,一般几十us级以上还是不用为好。

出0入42汤圆

发表于 2012-3-26 21:44:04 | 显示全部楼层
定时器,管理所有延时。
做过多线程的会有这方面体会。 定时器,网络消息,用户消息。
MCU平时闲得弹疼那种系统就没必要了。太麻烦。

写个驱动,把你的定时器处理函数注册进去,每个定时任务有不同的函数,还可以有type什么的。到点的时候底层挨个调函数就是了。当然不允许在定时器回调函数里面放delay的

出0入0汤圆

发表于 2012-3-26 21:49:42 | 显示全部楼层
delay意味着CPU空转,越少确实越好
不过,在IO模拟SPI或IIC时,delay又必不可少

出0入0汤圆

发表于 2012-3-27 08:34:50 | 显示全部楼层
不看广告 看疗效    实用的稳定的才是最好的

出0入0汤圆

发表于 2012-3-27 08:37:01 | 显示全部楼层
控制各种器件 需要等待的 你不等待行不?

出0入0汤圆

发表于 2012-3-27 08:46:05 | 显示全部楼层
又学习了

出0入0汤圆

发表于 2012-3-27 08:55:16 | 显示全部楼层
要看怎么 用吧!这个有点绝对了

出0入0汤圆

发表于 2012-3-27 09:07:20 | 显示全部楼层
新坛第一帖~~

出0入476汤圆

发表于 2012-3-27 09:09:41 | 显示全部楼层
这要看应用情况。有的时候要求实时性很强的话真只能干等

出0入0汤圆

发表于 2012-3-27 09:20:37 | 显示全部楼层
稳定可靠最重要、实现了功能就可以

出0入0汤圆

发表于 2012-3-27 09:22:47 | 显示全部楼层
合理用用还是很好滴

出0入0汤圆

发表于 2012-3-27 10:17:27 | 显示全部楼层
合理运用才是正道

出0入0汤圆

发表于 2012-3-27 10:20:42 | 显示全部楼层
试情况而定

出0入0汤圆

发表于 2012-3-27 10:25:28 | 显示全部楼层
不敢说
us级延时有些地方不得不用。mS级就不应该用延时了

出0入0汤圆

发表于 2012-3-27 10:28:54 | 显示全部楼层
Goselff 发表于 2012-3-25 18:07
我个人认为,delay()使用在两种情况下:
第一种情况:需要短时间延时。这种情况出现在驱动层较多,涉及到对 ...

赞一个

出0入0汤圆

发表于 2012-3-27 10:36:01 | 显示全部楼层
如果要控制多个模块的上电时序,延时的使用是不可避免的!

出0入0汤圆

发表于 2012-3-27 10:36:43 | 显示全部楼层
以前看别人程序延时真不少。
大概用了半年时间才学会用定时器处理。可还是有的麻烦,会打断别的程序时序造成混乱。比如液晶。
如果强时序或不能中断的程序又会破坏定时器节拍。不好整啊。
可以在定时器设标志,在主程序中查询处理时序会好些,也可被打断。问题没有根本解决。没有好办法,没有一劳永宜的办法。
还没用过操作系统,不知效果怎样。
方向没错。具体情况具体定。

出0入0汤圆

发表于 2012-3-27 10:38:02 | 显示全部楼层
14楼正解

出0入0汤圆

发表于 2012-3-27 11:20:52 | 显示全部楼层
这个不一定吧......

出0入0汤圆

发表于 2012-3-27 11:25:08 | 显示全部楼层
我觉得可以鉴别是未入门或已入门的吧,入门后的DELAY就看情况了

出0入0汤圆

发表于 2012-3-27 12:28:31 | 显示全部楼层
本人觉得这个没有直接关系,根据具体系统情况而定。

出0入0汤圆

发表于 2012-3-27 12:41:47 | 显示全部楼层
wangxb330226 发表于 2012-3-27 11:25
我觉得可以鉴别是未入门或已入门的吧,入门后的DELAY就看情况了


本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入0汤圆

发表于 2012-3-27 12:47:18 | 显示全部楼层
个人认为和编程水平高低没有多大关系

出0入296汤圆

发表于 2012-3-27 12:52:32 | 显示全部楼层
LZ说的Delay应该是那种阻塞式Delay。
在裸机情况下,大家能使用的只有主循环和中断处理程序组成的前后台系统。无论是前台还是后台,用阻塞式的代码,比如Delay,用的多了,自然自然就一根筋了……
其实我倒觉得:在大量使用Delay的情况下,还能完成应用的才是奇葩啊!~

出0入0汤圆

发表于 2012-3-27 12:53:10 | 显示全部楼层
没啥关系。

出0入0汤圆

发表于 2012-3-27 12:56:00 | 显示全部楼层
能写出功能强大,模块化,看起来舒服,维护方便的代码,那才叫功力

出0入0汤圆

发表于 2012-3-27 12:59:06 | 显示全部楼层
Anqi90 发表于 2012-3-25 18:30
只要能实现功能,不影响目标的实现,用多少都没问题

个人认为水平的高低取决于能不能实现设计要求,实现的 ...

同意这个观点,可以用只要不影响系统的实时性就可以了!

出0入0汤圆

发表于 2012-3-27 13:07:28 | 显示全部楼层
新手路过!!

出0入0汤圆

发表于 2012-3-27 13:13:59 | 显示全部楼层
拿钱走人

出0入0汤圆

发表于 2012-3-27 13:14:09 | 显示全部楼层
学习中……

出0入0汤圆

发表于 2012-3-27 13:19:30 | 显示全部楼层
delay()从某种意义上说确实是在浪费处理器的处理能力,但是也不一定。
如果有多个并行的外设要访问,在主函数中访问的外设用delay(),其他所有外设的访问都有中断方式,这样处理器资源的利用率也同样很高。

出0入0汤圆

发表于 2012-3-27 14:12:41 | 显示全部楼层
在我看来,好的程序应该有几个标准
1,完成设计的指标,用不用delay是你的事,我要的指标必须完成,只要程序稳定,生产没出问题,哪怕你用了100个delay调用,我都认为是很好的程序。(用了几年状态机后,现在我反而倾向去使用delay死等了
,因为这个可以很大的简化逻辑思维,特别是遇到逻辑很繁琐的情况,你会感觉到这样的架构有无比的魅力。不是说哪种好,重要的是实际情况实际分析)

2,容易修改,因为程序需要功能修改,经常维护升级,增减功能都是家常便饭。我不管你用不用模块化,只要你的程序很容易修改,例如删除一个功能,只需要在头文件定义一下,就将该功能全部涉及的部分都
删除,这就是好程序。(不过说实话,当你想通了具体是怎么做的时候,你就已经懂得什么是模块化了)

另外,一般刚入门的同学都很喜欢和别人比比水平谁高。 :-)

出0入0汤圆

发表于 2012-3-27 15:41:28 | 显示全部楼层
加NOP,,,,,,,,,,,,

出0入10汤圆

发表于 2012-3-28 09:24:16 | 显示全部楼层
我还经常用DELAY()啊,这个多方便啊。。。。。。

出0入0汤圆

发表于 2012-3-28 10:01:30 | 显示全部楼层
这个不一定吧。

出0入0汤圆

发表于 2012-3-28 10:16:05 | 显示全部楼层
来听课学习的

出0入0汤圆

发表于 2012-3-28 10:17:20 | 显示全部楼层
未必                             
这个得看具体情况!!

出0入0汤圆

发表于 2012-3-28 10:29:49 | 显示全部楼层
个人觉得扯不到好大的关系,自要你合理安排了mcu的资源就ok

出0入0汤圆

发表于 2012-3-28 10:36:54 | 显示全部楼层
按需使用~

出0入0汤圆

发表于 2012-3-28 10:56:05 | 显示全部楼层
如果系统要做的事情很多想用delay也没法用啊,只能靠定时器

出0入0汤圆

发表于 2012-3-28 11:26:35 | 显示全部楼层
低端单片机定时器资源本来就少,us级的延时还是delay来的划算。

出0入0汤圆

发表于 2012-3-28 11:44:21 | 显示全部楼层
两者没有必然的联系吧,

出0入296汤圆

发表于 2012-3-28 13:06:08 | 显示全部楼层
Etual 发表于 2012-3-27 14:12
在我看来,好的程序应该有几个标准
1,完成设计的指标,用不用delay是你的事,我要的指标必须完成,只要程 ...

看来你用状态机的时候碰了不少壁……我用的时候,规模一大,自己觉得没有什么,合作的人就抱怨了
说根本看不懂……哈哈哈哈哈哈……
稳定性方面,我倒觉得状态机稳定性更高,因为逻辑可控,行为确定。至于用不用Delay,完全是另外
一回事。
BTW,写代码的人什么时候能不比高下了,差不多就是要赚大钱的时候了。

出0入0汤圆

发表于 2012-3-28 13:28:21 | 显示全部楼层
jssd 发表于 2012-3-26 21:12
和编程能力无关,和编程思路有关,时间触发和事件触发。

同意。说的好

出0入0汤圆

发表于 2012-3-28 16:15:41 | 显示全部楼层
与编程水平没关系!

主要看具体应用了,对应那些要求实时性很高的地方尽量少用

其他地方要求不高的,用了也无妨,只要做出的东西可靠好用就行,黑猫白猫都是好猫。

CVAVR还有delay.H呢,供我们来引用

出0入0汤圆

发表于 2012-3-28 16:34:23 | 显示全部楼层
这个看你系统的复杂情况了,如果任务很多的话,模块函数里尽量少用,尽可能的使用定时器加状态机的方式,如果系统资源充足,那就爱咋咋,反正不影响性能,不是?

出0入0汤圆

发表于 2012-3-28 17:49:17 | 显示全部楼层
Goselff 发表于 2012-3-25 18:07
我个人认为,delay()使用在两种情况下:
第一种情况:需要短时间延时。这种情况出现在驱动层较多,涉及到对 ...

出0入0汤圆

发表于 2012-3-28 18:52:40 | 显示全部楼层
这标准太绝对了,看系统要求吧

出0入0汤圆

发表于 2012-3-28 19:08:51 | 显示全部楼层
这不能一概而论,我认为能自主弄个UCOSII之类的东东着实是高,这个论坛里的'傻孩子”水平不错,是我等平庸之辈学习之榜样。这不是恭维的话,的确佩服他。

出0入0汤圆

发表于 2012-3-28 19:09:39 | 显示全部楼层
这不能一概而论,我认为能自主弄个UCOSII之类的东东着实是高,这个论坛里的'傻孩子”水平不错,是我等平庸之辈学习之榜样。这不是恭维的话,的确佩服他。另外就是自己遇到问题能想出办法解决问题那就OK了,能成为科学家或专家的能有几个,我等就是个技术工人而已。

出0入0汤圆

发表于 2012-3-29 01:07:15 | 显示全部楼层
Gorgon_Meducer 发表于 2012-3-28 13:06
看来你用状态机的时候碰了不少壁……我用的时候,规模一大,自己觉得没有什么,合作的人就抱怨了
说根本 ...

呵呵,可能你不用汇编吧,我用汇编写些稍微复杂点的状态机就烦的想死,主要是标号太多了,一个 switch 和 十来个
case ,得用多少标号才能处理好 ... 而且容易出错,烦死人了。
状态机理论本身是稳定的,我说的不稳定只是写的程序容易出错,因为一个功能模块分割为多块去实现了,经常容易
忘记某一块的初始化或者释放变量了, so~~
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-4-19 01:54

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

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