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當裸奔用了,哈哈