IceAge
发表于 2007-12-4 21:49
还在争?
坦率的说,争这个意义不大。wxj1952 的用“终结“ 一字,显然欠妥。这样的题目,无论在 os 下有什么样的调度策略,裸奔绝对, 我是说, **** 绝对 **** 可以做到,无论如何,wxj1952 你肯定会输掉的。<br /><br />os 的优势在于通用性,灵活性,特别是可扩展性,这是 裸奔 很难做到的。<br /><br />wxj1952 是新警察吧?
liandao
发表于 2007-12-4 21:49
可行么
A.每分钟到达点之后9秒时序图<br />|___________________|___________________|___________________|___________________|<br />| 700ms | 300ms|200ms|300ms|500ms | 700ms | 300ms|200ms|300ms|500ms | <<时间<br />|--> F071 <|-->F05 <| _ |-->F05<|--> F072 <|-->F05 <| _ |-->F05<| <<任务<br />| + | | + + | | +<br />|0 1 | | 2 4 | | 5 <<秒值<br />| | |<-300ms延时| | |<-300ms延时|<br />| | | | | <br />#-- |<-秒跳 |<-秒跳 |<-秒跳 |<-秒跳<br />|<---每分钟到达点<br /><br /><br /><br />|___________________|___________________|___________________|___________________|<br />| 700ms | 300ms|200ms|300ms|500ms | 700ms | 300ms|200ms|300ms|500ms | <<时间<br />|--> F073 <|-->F05 <| _ |-->F05<|--> F074 <|-->F05 <| _ |-->F05<| <<任务<br />+ + | | + + | +<br />5 6 | | 7 8 | | 9 <<秒值<br />| | |<-300ms延时| | |<-300ms延时|<br />| | | | |<br />|<-秒跳 |<-秒跳 |<-秒跳 |<-秒跳 |<-秒跳<br /><br />B.每分钟其余时间时序图<br />|___________________|___________________|___________________|<br />| 500ms | 500ms | 500ms | 500ms | 500ms | 500ms | <<时间<br />|-->F05 <| _ _ _ _ |-->F05 <| _ _ _ _ |-->F05 <| _ _ _ _| <<任务<br />+ | + | + | + <br />8 | 9 | 10 | 11 <<秒值<br />| |<-500ms延时 |<-500ms延时 |<-500ms延时<br />| | | |<br />|<-秒跳 |<-秒跳 |<-秒跳 |<-秒跳 <br /><br />补充说明:<br />1 F05执行情况有两种如下:<br />1.a F05在每秒的开始点起被执行,如图B描述的时序图.<br />1.b F05并没有严格在每秒的时刻到达的时候被执行,但每一秒内均被执行过一次,如图A描述的时序图(这点不知是否合适?) <br />2.在每分钟的时刻到达后,9秒内F05如1.a所讲,9秒期间4个顺序任务F071--F074依次在每两秒的开始点被执行<br />3.图B中秒的维护比较容易,秒跳变比较精准;图A中,秒跳有偏差,一次是1200ms 下次是800ms 如此往复4次.虽然秒跳位置偏差但时间并未出现偏差<br /><br />要求点检查:<br />1.时间精确<<可以做到<br />2.F071---F074顺序执行<<可以做到<br />3.每秒一次F05<<做到了?(但时间点并不是次次都在秒跳的开始点)<br />4.任务不允许被打断<<做到<br />-------------------- <br />个人认为以下要求不能满足:<br />1.如果要求秒跳均是在每秒的开始点,做不到,因为700ms的任务加上一个500ms的任务比1秒长.<br />2.要求耗时500ms的任务F05必须开始于每秒的开始点,也做不到.<br /><br /><br /><br />1、用单CPU做一个精确的时钟。<br />2、以此时钟为基准,每秒钟运行一次一个500ms开销的任务,设其为F05()。<br />3,每分钟到达时,运行一次4个紧密关联的函数,每个运行开销700ms, 设其为F071(),F072(),F073(),F074();要求4个函数必须顺序运行。<br />4、为简化题目,只做秒、分2位。<br />
xwj
发表于 2007-12-4 21:53
好,就以LZ目前的这个版本为准,开始咬文嚼字的审题:
好,就以LZ目前的这个版本为准,开始咬文嚼字的审题:<br /><font color=#777777><br />这是一个实际应用的例子。实现目标:<br /><br />1、用单CPU做一个精确的时钟。<br /><font color=#0000EE>--估计不是“精确”,而应该是“准确”,既整体计数不会错误即可。<font color=#EE0000>这样理解LZ同意吗?</font><br /></font><br />2、以此时钟为基准,每秒钟运行一次一个500ms开销的任务,设其为F05()。<br /><font color=#0000EE>--依题意F05()在每秒钟内必须得到一次运行,每次运行的整体时长时500mS,但不限定是否被打断以及是否非在一秒开始时准确开始。由于有“每秒钟运行一次”的要求,考虑偏差,在任意2秒内如果一次都没运行那就肯定是错的。<font color=#EE0000>这样理解LZ同意吗?</font></font><br /><br />3,每分钟到达时,运行一次4个紧密关联的函数,每个运行开销700ms, 设其为F071(),F072(),F073(),F074();要求4个函数必须顺序运行。<br /><font color=#0000EE>--依题意F07x()每个函数运行时间为700mS,然后顺序依次为F071(),F072(),F073(),F074(),不能错乱(比如F071(),F073(),F072(),F074();),不能混合(比如F071(F072()),,F073(),F074();)等。而在“一分钟后”是1.01分时开始运行F071()还是1.10分时开始运行关系不大,是1.x1分时开始运行F072()还是1.x2分时开始运行F072()关系不大,实际上只要保证F071(),F072(),F073(),F074();4个的相对顺序正确就行了。<font color=#EE0000>这样理解LZ同意吗?</font></font><br /><br />4、为简化题目,只做秒、分2位。<br /><font color=#0000EE>--这个无所谓啦,设秒的范围为0~59;分的范围为0~59。<font color=#EE0000>这样理解LZ同意吗?</font></font><br /><br />要求:各函数时间开销严格,运行期间不允许打断(即不允许被中断或抢占)。<br /><font color=#0000EE>--这个要求非常关键,LZ本意上所设置的难点也就在这里了。“各函数时间开销严格”中的“严格”就很关键了。比如700mS的函数要时运行成了701mS或699mS都是不对的。<font color=#EE0000>这样理解LZ同意吗?</font><br />--“运行期间 不允许 打断”这句也是相当关键的,分为3个关键词组:“运行期间”“不允许”“打断”,缺一不可,对吧? 那么分别来详细理解:“运行期间”是指每个函数(比如F05()、F071())运行中间,对吧?“不允许”很好理解,违规就立即out嘛。“打断”--这个打断就不知怎么说了,不知会不会有人故意去曲解它呢?按照文字的意思,对应到处理器的行为上,如果运行F071()时PC指针全部在F071()的范围内才是不被打断,只要执行F071()范围外的任何指令,就是被打断了,<font color=#EE0000>这样理解LZ同意吗?</font><br />--再看括号里的补充:(即不允许被中断或抢占),这个“中断”是指 a、别的程序中断了它一下然后又返回了;b、还是指别的程序中断了它,就此不返回了;c、还是指别的程序中断了它,运行完另外的程序后再返回它了; d、还是指CPU产生了定时器硬件中断、IO硬件中断等?“抢占”很好理解,只是针对OS来说的,实际应该是上面的情况c吧。<font color=#EE0000>这样理解LZ同意吗?</font><br /><br /><br /><br /></font></font><br />先问这一部分吧,等LZ确认后再继续...
xwj
发表于 2007-12-4 21:58
如果对于我的理解有异议可以提出来,我们甚至可以把解释
前提是只要你有合理或不合理的解释!<br /><br />然后我们再在你的“解释”上统一讨论或比试,但不允许反悔或逃跑,OK?<br /><br />
农民讲习所
发表于 2007-12-4 21:59
LZ想要答案而已,夸张手法是市场运作。
老狼
发表于 2007-12-4 22:23
那就玩玩吧
Timer //定时1秒<br />{<br /> TimerCounter++;<br /> SecondLBL=1;<br />}<br />main()<br />{<br /> <br /> TimerCounter=0; //秒计时器<br /> SecondLBL=0; //秒到达标志<br /> OpenAndInitTimer();//<br /><br /> while(1)<br /> {<br /> if((SecondLBL==1)&&(TimerCounter<59))<br /> {<br /> F05();<br /> SecondLBL=0;<br /> }<br /> if(TimerCounter>=59)<br /> { <br /> CloseTimer(); //lineA 关定时器<br /> F071();<br /> F072();<br /> F073();<br /> F074();<br /> Delay(); //延时时间常数为,程序由lineA到lineB 时间为3秒<br /> TimerCounter=3; //让秒计时留出3秒的时间,留给这段程序执行<br /> 需要根据程序运行,修改等待时间<br /> OpenAndInitTimer();//lineB 开定时器,并从新初始化 <br /> }<br />}<br /><br /> 不知道楼主是不是这个意思!
zhuhai2004
发表于 2007-12-4 22:26
耐心看完所有的帖子,到最后也不知道都说了什么?
听说日本的uITRON的实时系统也不错,可惜是收费的。(没办法,好东西都是要银子的,可是不用银子的又不敢用,郁闷)不知道有没有这方面的高手啊?因为用日系的片子,所以关注,高手不如谈谈这个东东呗!
平常人
发表于 2007-12-4 22:29
哈哈,一只猫耍一群老鼠
有人在偷着乐
liandao
发表于 2007-12-4 22:29
追加
洗澡时想了一下:<br />对"224楼"补充如下:<br />如果图A图B正确,那么用状态机的方式做"裸奔"很容易的,即便是要求用OS,那么问题也能解决,在图A中每次秒跳点做系统时间校正就行了.<br />-->执行F071-->执行F05--->校正系统时间-->300ms空等-->F05---><br /> | | | | | <<调度点 <br /><br />-->执行F072-->执行F05--->校正系统时间-->300ms空等-->F05---><br /> | | | | | <<调度点 <br /><br />-->执行F073-->执行F05--->校正系统时间-->300ms空等-->F05---><br /> | | | | | <<调度点 <br /><br />-->执行F074-->执行F05--->校正系统时间-->300ms空等-->F05---><br /> | | | | | <<调度点 <br />...<br />还是认为500ms任务和700ms任务无法同时对齐于秒的开始点,如同有一个很多连续的一米的空格子,有70cm和50cm长的东西,事先要求每个格子放一个50cm的东西,那么无论如何70cm的东西是根本不再能发到格子里的.
uc.c
发表于 2007-12-4 22:29
楼好高啊
这么高的楼,一页一页看下来,真累。
wxj1952
发表于 2007-12-4 22:43
XWJ的分析完全对!
非常对不起,我差点今天关机了。没想到有这么多热心网友关注。我要再等就对不起人了。<br /><br />xwj的分析完全对!就是F05“但不限定是否被打断”这句,应该像F07x一样理解,只要启动运行,就应连续到完成。“所有函数‘运行期间’不允许被打断”。<br /><br />我这里公开主要答案:“什么叫临界代码”?<br /><br />代码的临界段<br />代码的临界段也称为临界区,指处理时不可分割的代码。一旦这部分代码开始执行,则不允许任何中断打入。为确保临界代码的执行不被中断,再进入临阶段之前须关中断,而临界代码执行完后,要立即开中断。<br /> ——摘自《嵌入式实时操作系统uc/OS-II》<br /><br />所以,把F07x处理为临界代码即可。临界代码的规则是(书上没说,我们自己应该知道):一段临界代码的运行时间不能超过一个系统节拍时间。分割任务也是按此规则吧。其实这是裸奔规则,(我在为裸奔者提示。)OS可以自动管理,不要求用户理解这么复杂的事情。<br /><br />还有,好像hotpower说过:只要秒脉冲不丢,什么都可以奔出来。临界代码运行期间,系统心跳停止了么?没有。所以,还有最后一个问题,怎么保证正确恢复丢失的秒数?<br /><br />基本原理都说明了。没有刁难谁。最后这个问题,还想看看怎么奔的。后天来看OS怎么做的。<br /><br />谢谢诸位!谢谢老狼,谢谢liandao。<br />
老狼
发表于 2007-12-4 22:43
uITRON
这个系统的作者好象叫 板村建(板寸贱),按zlg 的说法,全世界占有量第一(我不太相信),现在都在说全世界占有量第一,LINUX , WinCE 都说是占有量第一,如果从我能看到的来说,我个人觉得还是wince 更有发展,这个世界,跟老大混,不会有错的,不过在咱那个ARM 论坛上可不敢这样说,板砖不知道要飞过来多少。uITRON,个人觉得是最没前途的,你看看老周,现在再推啥?也就 LINUX , WinCE。 那个uITRON也就说说,没推啥产品!其实我更喜欢Vxwork or threadx,但是太贵了!
chuangong
发表于 2007-12-4 22:51
不知这样是否可以裸奔?
void main(void)<br />{<br /> while(1)<br /> {<br /> //TCONT为定时器的计数器寄存器,<br /> //该寄存器需满足大于2秒的定时计数长度( 假设为2秒 =500ms+700ms+其他语句执行时间)<br /> //timerReload为1秒的重载值<br /> if(timerReload>TCONT) //1秒计数已经溢出<br /> {<br /> TCONT = timerReload + TCONT ; //重载1S计数值,暂时不理该语句对时钟误差的影响<br /> Sec++;<br /> EnSecDeal=true;<br /> if(Sec>=60)<br /> { <br /> Sec = 0;<br /> Min++;<br /> EnMinDeal = true;<br /> EnF07 = 1;<br /> }<br /> }<br /><br /> if(EnSecDeal==true) //1秒的处理<br /> {<br /> EnSecDeal=false;<br /> F05();<br /> }<br /> //TCONT为定时器的计数器寄存器,该寄存器需满足大于2秒定时计数长度;<br /> //timerReload为1秒的重载值<br /> if(timerReload>TCONT) //1秒计数已经溢出<br /> {<br /> TCONT = timerReload + TCONT ; //重载1S计数值,暂时不理该语句对时钟误差的影响<br /> Sec++;<br /> EnSecDeal=true;<br /> if(Sec>=60)<br /> { <br /> Sec = 0;<br /> Min++;<br /> EnMinDeal = true;<br /> EnF07 = 1;<br /> }<br /> }<br /> if(EnMinDeal==turn) //1分钟的处理<br /> {<br /> switch(EnF07)<br /> {<br /> case 1 :F071(); EnF07 = 2;break;<br /> case 2 :F072(); EnF07 = 3;break;<br /> case 3 :F073(); EnF07 = 4;break;<br /> case 4 :F074(); EnF07 = 5;EnMinDeal=false;break;<br /> default:break;<br /> }<br /> }<br /> }<br />}
xwj
发表于 2007-12-4 22:56
就因为“一旦这部分代码开始执行,则不允许任何中断打入
那你的系统节拍时间定多少?700mS还是700mS以上?此时的OS还有什么意义?此时你怎么去保证每一秒内F05()都能运行一次?<br /><br />而且你的节拍怎么来???<br /><br /><br />OS根本就不是这样用的,LZ根本就是举错了例子...<br />
平常人
发表于 2007-12-4 23:06
我说嘛,玩这种文字游戏,这不是耍人是什么
在11楼,我第一次发言时就要求LZ画个坐标图描述一下你的要求,这是避免歧义的最好办法,但LZ始终置之不理。<br /><br />不知道LZ是要考大家的文字理解能力还是要考大家的编程能力,如果是前者,那纯属在捉弄人。<br /><br />如果是后者,则犯了任务定义之大忌,定义任务的目的是要实现既定目标,现在变成了所有人在揣摩出题人的真实意图,我只能说这是LZ在故意卖关子,看所有人的笑话;也许楼主不这么认为,但实际效果就是如此!试想在战场上,一个指挥员下命令而所有的下属都不明白他的意图,即使他是个非常优秀的指挥员,他仍然要吃败仗。再多说一句,如果你让你的承包商设计一个产品,但所有的承包商都不十分清楚你要的是什么样的产品,可能你是个十分优秀的人,你也自认为说明的很明确了,但如果没有人能够理解你的意图,你仍然不能得到你想要得到的产品,最终你还是不能达到你的目的。<br />
zhuhai2004
发表于 2007-12-4 23:07
uITRON主要是资料太少,推广不开,资料都是日文的多。
工业应用我看好uITRON,uLINUX可能更适合联网吧!好像在哪里看过计算机所的同志也谈过uITRON的系统,评价很高.
xwj
发表于 2007-12-4 23:11
同意LS,去看看我出的那个题吧,会象你这样缠夹不清吗?
soso
发表于 2007-12-4 23:19
有点疑问
那个 F05 可不可以被打断?或者不能被打断但是可以被延迟?<br /><br />F071-F074 这几个函数之间是否只要顺序执行即可,而不限制中间插入其他动作?<br /><br />
athlon64fx
发表于 2007-12-4 23:21
re:
此帖和“利用失重现象宇航员也许就不会死”异曲同工。<br />http://bbs.news.sina.com.cn/tableforum/App/view.php?bbsid=4&subid=2&fid=1549&tbid=2449<br /><br />一万五千个跟帖的试图说服他,但是却不知道其实他是故意炒作的。<br />大家看看这个帖子吧。 <br /> 相关链接:<a href='http://bbs.news.sina.com.cn/tableforum/App/view.php?bbsid=4&subid=2&fid=1549&tbid=2449'>http://bbs.news.sina.com.cn/tableforum/App/view.php?bbsid=4&subid=2&fid=1549&tbid=2449</a>
soso
发表于 2007-12-4 23:29
RTOS 不过是个工具,其基础仍然是非RTOS。
可以说,能够用RTOS做到的,用非RTOS的方法也都能做到。而用非RTOS的方法做不到的,用RTOS一样做不到。<br /><br />