购物车0种商品
IC邮购网-IC电子元件采购商城
感谢众网友关注,下午公开答案
(2011/10/25 9:02:00)
hotpower早就把这道题的题意和解法基本说穿了。可惜没人注意到:

1、不能打断的(函数)时间必须小于节拍时间。字谜实际在函数的间隙上。
2、只要不出现时间的误差积累,就应该"算准"。否则就别玩了。
3、只要秒脉冲不丢,什么都好奔出来。

三个努力方向,一清二楚。追求其他的细节问题,连方向都不对了。

还有所长好像说过:“裸奔是串行处理,OS是并行处理。”(所谓并发....)。简单明确的概括。所以OS只要符合任务分割规则,其他的只需要编程员单独考虑每个任务,互相牵连正是裸奔的缺点。

所以,这道题这不合理,那互相矛盾,都是对裸奔编程员来说的,对利用OS编程者,只需处理简单的事。

没那么多合理的联系。
有网友说:用OS实际就是请了个“管家”。很形象。要是我什么都考虑,请管家干什么?
还有网友说,OS是给傻瓜用的。没错,傻瓜根本不会像裸奔高手那样考虑到的那么多合理的关系。

/******************************************************************************/
/**/
/*wxj1952.C:ARTX-51Application*/
/**/
/******************************************************************************/

#include<rtx51tny.h>

/******************************************************************************/
/*Task0'job0':*/
/******************************************************************************/
job0()_task_0{

os_create_task(1);
os_create_task(2);
os_create_task(3);
os_create_task(4);
//os_create_task(5);
//os_create_task(6);


while(1){

os_wait(K_IVL,1,0);
.
.
.
DX_1;
F05();
EX_1;

os_switch_tast();
}
}

/******************************************************************************/
/*Task1'job1':*/
/******************************************************************************/
job1()_task_1{
while(1){

os_wait(K_IVL,60,0);
.
.
.
DX_1;
F071();
EX_1;
//os_send_signal(2);

os_switch_tast();
}
}

/******************************************************************************/
/*Task2'job2':*/
/******************************************************************************/
job2()_task_2{
while(1){
//os_wait1(K_SIG,1);
.
.
.
DX_1;
F072();
EX_1;
//os_send_signal(3);

os_switch_tast();

}
}


/******************************************************************************/
/*Task3'job3':*/
/******************************************************************************/
job3()_task_3{
while(1){
//os_wait1(K_SIG,2);
.
.
.
DX_1;
F073();
EX_1;
//os_send_signal(4);

os_switch_tast();

}
}

/******************************************************************************/
/*Task3'job4':*/
/******************************************************************************/
job3()_task_4{
while(1){
//os_wait1(K_SIG,3);
.
.
.
DX_1;
F074();
EX_1;

os_switch_tast();

}
}

DX_1/EX_1语句高手一看就知道是什么,这是陈明计书上提供的语句.



哇!睡了一觉,没想到“窝里斗”这么快就开演啦!

12月5号以前挺安静的,高手好像都没时间,怎么现在突然一下都那么兴奋起来了。都有时间了。






网友评论:终于出来啦,占个座先

网友评论:表达不清楚,程序更是弄得乱七八糟。BS之...

网友评论:什么是细节问题?

1、用单CPU做一个精确的时钟。
2、以此时钟为基准,每秒钟运行一次一个500ms开销的任务,设其为F05()。<--这一条基本上属于FP
3,每分钟到达时,运行一次4个紧密关联的函数,每个运行开销700ms,设其为F071(),F072(),F073(),F074();要求4个函数必须顺序运行。

intmain(void)
{
while(1);
return0;
}

这样不是更好?忽略所有细节问题?

---------------------------------------

wxj1952发表于2007-12-512:32侃单片机←返回版面按此察看该网友的资料按此把文章加入收藏夹按此编辑本帖

楼主:感谢众网友关注,下午公开答案

hotpower早就把这道题的题意和解法基本说穿了。可惜没人注意到:

1、不能打断的(函数)时间必须小于节拍时间。字谜实际在函数的间隙上。
2、只要不出现时间的误差积累,就应该"算准"。否则就别玩了。
3、只要秒脉冲不丢,什么都好奔出来。

三个努力方向,一清二楚。追求其他的细节问题,连方向都不对了。

---------------------------------------



网友评论:估计楼主的代码n多人都看得明白。
但是楼主却看不明白n多人贴的思路或代码。
拿DX/EX来当宝贝忽悠大家。

记得有一个兄弟时序图画得相当不错,哈


网友评论:俺该说的都在原来的帖子里面说过了,这里没必要再重复一遍了~~~

网友评论:赶快让我们看看那只纸老虎是什么样子!

从之前的帖子中看到LZ佩服了某个帖子的观点,这才知道LZ原来不是道中人,是个外来户。


网友评论:我头好晕,谁有"笨海拉明“?

网友评论:因为我基本上没有看过陈工的代码!!哈哈哈……

“DX_1/EX_1语句高手一看就知道是什么,这是陈明计书上提供的语句.”


网友评论:我怀颖楼主的这个框架做出来的时钟不可能准,不丢秒才怪,
我来说一下原因
1EX_1,DX_1用在LZ说的不可中断任务两边,
想必是开关中断.

2在F071-F074中某个函数运行时
关中断达到700ms,难保这中间不发生定时器中断,
使得RTX51内部使用的Timer0不正常工作,
而系统调用wait什么的是一定要到定时器数据的.
所以要丢秒.

3把代码写得这么难看,可想而知其程序水平如何.


网友评论:LZ说的话用回LZ身上是最恰当不过的。

网友评论:不是简单的串行和并行概念

网友评论:俺说的是“裸奔是串行化处理,OS是并行化处理”

不是简单的串行和并行概念





网友评论:os的技术核心在于时间片和调度,这两者裸奔也能做到,毕竟裸奔的场合大多不是复杂的应用。os的灵活性和通用性可以做到动态调度,裸奔要做到这点,就有衣服,不在是裸奔了。

wxj1952你拿固定任务去挑战裸奔,你的衣服会被终结---裸奔了。

网友评论:60秒后F05()和F071()的竞争问题~~~~~

网友评论:鸟人?

网友评论:哇!睡了一觉,没想到“窝里斗”这么快就开演啦!

12月5号以前挺安静的,高手好像都躲在阴处没时间,怎么现在突然一下冒出这么多高手,各个都那么兴奋,像打了鸡血似地,都有时间了。



网友评论:不错,就是两种任务的时间竞争,如果楼主这样写程序

voidTASK0(void*pdata)
{
pdata=pdata;

while(1)
{
F05();
OSTimeDly(OS_TICKS_PER_SEC/2);
}
}

voidTASK1(void*pdata)
{
pdata=pdata;

while(1)
{
if(分钟到)
{
F071();
OSTimeDly(OS_TICKS_PER_SEC/10);
F072();
OSTimeDly(OS_TICKS_PER_SEC/10);
F073();
OSTimeDly(OS_TICKS_PER_SEC/10);
F074();
OSTimeDly(OS_TICKS_PER_SEC/10);
}
}
}
那就乖乖等着挨砖头吧!!哈哈!!

网友评论:LZ的这点水平不行吧
首先是保证每秒的一次500ms的任务运行,可是现在你的软件不能保证呀
另个关联紧密的4个任务是不是不再紧密了呀
LZ先说明你如何保证的每S的一次500ms
"这是一个实际应用的例子。实现目标:

1、用单CPU做一个精确的时钟。
2、以此时钟为基准,每秒钟运行一次一个500ms开销的任务,设其为F05()。
3,每分钟到达时,运行一次4个紧密关联的函数,每个运行开销700ms,设其为F071(),F072(),F073(),F074();要求4个函数必须顺序运行。
4、为简化题目,只做秒、分2位。

要求:各函数时间开销严格,运行期间不允许打断(即不允许被中断或抢占)。

叙述一下这个题目的意思,当每分钟到达时,程序运行F071~F074,这段时间软件耗费至少700msX4=2.8秒,这样时钟的秒位肯定要丢数(因为“要求”说了,F071~F074运行必须顺序,不允许抢占。可以被调度)。怎么解决?"
这是你的原文


网友评论:"/******************************************************************************/
/**/
/*wxj1952.C:ARTX-51Application*/
/**/
/******************************************************************************/

#include<rtx51tny.h>

/******************************************************************************/
/*Task0'job0':*/
/******************************************************************************/
job0()_task_0{

os_create_task(1);
os_create_task(2);
os_create_task(3);
os_create_task(4);
//os_create_task(5);
//os_create_task(6);


while(1){

os_wait(K_IVL,1,0);
.
.
.
DX_1;
F05();
EX_1;

os_switch_tast();
}
}

/******************************************************************************/
/*Task1'job1':*/
/******************************************************************************/
job1()_task_1{
while(1){

os_wait(K_IVL,60,0);
.
.
.
DX_1;
F071();
EX_1;
//os_send_signal(2);

os_switch_tast();
}
}

/******************************************************************************/
/*Task2'job2':*/
/******************************************************************************/
job2()_task_2{
while(1){
//os_wait1(K_SIG,1);
.
.
.
DX_1;
F072();
EX_1;
//os_send_signal(3);

os_switch_tast();

}
}


/******************************************************************************/
/*Task3'job3':*/
/******************************************************************************/
job3()_task_3{
while(1){
//os_wait1(K_SIG,2);
.
.
.
DX_1;
F073();
EX_1;
//os_send_signal(4);

os_switch_tast();

}
}

/******************************************************************************/
/*Task3'job4':*/
/******************************************************************************/
job3()_task_4{
while(1){
//os_wait1(K_SIG,3);
.
.
.
DX_1;
F074();
EX_1;

os_switch_tast();

}
}

DX_1/EX_1语句高手一看就知道是什么,这是陈明计书上提供的语句.
"
LZ认为你的这个满足了要求了吗?
如果满足了要求的话,猪都会上树


网友评论:看看俺裸奔一下

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

interrupttime1s
{
time到=1;
time++;
}


*-本贴最后修改时间:2007-12-69:23:32修改者:senda_3526




网友评论:实在无聊.
有什么意思?

网友评论:不知道该说什么好了。

介绍下我的态度:
我不反对用OS,但资源少的MCU、任务明显的东东,尽量不要用OS。我现在的项目51的,程序量十几万行,几百K字节,不也就是状态机搞定?不过OS的一些东西还是可以学习的,什么消息呀、信号呀、状态机呀什么的。

但是32BIT的东东,还是用OS方便。我上个项目就是有TCP/IP、MPEG、GUI等等,不用OS,天,不写死?

总之要看项目、看MCU说话。期待拍砖!



网友评论:楼主这个程序不但无法保证“每秒运行一次”500mS任务,而且时间长了700ms任务的顺序执行恐怕也无法保证

网友评论:F05()和F07会在某一时刻同时去竞争CUP的使用权,无论优先给谁最高或同等,无论谁抢赢,都算是打断了对方

请问楼主如何解决这个问题哦,学习中,哈哈

网友评论:这次挖小坑
开始挖...












到底了

网友评论:头一名1万元奖金.我来准备一下,星期一公布名单.

高手还有三天的时间,3000元依然有效。别把时间花在吹牛上了。

我发现喷口水的人,一个赛一个的聪明,功夫最逊的也比我高明千倍。不过有本事最近抓紧到航天部第一研究院(中国运载火箭技术研究院)14研究所应聘去,出的面试题不会比这道容易。也许是航天器上用的类似例子。



网友评论:也许楼主表达得不清楚,他本来的意思也许是:
用户程序不能被被动地打断,象被中断打断的程序是不能确定打断位置的。
而用户程序是可以自主被打断的(在程序中确定的位置,用户程序自己把CPU交出去给别的进程),在可以自主打断的地方,调用了任务切换。
这也就是他所说的程序的间隙吧?
总体程序不一定非得用OS编写,但OS方便的达到了楼主的目的。

是这样的吧?

网友评论:本来是想说明OS在解这道题时的优越性,但是现在却把皮球踢给别人,问别人要代码.
没人说用OS解不了这道题,不过即使解了恐怕也看不出OS的优越性来.
你不如干脆说用钱换代码得了,搞那么多弯弯绕

网友评论:说什么用OS不用考虑相关性,恐怕不对吧。用OS恐怕更要考虑一个任务的运行不能影响另一个任务。
假设你的500mS是个串口任务呢,等700ms执行完了,你的串口恐怕啥也收不到。

网友评论:现在恐怕不敢再提什么缩成5ms,7ms之类的话了吧

那样不但可以5ms对齐秒计时,而且7ms四个任务都能合成一个来做,只不过要用定时器计数值比较来替代定时器中断,等于把OS当裸奔用了,哈哈

浏览:(536)| 评论( 0 )
博文评论

  • 昵 称:
  • 内 容:10~250个字符
  • 验证码: 验证码看不清楚?请点击刷新验证码
  •                      
  • 博文分类

    热点博文

    最新博文

    最新评论

    IC电子元件查询
    IC邮购网电子元件品质保障