打印

最高效率使用单片机,放弃程序中的延时函数(转)

[复制链接]
手机看帖
扫描二维码
随时随地手机跟帖
41
z_no1| | 2013-11-6 09:19 | 只看该作者 回帖奖励 |倒序浏览
不起眼 发表于 2013-11-2 20:53
1。LZ的內核是主动放弃当前任务,这种方式要保存的东西很少。
2。对,就是要利用这几十us的甚至几us时间 ...

那好,你想用它做什么事呢?切西瓜?神庙逃亡?还是打飞机?

使用特权

评论回复
42
xxlin1984| | 2013-11-6 11:58 | 只看该作者
金融小数 发表于 2013-11-4 10:41
楼主是从PC上转过来的,没有实际开发产品的经验,属于愣头青

当然使用 delay(unsigned char ms) 的代 ...

很多OS的最小片段都是5ms,10ms, 需要精确4ms,8ms时序匹配时,就必须用delay(unsigned char ms)或定时器中断定时了(但有时候定时器资源有限,要干些测频率之类的活)。

使用特权

评论回复
43
chenbb8| | 2013-11-6 14:45 | 只看该作者
xxlin1984 发表于 2013-11-6 11:58
很多OS的最小片段都是5ms,10ms, 需要精确4ms,8ms时序匹配时,就必须用delay(unsigned char ms)或定时器 ...

delay的话这几个ms组合起来甚至就是几百ms了,这时候只有少数放在中断中的东西能跑。
不过,现在的公司的程序我所看到的都是LZ所说的那种……
很纠结,我提倡的无阻塞的编程在完成项目的速度上比不过他们,被领导BS的很惨,
决定看情况放弃部分无阻塞的原则,反正原则就是用来打破的:loveliness:
新手们的编程方式速度实在是太赞了,哈哈

使用特权

评论回复
44
chenbb8| | 2013-11-6 14:50 | 只看该作者
本帖最后由 chenbb8 于 2013-11-6 14:52 编辑

我现在的观点是:用最合适,而不是最好的结构来设计。
领导只要求个流水灯,你非要弄一堆前后台标志位,编程框架,RTOS,这不是蛋疼么。

这是我从休闲的小公司跳到了整天加班的小公司后的转变……

使用特权

评论回复
评论
小鱼儿1045 2013-11-9 10:17 回复TA
好思想,我和楼主遭遇差不多,只选最适合自己的。 
评分
参与人数 1威望 +2 收起 理由
NE5532 + 2
45
zy19860818| | 2013-11-6 16:38 | 只看该作者
本帖最后由 zy19860818 于 2013-11-6 16:57 编辑

谢谢楼主所提供的思维方式,对我有些启示~~~

使用特权

评论回复
46
lc172415| | 2013-11-6 16:43 | 只看该作者
很好,学习

使用特权

评论回复
47
逍遥派掌门| | 2013-11-6 18:06 | 只看该作者
等楼主的内核出来,看看有什么创意

使用特权

评论回复
48
xxlin1984| | 2013-11-7 09:09 | 只看该作者
chenbb8 发表于 2013-11-6 14:45
delay的话这几个ms组合起来甚至就是几百ms了,这时候只有少数放在中断中的东西能跑。
不过,现在的公司的 ...

赞成。
只有在要求无阻塞的条件下,才能发挥出无阻塞的优势,比如追求低功耗(所有空闲都要睡眠)。

使用特权

评论回复
49
chenbb8| | 2013-11-7 09:28 | 只看该作者
本帖最后由 chenbb8 于 2013-11-7 09:31 编辑
xxlin1984 发表于 2013-11-7 09:09
赞成。
只有在要求无阻塞的条件下,才能发挥出无阻塞的优势,比如追求低功耗(所有空闲都要睡眠)。 ...

公司的低功耗产品也是阻塞式的,用了好多中断(在中断中调用DelayMS()),还有优先级的~
所以只要要求简单,比如外设少、无实时性的话阻塞也没问题。(51的低功耗实在是太渣了,没有WFI之类的休眠)

另外如果不对哪些原先阻塞函数进行改造的话,在一个无阻塞系统里很难拿来就用,无阻塞的函数
想添加到阻塞的系统里,也是个大问题。

以后找个空看下Protothreads能不能用来快速的转换阻塞代码~

使用特权

评论回复
50
通宵敲代码| | 2013-11-7 09:58 | 只看该作者
单片机开发,硬件资源是首位的,这是软件编程转行嵌入式的人员最难理解的地方,这是硬伤啊。

PC机里面可以通过倍频方式来协调时钟,而单片机却永不起这么复杂的系统,否则就成PC了。

其次,延时的确浪费了系统的资源,但很多时候也不失为一种解决问题好方法。

使用特权

评论回复
评论
NE5532 2013-11-7 12:02 回复TA
应该说是有资源来浪费。在时间和复杂度之间权衡,使用最简单可靠的方法完成目标,搞PC的手里没有这么多资源,多是考虑应用上的问题。 
51
chenferrari| | 2013-11-7 15:50 | 只看该作者
关键是它真的有那么多工作要做吗?比如就100ms闪个灯的功能,还想让干啥?根据需求

使用特权

评论回复
52
不起眼| | 2013-11-7 16:36 | 只看该作者
z_no1 发表于 2013-11-6 09:19
那好,你想用它做什么事呢?切西瓜?神庙逃亡?还是打飞机?

呵呵呵,两个任务同时监測一个IO,IO信号只持续几微秒。
        另外,任务切换是手动切换,不是系统切换,阻塞问題完全可以自己协调解决。这只是一种编程技法,不是OS。

使用特权

评论回复
53
不起眼| | 2013-11-7 16:39 | 只看该作者
另外,任务切换不是基于时间片,随时可以切。

使用特权

评论回复
54
mohanwei| | 2013-11-7 17:06 | 只看该作者
想知道啥叫高效率,建议搜索一下亚当大神的“Protothread”,典型应用就是UIP……

初看会一头雾水,把它仅有的那个头文件的几个宏定义仔细一分析,你肯定会拍案惊奇

使用特权

评论回复
55
mohanwei| | 2013-11-7 17:09 | 只看该作者
另外别把单片机想得太金贵……现在接触到的一些低端单片机,两毛钱的都有……比大部分逻辑器件、电解电容、接插件、晶体管还便宜

使用特权

评论回复
56
lishengyi| | 2013-11-9 00:15 | 只看该作者
延时是很敏感 可以用计数器避免啊

使用特权

评论回复
57
elbor21| | 2013-11-9 11:00 | 只看该作者
马克

使用特权

评论回复
58
chenbb8| | 2013-11-9 11:42 | 只看该作者
mohanwei 发表于 2013-11-7 17:06
想知道啥叫高效率,建议搜索一下亚当大神的“Protothread”,典型应用就是UIP……

初看会一头雾水,把它仅 ...

这玩意也不是万能的吧,我的前任们留下了大量的阻塞代码,自己的无阻塞代码不好融入到里面去。
除非大修改,就算是PT也无法在直接改正他们的程序吧。
比如,假设有A任务,包含函数结构如下
A
    B1
        C11
        C12
    B2
        C21
        C22
在B1 B2 和其下的Cxx函数都含有类似于while(TI);和DelayMs()这样的阻塞,
而看简介PT应该是通过生成switch结构来达到进入不同区域的目的的,但switch应该
无法跨越函数的~~
还是抢占式系统来的爽,本身RTOS编程就是可以阻塞的~
只是我现在用的51玩不起~
反正领导要求不多,就先写下阻塞的吧

使用特权

评论回复
59
chenbb8| | 2013-11-9 18:00 | 只看该作者
    嗯,这昨天开始新的项目,今天看了厂家给的2.4G demo例程,发现编程方式是半阻塞的,需要超时判断的,
并且时间较长的 就用了在中断中对相应的计数器(couter)进行运算,使用查询计数器的方法来达到判断超时
和延时的目的;内部调用的函数中局部十几个ms的话就是阻塞式的。
    阻塞和非阻塞相处的很好,原因是:任务的运行不依赖固定的定时执行,可以直接放到while(1)循环中,
也可以按照每个TICK定期执行一次。

    我之前的程序结构依赖TICK,并把计算延时交给了任务自己计算,比如设定TICK为5ms,任务被执行10次,就
代表过了50ms。这样的话,前任们留下来的阻塞型的程序很难和我的任务结合,因为他们的程序等待一次的话
可能就过去几百ms甚至几秒了。
    如果不将之前的阻塞都去掉的话,只要阻塞式的程序一运行就会导致时间不准确,比如要非阻塞任务A需要
延时50ms的,也就是要执行10次,在期间阻塞任务B某次运行占用了50ms,那么任务A还继续等待剩下的几次执行
的话,就会导致实际的延时达到了100ms。

    而使用2.4G demo例程的做法,将时间计算统统交给定时器中断,程序中一些小的十几ms的软延时也就不用
怕会很大的影响到别的任务了。只需要部分改造(几百ms的延时当然不行)别人的代码就能和我的无阻塞程序
结合了。

    每个任务有一个延时计数器,在定时中断中统一运算这才是比较标准的做法吧,ucos就是这样的。
这样看来我原来的,受到《时间触发模式》影响形成程序设计方法还真矬

使用特权

评论回复
60
dirtwillfly| | 2013-11-9 23:26 | 只看该作者
讨论很激烈啊,mark一下

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则