裸奔适合小系统,比如,xinlinx的有一款小软核,才2k程序空间,
怎么跑os?厂家连C都不提供,只能用汇编。这种结构的cpu有点是
占用
硬件资源少。资源就是钱啊。
比如最新的酷睿或者K10之类的,你裸奔个网络游戏试试!
所以呀,微小系统,对资源及其严格要求的裸奔;大系统,资源随便用的肯定用OS。
项目要求是第一位的,确定了要求,才能确定软件,确定了软件才能确定系统结构,最后才能确定硬件!
不要为了裸奔而裸奔,也不能为了os而OS。凡是不能走极端。
中庸之道.
网友评论:呵呵,这种方法不好,但有时是不得已的选择。硬件允许当然用os。
另,由于所长这个结构没啥抢占的,所以任务同步反倒是小问题。
to所长,你咋不强调实时性了?
网友评论:PC上写磁盘、数据库管理。协议处理,全是缓冲。
“以前的系统,任务最小响应要求是5微妙,执行时间2微妙”是MCU强实时处理,是用中断,而且还是最高等级中断。
弱实时一般5MS中断,你只要申请注册,就可以被调用,N个弱实时处理都可以被处理。
网友评论:我知道会用缓冲,但有些时候是不允许你将系统数据先缓冲再容后处理的~~
26楼,你这样说就对了。我在这里讨论,并不是争论谁的输赢,我只是想说明,有OS和没有OS确实不一样,而且我也分析了没有OS的设计模式特点,也可以认为是弱点,这个设计者自己做产品前需要认真考虑权衡。没错,有oS会对资源有限定,所以彼此都有优缺点~并不是所有东西都是万能的~os也是有他独有特点的~
网友评论:工控行业军工产品医疗器械等等~其实这样的应用需求的还是很多的~
网友评论:操作系统有句话,永远不要去假设处理器的速度
网友评论:“他的要求是响应时间1微妙,执行时间1微妙”
你觉得还是OS的范畴吗?
还是弱实时系统吗?
这时这一部分代码还不应该特别处理,还不应该裸奔解决吗?
所长前面说了:你还是用的OS的思维方式,没有去分析系统的强弱实时层次...
其实硬件的中断、优先级才是最高层次的强实时的OS,而区分系统层次和采用软件OS的目的恰恰是为了把弱实时的需求降低,以便让出更多的资源来保证强实时(中断程序)的可靠运行、激活。
区分系统实时层次、采用裸奔的目的就是为了让中断占用的时间最短,从而让任何最短的请求都不遗漏。
如果谁都有特权,那就等于谁都没有特权,明白吗?
一味推崇OS的,恰恰没理解到这一点哦。
不用急着说服谁,自己先去想想吧。
网友评论:在有OS的系统里,也是有中断的,而且有些东西也可以放中断里处理,这方面两者没有区别的,彼此都能做都能达到要求~比较这个比较不出彼此差别的~
网友评论:比如:TCP/IP数据被强实时的中断接收,存放在接收缓冲队列中,因为是协议,所以在需要的数据外壳包含着大量的封装代码,如果不及时解析处理,在MCU中会造成缓冲区的溢出。这时候,弱实时层的中断处理(一般5MS)开始起作用,将协议转为数据量极其小的真实数据或事件,通过消息队列或另外的缓冲区向非实时模块传递。
网友评论:因为概念极其清晰,处理手段分明,大小MCU通吃。
网友评论:很多处理器上的很多实时操作系统能达到那个指标要求~
你也不要钻那个点,那如果是响应时间1毫秒,执行时间100微妙呢,再多加几个类似任务呢,若再加个响应时间500微妙,执行时间200微妙的呢?还有其他响应时间50~100毫秒,执行时间50~100毫秒的呢?
网友评论:高中低三个层次,对应着高等级中断、低等级中断、主循环。倒是OS,想提升哪个优先级别就提升哪个,一点也没规则,全靠自己掌握。
网友评论:1、复杂系统中,OS也不能保证响应时间,大家都在尽力而为。例如抢占调度下,一个最高优先级任务的响应时间是:所有可能同时发生的中断的处理时间+任务上下文切换时间;但是因为驱动层的隔离,你可能根本不知道有多少个中断源。
2。有些任务间确实具有明确的优先级高低。但很多时候这个优先级是想像出来的,并不具有天然的含义。结果往往是,大家还是顺序执行,你做完了我做。
3。谁也没有否认OS的价值。但如果离开OS就连较简单的问题都解决不了,那才真是被误导了。
网友评论:但嵌入式裸奔太难了点,初学者选择OS也完全可以理解。
俺以前说过“MCU高手不用OS”,现在还是有效。
网友评论:主循环层次处理的时间模糊性,可丢失特性。
比如要求LED0.5S闪烁一次,没比较做到很精确,需要发挥模糊特性:0.45-0.55S都可以,类似模糊控制原理(呵呵,假的)。
网友评论:前者针对不同情况采用不同的处理手段,能够处理任何的硬骨头,但要求技术高超,非常而且费神;
后者就简单了,把肉直接扔进去就行了,一般情况下都可以把肉切的比庖丁的都好,但是碰到“要求是响应时间1微妙,执行时间1微妙”这样的硬骨头...那还是的优庖丁解决:-)
而且,切肉机对肉也是有要求的,你要是把头猪直接扔进去...出来的肉只怕没人敢吃了吧?
谁都知道Windows下要实现个1uS的精确延时多么的难,难道圆圈你没听说过吗?
竟然还举出这样的例子,这不是给反方增加论据吗?
呵呵^_^
网友评论:农民,我也不想说什么,只不过你的那种做法,我以前单片机上也做过的~其实要想做那种模式,上手并不难~了解状态机,熟悉软件系统分析,模块拆分的,很快能上手做~不过我做单片的时候,也确实从来没用过os,因为根本没必要浪费那个资源~但其他地方就不一样了~
网友评论:我吐下先~~拜托能不能不要把自己看太高~~
网友评论:用嵌入式裸奔是比较好的,不管8位还是ARM9
但如果需要多人协作,并支持外部未知设备的,还是OS好,这点OS表现非常优秀,规则大家都遵守。
个人看法。
网友评论:1、复杂系统中,OS也不能保证响应时间,大家都在尽力而为。例如抢占调度下,一个最高优先级任务的响应时间是:所有可能同时发生的中断的处理时间+任务上下文切换时间;但是因为驱动层的隔离,你可能根本不知道有多少个中断源。
//////////////////////////
这条不敢苟同。
区别也就是在立即调度还是等当前任务放弃cpu后再调度,至于多个中断源啥的,裸不裸奔没啥区别。
网友评论:这和多人是否协作没有关系~关键看产品,看产品的复杂度指标要求资源配置进度等等...
网友评论:说来说去其实论点很简单:
所长说的是裸奔区别对待实时要求,概念清晰,处理手段分明,大小MCU通吃。
圆圈说的是OS万能,实时性胜过裸奔,开发比裸奔简单
我的观点是说实时性OS永远不可能胜过裸奔,说应用则要各取所需
牛头不对马嘴,更不想变成人生攻击,懒得说了。
你们爱争的就继续争吧...
网友评论:圆圈强调:在没有OS时,“很难控制每个任务延迟时间”。
我的意思是,使用OS在稍复杂一点的情况,要分析每个任务的响应时间,都是一件很头痛的事情。最高级任务还好分析,最低级任务不管它,中间那些呢?所以,大家都在尽力而为。
网友评论:圆圈强调:在没有OS时,“很难控制每个任务延迟时间”。
我的意思是,使用OS在稍复杂一点的情况,要分析每个任务的响应时间,都是一件很头痛的事情。最高级任务还好分析,最低级任务不管它,中间那些呢?所以,大家都在尽力而为。
//////////////////////////////////
讨论嘛,大家平心静气
圆圈这句话也没啥错。当然你也没啥错。
所长大人那个裸奔结构,任务最大延迟==分割的最长一块代码执行时间,这还是在有优先级的情况下。如果不分优先级,那么最大任务延迟==其他所有任务最长代码段总和
网友评论:做个WINDOW程序的都知道,一个
MOUSE点击、一次KEY动作就是一个函数,说白了就是一个状态发生变化,一个事件产生了。如果你想象的OS线程来写程序,肯定是傻傻的等待。嵌入式裸奔分成稳定的状态来表达事件的需要,才是符合程序设计的世界观。
分割不是乱来的,是状态改变的需求。如果只在状态改变时执行有效代码,那么状态没改变的那些任务可以出让大量的时间给改变中的任务。
嵌入式裸奔从宏观上看,是一个巨大的平均器,将处理事件平均化,谁冒泡就敲谁。
网友评论:对于资源稀缺的mcu,半裸(嵌入式裸奔)是一个比较好的方法或者说架构。
网友评论:只要不是很大的系统,只一两个人做的
用嵌入式裸奔是比较好的,不管8位还是ARM9
但如果需要多人协作,并支持外部未知设备的,还是OS好,这点OS表现非常优秀,规则大家都遵守。
个人看法。
=======================
记得所长说过裸奔过200w行的程序,不知道这100w行是多少人合作的。
记不清楚了是不是200w行,记错了还忘谅解。
网友评论:看大家争得热火朝天的...俺不参与...
至于如何裸,是半裸,全裸,黑裸还是色裸,大家自己都有自己的裸的体验~~~
至于要统一裸的标准,估计很难~~~
网友评论:...
网友评论:另外回楼主
你把它当作争论也好,讨论也好。
在这里能够学到新知识新方法才有意义。
在讨论中学习。。。。
网友评论:感觉所长的嵌入式裸奔还嫌穿得多~~~要"裸"就裸个"透"~~~
网友评论:俺想实现MCU设计标准库化,
工具化,解放广大的贫下中农。目标远大。
网友评论:而且回调"穿"和"脱"都更方便些~~~
网友评论:在一年内写出200w行程序。
一年的工作时间算300天的话,一天要写6000多行程序,什么天才也不行啊。
网友评论:..
网友评论:以前有很多类似设计,只是移植到2410上,另外还设计了一个PC资源管理程序,这个花了三个月。前后一年。
网友评论:呵呵.我是菜鸟!
但是二姨里面很多高手都是我的偶像.我现在也不知道什么时候开始用用OS
一直都在裸奔.
近来的论坛把我已经搞晕了.
网友评论:个人的感觉是初学者,先学“裸奔”,对MCU编程了解的比较深入了再上OS。
对于先学习下,想找份好工作的人,建议两个方式都要会,并且都要精通才行,尤其是上了OS很容易迷惑人,一些底层的东西被封装起来,如果拿来别人移植好的平台就用,可能许多东西就不会考虑到,最经典的就是听我同学说过他的一个同事做数据库编程,居然认为执行数据库操作是0时间。
网友评论:裸奔的背后,其实就是一个小巧的,未封装的,专用的os,如果想把MCU设计标准库化,工具化,最后提供给客户的可能是个lib,但是如果加上一定的调度思想,其实也就是提供了一个os,各位高手没有必要急着和os划清界线。至于高手提到的谁冒泡就敲谁,本质上也是一个callback的思想,就是不要把自己写的程序当作主线,而是把系统的需求当作主线。这样无论怎么划分程序结构模块都不会觉得支领破碎了。总之,优美的程序背后,一定是有一个优秀的编程思想。理论化的编程思想就是os,而经验化的编程思想就是优美的裸奔。而能够提炼其中微妙的可以称之为师,而可以完美实现之的可以称之为匠了……
网友评论:关于US级相应时间,
用os提供的中断或者裸奔的中断都能解决。
复杂项目用os的最高等级中断,但是,达到目标可能比较困难,需要对该
os彻底了解,自由修改的程度。这个项目的价格很高才值得做。
简单项目用裸奔,则很容易解决--所有的硬件资源你都掌握中,冲突好解决。
甚至把不合适的硬件替换掉都可能。
us以下的相应时间不单纯是软件的问题了,应该硬件配合,甚至用fpga的
硬件逻辑实现。
ms级相应时间,linux2.6内核就能做到。win俺不懂,不知道。另外,恐怕ecos,ucos之类的小系统也没问题。
用不用裸奔,具体看项目,就是看值不值。没有做不到,只要给足够的钱。
网友评论:这是个矛盾,微型机讲求通用,单片机择重专用,二者有逐渐靠拢的趋势
要用辩证法去看待这个问题,再通用的系统做具体任务的时候的都是专用的
例如我此刻的
计算机此刻就是一部打字机,没有最好的,只有最协调的!就像两把扳手,做具体的事好用慎手肯定是死扳手用起安逸,但要翻修家用机电设备,可能一把活扳手方便性通用性就好了!
网友评论:裸奔有理,OS无罪!
喜欢裸奔的裸奔,裸出自己的特色,要象所长那样期望大家裸奔的一个模式,一看就是一个单位的就不容易实现了,工作量大啊!
在目前做8位机的系统里还没有遇到非要上OS不可解决的事情,甚至连用OS一定方便过自己裸奔的情况也没有。
解决问题,做出产品是最终考虑,手法各异,目的一致!
网友评论:#include<setjump.h>
jmp_bufjumper0,jumper1,jumper2,jumper3;
voidTask0()
{
staticintn=0;
if(setjmp(jumper0)>0)
{
while(1)
{
if(setjmp(jumper0)==0)longjump(jumper1,1);//任务切换
n++;//一段任务代码
if(setjmp(jumper0)==0)longjump(jumper1,1);//任务切换
n++;//一段任务代码
}
}
}
voidTask1()
{
staticintn=0;
if(setjmp(jumper1)>0)
{
while(1)
{
if(setjmp(jumper1)==0)longjump(jumper2,1);
n++;
if(setjmp(jumper1)==0)longjump(jumper2,1);
n++;
}
}
}
voidTask2()
{
staticintn=0;
if(setjmp(jumper2)>0)
{
while(1)
{
if(setjmp(jumper2)==0)longjump(jumper3,1);
n++;
if(setjmp(jumper2)==0)longjump(jumper3,1);
n++;
}
}
}
voidTask3()
{
staticintn=0;
if(setjmp(jumper3)>0)
{
while(1)
{
if(setjmp(jumper3)==0)longjump(jumper0,1);
n++;
if(setjmp(jumper3)==0)longjump(jumper0,1);
n++;
}
}
}
voidInitTask()
{
Task0();
Task1();
Task2();
Task3();
}
main()
{
InitTask();
longjmp(jumper0,1)
}
//以上代码在keilc中调试通过
//非占先式任务切换
//任务内变量必须是静态的,子程序不用
//任务内不要用
寄存器变量
网友评论:有个例程学习下更好
网友评论:原理都一样
网友评论:#setjump.h具体是?
网友评论:关键是longjump的实现。
有变成OS的苗头。
网友评论:用longjump的我也试验过,但并不好用,比如兼容性不好,同样的程序,换个CPU又不行了.因为各个CPU实现的不一样.在一个子程序内跳转还可以,如果跨越子程序,基本很危险.
所以77楼的后面也说有不少限制.
在网络上找找,有不少用longjmp做任务切换的例子.
网友评论:自动放弃cpu,协作式os.
不过要小心局部变量。
把每个任务的sp分开
网友评论:longjmp是c的标准函数,它本身就是为线程跳转用的。子程序内跳转用goto就行了。
后面的限制是由于c51
内存分配机制决定的。在pc上就没有以上限制。
网友评论:如果任务调用子程序,子程序能直接跳到别的任务吗?还是子程序也要一个jmp_buf?
网友评论:如果要在多任务切换,不要在子程序里面用噢。
如果不是做多任务切换,整个程序用一个jmp_buf.可以随意跳转。我回答的对么?
其实看得出,你才是高手
其实我贴它的用意是,不用OS也可以完成多任务切换。我用的是汇编版本,汇编版本在子程序里也是可以的。其实俺压根也没把这看成OS,也就是一件紧身衣。