大凡在各坛中,每当论及“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”华丽的外衣或者天真地“裸奔”之前,你所追求的是什么?
想好了吗? |