打印

**lz说湖南人好斗,

[复制链接]
楼主: wxj1952
手机看帖
扫描二维码
随时随地手机跟帖
461
bald| | 2007-12-17 23:04 | 只看该作者 回帖奖励 |倒序浏览

补充

当然,启动关联程序之还要确保为下一个F05()预留充分的运行时间。

使用特权

评论回复
462
wxj1952|  楼主 | 2007-12-18 09:50 | 只看该作者

bald分析的没错!

前面说到了这个初始命题条件并不明确,经过楼主后来补充逐渐清晰:
1,每秒钟运行一次F05()
2,每分钟运行一次4个关联程序
这就是说不限定运行时刻(或运行时刻限制并不严格)。因此这并不是一个严格意义上的实时程序。

使用特权

评论回复
463
wxj1952|  楼主 | 2007-12-18 09:57 | 只看该作者

题目不是我出的,我还真没这个水平。

我觉得这道题这种逻辑也许就是故意考验理解力/洞察力/分析能力/......。题目说过了,运行F280时,秒位和F05丢失管理。秒显示肯定停止了,那么“1,每秒钟运行一次F05()”的命题当然自相矛盾。所以有一位网友说:

“由于......是不可能的(自相矛盾的),所以F05应该是能够被推迟运行的函数。”

就是这么简单的逻辑判断。

说得简单一点,连秒数都丢了,那么“以秒(显示)为基准的F05”还会按时运行?基准都丢了,F05以什么为启动参考?所以既然丢失的秒数可以后补,那么F05当然也是随之后补的。

如果认为“每秒钟运行一次F05()”与题意自相矛盾,那“秒位肯定要丢数,....”对一个精确时钟来说,早就不合理了,丢了数又怎么还会精确?所以又有朋友早就断定“此题无解!”

不妨假定:F05函数就是秒位显示LED的驱动程序。

使用特权

评论回复
464
huntington| | 2007-12-18 10:36 | 只看该作者

阿弥陀佛...

善哉...结贴...

使用特权

评论回复
465
foxfox| | 2007-12-18 14:18 | 只看该作者

简单的作个补充,这个问题应该是自己住土左时间的补偿

while(1)
{
if(秒到达)
  {
   F05();
  }
if(分到达)
  {
   F071();
   F05();
   F072();
   F05();
   F073();
   F05();
   F074();
   F05();
  }
}

使用特权

评论回复
466
ym123| | 2007-12-18 17:41 | 只看该作者

LS

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

使用特权

评论回复
467
wxj1952|  楼主 | 2007-12-18 17:54 | 只看该作者

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

3,每分钟到达时,运行一次4个紧密关联的函数,每个运行开销700ms, 设其为F071(),F072(),F073(),F074();要求4个函数必须顺序运行。

实际上F07x是一个运行时间为280ms的长任务,系统中所有函数具有同等优先权,一旦任何一个启动运行,直到运行完之前,不可能被其它函数插入。
所以F280运行时,丢秒.怎样恢复?

使用特权

评论回复
468
fengyeu| | 2007-12-18 22:15 | 只看该作者

直接飞到最后页看结果!!!

直接飞到最后页看结果!!!
爬了好些累了!
结果出来没有啊?

使用特权

评论回复
469
win2000_li| | 2007-12-18 22:24 | 只看该作者

好!!

虽然我是单片机方面是很菜的。

没有发言权,但是做事,一定要落到实处。

说话再多,不如做出来摆起。

顶贴!!!

使用特权

评论回复
470
mapleyang| | 2007-12-18 22:43 | 只看该作者

re

有完没完?
俺只想看看到底谁拿到了10k银子,想采访一下人家有何感受

使用特权

评论回复
471
木头东瓜| | 2007-12-19 09:28 | 只看该作者

连老a都在吐雪啦

哈哈
这世界还有啥不可能的事情

使用特权

评论回复
472
wxj1952|  楼主 | 2007-12-19 09:32 | 只看该作者

回475楼

hotpower !

使用特权

评论回复
473
wuhancyq| | 2007-12-20 22:36 | 只看该作者

OK!

上次是偶然路过,现在也忘了是在哪里看到LZ的贴字,现在也懒得去找了.

今天又是偶然打开邮箱,有LZ的回复,看看后已是4-5天以后了,也不知道LZ的答案如何了,看来不给你个交代不行,花了25分钟将代码写完,如下:

void main(void)
{
  init_system();    //初始化

  tSecond = 0;      //秒
  tMinite = 0;      //分
  tCount  = 0;      //ticks计数器
  cFun7x  = 0;      //Fun71/72/73/74管理  
  cFun50  = 0;      //Fun50管理

  status = sWAIT;   //状态变量

  while(1)//主循环
  {
    switch(status)  //状态
    {
      case sWAIT:   //等待
        Enable;     //开中断
        //时间处理
        if(tCount>9)
        { 
          tCount -= 10;
          tSecond++;
          cFun50 = 0;     //秒更新后要进行Fun50调用
          if(tSecond > 59)
          {
            tSecond = 0;
            tMinite ++;   //分钟不处理了
          }
        }//end if(tCount>9)
        Disp();         //时间显示
        if(tSecond==0)  cFun7x=0;  //需要进行Fun7x调用
        break;

      case sFun5:   //F050
        Disable;    //关中断
        F050();     
        cFun50 = 1; //通知系统Fun50完成
        tCount += 5;//计数
        status = sWAIT;
        break;
        
      case sFun7:
        Disable;
        switch(cFun7x)
        {
          case 0: Fun71();  break;
          case 1: Fun72();  break;
          case 2: Fun72();  break;
          case 3: Fun73();  break;
          default:break;
        }
        tCount += 7;
        cFun7x++;
        status = sWAIT;
        break;
      
      deafult:break;
    }//end switch(status)
  }//end while(1)
}//end main(void)

timer0 interrupt()         //100ms中断
{
  if(cFun50==0)      status = sFUN5;//函数调用
  else
    if(cFun7x < 4)//需要Fun7x调用
      status = sFun7;
  tCount++;     //计数器加1
}

数了一下加上空行也只有70行,当然有些地方省写了,100行是没有问题.

详细分析了代码,没有问题,画了个状态图验证了一下,和我在帖子里说得一样,这里的一个问题就是秒信号不是在刚好更新的时候显示的(主要是奇数秒,发生在第1357秒,偶数秒没问题),这是先天不足,因为不可能在1秒内能完成0.7+0.5的任务

我不知道这个答案能否让LZ满意

本人在武汉工作,主要做应用电子设计,在电力医疗行业混,除了单片机(5196等),主要做DSP,现在用ARM了.

wuhancyq即日

使用特权

评论回复
474
wuhancyq| | 2007-12-20 22:43 | 只看该作者

OK!

上贴修改!!!!!!!!!!!!!!!
switch(cFun7x)
        {
          case 0: Fun71();  break;
          case 1: Fun72();  break;
          case 2: Fun73();  break;
          case 3: Fun74();  break;
          default:break;
        }

使用特权

评论回复
475
fuzichun| | 2007-12-22 10:52 | 只看该作者

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

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

使用特权

评论回复
476
alphal| | 2007-12-25 23:21 | 只看该作者

慕名前来留名。。。。

不知道最后结果如何了?

lz给的答案是否正确?太长了,偶没细看。

使用特权

评论回复
477
lanyong| | 2007-12-28 12:56 | 只看该作者

我用哲学来破你题

os是什么,一样是一串指令.

所以有os的和没有os的在本质上是一样的.

只是一种编程序的思想了.

我们无法否认os的作用,而同时我们也不得不承认不要os也有它的好处.

使用特权

评论回复
478
keer_zu| | 2007-12-28 14:03 | 只看该作者

快500楼了!加油,建造世间第一高楼!

使用特权

评论回复
479
常来21IC| | 2007-12-28 14:12 | 只看该作者

为天下百姓多盖一层楼

现在房价那么高,大家都来盖一层吧,房子多了房价必跌!

使用特权

评论回复
480
21ele| | 2008-1-1 23:55 | 只看该作者

支持457楼!初始命题不严谨,导致到了大部分人理解障碍!

命题内容我补充一点:

1,每秒钟运行一次F05(),
2,每分钟运行一次4个关联程序
这就是说不限定运行时刻(或运行时刻限制并不严格)。因此这并不是一个严格意义上的实时程序。
4个关联程序主要保证顺序,间隔时间无明确要求,间隔几秒按题意都是可以的。

3.F05()可以漏掉,但是秒计数不可以漏。
4.秒计数要精确,但精确的要求仅仅是不产生累加误差。

如果要实现,最简单的就是457楼的方法,全在定时中断里完成就可以了。

定时中断要选自动重装的或匹配的定时器中断,配合低点的时钟频率和预分频器保证秒秒冲完全由硬件产生即可。

用os也是可能的,关键是要设置os的系统节拍为1秒(通常仅仅设10ms)。但是实现起来还是不很轻松,任务里要关其他中断,设置最高优先级等,以避免os的调度和时钟节拍和中断打断任务,但做这些都是勉为其难的。因为本质上这个命题根本就不需要os去灵活调度任务。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则