|
|||||||||||
| 技術(shù)交流 | 電路欣賞 | 工控天地 | 數(shù)字廣電 | 通信技術(shù) | 電源技術(shù) | 測控之家 | EMC技術(shù) | ARM技術(shù) | EDA技術(shù) | PCB技術(shù) | 嵌入式系統(tǒng) 驅(qū)動編程 | 集成電路 | 器件替換 | 模擬技術(shù) | 新手園地 | 單 片 機 | DSP技術(shù) | MCU技術(shù) | IC 設計 | IC 產(chǎn)業(yè) | CAN-bus/DeviceNe |
問ucos2中的統(tǒng)計任務 |
| 作者:太陽草 欄目:嵌入式系統(tǒng) |
在uCOS2書中描述講解統(tǒng)計任務時提到使OS_TASK_STAT_EN為1允許了統(tǒng)計任務運行,然后在用戶程序運行中該任務每秒運行一次,是如何實現(xiàn)每秒運行一次的呢? 我們知道統(tǒng)計任務在OSInit()中創(chuàng)建(優(yōu)先級是OS_LOWEST_PRIO-1并設置就緒狀態(tài)為FALSE)、在第一個任務中調(diào)用OSStatInit()進行初始化并就緒態(tài)設為TURE,開始程序后面的工作因為應用程序的任務數(shù)不定運行時間也不定而統(tǒng)計的任務的優(yōu)先級又低,那如何在1秒鐘后一定來運行統(tǒng)計任務呢? 請大家?guī)蛶兔Γ?br> |
| 2樓: | >>參與討論 |
| 作者: 太陽草 于 2005/2/24 13:31:00 發(fā)布:
再求! 我想我還是沒 能很好的搞清楚一個嵌入式程序的運行順序比如: #include "inclides.h" #define TASK_STK_SIZE 512 OS_STK TaskStartStk[TASK_STK_SIZE]; OS_STK Task1Stk[TASK_STK_SIZE]; OS_STK Task2Stk[TASK_STK_SIZE]; void TaskStart(void *data); void Task1(void *data); void Task2(void *data); ////////////////////////////////////////////////////////// void main(void) { ……………………… OSInit(); …………………… OSTaskCreate(TaskStart, (void *)0, &TaskStartStk[TASK_STK_SIZE - 1], 0); OSStart(); } ///////////////////////////////////////////////////////// void TaskStart (void *data) { #if OS_CRITICAL_METHOD == 3 OS_CPU_SR cpu_sr; data = data; …………INSTALL uC/OS-II's clock…………………… ……………………………… ………… OSStatInit(); OSTaskCreate(Task1, (void *)0, &Task1Stk[TASK_STK_SIZE - 1], 1); OSTaskCreate(Task2, (void *)0, &Task1Stk[TASK_STK_SIZE - 1], 2); for(;;) { ……完成一些應用功能………… OSTimeDlyHMSM(0, 0, 1, 0); } } ////////////////////////////////////////////////////////// void Task1(void *data) { for(,,) { ………………………… } } ////////////////////////////////////////////////////////// void Task2(void *data) { for(,,) { ………………………… } } ///////////////////////////////////////////////////////// 在這個例子中,但統(tǒng)計任務完成初始化后又回到TaskStart,然后就開始創(chuàng)建Task1和Task2(當這2個任務一開始建立就處于就緒態(tài)),TaskStart自我延時一秒,開始運行Task1和Task2。假如這兩個任務要運行1秒(因為可能運行不到1秒,我考慮的是極端情況,假如有很多任務時就可能運行上1秒),當剛好運行完還沒來得及運行統(tǒng)計任務時又繼續(xù)運行 TaskStart這樣1秒后也沒有運行統(tǒng)計任務啊,這樣下去也很難保證每一秒運行一次統(tǒng)計任務。很多種情況都會遇到這種情況。我不是很能理解,是因為一般我情況下應用任務都很難運行到1秒嗎,這樣在每秒內(nèi)都能運行到統(tǒng)計任務,因為我剛才開始看UCOS2,沒有實際編程經(jīng)驗。請大家?guī)兔忉尮,謝謝! |
|
| 3樓: | >>參與討論 |
| 作者: hailisky 于 2005/2/24 20:56:00 發(fā)布:
問ucos2中的統(tǒng)計任務 好像統(tǒng)計任務是在其它任務執(zhí)行完時候進行計數(shù), CPU使用率=(1S可以產(chǎn)生的計數(shù)值-空閑時計數(shù)值)/1S可以產(chǎn)生的數(shù)值 而且在每一秒都應對空閑時計數(shù)值清0 |
|
| 4樓: | >>參與討論 |
| 作者: 太陽草 于 2005/2/25 10:46:00 發(fā)布:
問ucos2中的統(tǒng)計任務 不好意思我在問哈:你的意思是說統(tǒng)計任務統(tǒng)計每秒CPU使用率是每秒對空閑時計數(shù)(這點我理解),而不是因為每秒都運行了統(tǒng)計任務?但如何能存儲前2秒用空閑時的值的,比如在前1秒內(nèi)的空閑計數(shù)已到但還沒能運行統(tǒng)計任務,那么這個計數(shù)值也還沒用,也還沒有清0,有怎么來繼續(xù)記錄下一秒的值呢。 |
|
| 5樓: | >>參與討論 |
| 作者: owenbatt 于 2005/2/25 23:51:00 發(fā)布:
我也碰到類似的問題,下星期找人研究一下 沒想到uC/OS用的人還不少啊,哈哈 |
|
| 6樓: | >>參與討論 |
| 作者: 太陽草 于 2005/2/26 13:07:00 發(fā)布:
好的哈! 我也是剛接觸uC/OS,剛看完那本書! |
|
| 7樓: | >>參與討論 |
| 作者: 松鼠的大樹 于 2005/2/27 6:10:00 發(fā)布:
首先明確一個原則 在實際的RT系統(tǒng)中,CPU大部分的時間實際上是處于空閑狀態(tài)的,應為只有這樣才能保證各個任務的實時性要求。這也是一個和非實時系統(tǒng)很明顯的不同特點。 考慮問題的時候應該基于這一個原則。 像太陽草在"再求"中提出的任務設置情況,嚴格得說是不明確的: 1.并沒有表明任務1、2的出發(fā)條件和等待條件,所以很難說什么時候他們會運行,運行多長時間; 2.你所說的“極端情況”是不適當?shù)摹R驗楦静荒芤?guī)定task1、2正好在TaskStart運行的間隙正好運行。如果真的可以這樣,他們就不應該是任務,而是兩個在TaskStart中調(diào)用的例程,這時,我只能說是你的任務設計不正確。 實際上你的問題牽扯到的問題很多,這里很難一一歷數(shù),建議你閱讀一些講解RT的概論性文章或書籍。 |
|
|
|
| 免費注冊為維庫電子開發(fā)網(wǎng)會員,參與電子工程師社區(qū)討論,點此進入 |
Copyright © 1998-2006 m.58mhw.cn 浙ICP證030469號 |