搜索
bottom↓
楼主: yrloy

【原创】最高效率使用单片机,放弃程序中的延时函数

  [复制链接]

出0入0汤圆

 楼主| 发表于 2010-10-10 14:50:03 | 显示全部楼层
回复【101楼】xiaobendan 仲跻东
如果是像操作18b20那一点器件的精确到几个微妙的延时,不用delay()怎么办?
-----------------------------------------------------------------------

嗯,还是要分场合的,通常如果一个延时小于单指令周期的100 倍,比如8M频的AVR,100*0.125=12.5us,但凡小于此的延时都不能用定时中断,也没必要用~

但像毫秒级的延时,已经是单指令周期8000倍以上的重量级资源,毫秒级延时也是我们用的最多的,这样的有必要,也应该回收。

出0入0汤圆

发表于 2010-10-10 15:09:51 | 显示全部楼层

出0入0汤圆

发表于 2010-10-10 16:57:14 | 显示全部楼层
多任务操作方式确实有许多优点,可以实现在微观上串行,而在宏观上并行的运行效果。虽然系统本身会占用一点点硬件、软件资源,但在编写复杂程序的时候,确实让人感到它的强大。举一个最直接好处:它节省了编程的时间。
    一直想实现一个自已的AVR多任务操作系统,但由于能力所限,至今没能满意实现,只完成了一半的代码,感觉其工作效率不高,几乎就放弃了(郁闷哪)。真正实现这样一个系统,其实是很难的,需要考虑的东西太多,只能期待高手大作了。
    只是,在编写这个系统的时候,感觉到,多任务系统也不是万能的,有些场合,用多任务系实现,反而不好。如DS18B20的读写、IO口模拟的串行数据通信等,需要用到若干种延时时间片,有长有短,这些场合,还是普通的编程方式好用。

    说得不对,请大家包涵哦。I m 菜鸟,刚来到论坛(在校本科生),想学着融入这个大家庭。
    (喜欢101楼、102楼,说话简洁、有力。不像我,太罗嗦 ^_^)

出0入0汤圆

发表于 2010-10-10 20:01:34 | 显示全部楼层
mark

出0入0汤圆

发表于 2010-10-10 23:53:01 | 显示全部楼层
MARK,学习了,谢谢分享。。。

出0入0汤圆

 楼主| 发表于 2010-10-15 11:49:51 | 显示全部楼层
正在写说明,写完之后连同整个内核和例程一起发上来。

出0入0汤圆

发表于 2010-10-15 13:33:58 | 显示全部楼层
期待~

出0入0汤圆

发表于 2010-10-15 13:55:54 | 显示全部楼层
Very Good.Tks

出0入0汤圆

发表于 2010-10-15 14:08:43 | 显示全部楼层
向楼主学习

出0入0汤圆

发表于 2010-10-15 14:10:16 | 显示全部楼层
期侍!!!

出0入0汤圆

发表于 2010-10-15 14:28:15 | 显示全部楼层
LZ说的中肯

出0入0汤圆

发表于 2010-10-15 14:29:20 | 显示全部楼层
我只来学习。。。

出0入0汤圆

发表于 2010-10-15 14:44:34 | 显示全部楼层
m

出0入0汤圆

发表于 2010-10-15 15:13:08 | 显示全部楼层
协作式调度

出0入0汤圆

发表于 2010-10-15 15:29:06 | 显示全部楼层
楼主说的原理看的似懂非懂,谁有更详细的资料发给我一份,lxming1005@163.com.最好是能有单片机的实例的

出0入0汤圆

 楼主| 发表于 2010-10-15 16:11:53 | 显示全部楼层
回复【116楼】ming1005
楼主说的原理看的似懂非懂,谁有更详细的资料发给我一份,lxming1005@163.com.最好是能有单片机的实例的
-----------------------------------------------------------------------

http://www.ourdev.cn/bbs/bbs_content.jsp?bbs_sn=4325007&bbs_id=1000

刚刚发布的,是基于此文中说的内核

出0入0汤圆

发表于 2010-10-15 16:43:11 | 显示全部楼层
楼主想法不错

有两个问题
1  任务1 任务2工作完delay后,现在任务3在执行,任务1 任务2时间到后等待任务3放弃cpu控制权,如果任务1 任务2同时到时,那就的处理任务1 任务2谁先运行的问题。
2  两个任务同时要用同一资源(串口,i2c存储器)的问题。

出0入0汤圆

发表于 2010-10-15 17:15:34 | 显示全部楼层
LZ牛人啊

出0入0汤圆

发表于 2010-10-15 17:21:41 | 显示全部楼层
mark!

出0入0汤圆

发表于 2010-10-15 17:34:18 | 显示全部楼层
楼主牛人

出0入0汤圆

 楼主| 发表于 2010-10-15 19:57:37 | 显示全部楼层
回复【118楼】huy666
楼主想法不错
有两个问题
1  任务1 任务2工作完delay后,现在任务3在执行,任务1 任务2时间到后等待任务3放弃cpu控制权,如果任务1 任务2同时到时,那就的处理任务1 任务2谁先运行的问题。
2  两个任务同时要用同一资源(串口,i2c存储器)的问题。

-----------------------------------------------------------------------

嗯,第一个问题是由优先级决定的,调度算法可以设定一定优先级,可以看看写的内核。

第二个问题是需要用互斥信号的方式解决,比如说普通大循环结构,如果中断程序与主程序同时利用一个资源你怎么处理?同样的解决方法。不过协作式内核可以不必提供此服务,因为两个任务都调度同一硬件都可都过改善软件结构解决,解决不了就定一全局的标志来判断,并不复杂。

出0入0汤圆

发表于 2010-10-15 20:31:00 | 显示全部楼层
粗略看了下~~LZ没用过proto-thread smartos之类的“伪OS”吗

看一看用一用便知

在proto-thread基础上加上中断前后台,个人感觉是最优方案,同样再也不想回到裸奔时代了

出0入0汤圆

发表于 2010-10-15 21:22:38 | 显示全部楼层
MARK

出0入0汤圆

发表于 2010-10-15 21:31:32 | 显示全部楼层
楼主可能更偏向于PC,对单片机以及嵌入式应用还欠了解。在我们的实际应用中,我们总是可以很好的处理和延时的问题,有时候程序大部分做延时往往比频繁的调用别的任务稳定些!作为单片机应用,完全没有必要去折腾,所谓够用即可,只要能解决问题即可!何况在很多系统中,是需要利用延时来提高系统稳定性的!程序要越简单越好,别搞得你们复杂。单片机本身应用场合就是低速简单控制的场合,对实时性和多任务场合,估计会选择更高频率或档次的甚至带OS的芯片!

出0入0汤圆

发表于 2010-10-15 23:12:37 | 显示全部楼层
mark

出0入0汤圆

发表于 2010-10-15 23:30:07 | 显示全部楼层
突然想起一点,事实上,绝大多数有人机接口的单片机,1秒钟也不需要执行多少条有效指令,不论采用哪种方式。

快枪男遇见慢热女…只能在需要的时候,迅速进去状态,然后……然后………再然后………
复位,再来一次!

当然,楼主的方法能够解决慢热女的突然发春,但是会使得事情复杂化,在有的人眼里,1234,2234,3234,再来一次,这样简单明了。

从目前来看,3P、4P…NP的情况越来越多,同时考虑到数代同床的可能性…



不写了,手机太累了。

出0入0汤圆

发表于 2010-10-15 23:38:53 | 显示全部楼层
mark

出0入0汤圆

发表于 2010-10-16 00:09:09 | 显示全部楼层
学习啦

出0入0汤圆

发表于 2010-10-22 09:00:23 | 显示全部楼层
留名,以便于查找

出0入0汤圆

发表于 2010-10-22 09:27:12 | 显示全部楼层
留名!

出0入0汤圆

发表于 2010-11-3 21:33:07 | 显示全部楼层
ding

出0入0汤圆

发表于 2010-11-4 13:33:54 | 显示全部楼层
有意思,,晚上回去再研究研究。。。

出0入0汤圆

发表于 2010-11-4 14:45:02 | 显示全部楼层
再研究研究。。。

出0入0汤圆

发表于 2010-11-4 15:27:27 | 显示全部楼层
mark

出0入0汤圆

发表于 2010-11-4 16:58:11 | 显示全部楼层
有个东西。。叫PT。。。就是这种类型的。写的非常简洁。就是理解起来不容易

出0入0汤圆

发表于 2010-11-4 17:57:25 | 显示全部楼层
牛人,记号

出0入0汤圆

发表于 2010-11-4 18:11:31 | 显示全部楼层
这个  很有想法

出20入22汤圆

发表于 2010-11-4 20:27:03 | 显示全部楼层
有时要加的,小的系统,不要多快

出0入0汤圆

 楼主| 发表于 2010-11-4 20:39:09 | 显示全部楼层
回复【136楼】bg6agf 无垠春雪
有个东西。。叫pt。。。就是这种类型的。写的非常简洁。就是理解起来不容易
-----------------------------------------------------------------------

我用PT有半个月了
写了PT下基于GCC_AVR和KEIL_51的扩展文件,可以简单的实现延时。

出0入0汤圆

发表于 2010-11-4 21:08:57 | 显示全部楼层
我用protothread的原理试着写过程序,发现使用太多的SWITCH语句,编译后非常代码非常大.

出0入0汤圆

 楼主| 发表于 2010-11-4 21:17:20 | 显示全部楼层
回复【141楼】sipure
我用protothread的原理试着写过程序,发现使用太多的switch语句,编译后非常代码非常大.
-----------------------------------------------------------------------

SWITCH原理的模拟多任务应用还是很广的,偶然发现Zigbee协议用的OSAL也是这种原理!

如果是GCC编译器,比如说GCC_AVR,可以使用可编程标号,就是protothread中的另一种实现方式。

PT我也是最近学习的。

出0入0汤圆

发表于 2010-11-4 21:35:07 | 显示全部楼层
mark

出0入0汤圆

发表于 2010-11-4 22:39:08 | 显示全部楼层
mark

出0入0汤圆

发表于 2010-11-4 23:34:59 | 显示全部楼层
学习下……

出0入0汤圆

发表于 2010-11-4 23:45:30 | 显示全部楼层
学习下···

出0入0汤圆

发表于 2010-11-4 23:52:41 | 显示全部楼层
往往很多应用中确实没那么多事情干,
这时候省电才是最重要的,Delay --》 Sleep!

很多时候时序又是很重要的,
Delay --》 timer ticks!

当好不容易找到个应用挺适合类OS时,发现状态机才是我需要的!

出0入0汤圆

发表于 2010-11-5 00:06:44 | 显示全部楼层
shuodetaihao le

出0入0汤圆

发表于 2010-11-5 01:19:43 | 显示全部楼层
楼主的想法很好
我在项目中也常遇到这样的问题,时常的想如何去掉延时函数。当然有点情况下,裸奔就够了。状态机处理也是很不错的办法!
不要拒绝OS,有时候它工作得很好。

出0入0汤圆

发表于 2010-11-25 22:35:41 | 显示全部楼层
mark

出0入0汤圆

发表于 2010-11-26 08:52:50 | 显示全部楼层
楼主境界很高 有时候空转是因为程序量很小,空转代码逻辑很好理解。就懒得动脑筋想了。按楼主的方法处理,正所谓磨刀不误砍柴工,到大项目的时候有用

出0入0汤圆

发表于 2010-11-26 09:19:47 | 显示全部楼层
mark

出0入0汤圆

发表于 2010-11-26 10:34:03 | 显示全部楼层
mark

出0入0汤圆

发表于 2010-11-26 10:36:51 | 显示全部楼层
回复【104楼】qiu452555846 白羽
    多任务操作方式确实有许多优点,可以实现在微观上串行,而在宏观上并行的运行效果。虽然系统本身会占用一点点硬件、软件资源,但在编写复杂程序的时候,确实让人感到它的强大。举一个最直接好处:它节省了编程的时间。
    一直想实现一个自已的avr多任务操作系统,但由于能力所限,至今没能满意实现,只完成了一半的代码,感觉其工作效率不高,几乎就放弃了(郁闷哪)。真正实现这样一个系统,其实是很难的,需要考虑的东西太多,只能期待高手大作了。
    只是,在编写这个系统的时候,感觉到,多任务系统也不是万能的,有些场合,用多任务系实现,反而不好。如ds18b20的读写、io口模拟的串行数据通信等,需要用到若干种延时时间片,有长有短,这些场合,还是普通的编程方式好用。
    说得不对,请大家包涵哦。i m 菜鸟,刚来到论坛(在校本科生),想学着融入这个大家庭。
    (喜欢101楼、102......
-----------------------------------------------------------------------

像DS18B20这种延迟时间短的,还是直接延迟好。比如UCOS的时间节拍是200HZ,延迟小于5MS的就只能直接写延迟了。

出0入0汤圆

发表于 2010-11-26 12:30:24 | 显示全部楼层
mark^0^

出0入0汤圆

发表于 2010-11-26 13:38:43 | 显示全部楼层
mark

出0入0汤圆

发表于 2010-11-26 18:42:50 | 显示全部楼层
学习了

出0入0汤圆

发表于 2010-12-5 02:59:44 | 显示全部楼层
mark

出0入0汤圆

发表于 2010-12-5 06:10:04 | 显示全部楼层
期待

出0入0汤圆

发表于 2010-12-5 08:08:29 | 显示全部楼层
同意楼主,看12864屏的驱动,好多都是用一个固定延时来等待屏的操作,其实读BF更能省时间,自己感觉的哈。

出0入0汤圆

发表于 2010-12-5 08:51:22 | 显示全部楼层
不错 学习学习

出0入0汤圆

发表于 2010-12-6 09:27:18 | 显示全部楼层
LZ的认识很深刻,值得学习,正如你所说,学习不能死学,在吸收的同时,要活学活用!

出0入0汤圆

发表于 2010-12-7 16:28:19 | 显示全部楼层
正好刚刚 我也有这样的疑问,看到此贴就毫不犹豫的注_册了……

出0入0汤圆

发表于 2010-12-10 15:56:52 | 显示全部楼层
jh

出0入0汤圆

发表于 2010-12-10 16:41:38 | 显示全部楼层
mark

出0入0汤圆

发表于 2010-12-10 17:02:49 | 显示全部楼层
mark 下班了,回家看

出0入0汤圆

发表于 2010-12-10 17:31:16 | 显示全部楼层
好贴。受教了。谢谢大家

出0入0汤圆

发表于 2010-12-10 17:46:03 | 显示全部楼层
Delay有什么不好?
开时钟,开中断,休眠。
这样比较低碳

出0入0汤圆

发表于 2010-12-11 12:45:26 | 显示全部楼层
记号!

出0入0汤圆

发表于 2010-12-17 08:57:56 | 显示全部楼层
楼主太强大了,我现在就是在开发GPRS模块,里面就有用到大量的延时,真是不知道怎么下手呢,正好让我找到了一个有关的答案,我先研究一下,太好了!

出0入0汤圆

发表于 2010-12-28 22:12:06 | 显示全部楼层
值得研究学习!

出0入0汤圆

发表于 2010-12-28 22:15:03 | 显示全部楼层
mark

出0入0汤圆

发表于 2010-12-28 23:09:23 | 显示全部楼层
回复【楼主位】yrloy  断雪
-----------------------------------------------------------------------

楼主啊,你这个帖子,最好举个最简单的代码什么的,看着太爽了。不行。我是陶醉了。我想深入理解你这些话,可是现在还理解不通那~水平没到位

出0入0汤圆

发表于 2010-12-28 23:22:16 | 显示全部楼层
回复【52楼】kaka STM8  
-----------------------------------------------------------------------

此话怎讲,可否举例~~期待

出0入0汤圆

发表于 2010-12-29 01:56:54 | 显示全部楼层
假如端口正在模拟通讯协议,比如1wire,指定多少微秒后应该检测到信号,这时候中断恰好有任务来打扰,怎么办?

出0入0汤圆

发表于 2010-12-29 09:43:00 | 显示全部楼层
我觉得 楼主说的不全对 如果是用单片机处理一些简单任务,那么放弃延时函数换回的单片机资源对任务应用来说未必有多重要,但是,放弃延时函数 会造成程序的 修改、调试难度都成倍的增加,感觉没有必要,
如果是用单片机处理一些较为复杂的任务,那么放弃延时函数后 势必需要一个OS或者伪OS来协调管理各个任务之间的切换,而要开发一个稳定的OS或伪OS不是短时间能够做出来的 需要投入大量的成本 那么就变成针对低端的单片机去花这个成本开发 还是 直接选用高端芯片的选择了

个人感觉 作为研究很有必要,但是真正的应用,除非有那个决心整个OS出来,否则还是用延时,能让自己的程序调试修改起来方便点!

出0入0汤圆

 楼主| 发表于 2010-12-29 10:02:23 | 显示全部楼层
回复【173楼】dew2901 测控阿壮
回复【楼主位】yrloy  断雪
-----------------------------------------------------------------------
楼主啊,你这个帖子,最好举个最简单的代码什么的,看着太爽了。不行。我是陶醉了。我想深入理解你这些话,可是现在还理解不通那~水平没到位
-----------------------------------------------------------------------

我已经给出了实例的调度器,我在一个楼已经留下地址了,你可以找一下

出0入0汤圆

发表于 2010-12-29 10:06:38 | 显示全部楼层
mark

出0入0汤圆

发表于 2010-12-29 13:09:25 | 显示全部楼层
mark

出0入0汤圆

发表于 2010-12-30 14:25:56 | 显示全部楼层
mark

出0入0汤圆

发表于 2010-12-30 14:31:11 | 显示全部楼层
mark

出0入0汤圆

发表于 2010-12-30 15:01:46 | 显示全部楼层
回复【177楼】yrloy 断雪
-----------------------------------------------------------------------

谢~~~~

出0入0汤圆

发表于 2010-12-30 16:15:48 | 显示全部楼层
good

出0入0汤圆

发表于 2010-12-30 16:42:10 | 显示全部楼层
比较奇怪,delay函数的延时不是只在例子教学的程序中才出现的么,实际工程应用没有太大意义吧,让单片机死等几ms那真是太浪费了。反正我在实际程序中从来不用delay软件延迟,所有的精确延时都是定时器中断来置标志位的

出0入0汤圆

发表于 2010-12-30 16:50:11 | 显示全部楼层
最好的办法是MCU和FPGA混合的方式,ATMEL出过一种混合的芯片
这样的情况下,所有的外设都可以用FPGA实现,不占用CPU资源,这样的话,就跟PC差不多一样了,要做什么事情,都是一个命令带几个参数,然后就可以干别的去了

出0入0汤圆

发表于 2010-12-30 16:51:48 | 显示全部楼层
回复【184楼】whhityang 小样一
-----------------------------------------------------------------------

你这样定时,跟Delay的差别只在于定时的精度,你还是在空等
只是把 while(x--) 变成了 while(!intr) 而已

出0入0汤圆

发表于 2010-12-30 16:56:57 | 显示全部楼层
先mark

出0入0汤圆

发表于 2010-12-30 17:17:44 | 显示全部楼层
占个位 哈哈

出0入0汤圆

发表于 2010-12-30 17:40:00 | 显示全部楼层
回复【60楼】shzdxx 春
我觉得真正做产品考虑成本的单片机工程师,都应该考虑如果用最便宜的单片机实现最多的功能。
让单片机在做无用的等待的基本上还不能算合格的单片机工程师。一个主程序循环执行的时间越少,它的实时性就越高,回收时间就是提高稳定性。要想提高单片机水平必须要有提高软件效率的思想。
我一般把软件的工作按实时性划分,例如红外信号解码,按键查询,显示刷新均2ms执行一次,一些对实时性要求不高的程序就500ms处理一次,例如温度采集。 125us进入一次定时中断,这里面设置定时标志,这里面也可以处理更高实时性的任务(当然要简短,如果处理时间长的任务可以设置一个标志位,退出中断后,让程序处理完进入中断前的子程序,马上跳到标志位标识的子程序。)

-----------------------------------------------------------------------

这就是有限状态机的思想了。

主程序根据不同的状态标志处理不同的任务,中断负责改变这些状态标志。

出0入0汤圆

发表于 2011-1-8 19:59:26 | 显示全部楼层
留名

出0入0汤圆

发表于 2011-2-10 13:07:21 | 显示全部楼层
MARK 支持

出0入4汤圆

发表于 2011-2-10 14:00:05 | 显示全部楼层
有意思

出0入0汤圆

发表于 2011-2-10 14:38:35 | 显示全部楼层
回复【楼主位】yrloy 断雪
-----------------------------------------------------------------------

高手应该很多的,只不过都潜水了。浮在上面的都是小鱼多大鱼少啊!

出0入0汤圆

发表于 2011-2-10 17:02:13 | 显示全部楼层
MARK

出0入0汤圆

发表于 2011-2-10 17:26:27 | 显示全部楼层
Mark

出0入0汤圆

发表于 2011-2-10 20:27:21 | 显示全部楼层
mark  收益

出0入0汤圆

发表于 2011-2-10 21:01:24 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-2-10 21:16:40 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-2-10 21:30:33 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-2-10 21:40:21 | 显示全部楼层
个人比较推崇有限状态机, 可以在无os状态下简单并且高效使用mcu,只是状态机设计相对复杂。

出0入0汤圆

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

本版积分规则

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

GMT+8, 2024-3-29 06:13

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

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