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 />&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;F05();<br />&nbsp;&nbsp;}<br />if(分到达)<br />&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;F071();<br />&nbsp;&nbsp;&nbsp;F05();<br />&nbsp;&nbsp;&nbsp;F072();<br />&nbsp;&nbsp;&nbsp;F05();<br />&nbsp;&nbsp;&nbsp;F073();<br />&nbsp;&nbsp;&nbsp;F05();<br />&nbsp;&nbsp;&nbsp;F074();<br />&nbsp;&nbsp;&nbsp;F05();<br />&nbsp;&nbsp;}<br />}<br />

ym123 发表于 2007-12-18 17:41

LS

我想F071-073后各加多一个F05,每分钟的前8秒才能顺序跑完4个函数,时钟只不过是精确到秒而已,不知对否?

wxj1952 发表于 2007-12-18 17:54

题目的主题是:如何恢复丢失的秒数.

3,每分钟到达时,运行一次4个紧密关联的函数,每个运行开销700ms,&nbsp;设其为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&nbsp;!

wuhancyq 发表于 2007-12-20 22:36

OK!

上次是偶然路过,现在也忘了是在哪里看到LZ的贴字,现在也懒得去找了.<br /><br />今天又是偶然打开邮箱,有LZ的回复,看看后已是4-5天以后了,也不知道LZ的答案如何了,看来不给你个交代不行,花了25分钟将代码写完,如下:<br /><br />void&nbsp;main(void)<br />{<br />&nbsp;&nbsp;init_system();&nbsp;&nbsp;&nbsp;&nbsp;//初始化<br /><br />&nbsp;&nbsp;tSecond&nbsp;=&nbsp;0;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//秒<br />&nbsp;&nbsp;tMinite&nbsp;=&nbsp;0;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//分<br />&nbsp;&nbsp;tCount&nbsp;&nbsp;=&nbsp;0;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//ticks计数器<br />&nbsp;&nbsp;cFun7x&nbsp;&nbsp;=&nbsp;0;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//Fun71/72/73/74管理&nbsp;&nbsp;<br />&nbsp;&nbsp;cFun50&nbsp;&nbsp;=&nbsp;0;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//Fun50管理<br /><br />&nbsp;&nbsp;status&nbsp;=&nbsp;sWAIT;&nbsp;&nbsp;&nbsp;//状态变量<br /><br />&nbsp;&nbsp;while(1)//主循环<br />&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;switch(status)&nbsp;&nbsp;//状态<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;case&nbsp;sWAIT:&nbsp;&nbsp;&nbsp;//等待<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Enable;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//开中断<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//时间处理<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(tCount&gt9)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tCount&nbsp;-=&nbsp;10;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tSecond++;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cFun50&nbsp;=&nbsp;0;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//秒更新后要进行Fun50调用<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(tSecond&nbsp;&gt&nbsp;59)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tSecond&nbsp;=&nbsp;0;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tMinite&nbsp;++;&nbsp;&nbsp;&nbsp;//分钟不处理了<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}//end&nbsp;if(tCount&gt9)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Disp();&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//时间显示<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(tSecond==0)&nbsp;&nbsp;cFun7x=0;&nbsp;&nbsp;//需要进行Fun7x调用<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;case&nbsp;sFun5:&nbsp;&nbsp;&nbsp;//F050<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Disable;&nbsp;&nbsp;&nbsp;&nbsp;//关中断<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;F050();&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cFun50&nbsp;=&nbsp;1;&nbsp;//通知系统Fun50完成<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tCount&nbsp;+=&nbsp;5;//计数<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;status&nbsp;=&nbsp;sWAIT;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;case&nbsp;sFun7:<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Disable;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;switch(cFun7x)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;case&nbsp;0:&nbsp;Fun71();&nbsp;&nbsp;break;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;case&nbsp;1:&nbsp;Fun72();&nbsp;&nbsp;break;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;case&nbsp;2:&nbsp;Fun72();&nbsp;&nbsp;break;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;case&nbsp;3:&nbsp;Fun73();&nbsp;&nbsp;break;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;default:break;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tCount&nbsp;+=&nbsp;7;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cFun7x++;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;status&nbsp;=&nbsp;sWAIT;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;deafult:break;<br />&nbsp;&nbsp;&nbsp;&nbsp;}//end&nbsp;switch(status)<br />&nbsp;&nbsp;}//end&nbsp;while(1)<br />}//end&nbsp;main(void)<br /><br />timer0&nbsp;interrupt()&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//100ms中断<br />{<br />&nbsp;&nbsp;if(cFun50==0)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;status&nbsp;=&nbsp;sFUN5;//函数调用<br />&nbsp;&nbsp;else<br />&nbsp;&nbsp;&nbsp;&nbsp;if(cFun7x&nbsp;&lt&nbsp;4)//需要Fun7x调用<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;status&nbsp;=&nbsp;sFun7;<br />&nbsp;&nbsp;tCount++;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//计数器加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 />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;case&nbsp;0:&nbsp;Fun71();&nbsp;&nbsp;break;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;case&nbsp;1:&nbsp;Fun72();&nbsp;&nbsp;break;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;case&nbsp;2:&nbsp;Fun73();&nbsp;&nbsp;break;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;case&nbsp;3:&nbsp;Fun74();&nbsp;&nbsp;break;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;default:break;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />

fuzichun 发表于 2007-12-22 10:52

LZ把钱给汇给得奖的人没有

hotpower&nbsp;&nbsp;你拿到也说声哈,这样的好事该让大家知道

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去灵活调度任务。
页: 14 15 16 17 18 19 20 21 22 23 [24] 25 26 27 28 29
查看完整版本: **lz说湖南人好斗,