bald
发表于 2007-12-17 23:04
补充
当然,启动关联程序之还要确保为下一个F05()预留充分的运行时间。
wxj1952
发表于 2007-12-18 09:50
bald分析的没错!
前面说到了这个初始命题条件并不明确,经过楼主后来补充逐渐清晰:<br />1,每秒钟运行一次F05()<br />2,每分钟运行一次4个关联程序<br />这就是说不限定运行时刻(或运行时刻限制并不严格)。因此这并不是一个严格意义上的实时程序。<br /><br />
wxj1952
发表于 2007-12-18 09:57
题目不是我出的,我还真没这个水平。
我觉得这道题这种逻辑也许就是故意考验理解力/洞察力/分析能力/......。题目说过了,运行F280时,秒位和F05丢失管理。秒显示肯定停止了,那么“1,每秒钟运行一次F05()”的命题当然自相矛盾。所以有一位网友说:<br /><br />“由于......是不可能的(自相矛盾的),所以F05应该是能够被推迟运行的函数。”<br /><br />就是这么简单的逻辑判断。<br /><br />说得简单一点,连秒数都丢了,那么“以秒(显示)为基准的F05”还会按时运行?基准都丢了,F05以什么为启动参考?所以既然丢失的秒数可以后补,那么F05当然也是随之后补的。<br /><br />如果认为“每秒钟运行一次F05()”与题意自相矛盾,那“秒位肯定要丢数,....”对一个精确时钟来说,早就不合理了,丢了数又怎么还会精确?所以又有朋友早就断定“此题无解!”<br /><br />不妨假定:F05函数就是秒位显示LED的驱动程序。
huntington
发表于 2007-12-18 10:36
阿弥陀佛...
善哉...结贴...
foxfox
发表于 2007-12-18 14:18
简单的作个补充,这个问题应该是自己住土左时间的补偿
while(1)<br />{<br />if(秒到达)<br /> {<br /> F05();<br /> }<br />if(分到达)<br /> {<br /> F071();<br /> F05();<br /> F072();<br /> F05();<br /> F073();<br /> F05();<br /> F074();<br /> F05();<br /> }<br />}<br />
ym123
发表于 2007-12-18 17:41
LS
我想F071-073后各加多一个F05,每分钟的前8秒才能顺序跑完4个函数,时钟只不过是精确到秒而已,不知对否?
wxj1952
发表于 2007-12-18 17:54
题目的主题是:如何恢复丢失的秒数.
3,每分钟到达时,运行一次4个紧密关联的函数,每个运行开销700ms, 设其为F071(),F072(),F073(),F074();要求4个函数必须顺序运行。<br /><br />实际上F07x是一个运行时间为280ms的长任务,系统中所有函数具有同等优先权,一旦任何一个启动运行,直到运行完之前,不可能被其它函数插入。<br />所以F280运行时,丢秒.怎样恢复?<br />
fengyeu
发表于 2007-12-18 22:15
直接飞到最后页看结果!!!
直接飞到最后页看结果!!!<br />爬了好些累了!<br />结果出来没有啊?
win2000_li
发表于 2007-12-18 22:24
好!!
虽然我是单片机方面是很菜的。<br /><br />没有发言权,但是做事,一定要落到实处。<br /><br />说话再多,不如做出来摆起。<br /><br />顶贴!!!
mapleyang
发表于 2007-12-18 22:43
re
有完没完?<br />俺只想看看到底谁拿到了10k银子,想采访一下人家有何感受<br />
木头东瓜
发表于 2007-12-19 09:28
连老a都在吐雪啦
哈哈<br />这世界还有啥不可能的事情
wxj1952
发表于 2007-12-19 09:32
回475楼
hotpower !
wuhancyq
发表于 2007-12-20 22:36
OK!
上次是偶然路过,现在也忘了是在哪里看到LZ的贴字,现在也懒得去找了.<br /><br />今天又是偶然打开邮箱,有LZ的回复,看看后已是4-5天以后了,也不知道LZ的答案如何了,看来不给你个交代不行,花了25分钟将代码写完,如下:<br /><br />void main(void)<br />{<br /> init_system(); //初始化<br /><br /> tSecond = 0; //秒<br /> tMinite = 0; //分<br /> tCount = 0; //ticks计数器<br /> cFun7x = 0; //Fun71/72/73/74管理 <br /> cFun50 = 0; //Fun50管理<br /><br /> status = sWAIT; //状态变量<br /><br /> while(1)//主循环<br /> {<br /> switch(status) //状态<br /> {<br /> case sWAIT: //等待<br /> Enable; //开中断<br /> //时间处理<br /> if(tCount>9)<br /> { <br /> tCount -= 10;<br /> tSecond++;<br /> cFun50 = 0; //秒更新后要进行Fun50调用<br /> if(tSecond > 59)<br /> {<br /> tSecond = 0;<br /> tMinite ++; //分钟不处理了<br /> }<br /> }//end if(tCount>9)<br /> Disp(); //时间显示<br /> if(tSecond==0) cFun7x=0; //需要进行Fun7x调用<br /> break;<br /><br /> case sFun5: //F050<br /> Disable; //关中断<br /> F050(); <br /> cFun50 = 1; //通知系统Fun50完成<br /> tCount += 5;//计数<br /> status = sWAIT;<br /> break;<br /> <br /> case sFun7:<br /> Disable;<br /> switch(cFun7x)<br /> {<br /> case 0: Fun71(); break;<br /> case 1: Fun72(); break;<br /> case 2: Fun72(); break;<br /> case 3: Fun73(); break;<br /> default:break;<br /> }<br /> tCount += 7;<br /> cFun7x++;<br /> status = sWAIT;<br /> break;<br /> <br /> deafult:break;<br /> }//end switch(status)<br /> }//end while(1)<br />}//end main(void)<br /><br />timer0 interrupt() //100ms中断<br />{<br /> if(cFun50==0) status = sFUN5;//函数调用<br /> else<br /> if(cFun7x < 4)//需要Fun7x调用<br /> status = sFun7;<br /> tCount++; //计数器加1<br />}<br /><br />数了一下加上空行也只有70行,当然有些地方省写了,100行是没有问题.<br /><br />详细分析了代码,没有问题,画了个状态图验证了一下,和我在帖子里说得一样,这里的一个问题就是秒信号不是在刚好更新的时候显示的(主要是奇数秒,发生在第1357秒,偶数秒没问题),这是先天不足,因为不可能在1秒内能完成0.7+0.5的任务<br /><br />我不知道这个答案能否让LZ满意<br /><br />本人在武汉工作,主要做应用电子设计,在电力医疗行业混,除了单片机(5196等),主要做DSP,现在用ARM了.<br /><br />wuhancyq即日<br />
wuhancyq
发表于 2007-12-20 22:43
OK!
上贴修改!!!!!!!!!!!!!!!<br />switch(cFun7x)<br /> {<br /> case 0: Fun71(); break;<br /> case 1: Fun72(); break;<br /> case 2: Fun73(); break;<br /> case 3: Fun74(); break;<br /> default:break;<br /> }<br />
fuzichun
发表于 2007-12-22 10:52
LZ把钱给汇给得奖的人没有
hotpower 你拿到也说声哈,这样的好事该让大家知道
alphal
发表于 2007-12-25 23:21
慕名前来留名。。。。
不知道最后结果如何了?<br /><br />lz给的答案是否正确?太长了,偶没细看。
lanyong
发表于 2007-12-28 12:56
我用哲学来破你题
os是什么,一样是一串指令.<br /><br />所以有os的和没有os的在本质上是一样的.<br /><br />只是一种编程序的思想了.<br /><br />我们无法否认os的作用,而同时我们也不得不承认不要os也有它的好处.
keer_zu
发表于 2007-12-28 14:03
快500楼了!加油,建造世间第一高楼!
常来21IC
发表于 2007-12-28 14:12
为天下百姓多盖一层楼
现在房价那么高,大家都来盖一层吧,房子多了房价必跌!
21ele
发表于 2008-1-1 23:55
支持457楼!初始命题不严谨,导致到了大部分人理解障碍!
命题内容我补充一点:<br /><br />1,每秒钟运行一次F05(),<br />2,每分钟运行一次4个关联程序<br />这就是说不限定运行时刻(或运行时刻限制并不严格)。因此这并不是一个严格意义上的实时程序。<br />4个关联程序主要保证顺序,间隔时间无明确要求,间隔几秒按题意都是可以的。<br /><br />3.F05()可以漏掉,但是秒计数不可以漏。<br />4.秒计数要精确,但精确的要求仅仅是不产生累加误差。<br /><br />如果要实现,最简单的就是457楼的方法,全在定时中断里完成就可以了。<br /><br />定时中断要选自动重装的或匹配的定时器中断,配合低点的时钟频率和预分频器保证秒秒冲完全由硬件产生即可。<br /><br />用os也是可能的,关键是要设置os的系统节拍为1秒(通常仅仅设10ms)。但是实现起来还是不很轻松,任务里要关其他中断,设置最高优先级等,以避免os的调度和时钟节拍和中断打断任务,但做这些都是勉为其难的。因为本质上这个命题根本就不需要os去灵活调度任务。