打印

**lz说湖南人好斗,

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

怪了,爬这么高的楼咋就没有提MCU型号,晶振频率

俺感觉用以下两个方法(希望被拍砖):
1.采用双晶振MCU,一个为CPU主频(高速);另一个为时钟频率:F071~F074期间,定时>=2.8S,具体实施不难不再提;要不就直接用一个低频的晶振...
  该方法主要需注意变量的定义--避免使用临界区代码

2.关闭中断,但开定时,在F071~F074的各个进程中查询定时器溢出,并计数,基于以下说明:
   控制器信号处理具有滞后性(严格说所有的电路都有),所以选用控制器的前提就是已经认可并允许这个滞后时间的存在。滞后时间的大小由时基(晶振)、指令周期和算法所决定。而OS与非OS应算是算法的范畴吧?所以方法2可行



以下是俺网络上搜索来得关于临界区代码的说明:

临界代码--临界区内的代码
在操作系统中,有临界区的概念。临界区内放的一般是被1个以上的进程或线程(以下只说进程)共用的数据。 
临界区内的数据一次只能同时被一个进程使用,当一个进程使用临界区内的数据时,其他需要使用临界区数据的进程进入等待状态。 
操作系统需要合理的分配临界区以达到多进程的同步和互斥关系,如果协调不好,就容易出现死锁现象。

这个是对于多任务来说的 
当多个任务共享一个变量的时候 
会用到临界代码 
它的执行不会受到外界的干扰





http://www.52rd.com/bbs/printpage.asp?BoardID=38&ID=50395
--  作者:pantaiti
--  发布时间:2006-10-26 15:28:50

--  临界区代码
什么是临界区代码? 
--  作者:alfred5000
--  发布时间:2006-10-27 8:47:24

--  
临界区代码就是指处理时不可分割的代码。当某段代码里用到的变量属于全局变量时,那部分代码就为临界区代码。比如你在外面定义了一个变量i。当你执行下列代码:
    i=a;
   a=b;
   b=i;
这段代码就是临界代码,因为如果你执行i=a后,有中断打入,如果中断把 i 值改变了,那下面的b值有出错了,所以这段代码是不可分割的,也就是属于临界区代码。 
--  作者:pantaiti
--  发布时间:2006-10-27 11:21:08

--  
这样的意思是不是就是说,在临界区代码中,要么要做保存工作,要么就要禁止中断,或者,在中断处理的时候不要使用任何临界区代码中使用的全局变量 
--  作者:alfred5000
--  发布时间:2006-10-27 12:43:34

--  
其实一般情况下应该是相反,不是在中断处理时不使用临界区代码中使用的全局变量,而在在处理临界区代码时要用把中断关闭。这在UCOS里内核里得到充分体现。 
--  作者:tongliangl
--  发布时间:2006-10-28 9:50:33

--  
临界区代码问题是涉及互斥访问的问题,是操作系统中一个十分重要的概念,而关于临界区代码的执行问题,一般采用开关中断的方式进行。

而什么是临界区代码呢?我认为临界区代码是这样的一段代码:一个时刻只能有一个任务调用;是不可分割的;设计了全局变量的使用;等等。

使用特权

评论回复
282
huangqi412| | 2007-12-5 17:46 | 只看该作者

lz怎么还没出答案?

使用特权

评论回复
283
wxj1952|  楼主 | 2007-12-5 17:57 | 只看该作者

283楼说的不错。

佩服。

使用特权

评论回复
284
chuangong| | 2007-12-5 19:10 | 只看该作者

我的思路应该对了,裸奔吧!!

5_0_5说的思路正是

235楼的裸奔解法:最起码思路对了,但不知细节有没有纰漏,^哈哈!!

“关闭中断,但开定时,在F071~F074的各个进程中查询定时器溢出,”

改为

“关闭中断,但开定时,在F071~F074的各个进程“结束后”查询定时器溢出,”
就可以完全解决各函数完全独立,不受影响的要求;

但是很怀疑这样会有实际应用场合吗?我只看过有些OS是“关中断”“开中断”成对出现保护部分几句的代码而尔。

回头看 224楼 的liandao 兄弟/姐妹 也是对的,而且思路清晰,直观。

哈哈哈,是不是有奖……

使用特权

评论回复
285
naviplus| | 2007-12-5 22:45 | 只看该作者

提供ARM9开发板

提供ARM9开发板 
(1)产品名称:SDPJ-2410-I 型套餐(S3C2410);
(2)提供linux,Wince的BSP;
(3)原理图文档提供(PDF/ORCAD);
(4)详细的说明文档及完善的技术支持;
(5)支持VGA,TV,LCD输出;
(6)NEC/3.5inch竖屏,可wince下软件调整为横屏;
(7)带电阻式触摸屏.
价格:1400 元(不含税)
www.naviplus.cn   QQ:408554849
 

使用特权

评论回复
286
汽车电子| | 2007-12-5 23:24 | 只看该作者

一看500ms,700ms,

  就觉得不是该任务占CPU机时为500ms或700ms

  只是检测时间而已,即任务开始运行到任务结束时,时差为500ms或700ms

  如果是代码运行占500ms或700ms,那实际应用中简直没有这样的例子。 3.3秒钟,要运行好多代码哦,实际应用中也不允许这样的。

  故:这样的要求,是在误导人。

使用特权

评论回复
287
zzwj5120| | 2007-12-6 01:21 | 只看该作者

看这个死循环如何?

while(1)
{
  while(秒未到达); //空等待,等待秒到达

  if((秒到达) && (分到达)){  //秒也到达而且分也到达
    F05(); //0.5S执行时间,清除秒标志,不用判断
    F071();//0.7S执行时间,共1.2S
    F05(); //0.5S执行时间,共1.7S,清除秒标志,也不用判断,2S执行F05()2次

    while(秒未到达); //空等待,等待秒到达
    F05(); //0.5S执行时间,清除秒标志,不用判断
    F072();//0.7S执行时间,共1.2S
    F05(); //0.5S执行时间,共1.7S,清除秒标志,也不用判断,2S执行F05()2次

    while(秒未到达); //空等待,等待秒到达
    F05(); //0.5S执行时间,清除秒标志,不用判断
    F073();//0.7S执行时间,共1.2S
    F05(); //0.5S执行时间,共1.7S,清除秒标志,也不用判断,2S执行F05()2次

    while(秒未到达); //空等待,等待秒到达
    F05(); //0.5S执行时间,清除秒标志,不用判断
    F074();//0.7S执行时间,共1.2S
    F05(); //0.5S执行时间,共1.7S,清除秒标志,也不用判断,2S执行F05()2次
  }else{//秒到达,但分没到达
      F05(); //0.5S执行时间,剩余0.5S
  }
}

使用特权

评论回复
288
senda_3526| | 2007-12-6 09:06 | 只看该作者

OS俺们不懂

OS俺们不懂,但俺知道OS能做的,裸奔都能做到

使用特权

评论回复
289
senda_3526| | 2007-12-6 09:17 | 只看该作者

看看俺裸奔一下

main()
{
  while(1)
   { 
    if(time到)
    {
     time到=0;
      if(time>=66)
       {
           f04();
           //f05();
         time-=6;
       }
      else if(time==64)
      {
          f03();
          //f05();
      }
     else if(time==62)
      {f02();//f05();
      }
      else if(time==60)
      {f01();//f05();
      }
      else if(time>60)
      {
       f05();
      }
      else
     {     delay300ms;f05();}
    }
  }
}

interrupt time1s
{
time到=1;
time++;
}

使用特权

评论回复
290
makesoft| | 2007-12-6 10:21 | 只看该作者

我感觉楼主应该是个学生吧

OS运行基于时间片,任务中间不能插入其他动作,要OS做什么?

使用特权

评论回复
291
heyan| | 2007-12-6 10:55 | 只看该作者

设置一个秒定时器。

设置一个秒定时器,自动重装的那种。执行任务,当任务结束查一下定时器溢出标志。不管是500ms还是700ms的,只要发现溢出就加秒。搞定。



不知道我这样说大家明白不?

使用特权

评论回复
292
电子人参| | 2007-12-6 11:25 | 只看该作者

先弄清OS调度原理再说吧


LZ你在考什么,考大家对题目的理解能力吗?
“各函数时间开销严格,运行期间不允许打断(即不允许被中断或抢占)”
“不允许抢占。可以被调度”
我们试着用OS来解决这个题目,运行期间不允许被中断,那么运行期间就必须关中断,关了中断,OS怎样才能切换任务呢,除非动行任务中有自己暂时放弃CPU的代码或者调用OS函数,否则就完成不了任务切换,那么也就不能如题意所愿。
既然是在任务函数中加上调度代码,那么为什么裸奔就不可以在函数中加上几行或者几十行的代码来完成呢,当然也可以。
有人说在函数间隙上切换,那么秒时间到来的时候,函断还在运行中呢。总觉得还是问题。
不要搞错了,OS也不是那么神奇,它不能多变出CPU来,也不能使CPU的时间平白无辜的膨胀;它对任务的切换或者调度,也只有通过中断,或者任务函断调用系统函数,否则它还还能靠什么来完成任务的调度呢?
呵呵,很多人没真正弄清OS调度机制,就找人挑战,还叫个不停。

使用特权

评论回复
293
圆圈| | 2007-12-6 13:47 | 只看该作者

OS和裸奔确实还是有差别的~~

有些东西裸奔不是那么容易替代OS的~~~  比如实时性要求场合~~~
因为裸奔是基于状态机,虽然中断能接受部分信号缓存,但真要处理也是要退出当前状态任务才行,而有OS的,可以马上执行任务调度对事件和信号进行处理! 请问这个状态机如何实现?

使用特权

评论回复
294
圆圈| | 2007-12-6 13:51 | 只看该作者

21ICBBS提醒您注意:发言不成功!!!,至少主题不应为空

无论怎么说,裸奔最多是带状态机的单线程+中断,而有OS可以实现多线程+中断,这个单线程多线程就是区别! 无论单线程如何模拟多线程,他肯定还是和真正意义上的多线程有区别的!

使用特权

评论回复
295
农民讲习所| | 2007-12-6 14:04 | 只看该作者

圆圈:

俺说过一百遍了:
  裸奔处理分三个层次:强实时,弱实时,非实时,对应着高等级中断,低等级中断,主循环。裸奔比OS优势在于能充分保证强实时处理,同时也兼顾弱实时.
  你说的OS的实时处理及时,都只指弱实时。

  裸奔和OS对多任务处理的策略是不一样的,裸奔的策略就是三个等级,然后将任务串行化排队处理,这种处理的方式在于任务的耦合性极佳。OS对任务是并行化处理,在简单场合逻辑处理比较简单,在大的复杂控制逻辑中,各个任务耦合性就比较复杂。
  俺这里说的OS是嵌入式OS,非操作系统OS。

  俺猜测:嵌入式OS很少用在手机、PDA上,也有这方面原因。

使用特权

评论回复
296
圆圈| | 2007-12-6 14:07 | 只看该作者

PDA          PALM OS    WINCE
HANDPHONE    WINCE  PALM OS  

使用特权

评论回复
297
农民讲习所| | 2007-12-6 14:08 | 只看该作者

裸奔应该改名叫“嵌入式裸奔”

时髦

使用特权

评论回复
298
农民讲习所| | 2007-12-6 14:11 | 只看该作者

为什么没见到VXWORKS、UCOS2上?

WINCE、LINUX其实不是真正的嵌入式OS

使用特权

评论回复
299
农民讲习所| | 2007-12-6 14:18 | 只看该作者

市面上还有嵌入式XP

WINDOW XP肯定不是嵌入式,然而裁剪后能在PC104上跑起来,这样的XP也叫嵌入式。

嵌入式真是时髦。

使用特权

评论回复
300
汽车电子| | 2007-12-6 14:20 | 只看该作者

LZ傻,你也跟着傻?还贴代码!

   真是服了你舞,讨论没实际意义的东东!

使用特权

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

本版积分规则