打印

【斑竹竞选帖】从王婆卖瓜说操作系统与裸奔的关系

[复制链接]
22749|131
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
NE5532|  楼主 | 2009-3-27 22:12 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
    大凡在各坛中,每当论及“OS”与“裸奔”孰好孰坏之时,必将争到剑拔弩张、头破血流、楼台高筑,却往往都无果而终,何也?一言以蔽之:王婆卖瓜,自卖自夸!

    当所有的回帖将注意力集中于论述“OS”或“裸奔”的好坏时,在将自己观点论述得无比优秀时,忘却了世间还有一个被称为“条件”之物,忘却了天天挂在嘴边的“实事求是”。

    让我们来看一个例子:使用51单片机检测一个端口,当该端口由低电平转变为高电平时,将另一个端口设置为低电平,要求软件所带来的延迟尽量短,如果我们用汇编来实现这个要求:

loop:
    mov  c,port.a
    mov  port.b,c
    goto loop

    在这段代码面前,一切所谓的“实时操作系统”的“实时性”都将黯然失色。但是,这块单片机今生今世只能为这3行代码服务,为了“实时”的要求,任何其他事情都将无法应对——这就是“条件”。
    如果你有20个端口需要监测,中断可能是你最好的选择。(当然此时你可能不得不选择带“端口电平变化中断”功能的AVR,例如ATmega48)轮询20个端口,并不是一件轻松的事。更具有技巧性的是,如果单片机只被要求做这一件事的话,你的中断服务程序甚至可以抛弃掉现场保护和现场恢复代码!
    如果你不能在极短的时间内完成某个任务,并且还得顾及其他的“突发事件”,那么“实时操作系统”可能是你的解决之道。
    我们每天说着“实时”却忘记给他加个“一万年”的期限,没有指标的“实时”是没有意义的!




    正如哲学所言,我们做任何事情,都不得不付出代价——在晚饭的餐桌上,你饱餐了山珍,就没有胃口吃下迟来的海味。我们所做的一切,不外乎是在各种利弊之间加以权衡取舍罢了。记得有一句话“我只在需要勇敢的时候才勇敢”,如果作者允许的话,我们将他套用成“我只在需要复杂的时候才复杂”。

    没有人愿意做无谓的工作,让单片机闪烁端口上的LED这种简单工作,虽然裸奔代码与“OS”中加载一个任务的代码在行数上看来相差无几,但请记得,这块单片机为了完成这个极其简单的任务,所付出的代价实在太多太多。

    “言多必失”,当我们为了完成一个简单任务而采取了超过需求的措施时,犯错的机会必将大大增加。因此,当一个菜鸟写下

     while(1)
     {
      porta^=0x01;
      delay_ms(1);
      }

时,这段代码的可靠性远高于一个有着几十年经验的高手用“OS”作出的端口方波程序!




    “当我们到达一块高地之后,却忘记了我们来这里的目的,这将是我们最大的不幸!”如果用“OS”的“高手”和“裸奔”的“菜鸟”忘却了他们为何要选择华丽的“OS”与朴素的“裸奔”,这场赛跑将变得没有任何意义。一个遇到任何问题都用“OS” 的人和一个不会用“OS”的人同样晕菜。




    王婆会继续买她的瓜,也许她会为了“炫耀”自己的“聪明”向你推荐她的“OS”,也许她为了收取版权费,或者她为了把你拒之门外,索性“裸奔”,不过说穿了,王婆总要能赚到钱,才会去做。

    在选择穿上“OS”华丽的外衣或者天真地“裸奔”之前,你所追求的是什么?

    想好了吗?

相关帖子

沙发
hotpower| | 2009-3-27 22:23 | 只看该作者

沙发~~~

使用特权

评论回复
板凳
NE5532|  楼主 | 2009-3-27 22:26 | 只看该作者

惊见沙发已被菜农占领,此楼招租。

本帖接受技术讨论。

使用特权

评论回复
地板
sz_kd| | 2009-3-27 22:33 | 只看该作者

呵呵,实用才是最好

使用特权

评论回复
5
hotpower| | 2009-3-27 22:33 | 只看该作者

最近对本主题研究较多~~~

虽然俺已在51上实现了“零切换”,但51的架构确实很倒塌~~~

所以今天又理论上实现了裸奔式协作型的OS,这个不需为每个任务设置堆栈及大小。

如同中断或子程序。和“裸”无二样~~~

只不过是将“零耗时键盘OS”套上了件外套~~~

至于为什么要用或不用OS和OS与裸奔的最大区别,候选版主应该说道说道~~~

使用特权

评论回复
6
zdxlxq| | 2009-3-27 22:35 | 只看该作者

有理

使用特权

评论回复
7
NE5532|  楼主 | 2009-3-28 09:28 | 只看该作者

其实只是说一个道理:实事求是。

使用特权

评论回复
8
古道热肠| | 2009-3-28 10:13 | 只看该作者

还有一个道理,学以致用,把要用到的学好,学精是学习的当务

经常听到初学者问该如何学单片机的问题.

使用特权

评论回复
9
yewuyi| | 2009-3-28 11:02 | 只看该作者

恩,我就支持你了。。。

使用特权

评论回复
10
刘前辈| | 2009-3-28 11:55 | 只看该作者

我来说两句。

 “言多必失”,当我们为了完成一个简单任务而采取了超过需求的措施时,犯错的机会必将大大增加。因此,当一个菜鸟写下

     while(1)
     {
      porta^=0x01;
      delay_ms(1);
      }

时,这段代码的可靠性远高于一个有着几十年经验的高手用“OS”作出的端口方波程序!

********************************************************************

LZ这段话可能不恰当:说句不客气的话,您大概连嵌入式OS的节拍函数如何工作的都没研究过,怎么好下结论?

裸奔程序中的延时函数delay_ms(int)是软件延时器,我把这个函数展开一下就更清楚了:

void delay_ms(unsigned int ms)    // 延时子程序
{                        
    unsigned char i;
    while(ms--)
    {
    for(i = 0; i < 120; i++);
    }
}

进一步展开成汇编代码就更清楚了,在机器运行这段汇编代码的时刻,如果受到干扰,轻则时间混乱,重则循环死机。

这个问题大家没有疑问吧。LZ也没有疑问吧?

好,下面我再请问,这种问题在uc/os之类的嵌入式操作系统中会发生吗?

根本不可能!

嵌入式OS的延时或超时函数是基于片内硬件计数器的,片内计数器是由D触发器组成的“电路”。它相当于内部“看门狗”。一个看门狗在一个系统中应该是最可靠可信的吧。

——对于任何干扰,硬件比软件具有更高的可靠度和坚固性。这个是常识吧。

“比较”应该是在对等的平台上进行,所以LZ应该用片内计时器来编写延时函数,但是如果当您那么做的时候,你就已经输给OS了。OS早就写好了,编程员只是需要一个调用。他不需要把注意力放在这种与程序结构无关的小事情上。

可以肯定:那些站在裸奔立场一方的人,都是不会用嵌入式OS的编程员。(为自己的“不会”寻找辩句。)
而那些站在OS一方的人,都是即会OS,又懂裸奔的编程员。(他们不需要为自己寻找辩句。我愿意站哪边站哪边。笑看不懂装懂的人的闹剧。)

陈明计:一旦读者用实时内核做过系统设计,将决不再想返回到前、后台系统。
(呵呵,一旦读者用实时内核做过系统设计,将决不再想返回到裸奔结构。)

LZ看不起陈明计?



使用特权

评论回复
11
NE5532|  楼主 | 2009-3-28 11:59 | 只看该作者

我不认识陈明计,但是也不同意他的观点

马克思主义哲学告诉我们:矛盾是普遍存在的;
**理论告诉我们:实事求是

“一旦读者用实时内核做过系统设计,将决不再想返回到前、后台系统”的观点忽略了其所针对的客观对象,无视矛盾的普遍性。

也许这句话原来有他所对应的环境和条件,但是剥离出来,就无法成为一个让人信服的观点。

使用特权

评论回复
12
NE5532|  楼主 | 2009-3-28 12:11 | 只看该作者

哲学说完了,咱们来说具体问题

一个时钟振荡失效了的单片机,纵有孙悟空般伟大的软件支持,也只能是“死”字一个。

软件之所以比硬件“可靠”,指的是软件可以被100%重复地复制,在这个世界上,你可以找到两个100%相同的软件,但你却找不到两个100%相同的硬件,这也就是硬件设计中最重要的问题——容差分析。

硬件可以讲实效率,但是一个软件,只要存储器没有发生物理损坏,其代码是不会被改变的,从另一个方面看,只要不是事件驱动的程序,在编译好的那一刻起,这个软件的一切行为和BUG就已经确定下来了。

把硬件的工作交给软件,是提高系统可靠性的方法之一,但是这绝不是说软件可以“修复”硬件的不可靠性,只是说将硬件的不可靠点减少,转化为“一致性非常好,实效性较低”的软件行为。

LS在批评我代码的时候没有注意,我没有说单片机需要运行其他程序代码。并且不使用OS,同样可以用定时器完成这个任务。再者,如果认为程序代码的执行可能受干扰,那么OS和裸奔在程序代码面前是对等的。更胜,即使定时器是硬件设备不易受到干扰,中断的响应总是要MCU软件支持的。

脱离具体环境讨论,只能得到风马牛不相及的答案。

最后声明立场:本人即不支持裸奔,也不支持OS,只支持**的“实事求是”。

补充:本人觉悟不足,不是D员,只学过初级哲学理论。

使用特权

评论回复
13
刘前辈| | 2009-3-28 12:36 | 只看该作者

我不认识马克思。看来NE5532是GCD员?太可怕了。

张口闭口D的基本思想是实事求是。我是老百姓,害怕搞阶级斗争。见D员我就闪。

当然当然,NE5532还不认识周立功,邵贝贝、和uc/os的作者。您只认识领袖,咱不是唱赞歌的那种人。没有共同语言。



     8: void delayms(unsigned int ms)    
     9: // 延时子程序 
    10: {                                           
    11:         unsigned char i; 
    12:         while(ms--) 
C:0x01DF    EF       MOV      A,R7
C:0x01E0    1F       DEC      R7
C:0x01E1    AA06     MOV      R2,0x06
C:0x01E3    7001     JNZ      C:01E6
C:0x01E5    1E       DEC      R6
C:0x01E6    4A       ORL      A,R2
C:0x01E7    600B     JZ       C:01F4
    13:         { 
    14:         for(i = 0; i < 120; i++); 
C:0x01E9    E4       CLR      A
C:0x01EA    FD       MOV      R5,A
C:0x01EB    ED       MOV      A,R5
C:0x01EC    C3       CLR      C
C:0x01ED    9478     SUBB     A,#0x78
C:0x01EF    50EE     JNC      delayms(C:01DF)
C:0x01F1    0D       INC      R5
C:0x01F2    80F7     SJMP     C:01EB
    15:         } 
    16: } 
C:0x01F4     22      RET
    
D的基本思想是横说竖说都有理。打死人却说是自己撞墙死的。
我闪。

使用特权

评论回复
14
NE5532|  楼主 | 2009-3-28 12:51 | 只看该作者

delay

DELAY1MS:                               ;延时1mS
    MOVLW   0xF7
    MOVWF   COUNT7

DELAY1MS_LOOP:
    NOP
    DECFSZ  COUNT7
    GOTO    DELAY1MS_LOOP

    RETURN

使用特权

评论回复
15
yewuyi| | 2009-3-28 13:10 | 只看该作者

呵呵,有事说事,不要拿着什么名人来压顶。。。

陈明计到底有没有说,我们也无法证实,陈明计说这段话的背景是什么,我们也无从得知,截取那一段也没啥多大意思。

扣大帽子就更不好了。。。


使用特权

评论回复
16
NE5532|  楼主 | 2009-3-28 13:13 | 只看该作者

恩,接受yewuyi的批评

有错就改,在没有指明条件的前提下,无法判断这句话的对错。

使用特权

评论回复
17
宇宙飞船| | 2009-3-28 13:25 | 只看该作者

还是实是求是好!

该OS就上OS,该前后台裸奔就裸奔,该用纯汇编的还得上纯汇编。每一样都少不了!

俺的做法是:
不用上OS的,就用前后台裸奔!要求极速运行的就纯汇编。代码不大,觉得用纯汇编更省事的,还是用纯汇编。有时会用混编就是为了更加方便调试,那就用混编。

使用特权

评论回复
18
冷漠| | 2009-3-28 13:49 | 只看该作者

马克思都上来了。

“呵呵,有事说事,不要拿着什么名人来压顶。。。”
*********************************************************************
好玩。  那马克思、**是什么名人?

前辈真是太包含。连马克思都上来了,谁还敢玩?什么问题辩不过要把老祖宗搬出来挡箭?这反方辩手也太无力了。

技术论坛有事说事,别玩政治。别玩哲学。

告诉诸位陈明计是谁:——中国的脊梁。中国就缺少这样的脊梁,比较陈明计,我们这样只会讲空话的人只能算作是庸人。“他有什么了不起啦,我还马克思呢.....”

不服气,你也写一本。
不服气,你来。






使用特权

评论回复
19
seaman117| | 2009-3-28 14:04 | 只看该作者

NE5532

NE5532 确实说的很实在,但,选择是痛苦的。如果喝空气都能饱肚子的话,我们也许都玩哲学去了。

使用特权

评论回复
20
冷漠| | 2009-3-28 14:15 | 只看该作者

我们只会这两下子?

“一个时钟振荡失效了的单片机,纵有孙悟空般伟大的软件支持,也只能是“死”字一个。”

——我还以为NE5532的裸奔程序可以在时钟震荡失效的情况下继续可靠容错地照常运行呢。咱不行,实事求是地说,咱OS的高可靠性在这类异常情况下绝对不行。裸奔就行?哈哈,认输。

“硬件可以讲实效率,但是一个软件,只要存储器没有发生物理损坏,其代码是不会被改变的,从另一个方面看,只要不是事件驱动的程序,在编译好的那一刻起,这个软件的一切行为和BUG就已经确定下来了。”

深刻,但是缺少一个条件没说,(别总要求别人讲清前提条件。)
——除非你的软件的所有指令机器码都是单字节!可能吗?可千万别说PIC或者XX就可以,我们现在谈的是51。

“....只要存储器没有发生物理损坏,其代码是不会被改变的,....在编译好的那一刻起,这个软件的一切行为和BUG就已经确定下来了。”

这是废话,还是适合任何环境下?看来抗干扰容错程序、看门狗等都是多此一举,吃饱了撑的。——行为都确定了,程序怎么可能脱离轨道?不可能嘛。中国就为这种事一天到晚吵。

哈哈,服气,认输。有这水平,竞争版主足够了。

使用特权

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

本版积分规则

159

主题

13769

帖子

586

粉丝